OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #ifndef GrPaint_DEFINED | 10 #ifndef GrPaint_DEFINED |
11 #define GrPaint_DEFINED | 11 #define GrPaint_DEFINED |
12 | 12 |
13 #include "GrColor.h" | 13 #include "GrColor.h" |
14 #include "GrEffectStage.h" | 14 #include "GrProcessorStage.h" |
15 | 15 |
16 #include "SkXfermode.h" | 16 #include "SkXfermode.h" |
17 | 17 |
18 /** | 18 /** |
19 * The paint describes how color and coverage are computed at each pixel by GrCo
ntext draw | 19 * The paint describes how color and coverage are computed at each pixel by GrCo
ntext draw |
20 * functions and the how color is blended with the destination pixel. | 20 * functions and the how color is blended with the destination pixel. |
21 * | 21 * |
22 * The paint allows installation of custom color and coverage stages. New types
of stages are | 22 * The paint allows installation of custom color and coverage stages. New types
of stages are |
23 * created by subclassing GrEffect. | 23 * created by subclassing GrProcessor. |
24 * | 24 * |
25 * The primitive color computation starts with the color specified by setColor()
. This color is the | 25 * The primitive color computation starts with the color specified by setColor()
. This color is the |
26 * input to the first color stage. Each color stage feeds its output to the next
color stage. The | 26 * input to the first color stage. Each color stage feeds its output to the next
color stage. The |
27 * final color stage's output color is input to the color filter specified by | 27 * final color stage's output color is input to the color filter specified by |
28 * setXfermodeColorFilter which produces the final source color, S. | 28 * setXfermodeColorFilter which produces the final source color, S. |
29 * | 29 * |
30 * Fractional pixel coverage follows a similar flow. The coverage is initially t
he value specified | 30 * Fractional pixel coverage follows a similar flow. The coverage is initially t
he value specified |
31 * by setCoverage(). This is input to the first coverage stage. Coverage stages
are chained | 31 * by setCoverage(). This is input to the first coverage stage. Coverage stages
are chained |
32 * together in the same manner as color stages. The output of the last stage is
modulated by any | 32 * together in the same manner as color stages. The output of the last stage is
modulated by any |
33 * fractional coverage produced by anti-aliasing. This last step produces the fi
nal coverage, C. | 33 * fractional coverage produced by anti-aliasing. This last step produces the fi
nal coverage, C. |
34 * | 34 * |
35 * setBlendFunc() specifies blending coefficients for S (described above) and D,
the initial value | 35 * setBlendFunc() specifies blending coefficients for S (described above) and D,
the initial value |
36 * of the destination pixel, labeled Bs and Bd respectively. The final value of
the destination | 36 * of the destination pixel, labeled Bs and Bd respectively. The final value of
the destination |
37 * pixel is then D' = (1-C)*D + C*(Bd*D + Bs*S). | 37 * pixel is then D' = (1-C)*D + C*(Bd*D + Bs*S). |
38 * | 38 * |
39 * Note that the coverage is applied after the blend. This is why they are compu
ted as distinct | 39 * Note that the coverage is applied after the blend. This is why they are compu
ted as distinct |
40 * values. | 40 * values. |
41 * | 41 * |
42 * TODO: Encapsulate setXfermodeColorFilter in a GrEffect and remove from GrPain
t. | 42 * TODO: Encapsulate setXfermodeColorFilter in a GrProcessor and remove from GrP
aint. |
43 */ | 43 */ |
44 class GrPaint { | 44 class GrPaint { |
45 public: | 45 public: |
46 GrPaint() { this->reset(); } | 46 GrPaint() { this->reset(); } |
47 | 47 |
48 GrPaint(const GrPaint& paint) { *this = paint; } | 48 GrPaint(const GrPaint& paint) { *this = paint; } |
49 | 49 |
50 ~GrPaint() {} | 50 ~GrPaint() {} |
51 | 51 |
52 /** | 52 /** |
(...skipping 25 matching lines...) Expand all Loading... |
78 void setAntiAlias(bool aa) { fAntiAlias = aa; } | 78 void setAntiAlias(bool aa) { fAntiAlias = aa; } |
79 bool isAntiAlias() const { return fAntiAlias; } | 79 bool isAntiAlias() const { return fAntiAlias; } |
80 | 80 |
81 /** | 81 /** |
82 * Should dithering be applied. Defaults to false. | 82 * Should dithering be applied. Defaults to false. |
83 */ | 83 */ |
84 void setDither(bool dither) { fDither = dither; } | 84 void setDither(bool dither) { fDither = dither; } |
85 bool isDither() const { return fDither; } | 85 bool isDither() const { return fDither; } |
86 | 86 |
87 /** | 87 /** |
88 * Appends an additional color effect to the color computation. | 88 * Appends an additional color processor to the color computation. |
89 */ | 89 */ |
90 const GrEffect* addColorEffect(const GrEffect* effect) { | 90 const GrFragmentProcessor* addColorProcessor(const GrFragmentProcessor* fp)
{ |
91 SkASSERT(effect); | 91 SkASSERT(fp); |
92 SkASSERT(!effect->requiresVertexShader()); | 92 if (!fp->willUseInputColor()) { |
93 if (!effect->willUseInputColor()) { | |
94 fColorStages.reset(); | 93 fColorStages.reset(); |
95 } | 94 } |
96 SkNEW_APPEND_TO_TARRAY(&fColorStages, GrEffectStage, (effect)); | 95 SkNEW_APPEND_TO_TARRAY(&fColorStages, GrProcessorStage, (fp)); |
97 return effect; | 96 return fp; |
98 } | 97 } |
99 | 98 |
100 /** | 99 /** |
101 * Appends an additional coverage effect to the coverage computation. | 100 * Appends an additional coverage processor to the coverage computation. |
102 */ | 101 */ |
103 const GrEffect* addCoverageEffect(const GrEffect* effect) { | 102 const GrFragmentProcessor* addCoverageProcessor(const GrFragmentProcessor* f
p) { |
104 SkASSERT(effect); | 103 SkASSERT(fp); |
105 SkASSERT(!effect->requiresVertexShader()); | 104 if (!fp->willUseInputColor()) { |
106 if (!effect->willUseInputColor()) { | |
107 fCoverageStages.reset(); | 105 fCoverageStages.reset(); |
108 } | 106 } |
109 SkNEW_APPEND_TO_TARRAY(&fCoverageStages, GrEffectStage, (effect)); | 107 SkNEW_APPEND_TO_TARRAY(&fCoverageStages, GrProcessorStage, (fp)); |
110 return effect; | 108 return fp; |
111 } | 109 } |
112 | 110 |
113 /** | 111 /** |
114 * Helpers for adding color or coverage effects that sample a texture. The m
atrix is applied | 112 * Helpers for adding color or coverage effects that sample a texture. The m
atrix is applied |
115 * to the src space position to compute texture coordinates. | 113 * to the src space position to compute texture coordinates. |
116 */ | 114 */ |
117 void addColorTextureEffect(GrTexture* texture, const SkMatrix& matrix); | 115 void addColorTextureProcessor(GrTexture*, const SkMatrix&); |
118 void addCoverageTextureEffect(GrTexture* texture, const SkMatrix& matrix); | 116 void addCoverageTextureProcessor(GrTexture*, const SkMatrix&); |
119 | 117 void addColorTextureProcessor(GrTexture*, const SkMatrix&, const GrTexturePa
rams&); |
120 void addColorTextureEffect(GrTexture* texture, | 118 void addCoverageTextureProcessor(GrTexture*, const SkMatrix&, const GrTextur
eParams&); |
121 const SkMatrix& matrix, | |
122 const GrTextureParams& params); | |
123 void addCoverageTextureEffect(GrTexture* texture, | |
124 const SkMatrix& matrix, | |
125 const GrTextureParams& params); | |
126 | 119 |
127 int numColorStages() const { return fColorStages.count(); } | 120 int numColorStages() const { return fColorStages.count(); } |
128 int numCoverageStages() const { return fCoverageStages.count(); } | 121 int numCoverageStages() const { return fCoverageStages.count(); } |
129 int numTotalStages() const { return this->numColorStages() + this->numCovera
geStages(); } | 122 int numTotalStages() const { return this->numColorStages() + this->numCovera
geStages(); } |
130 | 123 |
131 const GrEffectStage& getColorStage(int s) const { return fColorStages[s]; } | 124 const GrFragmentStage& getColorStage(int s) const { return fColorStages[s];
} |
132 const GrEffectStage& getCoverageStage(int s) const { return fCoverageStages[
s]; } | 125 const GrFragmentStage& getCoverageStage(int s) const { return fCoverageStage
s[s]; } |
133 | 126 |
134 GrPaint& operator=(const GrPaint& paint) { | 127 GrPaint& operator=(const GrPaint& paint) { |
135 fSrcBlendCoeff = paint.fSrcBlendCoeff; | 128 fSrcBlendCoeff = paint.fSrcBlendCoeff; |
136 fDstBlendCoeff = paint.fDstBlendCoeff; | 129 fDstBlendCoeff = paint.fDstBlendCoeff; |
137 fAntiAlias = paint.fAntiAlias; | 130 fAntiAlias = paint.fAntiAlias; |
138 fDither = paint.fDither; | 131 fDither = paint.fDither; |
139 | 132 |
140 fColor = paint.fColor; | 133 fColor = paint.fColor; |
141 fCoverage = paint.fCoverage; | 134 fCoverage = paint.fCoverage; |
142 | 135 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 computed = true; | 204 computed = true; |
212 } | 205 } |
213 fCoverageStages[i].localCoordChange(oldToNew); | 206 fCoverageStages[i].localCoordChange(oldToNew); |
214 } | 207 } |
215 return true; | 208 return true; |
216 } | 209 } |
217 | 210 |
218 friend class GrContext; // To access above two functions | 211 friend class GrContext; // To access above two functions |
219 friend class GrStencilAndCoverTextContext; // To access above two functions | 212 friend class GrStencilAndCoverTextContext; // To access above two functions |
220 | 213 |
221 SkSTArray<4, GrEffectStage> fColorStages; | 214 SkSTArray<4, GrFragmentStage> fColorStages; |
222 SkSTArray<2, GrEffectStage> fCoverageStages; | 215 SkSTArray<2, GrFragmentStage> fCoverageStages; |
223 | 216 |
224 GrBlendCoeff fSrcBlendCoeff; | 217 GrBlendCoeff fSrcBlendCoeff; |
225 GrBlendCoeff fDstBlendCoeff; | 218 GrBlendCoeff fDstBlendCoeff; |
226 bool fAntiAlias; | 219 bool fAntiAlias; |
227 bool fDither; | 220 bool fDither; |
228 | 221 |
229 GrColor fColor; | 222 GrColor fColor; |
230 uint8_t fCoverage; | 223 uint8_t fCoverage; |
231 | 224 |
232 void resetBlend() { | 225 void resetBlend() { |
(...skipping 14 matching lines...) Expand all Loading... |
247 fCoverage = 0xff; | 240 fCoverage = 0xff; |
248 } | 241 } |
249 | 242 |
250 void resetStages() { | 243 void resetStages() { |
251 fColorStages.reset(); | 244 fColorStages.reset(); |
252 fCoverageStages.reset(); | 245 fCoverageStages.reset(); |
253 } | 246 } |
254 }; | 247 }; |
255 | 248 |
256 #endif | 249 #endif |
OLD | NEW |