skia2/tests/ParametricStageTest.cpp
Mike Klein c0bd9f9fe5 rewrite includes to not need so much -Ifoo
Current strategy: everything from the top

Things to look at first are the manual changes:

   - added tools/rewrite_includes.py
   - removed -Idirectives from BUILD.gn
   - various compile.sh simplifications
   - tweak tools/embed_resources.py
   - update gn/find_headers.py to write paths from the top
   - update gn/gn_to_bp.py SkUserConfig.h layout
     so that #include "include/config/SkUserConfig.h" always
     gets the header we want.

No-Presubmit: true
Change-Id: I73a4b181654e0e38d229bc456c0d0854bae3363e
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/209706
Commit-Queue: Mike Klein <mtklein@google.com>
Reviewed-by: Hal Canary <halcanary@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Reviewed-by: Florin Malita <fmalita@chromium.org>
2019-04-24 16:27:11 +00:00

79 lines
2.6 KiB
C++

/*
* 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 "include/core/SkColorSpace.h"
#include "src/core/SkRasterPipeline.h"
#include "tests/Test.h"
static void check_error(skiatest::Reporter* r, float limit, skcms_TransferFunction 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.
}
SkRasterPipeline_MemoryCtx ip = { in, 0},
op = {out, 0};
SkRasterPipeline_<256> p;
p.append(SkRasterPipeline::load_f32, &ip);
p.append(SkRasterPipeline::parametric, &fn);
p.append(SkRasterPipeline::store_f32, &op);
p.run(0,0, 256/4,1);
for (int i = 0; i < 256; i++) {
float want = (in[i] <= fn.d) ? fn.c * in[i] + fn.f
: powf(in[i] * fn.a + fn.b, fn.g) + fn.e;
if (i % 4 == 3) { // alpha should stay unchanged.
want = in[i];
}
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) {
skcms_TransferFunction fn = {0,0,0,0,0,0,0};
fn.g = gamma;
fn.a = 1;
check_error(r, limit, fn);
}
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); }