diff options
author | Florin Malita <fmalita@chromium.org> | 2017-11-01 15:43:52 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-11-01 20:22:30 +0000 |
commit | 79363b604e376a3c0f70009ed1017edc6d29cdfb (patch) | |
tree | 7acd6d0cf00cce49034e7433ac2d3ec63f719c4c /src/shaders | |
parent | 3c2359397a3c586a9a49266e1d0a6990558debdd (diff) |
Streamline legacy gradient color conversion
To produce colors for interpolation in legacy mode, we currently do
something like
SkColor c = Sk4f_toS32(swizzle_rb(Sk4f::Load(c4f)));
color4f = swizzle_rb(SkNx_cast<float>(Sk4b::Load(&c)) * (1/255.0f));
Let's see if we can streamline some of that.
Change-Id: I423b5aa8c2df8d115cc236d5f0a2e79923a9c2cc
Reviewed-on: https://skia-review.googlesource.com/66142
Commit-Queue: Florin Malita <fmalita@chromium.org>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Reviewed-by: Brian Osman <brianosman@google.com>
Diffstat (limited to 'src/shaders')
-rw-r--r-- | src/shaders/gradients/SkGradientShader.cpp | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/src/shaders/gradients/SkGradientShader.cpp b/src/shaders/gradients/SkGradientShader.cpp index 3d4b2552a4..e9f6e69f9b 100644 --- a/src/shaders/gradients/SkGradientShader.cpp +++ b/src/shaders/gradients/SkGradientShader.cpp @@ -500,8 +500,19 @@ void SkGradientShaderBase::initLinearBitmap(SkBitmap* bitmap, GradientBitmapType } SkColor4f SkGradientShaderBase::getXformedColor(size_t i, SkColorSpace* dstCS) const { - return dstCS ? to_colorspace(fOrigColors4f[i], fColorSpace.get(), dstCS) - : SkColor4f_from_SkColor(this->getLegacyColor(i), nullptr); + if (dstCS) { + return to_colorspace(fOrigColors4f[i], fColorSpace.get(), dstCS); + } + + // Legacy/srgb color. +#ifdef SK_SUPPORT_LEGACY_GRADIENT_COLOR_CONVERSION + return SkColor4f_from_SkColor(this->getLegacyColor(i), nullptr); +#else + // We quantize upfront to ensure stable SkColor round-trips. + auto rgb255 = sk_linear_to_srgb(Sk4f::Load(fOrigColors4f[i].vec())); + auto rgb = SkNx_cast<float>(rgb255) * (1/255.0f); + return { rgb[0], rgb[1], rgb[2], fOrigColors4f[i].fA }; +#endif } SK_DECLARE_STATIC_MUTEX(gGradientCacheMutex); @@ -1243,12 +1254,10 @@ GrGradientEffect::GrGradientEffect(ClassID classID, const CreateArgs& args, bool SkASSERT(shader.fOrigColors4f); fColors4f.setCount(shader.fColorCount); for (int i = 0; i < shader.fColorCount; ++i) { - if (args.fDstColorSpace) { - fColors4f[i] = GrColor4f::FromSkColor4f(shader.fOrigColors4f[i]); - } else { - GrColor grColor = SkColorToUnpremulGrColor(shader.getLegacyColor(i)); - fColors4f[i] = GrColor4f::FromGrColor(grColor); - } + // We apply the dest CS transform separately, so we only use this as a selector + // for linear vs. legacy colors. + auto* cs = args.fDstColorSpace ? shader.fColorSpace.get() : nullptr; + fColors4f[i] = GrColor4f::FromSkColor4f(shader.getXformedColor(i, cs)); if (kBeforeInterp_PremulType == fPremulType) { fColors4f[i] = fColors4f[i].premul(); |