blob: 6d98ac451bef8e067bb935e236a6881aa86d2e58 [file] [log] [blame]
Mike Klein8f2911f2017-04-19 12:40:52 -04001/*
2 * Copyright 2017 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkColorSpace.h"
9#include "SkRasterPipeline.h"
10#include "Test.h"
Mike Klein45c16fa2017-07-18 18:15:13 -040011#include "../src/jumper/SkJumper.h"
Mike Klein8f2911f2017-04-19 12:40:52 -040012
13static void check_error(skiatest::Reporter* r, float limit, SkColorSpaceTransferFn fn) {
14 float in[256], out[256];
15 for (int i = 0; i < 256; i++) {
16 in [i] = i / 255.0f;
17 out[i] = 0.0f; // Not likely important. Just being tidy.
18 }
19
Mike Klein45c16fa2017-07-18 18:15:13 -040020 SkJumper_MemoryCtx ip = { in, 0},
21 op = {out, 0};
Mike Klein8f2911f2017-04-19 12:40:52 -040022
Mike Kleinb24704d2017-05-24 07:53:00 -040023 SkRasterPipeline_<256> p;
Mike Klein8f2911f2017-04-19 12:40:52 -040024 p.append(SkRasterPipeline::load_f32, &ip);
25 p.append(SkRasterPipeline::parametric_r, &fn);
26 p.append(SkRasterPipeline::parametric_g, &fn);
27 p.append(SkRasterPipeline::parametric_b, &fn);
28 p.append(SkRasterPipeline::parametric_a, &fn);
29 p.append(SkRasterPipeline::store_f32, &op);
30
Mike Klein45c16fa2017-07-18 18:15:13 -040031 p.run(0,0, 256/4,1);
Mike Klein8f2911f2017-04-19 12:40:52 -040032
33
34 for (int i = 0; i < 256; i++) {
35 float want = (in[i] <= fn.fD) ? fn.fC * in[i] + fn.fF
36 : powf(in[i] * fn.fA + fn.fB, fn.fG) + fn.fE;
37 float err = fabsf(out[i] - want);
38 if (err > limit) {
39 ERRORF(r, "At %d, error was %g (got %g, want %g)", i, err, out[i], want);
40 }
41 }
42}
43
44static void check_error(skiatest::Reporter* r, float limit, float gamma) {
Mike Kleinc7be0032017-04-25 15:51:23 -040045 SkColorSpaceTransferFn fn = {0,0,0,0,0,0,0};
46 fn.fG = gamma;
47 fn.fA = 1;
48 check_error(r, limit, fn);
Mike Klein8f2911f2017-04-19 12:40:52 -040049}
50
51DEF_TEST(Parametric_sRGB, r) {
52 // Test our good buddy the sRGB transfer function in resplendent 7-parameter glory.
53 check_error(r, 1/510.0f, {
54 2.4f,
55 1.0f / 1.055f,
56 0.055f / 1.055f,
57 1.0f / 12.92f,
58 0.04045f,
59 0.0f,
60 0.0f,
61 });
62}
63
64// A nice little spread of simple gammas.
65DEF_TEST(Parametric_1dot0, r) { check_error(r, 1/510.0f, 1.0f); }
66
67DEF_TEST(Parametric_1dot2, r) { check_error(r, 1/510.0f, 1.2f); }
68DEF_TEST(Parametric_1dot4, r) { check_error(r, 1/510.0f, 1.4f); }
69DEF_TEST(Parametric_1dot8, r) { check_error(r, 1/510.0f, 1.8f); }
70DEF_TEST(Parametric_2dot0, r) { check_error(r, 1/510.0f, 2.0f); }
71DEF_TEST(Parametric_2dot2, r) { check_error(r, 1/510.0f, 2.2f); }
72DEF_TEST(Parametric_2dot4, r) { check_error(r, 1/510.0f, 2.4f); }
73
74DEF_TEST(Parametric_inv_1dot2, r) { check_error(r, 1/510.0f, 1/1.2f); }
75DEF_TEST(Parametric_inv_1dot4, r) { check_error(r, 1/510.0f, 1/1.4f); }
76DEF_TEST(Parametric_inv_1dot8, r) { check_error(r, 1/510.0f, 1/1.8f); }
77DEF_TEST(Parametric_inv_2dot0, r) { check_error(r, 1/510.0f, 1/2.0f); }
78DEF_TEST(Parametric_inv_2dot2, r) { check_error(r, 1/510.0f, 1/2.2f); }
79DEF_TEST(Parametric_inv_2dot4, r) { check_error(r, 1/510.0f, 1/2.4f); }