Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(852)

Side by Side Diff: src/gpu/GrBlend.cpp

Issue 1334293003: Create fragment processor for performing input color blend with child processor (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: working Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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 "GrBlend.h"
9
10 /**
11 * MaskedColor is used to evaluate the color and valid color component flags thr ough the
12 * blending equation. Could possibly extend this to be used more broadly.
13 */
14 class MaskedColor {
15 public:
16 MaskedColor(GrColor color, GrColorComponentFlags flags)
17 : fColor(color)
18 , fFlags(flags) {}
19
20 MaskedColor() {}
21
22 void set(GrColor color, GrColorComponentFlags flags) {
23 fColor = color;
24 fFlags = flags;
25 }
26
27 static MaskedColor Invert(const MaskedColor& in) {
28 return MaskedColor(GrInvertColor(in.fColor), in.fFlags);
29 }
30
31 static MaskedColor ExtractAlpha(const MaskedColor& in) {
32 GrColorComponentFlags flags = (in.fFlags & kA_GrColorComponentFlag) ?
33 kRGBA_GrColorComponentFlags : kNone_GrColorComponentFlags;
34 return MaskedColor(GrColorPackA4(GrColorUnpackA(in.fColor)), flags);
35 }
36
37 static MaskedColor ExtractInverseAlpha(const MaskedColor& in) {
38 GrColorComponentFlags flags = (in.fFlags & kA_GrColorComponentFlag) ?
39 kRGBA_GrColorComponentFlags : kNone_GrColorComponentFlags;
40 return MaskedColor(GrColorPackA4(0xFF - GrColorUnpackA(in.fColor)), flag s);
41 }
42
43 static MaskedColor Mul(const MaskedColor& a, const MaskedColor& b) {
44 GrColorComponentFlags outFlags = (a.fFlags & b.fFlags) | a.componentsWit hValue(0) |
45 b.componentsWithValue(0);
46 return MaskedColor(GrColorMul(a.fColor, b.fColor), outFlags);
47 }
48
49 static MaskedColor SatAdd(const MaskedColor& a, const MaskedColor& b) {
50 GrColorComponentFlags outFlags = (a.fFlags & b.fFlags) | a.componentsWit hValue(0xFF) |
51 b.componentsWithValue(0xFF);
52 return MaskedColor(GrColorSatAdd(a.fColor, b.fColor), outFlags);
53 }
54
55 GrColor color() const { return fColor; }
56
57 GrColorComponentFlags validFlags () const { return fFlags; }
58
59 private:
60 GrColorComponentFlags componentsWithValue(unsigned value) const {
61 GrColorComponentFlags flags = kNone_GrColorComponentFlags;
62 if ((kR_GrColorComponentFlag & fFlags) && value == GrColorUnpackR(fColor )) {
63 flags |= kR_GrColorComponentFlag;
64 }
65 if ((kG_GrColorComponentFlag & fFlags) && value == GrColorUnpackG(fColor )) {
66 flags |= kG_GrColorComponentFlag;
67 }
68 if ((kB_GrColorComponentFlag & fFlags) && value == GrColorUnpackB(fColor )) {
69 flags |= kB_GrColorComponentFlag;
70 }
71 if ((kA_GrColorComponentFlag & fFlags) && value == GrColorUnpackA(fColor )) {
72 flags |= kA_GrColorComponentFlag;
73 }
74 return flags;
75 }
76
77 GrColor fColor;
78 GrColorComponentFlags fFlags;
79 };
80
81
82 static GrBlendCoeff sub_GrBlendCoeff_dst_with_src(GrBlendCoeff coeff) {
83 switch (coeff) {
84 case kDC_GrBlendCoeff:
85 return kSC_GrBlendCoeff;
86 case kIDC_GrBlendCoeff:
87 return kISC_GrBlendCoeff;
88 case kDA_GrBlendCoeff:
89 return kSA_GrBlendCoeff;
90 case kIDA_GrBlendCoeff:
91 return kISA_GrBlendCoeff;
92 default:
93 return coeff;
94 }
95 }
96
97 static GrBlendCoeff sub_GrBlendCoeff_src_with_dst(GrBlendCoeff coeff) {
98 switch (coeff) {
99 case kSC_GrBlendCoeff:
100 return kDC_GrBlendCoeff;
101 case kISC_GrBlendCoeff:
102 return kIDC_GrBlendCoeff;
103 case kSA_GrBlendCoeff:
104 return kDA_GrBlendCoeff;
105 case kISA_GrBlendCoeff:
106 return kIDA_GrBlendCoeff;
107 default:
108 return coeff;
109 }
110 }
111
112 static MaskedColor get_term(GrBlendCoeff coeff, const MaskedColor& src, const Ma skedColor& dst,
113 const MaskedColor& value) {
114 switch (coeff) {
115 case kZero_GrBlendCoeff:
116 return MaskedColor(0, kRGBA_GrColorComponentFlags);
117 case kOne_GrBlendCoeff:
118 return value;
119 case kDC_GrBlendCoeff:
120 return MaskedColor::Mul(dst, value);
121 case kIDC_GrBlendCoeff:
122 return MaskedColor::Mul(MaskedColor::Invert(dst), value);
123 case kDA_GrBlendCoeff:
124 return MaskedColor::Mul(MaskedColor::ExtractAlpha(dst), value);
125 case kIDA_GrBlendCoeff:
126 return MaskedColor::Mul(MaskedColor::ExtractInverseAlpha(dst), value );
127 case kSC_GrBlendCoeff:
128 return MaskedColor::Mul(src, value);
129 case kISC_GrBlendCoeff:
130 return MaskedColor::Mul(MaskedColor::Invert(src), value);
131 case kSA_GrBlendCoeff:
132 return MaskedColor::Mul(MaskedColor::ExtractAlpha(src), value);
133 case kISA_GrBlendCoeff:
134 return MaskedColor::Mul(MaskedColor::ExtractInverseAlpha(src), value );
135 }
136 SkFAIL("Illegal coefficient");
137 return MaskedColor();
138 }
139
140 void GrGetCoeffBlendKnownComponents(GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff ,
141 GrColor srcColor, GrColorComponentFlags srcC olorFlags,
142 GrColor dstColor, GrColorComponentFlags dstC olorFlags,
143 GrColor* outColor,
144 GrColorComponentFlags* outFlags) {
145 MaskedColor src(srcColor, srcColorFlags);
146 MaskedColor dst(dstColor, dstColorFlags);
147
148 MaskedColor srcTerm = get_term(srcCoeff, src, dst, src);
149 MaskedColor dstTerm = get_term(dstCoeff, src, dst, dst);
150
151 MaskedColor output = MaskedColor::SatAdd(srcTerm, dstTerm);
152 *outColor = output.color();
153 *outFlags = output.validFlags();
154 }
155
156 bool coeff_refs_src(GrBlendCoeff coeff) {
157 switch (coeff) {
158 case kSC_GrBlendCoeff:
159 case kISC_GrBlendCoeff:
160 case kSA_GrBlendCoeff:
161 case kISA_GrBlendCoeff:
162 return true;
163 default:
164 return false;
165 }
166 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698