| /* |
| * Copyright 2026 Google LLC |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "tests/Test.h" |
| |
| #include "src/gpu/Swizzle.h" |
| |
| namespace skgpu { |
| |
| DEF_TEST(SwizzleInvertTest, r) { |
| struct { |
| const char* fTest; |
| const char* fExpectedInverse; |
| bool fTrueInverse; |
| } kSwizzleTests[] = { |
| // These are true inverses since they use each of r,g,b,a exactly once |
| {.fTest="rgba", .fExpectedInverse="rgba", .fTrueInverse=true}, |
| {.fTest="bgra", .fExpectedInverse="bgra", .fTrueInverse=true}, |
| {.fTest="garb", .fExpectedInverse="brag", .fTrueInverse=true}, |
| {.fTest="argb", .fExpectedInverse="gbar", .fTrueInverse=true}, |
| {.fTest="abgr", .fExpectedInverse="abgr", .fTrueInverse=true}, |
| // These are true inverses because the channels with constants are not referenced by the |
| // other channels being swizzled |
| {.fTest="000r", .fExpectedInverse="a001", .fTrueInverse=true}, |
| {.fTest="rgb1", .fExpectedInverse="rgb1", .fTrueInverse=true}, |
| {.fTest="bgr1", .fExpectedInverse="bgr1", .fTrueInverse=true}, |
| // These are not true inverses because not every channel is used, and the missing channels |
| // are not set to a constant 0 or 1 |
| {.fTest="rrr1", .fExpectedInverse="r001", .fTrueInverse=false}, |
| {.fTest="rrra", .fExpectedInverse="r00a", .fTrueInverse=false}, |
| // This tests that a non-default constant is preserved if the channel is not in conflict |
| // with any other swizzle component (e.g. B=1, but nothing references 'b' in rr11 so |
| // preserve B=1 instead of falling back to the default B=0. At the same time, the inverse |
| // G = 0 because had set it to 'r' and nothing references 'g' to provide another value). |
| {.fTest="rr11", .fExpectedInverse="r011", .fTrueInverse=false}, |
| // This one is subtle, because both a000 and a001 map to 000r, but 000r maps back to a001 |
| {.fTest="a000", .fExpectedInverse="000r", .fTrueInverse=false}, |
| }; |
| |
| for (auto t : kSwizzleTests) { |
| Swizzle actualInverse = Swizzle(t.fTest).invert(); |
| REPORTER_ASSERT(r, Swizzle(actualInverse) == Swizzle(t.fExpectedInverse), |
| "Expected inverse(%s) == %s, but was %s", |
| t.fTest, t.fExpectedInverse, actualInverse.asString().c_str()); |
| if (t.fTrueInverse) { |
| // For a true inverse, the inverse of the inverse should be the original |
| Swizzle original = actualInverse.invert(); |
| REPORTER_ASSERT(r, Swizzle(t.fTest) == original, |
| "Expected inverse(inverse(%s)) == inverse(%s) == %s, but was %s", |
| t.fTest, actualInverse.asString().c_str(), t.fTest, |
| original.asString().c_str()); |
| } |
| } |
| } |
| |
| } // namespace skgpu |