diff options
author | 2016-09-30 11:41:59 -0400 | |
---|---|---|
committer | 2016-09-30 17:33:45 +0000 | |
commit | c68d4aa4ead74e7c89f0d638f56234f4103e19e7 (patch) | |
tree | 0f0b011f48bc7f5cb197990f5613d9e4455ef377 /src/gpu/SkGr.cpp | |
parent | d921dbb9b88327eef7b1fbd42e9d88bace4a65ff (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.cpp | 43 |
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. |