diff options
author | 2018-07-11 14:30:27 -0400 | |
---|---|---|
committer | 2018-07-11 21:42:26 +0000 | |
commit | fcc10da18eb533e83d8d46181819deed234ad1a3 (patch) | |
tree | deaeee44b6f88de9320939609617a4ecd579e844 | |
parent | 80247e594d1fb168e11a19ce6a73a7e7169ec1f5 (diff) |
fix color management in sprite blitter
Basically exactly the same as the SkImageShader CL.
441 diffs -> 360 diffs
Change-Id: Ib0d5498d0a286a879ba39bdc28979b20881f4acb
Reviewed-on: https://skia-review.googlesource.com/140573
Commit-Queue: Mike Klein <mtklein@chromium.org>
Reviewed-by: Brian Osman <brianosman@google.com>
-rw-r--r-- | src/core/SkBlitter_Sprite.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/core/SkBlitter_Sprite.cpp b/src/core/SkBlitter_Sprite.cpp index 057b2a5d07..b26b712d93 100644 --- a/src/core/SkBlitter_Sprite.cpp +++ b/src/core/SkBlitter_Sprite.cpp @@ -7,6 +7,7 @@ #include "SkArenaAlloc.h" #include "SkColorSpace.h" +#include "SkColorSpaceXformSteps.h" #include "SkCoreBlitters.h" #include "SkOpts.h" #include "SkPM4fPriv.h" @@ -110,7 +111,8 @@ public: fLeft = left; fTop = top; - fPaintColor = SkColor4f_from_SkColor(paint.getColor(), fDst.colorSpace()); + // Just like in SkImageShader, we'll keep the paint color as floats in sRGB. + swizzle_rb(Sk4f_fromL32(paint.getColor())).store(fPaintColor.vec()); SkRasterPipeline p(fAlloc); void* ctx = &fSrcPtr; @@ -131,16 +133,21 @@ public: p.append(SkRasterPipeline::force_opaque ); break; default: SkASSERT(false); } - if (fDst.colorSpace() && - (!fSource.colorSpace() || fSource.colorSpace()->gammaCloseToSRGB())) { - p.append(SkRasterPipeline::from_srgb); - } if (fSource.colorType() == kAlpha_8_SkColorType) { + // The color for A8 images comes from the (sRGB) paint color. p.append(SkRasterPipeline::set_rgb, &fPaintColor); p.append(SkRasterPipeline::premul); } - append_gamut_transform(&p, fAlloc, - fSource.colorSpace(), fDst.colorSpace(), kPremul_SkAlphaType); + if (auto dstCS = fDst.colorSpace()) { + auto srcCS = fSource.colorSpace(); + if (!srcCS || fSource.colorType() == kAlpha_8_SkColorType) { + // We treat untagged images as sRGB. + // A8 images get their r,g,b from the paint color, so they're also sRGB. + srcCS = SkColorSpace::MakeSRGB().get(); + } + fAlloc->make<SkColorSpaceXformSteps>(srcCS, kPremul_SkAlphaType, dstCS) + ->apply(&p); + } if (fPaintColor.fA != 1.0f) { p.append(SkRasterPipeline::scale_1_float, &fPaintColor.fA); } |