diff options
author | Mike Klein <mtklein@chromium.org> | 2018-05-24 15:27:03 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-05-24 19:51:51 +0000 |
commit | be6e575ee725e8304e782b60eebf515036215288 (patch) | |
tree | 810c0d25be56cf5194a73d467b95810002843c09 /tests | |
parent | b12175f40fcd3d049de3f38d5388f6eb483ab268 (diff) |
spin off unpremul and opaque tests
- opaque and unpremul are never the same...
there's no reason to ever premul opaque sources.
- under optimization, they won't always be a deterministic
tweak the the premul steps (though right now they still are).
Change-Id: I5669b3dba83774326c07d5a8f16b1d2ce2b22aae
Reviewed-on: https://skia-review.googlesource.com/130061
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Auto-Submit: Mike Klein <mtklein@chromium.org>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/SkColorSpaceXformStepsTest.cpp | 112 |
1 files changed, 78 insertions, 34 deletions
diff --git a/tests/SkColorSpaceXformStepsTest.cpp b/tests/SkColorSpaceXformStepsTest.cpp index 900eb4a9cd..ef53f588cf 100644 --- a/tests/SkColorSpaceXformStepsTest.cpp +++ b/tests/SkColorSpaceXformStepsTest.cpp @@ -36,6 +36,7 @@ DEF_TEST(SkColorSpaceXformSteps, r) { struct { sk_sp<SkColorSpace> src, dst; + SkAlphaType srcAT; bool early_unpremul; bool linearize_src; @@ -51,7 +52,7 @@ DEF_TEST(SkColorSpaceXformSteps, r) { // The first eight cases we test are back and forth between two color spaces with // different gamuts and transfer functions. There's not much optimization possible here. - { adobe_N, srgb_N, + { adobe_N, srgb_N, kPremul_SkAlphaType, true, // src is encoded as f(s)*a,a, so we unpremul to f(s),a before linearizing. true, // Linearize to s,a. false, @@ -63,9 +64,9 @@ DEF_TEST(SkColorSpaceXformSteps, r) { false, // Non-linear blending, so no need to linearize dst. false, // Non-linear blending, so the output of our blend function is what we want. }, - { srgb_N, adobe_N, true,true,false, true,true,true, false,false }, + { srgb_N, adobe_N, kPremul_SkAlphaType, true,true,false, true,true,true, false,false }, - { adobe_L, srgb_L, + { adobe_L, srgb_L, kPremul_SkAlphaType, false, // src is encoded as f(s*a),a, so we linearize before unpremul. true, // Linearize, true, // then unpremul. @@ -77,9 +78,9 @@ DEF_TEST(SkColorSpaceXformSteps, r) { true, // We're doing linear blending, so we need to linearize dst. true, // Once blending is done, finally encode to sRGB. }, - { srgb_L, adobe_L, false,true,true, true,false,true, true,true }, + { srgb_L, adobe_L, kPremul_SkAlphaType, false,true,true, true,false,true, true,true }, - { adobe_L, srgb_N, + { adobe_L, srgb_N, kPremul_SkAlphaType, false, // src is encoded as f(s*a),a, so we linearize before unpremul. true, // Linearize, true, // then unpremul. @@ -91,9 +92,9 @@ DEF_TEST(SkColorSpaceXformSteps, r) { false, // We're doing non-linear blending, so dst is already ready to blend. false, // The output of the blend is just what we want. }, - { srgb_L, adobe_N, false,true,true, true,true,true, false,false }, + { srgb_L, adobe_N, kPremul_SkAlphaType, false,true,true, true,true,true, false,false }, - { adobe_N, srgb_L, + { adobe_N, srgb_L, kPremul_SkAlphaType, true, // src is encoded as f(s)*a,a, so we unpremul to f(s),a before linearizing. true, // Linearize to s,a. false, @@ -105,46 +106,89 @@ DEF_TEST(SkColorSpaceXformSteps, r) { true, // We're doing linear blending, so we need to linearize dst. true, // Once blending is done, finally encode to sRGB. }, - { srgb_N, adobe_L, true,true,false, true,false,true, true,true }, + { srgb_N, adobe_L, kPremul_SkAlphaType, true,true,false, true,false,true, true,true }, + + // These next 16 are the previous 8 with opaque and unpremul srcs. + // Generally, the steps that change are the early_unpremul, late_unpremul, and premul steps, + // but optimizations can sometimes make more steps drop out. + { adobe_N, srgb_N, kOpaque_SkAlphaType, false,true,false, true,true,false, false,false }, + { adobe_N, srgb_N, kUnpremul_SkAlphaType, false,true,false, true,true,true, false,false }, + { srgb_N, adobe_N, kOpaque_SkAlphaType, false,true,false, true,true,false, false,false }, + { srgb_N, adobe_N, kUnpremul_SkAlphaType, false,true,false, true,true,true, false,false }, + + { adobe_L, srgb_L, kOpaque_SkAlphaType, false,true,false, true,false,false, true,true }, + { adobe_L, srgb_L, kUnpremul_SkAlphaType, false,true,false, true,false,true, true,true }, + { srgb_L, adobe_L, kOpaque_SkAlphaType, false,true,false, true,false,false, true,true }, + { srgb_L, adobe_L, kUnpremul_SkAlphaType, false,true,false, true,false,true, true,true }, + + { adobe_L, srgb_N, kOpaque_SkAlphaType, false,true,false, true,true,false, false,false }, + { adobe_L, srgb_N, kUnpremul_SkAlphaType, false,true,false, true,true,true, false,false }, + { srgb_L, adobe_N, kOpaque_SkAlphaType, false,true,false, true,true,false, false,false }, + { srgb_L, adobe_N, kUnpremul_SkAlphaType, false,true,false, true,true,true, false,false }, + + { adobe_N, srgb_L, kOpaque_SkAlphaType, false,true,false, true,false,false, true,true }, + { adobe_N, srgb_L, kUnpremul_SkAlphaType, false,true,false, true,false,true, true,true }, + { srgb_N, adobe_L, kOpaque_SkAlphaType, false,true,false, true,false,false, true,true }, + { srgb_N, adobe_L, kUnpremul_SkAlphaType, false,true,false, true,false,true, true,true }, // These eight cases transform between color spaces with different // transfer functions and the same gamut. Optimization here is limited - // to skipping the gamut_transform step: | - // v This column has all become false. - { srgb_N, srgb22_N, true,true,false, false,true,true, false,false }, - { srgb22_N, srgb_N, true,true,false, false,true,true, false,false }, + // to skipping the gamut_transform step: | + // This column v has all become false. + { srgb_N, srgb22_N, kPremul_SkAlphaType, true,true,false, false,true,true, false,false }, + { srgb22_N, srgb_N, kPremul_SkAlphaType, true,true,false, false,true,true, false,false }, - { srgb_L, srgb22_L, false,true,true, false,false,true, true,true }, - { srgb22_L, srgb_L, false,true,true, false,false,true, true,true }, + { srgb_L, srgb22_L, kPremul_SkAlphaType, false,true,true, false,false,true, true,true }, + { srgb22_L, srgb_L, kPremul_SkAlphaType, false,true,true, false,false,true, true,true }, - { srgb_N, srgb22_L, true,true,false, false,false,true, true,true }, - { srgb22_N, srgb_L, true,true,false, false,false,true, true,true }, + { srgb_L, srgb22_N, kPremul_SkAlphaType, false,true,true, false,true,true, false,false }, + { srgb22_L, srgb_N, kPremul_SkAlphaType, false,true,true, false,true,true, false,false }, - { srgb_L, srgb22_N, false,true,true, false,true,true, false,false }, - { srgb22_L, srgb_N, false,true,true, false,true,true, false,false }, + { srgb_N, srgb22_L, kPremul_SkAlphaType, true,true,false, false,false,true, true,true }, + { srgb22_N, srgb_L, kPremul_SkAlphaType, true,true,false, false,false,true, true,true }, + + // Same deal, the next 16 are the previous 8 in opaque and unpremul. + { srgb_N, srgb22_N, kOpaque_SkAlphaType, false,true,false, false,true,false, false,false}, + { srgb_N, srgb22_N, kUnpremul_SkAlphaType, false,true,false, false,true,true, false,false}, + { srgb22_N, srgb_N, kOpaque_SkAlphaType, false,true,false, false,true,false, false,false}, + { srgb22_N, srgb_N, kUnpremul_SkAlphaType, false,true,false, false,true,true, false,false}, + + { srgb_L, srgb22_L, kOpaque_SkAlphaType, false,true,false, false,false,false, true,true }, + { srgb_L, srgb22_L, kUnpremul_SkAlphaType, false,true,false, false,false,true, true,true }, + { srgb22_L, srgb_L, kOpaque_SkAlphaType, false,true,false, false,false,false, true,true }, + { srgb22_L, srgb_L, kUnpremul_SkAlphaType, false,true,false, false,false,true, true,true }, + + { srgb_L, srgb22_N, kOpaque_SkAlphaType, false,true,false, false,true,false, false,false}, + { srgb_L, srgb22_N, kUnpremul_SkAlphaType, false,true,false, false,true,true, false,false}, + { srgb22_L, srgb_N, kOpaque_SkAlphaType, false,true,false, false,true,false, false,false}, + { srgb22_L, srgb_N, kUnpremul_SkAlphaType, false,true,false, false,true,true, false,false}, + + { srgb_N, srgb22_L, kOpaque_SkAlphaType, false,true,false, false,false,false, true,true }, + { srgb_N, srgb22_L, kUnpremul_SkAlphaType, false,true,false, false,false,true, true,true }, + { srgb22_N, srgb_L, kOpaque_SkAlphaType, false,true,false, false,false,false, true,true }, + { srgb22_N, srgb_L, kUnpremul_SkAlphaType, false,true,false, false,false,true, true,true }, // These four test cases test drawing in the same color space. // There is lots of room for optimization here. - { srgb_N, srgb_N, true,true,false, false,true,true, false,false }, // a.k.a legacy 8888 - { srgb_L, srgb_L, false,true,true, false,false,true, true,true }, // <canvas> use case - { srgb_N, srgb_L, true,true,false, false,false,true, true,true }, - { srgb_L, srgb_N, false,true,true, false,true,true, false,false }, + { srgb_N, srgb_N, kPremul_SkAlphaType, true,true,false, false,true,true, false,false }, + { srgb_L, srgb_L, kPremul_SkAlphaType, false,true,true, false,false,true, true,true }, + { srgb_L, srgb_N, kPremul_SkAlphaType, false,true,true, false,true,true, false,false }, + { srgb_N, srgb_L, kPremul_SkAlphaType, true,true,false, false,false,true, true,true }, + + // And the usual variants for opaque + unpremul sources. + { srgb_N, srgb_N, kOpaque_SkAlphaType, false,true,false, false,true,false, false,false }, + { srgb_N, srgb_N, kUnpremul_SkAlphaType, false,true,false, false,true,true, false,false }, + { srgb_L, srgb_L, kOpaque_SkAlphaType, false,true,false, false,false,false, true,true }, + { srgb_L, srgb_L, kUnpremul_SkAlphaType, false,true,false, false,false,true, true,true }, + { srgb_L, srgb_N, kOpaque_SkAlphaType, false,true,false, false,true,false, false,false }, + { srgb_L, srgb_N, kUnpremul_SkAlphaType, false,true,false, false,true,true, false,false }, + { srgb_N, srgb_L, kOpaque_SkAlphaType, false,true,false, false,false,false, true,true }, + { srgb_N, srgb_L, kUnpremul_SkAlphaType, false,true,false, false,false,true, true,true }, // TODO: versions of above crossing in linear transfer functions }; for (auto t : tests) { - // Our expectations are written for premul source alpha types. - check_eq(r, SkColorSpaceXformSteps(t.src.get(), kPremul_SkAlphaType, t.dst.get()), t); - - // Opaque and unpremul sources should always go through the same steps, - // and they should be the same as premul's steps, with these fixed premul/unpremul steps. - auto upm = t; - upm.early_unpremul = false; - upm.late_unpremul = false; - upm.premul = true; - - check_eq(r, SkColorSpaceXformSteps(t.src.get(), kUnpremul_SkAlphaType, t.dst.get()), upm); - check_eq(r, SkColorSpaceXformSteps(t.src.get(), kOpaque_SkAlphaType, t.dst.get()), upm); + check_eq(r, SkColorSpaceXformSteps(t.src.get(), t.srcAT, t.dst.get()), t); } } |