aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Mike Klein <mtklein@chromium.org>2018-07-11 14:30:27 -0400
committerGravatar Mike Klein <mtklein@chromium.org>2018-07-11 21:42:26 +0000
commitfcc10da18eb533e83d8d46181819deed234ad1a3 (patch)
treedeaeee44b6f88de9320939609617a4ecd579e844 /src/core
parent80247e594d1fb168e11a19ce6a73a7e7169ec1f5 (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>
Diffstat (limited to 'src/core')
-rw-r--r--src/core/SkBlitter_Sprite.cpp21
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);
}