blob: 53bd09e2512fd3b6e921470dda951ad880c08111 [file] [log] [blame]
bsalomonae4738f2015-09-15 15:33:27 -07001/*
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"
bsalomonae4738f2015-09-15 15:33:27 -070014#include "SkRandom.h"
bsalomonae4738f2015-09-15 15:33:27 -070015
Brian Osman3b655982017-03-07 16:58:08 -050016static inline SkPMColor GrColorToSkPMColor(GrColor c) {
17 GrColorIsPMAssert(c);
18 return SkPackARGB32(GrColorUnpackA(c), GrColorUnpackR(c), GrColorUnpackG(c), GrColorUnpackB(c));
19}
20
21static inline GrColor SkPMColorToGrColor(SkPMColor c) {
22 return GrColorPackRGBA(SkGetPackedR32(c), SkGetPackedG32(c), SkGetPackedB32(c),
23 SkGetPackedA32(c));
24}
25
bsalomonae4738f2015-09-15 15:33:27 -070026static 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
38DEF_TEST(GrGetCoeffBlendKnownComponents, reporter) {
39 SkRandom random;
40 for (int i = 0; i < SkXfermode::kLastCoeffMode; ++i) {
41 SkXfermode::Mode mode = (SkXfermode::Mode)i;
reedcfb6bdf2016-03-29 11:32:50 -070042 auto xm(SkXfermode::Make(mode));
bsalomonae4738f2015-09-15 15:33:27 -070043 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);
reedcfb6bdf2016-03-29 11:32:50 -070055 GrColor baselineColor = make_baseline_color(src, dst, xm.get());
bsalomonae4738f2015-09-15 15:33:27 -070056 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