aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/opts/SkRasterPipeline_opts.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/opts/SkRasterPipeline_opts.h')
-rw-r--r--src/opts/SkRasterPipeline_opts.h6
1 files changed, 4 insertions, 2 deletions
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); }