aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkRasterPipeline.cpp
diff options
context:
space:
mode:
authorGravatar Mike Klein <mtklein@google.com>2018-07-10 15:52:06 +0000
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-07-11 14:48:38 +0000
commitcd3e13a130e3d99790e80b329ef6d13591615fe0 (patch)
tree98a782cb1a5048ce485bbd90aacaea8220367ce4 /src/core/SkRasterPipeline.cpp
parent532b3f944a4991064963aee8f535c695f4068368 (diff)
Reland "transform paint color to dst colorspace"
This is a reland of 6eb36214461794626291a01c3150f7239e4a91a3 I've added an unbounded_uniform_color stage to allow lowp to keep working when colors are in range and to force floats when colors go out of range, most commonly in "narrow" config. Original change's description: > transform paint color to dst colorspace > > Hopefully I can start to knock off effects that need > to be converted to dst colorspace one at a time now. > > My rough list is, > - paint color <---- > - image shader > - sprite blitter > - gradients? > - mode color filter > - lighting color filter > - high contrast filter > - toSRGB color filter > > This change cuts the diffs between 8888 and srgb from > ~540 to ~500. > > I left myself a note about not being able to interpret null > to sRGB at a high level yet. That'd cause a ton of 8888 diffs, > and I think SkColorSpaceXformCanvas diffs too. > > Change-Id: Id66a63e0e92130927f267719aeccb8bbcd92973a > Reviewed-on: https://skia-review.googlesource.com/140244 > Reviewed-by: Brian Osman <brianosman@google.com> > Commit-Queue: Mike Klein <mtklein@google.com> Change-Id: I56dbf3ad3547d668e4b41f3126ef61d70b295f7c Reviewed-on: https://skia-review.googlesource.com/140460 Reviewed-by: Mike Klein <mtklein@chromium.org> Commit-Queue: Mike Klein <mtklein@chromium.org>
Diffstat (limited to 'src/core/SkRasterPipeline.cpp')
-rw-r--r--src/core/SkRasterPipeline.cpp29
1 files changed, 18 insertions, 11 deletions
diff --git a/src/core/SkRasterPipeline.cpp b/src/core/SkRasterPipeline.cpp
index 46658969cd..4ee1be0372 100644
--- a/src/core/SkRasterPipeline.cpp
+++ b/src/core/SkRasterPipeline.cpp
@@ -21,7 +21,8 @@ void SkRasterPipeline::reset() {
}
void SkRasterPipeline::append(StockStage stage, void* ctx) {
- SkASSERT(stage != uniform_color); // Please use append_constant_color().
+ SkASSERT(stage != uniform_color); // Please use append_constant_color().
+ SkASSERT(stage != unbounded_uniform_color); // Please use append_constant_color().
this->unchecked_append(stage, ctx);
}
void SkRasterPipeline::unchecked_append(StockStage stage, void* ctx) {
@@ -90,9 +91,7 @@ void SkRasterPipeline::dump() const {
#endif
void SkRasterPipeline::append_constant_color(SkArenaAlloc* alloc, const float rgba[4]) {
- SkASSERT(0 <= rgba[0] && rgba[0] <= 1);
- SkASSERT(0 <= rgba[1] && rgba[1] <= 1);
- SkASSERT(0 <= rgba[2] && rgba[2] <= 1);
+ // r,g,b might be outside [0,1], but alpha should probably always be in [0,1].
SkASSERT(0 <= rgba[3] && rgba[3] <= 1);
if (rgba[0] == 0 && rgba[1] == 0 && rgba[2] == 0 && rgba[3] == 1) {
@@ -106,14 +105,22 @@ void SkRasterPipeline::append_constant_color(SkArenaAlloc* alloc, const float rg
Sk4f color = Sk4f::Load(rgba);
color.store(&ctx->r);
- // To make loads more direct, we store 8-bit values in 16-bit slots.
- color = color * 255.0f + 0.5f;
- ctx->rgba[0] = (uint16_t)color[0];
- ctx->rgba[1] = (uint16_t)color[1];
- ctx->rgba[2] = (uint16_t)color[2];
- ctx->rgba[3] = (uint16_t)color[3];
+ // uniform_color requires colors in range and can go lowp,
+ // while unbounded_uniform_color supports out-of-range colors too but not lowp.
+ if (0 <= rgba[0] && rgba[0] <= 1 &&
+ 0 <= rgba[1] && rgba[1] <= 1 &&
+ 0 <= rgba[2] && rgba[2] <= 1) {
+ // To make loads more direct, we store 8-bit values in 16-bit slots.
+ color = color * 255.0f + 0.5f;
+ ctx->rgba[0] = (uint16_t)color[0];
+ ctx->rgba[1] = (uint16_t)color[1];
+ ctx->rgba[2] = (uint16_t)color[2];
+ ctx->rgba[3] = (uint16_t)color[3];
+ this->unchecked_append(uniform_color, ctx);
+ } else {
+ this->unchecked_append(unbounded_uniform_color, ctx);
+ }
- this->unchecked_append(uniform_color, ctx);
INC_COLOR;
}