aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkColorSpaceXformSteps.cpp
diff options
context:
space:
mode:
authorGravatar Mike Klein <mtklein@chromium.org>2018-07-11 11:14:03 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-07-11 15:54:39 +0000
commitc3a541942310673a4f26aab6079c586efb8d8c3e (patch)
tree2461b440effd6627c37efb7c49a3ecbb552d0693 /src/core/SkColorSpaceXformSteps.cpp
parent2267a092356d17f6444502dc92491485ccf24341 (diff)
use from/to_srgb
Change-Id: I256dd98e1e918943195772954bc114e54b9325cd Reviewed-on: https://skia-review.googlesource.com/140564 Commit-Queue: Mike Klein <mtklein@chromium.org> Commit-Queue: Brian Osman <brianosman@google.com> Auto-Submit: Mike Klein <mtklein@chromium.org> Reviewed-by: Brian Osman <brianosman@google.com>
Diffstat (limited to 'src/core/SkColorSpaceXformSteps.cpp')
-rw-r--r--src/core/SkColorSpaceXformSteps.cpp28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/core/SkColorSpaceXformSteps.cpp b/src/core/SkColorSpaceXformSteps.cpp
index 4dfe56383a..d2f3881a1d 100644
--- a/src/core/SkColorSpaceXformSteps.cpp
+++ b/src/core/SkColorSpaceXformSteps.cpp
@@ -41,8 +41,10 @@ SkColorSpaceXformSteps::SkColorSpaceXformSteps(SkColorSpace* src, SkAlphaType sr
SkColorSpaceTransferFn srcTF, dstTF;
SkAssertResult(src->isNumericalTransferFn(&srcTF));
SkAssertResult(dst->isNumericalTransferFn(&dstTF));
- this->srcTF = srcTF;
- this->dstTFInv = dstTF.invert();
+ this->srcTF = srcTF;
+ this->dstTFInv = dstTF.invert();
+ this->srcTF_is_sRGB = src->gammaCloseToSRGB();
+ this->dstTF_is_sRGB = dst->gammaCloseToSRGB();
// If we linearize then immediately reencode with the same transfer function, skip both.
if ( this->flags.linearize &&
@@ -103,19 +105,25 @@ void SkColorSpaceXformSteps::apply(float* rgba) const {
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 (srcTF_is_sRGB) {
+ p->append(SkRasterPipeline::from_srgb);
+ } else {
+ 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 (dstTF_is_sRGB) {
+ p->append(SkRasterPipeline::to_srgb);
+ } else {
+ 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); }
}