aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkColorSpaceXformSteps.cpp
diff options
context:
space:
mode:
authorGravatar Mike Klein <mtklein@google.com>2018-07-10 18:25:03 +0000
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-07-10 20:13:26 +0000
commitb82edcc92bb49ca877bd51b9f47cfece68785035 (patch)
tree26fe067de6cf37a96a93cb94bc18cd41bc7b880b /src/core/SkColorSpaceXformSteps.cpp
parent6eb36214461794626291a01c3150f7239e4a91a3 (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.cpp26
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); }
+}