1 /*
2 * Copyright 2015 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 "Test.h"
9
10 #if SK_SUPPORT_GPU
11
12 #include "GrBlend.h"
13 #include "SkGr.h"
14 #include "SkRandom.h"
15
GrColorToSkPMColor(GrColor c)16 static inline SkPMColor GrColorToSkPMColor(GrColor c) {
17 GrColorIsPMAssert(c);
18 return SkPackARGB32(GrColorUnpackA(c), GrColorUnpackR(c), GrColorUnpackG(c), GrColorUnpackB(c));
19 }
20
SkPMColorToGrColor(SkPMColor c)21 static inline GrColor SkPMColorToGrColor(SkPMColor c) {
22 return GrColorPackRGBA(SkGetPackedR32(c), SkGetPackedG32(c), SkGetPackedB32(c),
23 SkGetPackedA32(c));
24 }
25
make_baseline_color(GrColor src,GrColor dst,const SkXfermode * xm)26 static GrColor make_baseline_color(GrColor src, GrColor dst, const SkXfermode* xm) {
27 SkPMColor skSrc = GrColorToSkPMColor(src);
28 SkPMColor skDst = GrColorToSkPMColor(dst);
29 if (xm) {
30 xm->xfer32(&skDst, &skSrc, 1, nullptr);
31 } else {
32 // null means src-over
33 skDst = SkPMSrcOver(skSrc, skDst);
34 }
35 return SkPMColorToGrColor(skDst);
36 }
37
DEF_TEST(GrGetCoeffBlendKnownComponents,reporter)38 DEF_TEST(GrGetCoeffBlendKnownComponents, reporter) {
39 SkRandom random;
40 for (int i = 0; i < SkXfermode::kLastCoeffMode; ++i) {
41 SkXfermode::Mode mode = (SkXfermode::Mode)i;
42 auto xm(SkXfermode::Make(mode));
43 SkXfermode::Coeff srcCoeff, dstCoeff;
44 SkAssertResult(SkXfermode::ModeAsCoeff(mode, &srcCoeff, &dstCoeff));
45 for (int j = 0; j < 1000; ++j) {
46 GrColor src = GrPremulColor(random.nextU());
47 GrColor dst = GrPremulColor(random.nextU());
48 GrColor outColor;
49 GrColorComponentFlags outFlags;
50 GrGetCoeffBlendKnownComponents(SkXfermodeCoeffToGrBlendCoeff(srcCoeff),
51 SkXfermodeCoeffToGrBlendCoeff(dstCoeff),
52 src, kRGBA_GrColorComponentFlags,
53 dst, kRGBA_GrColorComponentFlags,
54 &outColor, &outFlags);
55 GrColor baselineColor = make_baseline_color(src, dst, xm.get());
56 if (SkAbs32(GrColorUnpackA(baselineColor) - GrColorUnpackA(outColor)) > 1 ||
57 SkAbs32(GrColorUnpackR(baselineColor) - GrColorUnpackR(outColor)) > 1 ||
58 SkAbs32(GrColorUnpackG(baselineColor) - GrColorUnpackG(outColor)) > 1 ||
59 SkAbs32(GrColorUnpackB(baselineColor) - GrColorUnpackB(outColor)) > 1) {
60 ERRORF(reporter, "Blended color is 0x%08x, expected 0x%08x", outColor,
61 baselineColor);
62 }
63 GrColorIsPMAssert(outColor);
64 }
65 }
66 GrColor outColor;
67 GrColorComponentFlags outFlags;
68 GrGetCoeffBlendKnownComponents(kZero_GrBlendCoeff, kZero_GrBlendCoeff,
69 0xFFFFFFFF, kNone_GrColorComponentFlags,
70 0xFFFFFFFF, kNone_GrColorComponentFlags,
71 &outColor, &outFlags);
72 REPORTER_ASSERT(reporter, GrColor_TRANSPARENT_BLACK == outColor &&
73 kRGBA_GrColorComponentFlags == outFlags);
74 GrGetCoeffBlendKnownComponents(
75 kOne_GrBlendCoeff, kOne_GrBlendCoeff,
76 0x80FF0100, (kG_GrColorComponentFlag | kB_GrColorComponentFlag | kA_GrColorComponentFlag),
77 0x7F00FFFF, (kR_GrColorComponentFlag | kG_GrColorComponentFlag | kA_GrColorComponentFlag),
78 &outColor, &outFlags);
79 REPORTER_ASSERT(reporter, GrColor_WHITE == outColor && kRGBA_GrColorComponentFlags == outFlags);
80
81 GrGetCoeffBlendKnownComponents(
82 kOne_GrBlendCoeff, kISA_GrBlendCoeff,
83 0x0000000, kRGBA_GrColorComponentFlags,
84 0x80010203, kRGBA_GrColorComponentFlags,
85 &outColor, &outFlags);
86 REPORTER_ASSERT(reporter, 0x80010203 == outColor && kRGBA_GrColorComponentFlags == outFlags);
87
88 GrGetCoeffBlendKnownComponents(kZero_GrBlendCoeff, kISA_GrBlendCoeff,
89 0x0000000, kA_GrColorComponentFlag,
90 0x80010203, kRGBA_GrColorComponentFlags,
91 &outColor, &outFlags);
92 REPORTER_ASSERT(reporter, 0x80010203 == outColor && kRGBA_GrColorComponentFlags == outFlags);
93
94 GrGetCoeffBlendKnownComponents(
95 kIDC_GrBlendCoeff, kSC_GrBlendCoeff,
96 0x0, kNone_GrColorComponentFlags,
97 0x0, kRGBA_GrColorComponentFlags,
98 &outColor, &outFlags);
99 REPORTER_ASSERT(reporter, kNone_GrColorComponentFlags == outFlags);
100
101 GrGetCoeffBlendKnownComponents(
102 kOne_GrBlendCoeff, kISA_GrBlendCoeff,
103 0xFF808080, (kG_GrColorComponentFlag | kB_GrColorComponentFlag | kA_GrColorComponentFlag),
104 0xFF606060, kRGBA_GrColorComponentFlags,
105 &outColor, &outFlags);
106 REPORTER_ASSERT(reporter,
107 (kG_GrColorComponentFlag | kB_GrColorComponentFlag | kA_GrColorComponentFlag) == outFlags &&
108 (outColor & 0xFFFFFF00) == 0xFF808000);
109 }
110
111 #endif
112