aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar raftias <raftias@google.com>2016-12-05 16:30:41 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2016-12-08 15:24:19 +0000
commit2979b1a7eaffcdcf994e506caf743a9adf35b8ed (patch)
tree743f77a83252385c334ce782df912f055fa5c1ab /src
parentee6c368a6d3429ff61c6a90561e0edc46945f0c3 (diff)
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 <msarett@google.com> Commit-Queue: Robert Aftias <raftias@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/core/SkColorSpaceXform_A2B.cpp11
-rw-r--r--src/opts/SkRasterPipeline_opts.h6
2 files changed, 4 insertions, 13 deletions
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); }