aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/SkGr.cpp
diff options
context:
space:
mode:
authorGravatar Brian Osman <brianosman@google.com>2016-09-30 11:41:59 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2016-09-30 17:33:45 +0000
commitc68d4aa4ead74e7c89f0d638f56234f4103e19e7 (patch)
tree0f0b011f48bc7f5cb197990f5613d9e4455ef377 /src/gpu/SkGr.cpp
parentd921dbb9b88327eef7b1fbd42e9d88bace4a65ff (diff)
Helper functions to do SkColor -> GrColor4f
I started fixing more effects and realized I needed something like this. Wanted to land it separately. After this, I'll add the DC's cached xform from sRGB to AsFPArgs, so that we can easily leverage this code in more places (mostly GrConstColorProcessor, or any effect that falls back to that based on invariants, etc...) BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2844 Change-Id: I335546f02a6c49620494d736140a72c14441b35d Reviewed-on: https://skia-review.googlesource.com/2844 Reviewed-by: Robert Phillips <robertphillips@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Brian Osman <brianosman@google.com>
Diffstat (limited to 'src/gpu/SkGr.cpp')
-rw-r--r--src/gpu/SkGr.cpp43
1 files changed, 30 insertions, 13 deletions
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index 6d1e73552d..d4db461c57 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -437,6 +437,33 @@ sk_sp<GrTexture> GrMakeCachedBitmapTexture(GrContext* ctx, const SkBitmap& bitma
///////////////////////////////////////////////////////////////////////////////
+GrColor4f SkColorToPremulGrColor4f(SkColor c, bool gammaCorrect, GrColorSpaceXform* gamutXform) {
+ // We want to premultiply after linearizing, so this is easy:
+ return SkColorToUnpremulGrColor4f(c, gammaCorrect, gamutXform).premul();
+}
+
+GrColor4f SkColorToUnpremulGrColor4f(SkColor c, bool gammaCorrect, GrColorSpaceXform* gamutXform) {
+ // You can't be color-space aware in legacy mode
+ SkASSERT(gammaCorrect || !gamutXform);
+
+ GrColor4f color;
+ if (gammaCorrect) {
+ // SkColor4f::FromColor does sRGB -> Linear
+ color = GrColor4f::FromSkColor4f(SkColor4f::FromColor(c));
+ } else {
+ // GrColor4f::FromGrColor just multiplies by 1/255
+ color = GrColor4f::FromGrColor(SkColorToUnpremulGrColor(c));
+ }
+
+ if (gamutXform) {
+ color = gamutXform->apply(color);
+ }
+
+ return color;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
// alphatype is ignore for now, but if GrPixelConfig is expanded to encompass
// alpha info, that will be considered.
GrPixelConfig SkImageInfo2GrPixelConfig(SkColorType ct, SkAlphaType, const SkColorSpace* cs,
@@ -542,19 +569,9 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context,
grPaint->setAntiAlias(skPaint.isAntiAlias());
grPaint->setAllowSRGBInputs(dc->isGammaCorrect());
- // Raw translation of the SkPaint color to our 4f format:
- GrColor4f origColor = GrColor4f::FromGrColor(SkColorToUnpremulGrColor(skPaint.getColor()));
-
- // Linearize, if the color is meant to be in sRGB gamma:
- if (dc->isGammaCorrect()) {
- origColor.fRGBA[0] = exact_srgb_to_linear(origColor.fRGBA[0]);
- origColor.fRGBA[1] = exact_srgb_to_linear(origColor.fRGBA[1]);
- origColor.fRGBA[2] = exact_srgb_to_linear(origColor.fRGBA[2]);
-
- if (dc->getColorXformFromSRGB()) {
- origColor = dc->getColorXformFromSRGB()->apply(origColor);
- }
- }
+ // Convert SkPaint color to 4f format, including optional linearizing and gamut conversion.
+ GrColor4f origColor = SkColorToUnpremulGrColor4f(skPaint.getColor(), dc->isGammaCorrect(),
+ dc->getColorXformFromSRGB());
// Setup the initial color considering the shader, the SkPaint color, and the presence or not
// of per-vertex colors.