aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkRasterPipelineBlitter.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/SkRasterPipelineBlitter.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/SkRasterPipelineBlitter.cpp')
-rw-r--r--src/core/SkRasterPipelineBlitter.cpp27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/core/SkRasterPipelineBlitter.cpp b/src/core/SkRasterPipelineBlitter.cpp
index 66a4a62734..3643637f0b 100644
--- a/src/core/SkRasterPipelineBlitter.cpp
+++ b/src/core/SkRasterPipelineBlitter.cpp
@@ -12,6 +12,7 @@
#include "SkColor.h"
#include "SkColorFilter.h"
#include "SkColorSpaceXformer.h"
+#include "SkColorSpaceXformSteps.h"
#include "SkOpts.h"
#include "SkPM4f.h"
#include "SkPM4fPriv.h"
@@ -85,12 +86,36 @@ private:
typedef SkBlitter INHERITED;
};
+static SkPM4f premul_in_dst_colorspace(SkColor color, SkColorSpace* dstCS) {
+ float rgba[4];
+ swizzle_rb(SkNx_cast<float>(Sk4b::Load(&color)) * (1/255.0f)).store(rgba);
+
+ // SkColors are always sRGB.
+ auto srcCS = SkColorSpace::MakeSRGB().get();
+
+ // If dstCS is null, no color space transformation is needed (and apply() will just premul).
+ if (!dstCS) { dstCS = srcCS; }
+
+ SkColorSpaceXformSteps(srcCS, kUnpremul_SkAlphaType, dstCS)
+ .apply(rgba);
+
+ return {{rgba[0], rgba[1], rgba[2], rgba[3]}};
+}
+
SkBlitter* SkCreateRasterPipelineBlitter(const SkPixmap& dst,
const SkPaint& paint,
const SkMatrix& ctm,
SkArenaAlloc* alloc) {
+ // For legacy/SkColorSpaceXformCanvas to keep working,
+ // we need to sometimes still need to distinguish null dstCS from sRGB.
+#if 0
+ SkColorSpace* dstCS = dst.colorSpace() ? dst.colorSpace()
+ : SkColorSpace::MakeSRGB().get();
+#else
SkColorSpace* dstCS = dst.colorSpace();
- SkPM4f paintColor = SkPM4f_from_SkColor(paint.getColor(), dstCS);
+#endif
+ SkPM4f paintColor = premul_in_dst_colorspace(paint.getColor(), dstCS);
+
auto shader = as_SB(paint.getShader());
SkRasterPipeline_<256> shaderPipeline;