diff options
author | Mike Klein <mtklein@google.com> | 2018-07-10 18:25:03 +0000 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-07-10 20:13:26 +0000 |
commit | b82edcc92bb49ca877bd51b9f47cfece68785035 (patch) | |
tree | 26fe067de6cf37a96a93cb94bc18cd41bc7b880b /src/core/SkColorSpaceXformSteps.cpp | |
parent | 6eb36214461794626291a01c3150f7239e4a91a3 (diff) |
update (non-sprite) image shader color management
Just another little step... diffs down to ~450 from ~500.
The A8 handling has changed a little, keeping the paint
color in sRGB just to make the append_misc() logic a bit
more streamlined.
I may want to refactor things a little later so that I can
get an easy signal to use to_srgb and from_srgb stages instead
of sending them through the generic parametric stages.
Change-Id: Iefff3206b06a3aa7d81f85fd169272b6ac9c20e0
Reviewed-on: https://skia-review.googlesource.com/140250
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Mike Klein <mtklein@google.com>
Diffstat (limited to 'src/core/SkColorSpaceXformSteps.cpp')
-rw-r--r-- | src/core/SkColorSpaceXformSteps.cpp | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/core/SkColorSpaceXformSteps.cpp b/src/core/SkColorSpaceXformSteps.cpp index ae230ee0fc..4dfe56383a 100644 --- a/src/core/SkColorSpaceXformSteps.cpp +++ b/src/core/SkColorSpaceXformSteps.cpp @@ -6,6 +6,7 @@ */ #include "SkColorSpaceXformSteps.h" +#include "SkRasterPipeline.h" // TODO: explain @@ -66,7 +67,10 @@ SkColorSpaceXformSteps::SkColorSpaceXformSteps(SkColorSpace* src, SkAlphaType sr void SkColorSpaceXformSteps::apply(float* rgba) const { if (flags.unpremul) { - float invA = isfinite(1.0f / rgba[3]) ? 1.0f / rgba[3] : 0; + // I don't know why isfinite(x) stopped working on the Chromecast bots... + auto is_finite = [](float x) { return x*0 == 0; }; + + float invA = is_finite(1.0f / rgba[3]) ? 1.0f / rgba[3] : 0; rgba[0] *= invA; rgba[1] *= invA; rgba[2] *= invA; @@ -95,3 +99,23 @@ void SkColorSpaceXformSteps::apply(float* rgba) const { rgba[2] *= rgba[3]; } } + +void SkColorSpaceXformSteps::apply(SkRasterPipeline* p) const { + if (flags.unpremul) { p->append(SkRasterPipeline::unpremul); } + if (flags.linearize) { + // TODO: missing an opportunity to use from_srgb here. + p->append(SkRasterPipeline::parametric_r, &srcTF); + p->append(SkRasterPipeline::parametric_g, &srcTF); + p->append(SkRasterPipeline::parametric_b, &srcTF); + } + if (flags.gamut_transform) { + p->append(SkRasterPipeline::matrix_3x3, &src_to_dst_matrix); + } + if (flags.encode) { + // TODO: missing an opportunity to use to_srgb here. + p->append(SkRasterPipeline::parametric_r, &dstTFInv); + p->append(SkRasterPipeline::parametric_g, &dstTFInv); + p->append(SkRasterPipeline::parametric_b, &dstTFInv); + } + if (flags.premul) { p->append(SkRasterPipeline::premul); } +} |