diff options
author | Mike Klein <mtklein@chromium.org> | 2018-07-11 11:14:03 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-07-11 15:54:39 +0000 |
commit | c3a541942310673a4f26aab6079c586efb8d8c3e (patch) | |
tree | 2461b440effd6627c37efb7c49a3ecbb552d0693 /src/core/SkColorSpaceXformSteps.cpp | |
parent | 2267a092356d17f6444502dc92491485ccf24341 (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.cpp | 28 |
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); } } |