From 2979b1a7eaffcdcf994e506caf743a9adf35b8ed Mon Sep 17 00:00:00 2001 From: raftias Date: Mon, 5 Dec 2016 16:30:41 -0500 Subject: Added clamps in SkRasterPipeline's gamma stages. Clamping stages were also removed from SkColorSpace_A2B as they are now not needed. BUG=skia: CQ_INCLUDE_TRYBOTS=skia.primary:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD Change-Id: I24e2e411e12b463854e980cb10c0e6bafb4a7c42 Reviewed-on: https://skia-review.googlesource.com/5546 Reviewed-by: Matt Sarett Commit-Queue: Robert Aftias --- src/core/SkColorSpaceXform_A2B.cpp | 11 ----------- src/opts/SkRasterPipeline_opts.h | 6 ++++-- 2 files changed, 4 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/core/SkColorSpaceXform_A2B.cpp b/src/core/SkColorSpaceXform_A2B.cpp index 9f48aafd81..525589bec0 100644 --- a/src/core/SkColorSpaceXform_A2B.cpp +++ b/src/core/SkColorSpaceXform_A2B.cpp @@ -189,9 +189,6 @@ SkColorSpaceXform_A2B::SkColorSpaceXform_A2B(SkColorSpace_A2B* srcSpace, debugGammaNamed[(int)e.gammaNamed()]); SkColorSpaceTransferFn fn = gammanamed_to_parametric(e.gammaNamed()); this->addTransferFns(fn, currentChannels); - - fElementsPipeline.append(SkRasterPipeline::clamp_0); - fElementsPipeline.append(SkRasterPipeline::clamp_1); } break; case SkColorSpace_A2B::Element::Type::kGammas: { @@ -219,9 +216,6 @@ SkColorSpaceXform_A2B::SkColorSpaceXform_A2B(SkColorSpace_A2B* srcSpace, if (gammaNeedsRef) { fGammaRefs.push_back(sk_ref_sp(&gammas)); } - - fElementsPipeline.append(SkRasterPipeline::clamp_0); - fElementsPipeline.append(SkRasterPipeline::clamp_1); break; } case SkColorSpace_A2B::Element::Type::kCLUT: @@ -273,8 +267,6 @@ SkColorSpaceXform_A2B::SkColorSpaceXform_A2B(SkColorSpace_A2B* srcSpace, SkColorSpaceTransferFn fn = invert_parametric(gammanamed_to_parametric(dstSpace->gammaNamed())); this->addTransferFns(fn, 3); - fElementsPipeline.append(SkRasterPipeline::clamp_0); - fElementsPipeline.append(SkRasterPipeline::clamp_1); } } else { for (int channel = 0; channel < 3; ++channel) { @@ -296,9 +288,6 @@ SkColorSpaceXform_A2B::SkColorSpaceXform_A2B(SkColorSpace_A2B* srcSpace, this->addTransferFn(fn, channel); } } - - fElementsPipeline.append(SkRasterPipeline::clamp_0); - fElementsPipeline.append(SkRasterPipeline::clamp_1); } } diff --git a/src/opts/SkRasterPipeline_opts.h b/src/opts/SkRasterPipeline_opts.h index d0a57e4a11..1359cba10b 100644 --- a/src/opts/SkRasterPipeline_opts.h +++ b/src/opts/SkRasterPipeline_opts.h @@ -695,7 +695,6 @@ STAGE(matrix_perspective) { g = G * Z.invert(); } - SI SkNf parametric(const SkNf& v, const SkColorSpaceTransferFn& p) { float result[N]; // Unconstrained powf() doesn't vectorize well... for (int i = 0; i < N; i++) { @@ -703,7 +702,9 @@ SI SkNf parametric(const SkNf& v, const SkColorSpaceTransferFn& p) { result[i] = (s <= p.fD) ? p.fE * s + p.fF : powf(s * p.fA + p.fB, p.fG) + p.fC; } - return SkNf::Load(result); + // Clamp the output to [0, 1]. + // Max(NaN, 0) = 0, but Max(0, NaN) = NaN, so we want this exact order to ensure NaN => 0 + return SkNf::Min(SkNf::Max(SkNf::Load(result), 0.0f), 1.0f); } STAGE(parametric_r) { r = parametric(r, *(const SkColorSpaceTransferFn*)ctx); } STAGE(parametric_g) { g = parametric(g, *(const SkColorSpaceTransferFn*)ctx); } @@ -715,6 +716,7 @@ SI SkNf table(const SkNf& v, const SkTableTransferFn& table) { for (int i = 0; i < N; i++) { result[i] = interp_lut(v[i], table.fData, table.fSize); } + // no need to clamp - tables are by-design [0,1] -> [0,1] return SkNf::Load(result); } STAGE(table_r) { r = table(r, *(const SkTableTransferFn*)ctx); } -- cgit v1.2.3