ParametricStageTest.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  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. #include "include/core/SkColorSpace.h"
  8. #include "src/core/SkRasterPipeline.h"
  9. #include "tests/Test.h"
  10. static void check_error(skiatest::Reporter* r, float limit, skcms_TransferFunction fn) {
  11. float in[256], out[256];
  12. for (int i = 0; i < 256; i++) {
  13. in [i] = i / 255.0f;
  14. out[i] = 0.0f; // Not likely important. Just being tidy.
  15. }
  16. SkRasterPipeline_MemoryCtx ip = { in, 0},
  17. op = {out, 0};
  18. SkRasterPipeline_<256> p;
  19. p.append(SkRasterPipeline::load_f32, &ip);
  20. p.append(SkRasterPipeline::parametric, &fn);
  21. p.append(SkRasterPipeline::store_f32, &op);
  22. p.run(0,0, 256/4,1);
  23. for (int i = 0; i < 256; i++) {
  24. float want = (in[i] <= fn.d) ? fn.c * in[i] + fn.f
  25. : powf(in[i] * fn.a + fn.b, fn.g) + fn.e;
  26. if (i % 4 == 3) { // alpha should stay unchanged.
  27. want = in[i];
  28. }
  29. float err = fabsf(out[i] - want);
  30. if (err > limit) {
  31. ERRORF(r, "At %d, error was %g (got %g, want %g)", i, err, out[i], want);
  32. }
  33. }
  34. }
  35. static void check_error(skiatest::Reporter* r, float limit, float gamma) {
  36. skcms_TransferFunction fn = {0,0,0,0,0,0,0};
  37. fn.g = gamma;
  38. fn.a = 1;
  39. check_error(r, limit, fn);
  40. }
  41. DEF_TEST(Parametric_sRGB, r) {
  42. // Test our good buddy the sRGB transfer function in resplendent 7-parameter glory.
  43. check_error(r, 1/510.0f, {
  44. 2.4f,
  45. 1.0f / 1.055f,
  46. 0.055f / 1.055f,
  47. 1.0f / 12.92f,
  48. 0.04045f,
  49. 0.0f,
  50. 0.0f,
  51. });
  52. }
  53. // A nice little spread of simple gammas.
  54. DEF_TEST(Parametric_1dot0, r) { check_error(r, 1/510.0f, 1.0f); }
  55. DEF_TEST(Parametric_1dot2, r) { check_error(r, 1/510.0f, 1.2f); }
  56. DEF_TEST(Parametric_1dot4, r) { check_error(r, 1/510.0f, 1.4f); }
  57. DEF_TEST(Parametric_1dot8, r) { check_error(r, 1/510.0f, 1.8f); }
  58. DEF_TEST(Parametric_2dot0, r) { check_error(r, 1/510.0f, 2.0f); }
  59. DEF_TEST(Parametric_2dot2, r) { check_error(r, 1/510.0f, 2.2f); }
  60. DEF_TEST(Parametric_2dot4, r) { check_error(r, 1/510.0f, 2.4f); }
  61. DEF_TEST(Parametric_inv_1dot2, r) { check_error(r, 1/510.0f, 1/1.2f); }
  62. DEF_TEST(Parametric_inv_1dot4, r) { check_error(r, 1/510.0f, 1/1.4f); }
  63. DEF_TEST(Parametric_inv_1dot8, r) { check_error(r, 1/510.0f, 1/1.8f); }
  64. DEF_TEST(Parametric_inv_2dot0, r) { check_error(r, 1/510.0f, 1/2.0f); }
  65. DEF_TEST(Parametric_inv_2dot2, r) { check_error(r, 1/510.0f, 1/2.2f); }
  66. DEF_TEST(Parametric_inv_2dot4, r) { check_error(r, 1/510.0f, 1/2.4f); }