• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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