blob: 80e855b897452a8299b6fa641dd33341c49830b5 [file] [log] [blame]
Ethan Nicholas130fb3f2018-02-01 12:14:34 -05001/*
2 * Copyright 2018 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
Ethan Nicholase9d172a2017-11-20 12:12:24 -05008enum class InputMode {
9 kIgnore,
10 kModulateRGBA,
11 kModulateA,
12
13 kLast = kModulateA
14};
15
Michael Ludwiga4275592018-08-31 10:52:47 -040016layout(ctype=GrColor4f, tracked) in uniform half4 color;
Ethan Nicholase9d172a2017-11-20 12:12:24 -050017layout(key) in InputMode mode;
18
19@optimizationFlags {
20 OptFlags(color, mode)
21}
22
23void main() {
24 @switch (mode) {
25 case InputMode::kIgnore:
Michael Ludwiga4275592018-08-31 10:52:47 -040026 sk_OutColor = color;
Ethan Nicholase9d172a2017-11-20 12:12:24 -050027 break;
28 case InputMode::kModulateRGBA:
Michael Ludwiga4275592018-08-31 10:52:47 -040029 sk_OutColor = sk_InColor * color;
Ethan Nicholase9d172a2017-11-20 12:12:24 -050030 break;
31 case InputMode::kModulateA:
Michael Ludwiga4275592018-08-31 10:52:47 -040032 sk_OutColor = sk_InColor.a * color;
Ethan Nicholase9d172a2017-11-20 12:12:24 -050033 break;
34 }
35}
36
Ethan Nicholase9d172a2017-11-20 12:12:24 -050037@class {
38 static const int kInputModeCnt = (int) InputMode::kLast + 1;
39
40 static OptimizationFlags OptFlags(GrColor4f color, InputMode mode) {
41 OptimizationFlags flags = kConstantOutputForConstantInput_OptimizationFlag;
42 if (mode != InputMode::kIgnore) {
43 flags |= kCompatibleWithCoverageAsAlpha_OptimizationFlag;
44 }
45 if (color.isOpaque()) {
46 flags |= kPreservesOpaqueInput_OptimizationFlag;
47 }
48 return flags;
49 }
50
51 GrColor4f constantOutputForConstantInput(GrColor4f input) const override {
52 switch (fMode) {
53 case InputMode::kIgnore:
54 return fColor;
55 case InputMode::kModulateA:
56 return fColor.mulByScalar(input.fRGBA[3]);
57 case InputMode::kModulateRGBA:
58 return fColor.modulate(input);
59 }
60 SK_ABORT("Unexpected mode");
61 return GrColor4f::TransparentBlack();
62 }
63}
64
65@test(d) {
66 GrColor4f color;
67 int colorPicker = d->fRandom->nextULessThan(3);
68 switch (colorPicker) {
69 case 0: {
70 uint32_t a = d->fRandom->nextULessThan(0x100);
71 uint32_t r = d->fRandom->nextULessThan(a+1);
72 uint32_t g = d->fRandom->nextULessThan(a+1);
73 uint32_t b = d->fRandom->nextULessThan(a+1);
74 color = GrColor4f::FromGrColor(GrColorPackRGBA(r, g, b, a));
75 break;
76 }
77 case 1:
78 color = GrColor4f::TransparentBlack();
79 break;
80 case 2:
81 uint32_t c = d->fRandom->nextULessThan(0x100);
82 color = GrColor4f::FromGrColor(c | (c << 8) | (c << 16) | (c << 24));
83 break;
84 }
85 InputMode mode = static_cast<InputMode>(d->fRandom->nextULessThan(kInputModeCnt));
86 return GrConstColorProcessor::Make(color, mode);
Michael Ludwiga4275592018-08-31 10:52:47 -040087}