aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/ParametricStageTest.cpp
diff options
context:
space:
mode:
authorGravatar Mike Klein <mtklein@chromium.org>2017-04-19 12:40:52 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-04-19 17:39:48 +0000
commit8f2911f8407b5e151768690ed40ecedde6cd7ad8 (patch)
treec1ed71e4133f4e38434e89b6a9deacebee57b61c /tests/ParametricStageTest.cpp
parent03013084aac29967ee0559efce817b39234f4aa6 (diff)
add unit tests for parametric_* stages
Change-Id: I7fab6d1c7240c17f2cc8436e8c6e7c8d2df940bb Reviewed-on: https://skia-review.googlesource.com/13814 Reviewed-by: Matt Sarett <msarett@google.com> Commit-Queue: Mike Klein <mtklein@chromium.org>
Diffstat (limited to 'tests/ParametricStageTest.cpp')
-rw-r--r--tests/ParametricStageTest.cpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/tests/ParametricStageTest.cpp b/tests/ParametricStageTest.cpp
new file mode 100644
index 0000000000..5810148454
--- /dev/null
+++ b/tests/ParametricStageTest.cpp
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkColorSpace.h"
+#include "SkRasterPipeline.h"
+#include "Test.h"
+
+static void check_error(skiatest::Reporter* r, float limit, SkColorSpaceTransferFn fn) {
+ float in[256], out[256];
+ for (int i = 0; i < 256; i++) {
+ in [i] = i / 255.0f;
+ out[i] = 0.0f; // Not likely important. Just being tidy.
+ }
+
+ const float* ip = in;
+ float* op = out;
+
+ SkRasterPipeline p;
+ p.append(SkRasterPipeline::load_f32, &ip);
+ p.append(SkRasterPipeline::parametric_r, &fn);
+ p.append(SkRasterPipeline::parametric_g, &fn);
+ p.append(SkRasterPipeline::parametric_b, &fn);
+ p.append(SkRasterPipeline::parametric_a, &fn);
+ p.append(SkRasterPipeline::store_f32, &op);
+
+ p.run(0, 256/4);
+
+
+ for (int i = 0; i < 256; i++) {
+ float want = (in[i] <= fn.fD) ? fn.fC * in[i] + fn.fF
+ : powf(in[i] * fn.fA + fn.fB, fn.fG) + fn.fE;
+ float err = fabsf(out[i] - want);
+ if (err > limit) {
+ ERRORF(r, "At %d, error was %g (got %g, want %g)", i, err, out[i], want);
+ }
+ }
+}
+
+static void check_error(skiatest::Reporter* r, float limit, float gamma) {
+ check_error(r, limit, { gamma, 1.0f,0,0,0,0,0 });
+}
+
+DEF_TEST(Parametric_sRGB, r) {
+ // Test our good buddy the sRGB transfer function in resplendent 7-parameter glory.
+ check_error(r, 1/510.0f, {
+ 2.4f,
+ 1.0f / 1.055f,
+ 0.055f / 1.055f,
+ 1.0f / 12.92f,
+ 0.04045f,
+ 0.0f,
+ 0.0f,
+ });
+}
+
+// A nice little spread of simple gammas.
+DEF_TEST(Parametric_1dot0, r) { check_error(r, 1/510.0f, 1.0f); }
+
+DEF_TEST(Parametric_1dot2, r) { check_error(r, 1/510.0f, 1.2f); }
+DEF_TEST(Parametric_1dot4, r) { check_error(r, 1/510.0f, 1.4f); }
+DEF_TEST(Parametric_1dot8, r) { check_error(r, 1/510.0f, 1.8f); }
+DEF_TEST(Parametric_2dot0, r) { check_error(r, 1/510.0f, 2.0f); }
+DEF_TEST(Parametric_2dot2, r) { check_error(r, 1/510.0f, 2.2f); }
+DEF_TEST(Parametric_2dot4, r) { check_error(r, 1/510.0f, 2.4f); }
+
+DEF_TEST(Parametric_inv_1dot2, r) { check_error(r, 1/510.0f, 1/1.2f); }
+DEF_TEST(Parametric_inv_1dot4, r) { check_error(r, 1/510.0f, 1/1.4f); }
+DEF_TEST(Parametric_inv_1dot8, r) { check_error(r, 1/510.0f, 1/1.8f); }
+DEF_TEST(Parametric_inv_2dot0, r) { check_error(r, 1/510.0f, 1/2.0f); }
+DEF_TEST(Parametric_inv_2dot2, r) { check_error(r, 1/510.0f, 1/2.2f); }
+DEF_TEST(Parametric_inv_2dot4, r) { check_error(r, 1/510.0f, 1/2.4f); }