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

Side by Side Diff: src/effects/SkArithmeticMode.cpp

Issue 204543006: New option for arithmetic mode (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Added background texture check Created 6 years, 8 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
« no previous file with comments | « include/effects/SkArithmeticMode.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkArithmeticMode.h" 8 #include "SkArithmeticMode.h"
9 #include "SkColorPriv.h" 9 #include "SkColorPriv.h"
10 #include "SkReadBuffer.h" 10 #include "SkReadBuffer.h"
11 #include "SkWriteBuffer.h" 11 #include "SkWriteBuffer.h"
12 #include "SkString.h" 12 #include "SkString.h"
13 #include "SkUnPreMultiply.h" 13 #include "SkUnPreMultiply.h"
14 #if SK_SUPPORT_GPU 14 #if SK_SUPPORT_GPU
15 #include "GrContext.h" 15 #include "GrContext.h"
16 #include "GrCoordTransform.h" 16 #include "GrCoordTransform.h"
17 #include "gl/GrGLEffect.h" 17 #include "gl/GrGLEffect.h"
18 #include "GrTBackendEffectFactory.h" 18 #include "GrTBackendEffectFactory.h"
19 #endif 19 #endif
20 20
21 static const bool gUseUnpremul = false; 21 static const bool gUseUnpremul = false;
22 22
23 class SkArithmeticMode_scalar : public SkXfermode { 23 class SkArithmeticMode_scalar : public SkXfermode {
24 public: 24 public:
25 static SkArithmeticMode_scalar* Create(SkScalar k1, SkScalar k2, SkScalar k3 , SkScalar k4) { 25 static SkArithmeticMode_scalar* Create(SkScalar k1, SkScalar k2, SkScalar k3 , SkScalar k4,
26 return SkNEW_ARGS(SkArithmeticMode_scalar, (k1, k2, k3, k4)); 26 bool enforcePMColor) {
27 return SkNEW_ARGS(SkArithmeticMode_scalar, (k1, k2, k3, k4, enforcePMCol or));
27 } 28 }
28 29
29 virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count, 30 virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
30 const SkAlpha aa[]) const SK_OVERRIDE; 31 const SkAlpha aa[]) const SK_OVERRIDE;
31 32
32 SK_TO_STRING_OVERRIDE() 33 SK_TO_STRING_OVERRIDE()
33 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkArithmeticMode_scalar) 34 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkArithmeticMode_scalar)
34 35
35 #if SK_SUPPORT_GPU 36 #if SK_SUPPORT_GPU
36 virtual bool asNewEffect(GrEffectRef** effect, GrTexture* background) const SK_OVERRIDE; 37 virtual bool asNewEffect(GrEffectRef** effect, GrTexture* background) const SK_OVERRIDE;
37 #endif 38 #endif
38 39
39 private: 40 private:
40 SkArithmeticMode_scalar(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4) { 41 SkArithmeticMode_scalar(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4, bool enforcePMColor) {
41 fK[0] = k1; 42 fK[0] = k1;
42 fK[1] = k2; 43 fK[1] = k2;
43 fK[2] = k3; 44 fK[2] = k3;
44 fK[3] = k4; 45 fK[3] = k4;
46 fEnforcePMColor = enforcePMColor;
45 } 47 }
46 48
47 SkArithmeticMode_scalar(SkReadBuffer& buffer) : INHERITED(buffer) { 49 SkArithmeticMode_scalar(SkReadBuffer& buffer) : INHERITED(buffer) {
48 fK[0] = buffer.readScalar(); 50 fK[0] = buffer.readScalar();
49 fK[1] = buffer.readScalar(); 51 fK[1] = buffer.readScalar();
50 fK[2] = buffer.readScalar(); 52 fK[2] = buffer.readScalar();
51 fK[3] = buffer.readScalar(); 53 fK[3] = buffer.readScalar();
54 fEnforcePMColor = buffer.readBool();
52 } 55 }
53 56
54 virtual void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE { 57 virtual void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE {
55 INHERITED::flatten(buffer); 58 INHERITED::flatten(buffer);
56 buffer.writeScalar(fK[0]); 59 buffer.writeScalar(fK[0]);
57 buffer.writeScalar(fK[1]); 60 buffer.writeScalar(fK[1]);
58 buffer.writeScalar(fK[2]); 61 buffer.writeScalar(fK[2]);
59 buffer.writeScalar(fK[3]); 62 buffer.writeScalar(fK[3]);
63 buffer.writeBool(fEnforcePMColor);
60 } 64 }
61 SkScalar fK[4]; 65 SkScalar fK[4];
66 bool fEnforcePMColor;
62 67
63 typedef SkXfermode INHERITED; 68 typedef SkXfermode INHERITED;
64 }; 69 };
65 70
66 static int pinToByte(int value) { 71 static int pinToByte(int value) {
67 if (value < 0) { 72 if (value < 0) {
68 value = 0; 73 value = 0;
69 } else if (value > 255) { 74 } else if (value > 255) {
70 value = 255; 75 value = 255;
71 } 76 }
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 } 143 }
139 144
140 a = arith(k1, k2, k3, k4, sa, da); 145 a = arith(k1, k2, k3, k4, sa, da);
141 r = arith(k1, k2, k3, k4, sr, dr); 146 r = arith(k1, k2, k3, k4, sr, dr);
142 g = arith(k1, k2, k3, k4, sg, dg); 147 g = arith(k1, k2, k3, k4, sg, dg);
143 b = arith(k1, k2, k3, k4, sb, db); 148 b = arith(k1, k2, k3, k4, sb, db);
144 } 149 }
145 } else { 150 } else {
146 a = arith(k1, k2, k3, k4, SkGetPackedA32(sc), SkGetPackedA32(dc) ); 151 a = arith(k1, k2, k3, k4, SkGetPackedA32(sc), SkGetPackedA32(dc) );
147 r = arith(k1, k2, k3, k4, SkGetPackedR32(sc), SkGetPackedR32(dc) ); 152 r = arith(k1, k2, k3, k4, SkGetPackedR32(sc), SkGetPackedR32(dc) );
148 r = SkMin32(r, a);
149 g = arith(k1, k2, k3, k4, SkGetPackedG32(sc), SkGetPackedG32(dc) ); 153 g = arith(k1, k2, k3, k4, SkGetPackedG32(sc), SkGetPackedG32(dc) );
150 g = SkMin32(g, a);
151 b = arith(k1, k2, k3, k4, SkGetPackedB32(sc), SkGetPackedB32(dc) ); 154 b = arith(k1, k2, k3, k4, SkGetPackedB32(sc), SkGetPackedB32(dc) );
152 b = SkMin32(b, a); 155 if (fEnforcePMColor) {
156 r = SkMin32(r, a);
157 g = SkMin32(g, a);
158 b = SkMin32(b, a);
159 }
153 } 160 }
154 161
155 // apply antialias coverage if necessary 162 // apply antialias coverage if necessary
156 if (aaCoverage && 0xFF != aaCoverage[i]) { 163 if (aaCoverage && 0xFF != aaCoverage[i]) {
157 int scale = aaCoverage[i] + (aaCoverage[i] >> 7); 164 int scale = aaCoverage[i] + (aaCoverage[i] >> 7);
158 a = blend(a, SkGetPackedA32(sc), scale); 165 a = blend(a, SkGetPackedA32(sc), scale);
159 r = blend(r, SkGetPackedR32(sc), scale); 166 r = blend(r, SkGetPackedR32(sc), scale);
160 g = blend(g, SkGetPackedG32(sc), scale); 167 g = blend(g, SkGetPackedG32(sc), scale);
161 b = blend(b, SkGetPackedB32(sc), scale); 168 b = blend(b, SkGetPackedB32(sc), scale);
162 } 169 }
163 170
164 // turn the result back into premul 171 // turn the result back into premul
165 if (gUseUnpremul && (0xFF != a)) { 172 if (gUseUnpremul && (0xFF != a)) {
166 int scale = a + (a >> 7); 173 int scale = a + (a >> 7);
167 r = SkAlphaMul(r, scale); 174 r = SkAlphaMul(r, scale);
168 g = SkAlphaMul(g, scale); 175 g = SkAlphaMul(g, scale);
169 b = SkAlphaMul(b, scale); 176 b = SkAlphaMul(b, scale);
170 } 177 }
171 dst[i] = SkPackARGB32(a, r, g, b); 178 dst[i] = fEnforcePMColor ? SkPackARGB32(a, r, g, b) : SkPackARGB32No Check(a, r, g, b);
172 } 179 }
173 } 180 }
174 } 181 }
175 182
176 #ifndef SK_IGNORE_TO_STRING 183 #ifndef SK_IGNORE_TO_STRING
177 void SkArithmeticMode_scalar::toString(SkString* str) const { 184 void SkArithmeticMode_scalar::toString(SkString* str) const {
178 str->append("SkArithmeticMode_scalar: "); 185 str->append("SkArithmeticMode_scalar: ");
179 for (int i = 0; i < 4; ++i) { 186 for (int i = 0; i < 4; ++i) {
180 str->appendScalar(fK[i]); 187 str->appendScalar(fK[i]);
181 if (i < 3) { 188 str->append(" ");
182 str->append(" ");
183 }
184 } 189 }
190 str->appendS32(fEnforcePMColor ? 1 : 0);
185 } 191 }
186 #endif 192 #endif
187 193
188 /////////////////////////////////////////////////////////////////////////////// 194 ///////////////////////////////////////////////////////////////////////////////
189 195
190 static bool fitsInBits(SkScalar x, int bits) { 196 static bool fitsInBits(SkScalar x, int bits) {
191 return SkScalarAbs(x) < (1 << (bits - 1)); 197 return SkScalarAbs(x) < (1 << (bits - 1));
192 } 198 }
193 199
194 #if 0 // UNUSED 200 #if 0 // UNUSED
195 static int32_t toDot8(SkScalar x) { 201 static int32_t toDot8(SkScalar x) {
196 return (int32_t)(x * 256); 202 return (int32_t)(x * 256);
197 } 203 }
198 #endif 204 #endif
199 205
200 SkXfermode* SkArithmeticMode::Create(SkScalar k1, SkScalar k2, 206 SkXfermode* SkArithmeticMode::Create(SkScalar k1, SkScalar k2,
201 SkScalar k3, SkScalar k4) { 207 SkScalar k3, SkScalar k4,
208 bool enforcePMColor) {
202 if (fitsInBits(k1, 8) && fitsInBits(k2, 16) && 209 if (fitsInBits(k1, 8) && fitsInBits(k2, 16) &&
203 fitsInBits(k2, 16) && fitsInBits(k2, 24)) { 210 fitsInBits(k2, 16) && fitsInBits(k2, 24)) {
204 211
205 #if 0 // UNUSED 212 #if 0 // UNUSED
206 int32_t i1 = toDot8(k1); 213 int32_t i1 = toDot8(k1);
207 int32_t i2 = toDot8(k2); 214 int32_t i2 = toDot8(k2);
208 int32_t i3 = toDot8(k3); 215 int32_t i3 = toDot8(k3);
209 int32_t i4 = toDot8(k4); 216 int32_t i4 = toDot8(k4);
210 if (i1) { 217 if (i1) {
211 return SkNEW_ARGS(SkArithmeticMode_quad, (i1, i2, i3, i4)); 218 return SkNEW_ARGS(SkArithmeticMode_quad, (i1, i2, i3, i4));
212 } 219 }
213 if (0 == i2) { 220 if (0 == i2) {
214 return SkNEW_ARGS(SkArithmeticMode_dst, (i3, i4)); 221 return SkNEW_ARGS(SkArithmeticMode_dst, (i3, i4));
215 } 222 }
216 if (0 == i3) { 223 if (0 == i3) {
217 return SkNEW_ARGS(SkArithmeticMode_src, (i2, i4)); 224 return SkNEW_ARGS(SkArithmeticMode_src, (i2, i4));
218 } 225 }
219 return SkNEW_ARGS(SkArithmeticMode_linear, (i2, i3, i4)); 226 return SkNEW_ARGS(SkArithmeticMode_linear, (i2, i3, i4));
220 #endif 227 #endif
221 } 228 }
222 return SkArithmeticMode_scalar::Create(k1, k2, k3, k4); 229 return SkArithmeticMode_scalar::Create(k1, k2, k3, k4, enforcePMColor);
223 } 230 }
224 231
225 232
226 ////////////////////////////////////////////////////////////////////////////// 233 //////////////////////////////////////////////////////////////////////////////
227 234
228 #if SK_SUPPORT_GPU 235 #if SK_SUPPORT_GPU
229 236
230 class GrGLArithmeticEffect : public GrGLEffect { 237 class GrGLArithmeticEffect : public GrGLEffect {
231 public: 238 public:
232 GrGLArithmeticEffect(const GrBackendEffectFactory&, const GrDrawEffect&); 239 GrGLArithmeticEffect(const GrBackendEffectFactory&, const GrDrawEffect&);
233 virtual ~GrGLArithmeticEffect(); 240 virtual ~GrGLArithmeticEffect();
234 241
235 virtual void emitCode(GrGLShaderBuilder*, 242 virtual void emitCode(GrGLShaderBuilder*,
236 const GrDrawEffect&, 243 const GrDrawEffect&,
237 EffectKey, 244 EffectKey,
238 const char* outputColor, 245 const char* outputColor,
239 const char* inputColor, 246 const char* inputColor,
240 const TransformedCoordsArray&, 247 const TransformedCoordsArray&,
241 const TextureSamplerArray&) SK_OVERRIDE; 248 const TextureSamplerArray&) SK_OVERRIDE;
242 249
243 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER RIDE; 250 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER RIDE;
244 251
252 static EffectKey GenKey(const GrDrawEffect&, const GrGLCaps& caps);
253
245 private: 254 private:
246 GrGLUniformManager::UniformHandle fKUni; 255 GrGLUniformManager::UniformHandle fKUni;
256 bool fEnforcePMColor;
247 257
248 typedef GrGLEffect INHERITED; 258 typedef GrGLEffect INHERITED;
249 }; 259 };
250 260
251 /////////////////////////////////////////////////////////////////////////////// 261 ///////////////////////////////////////////////////////////////////////////////
252 262
253 class GrArithmeticEffect : public GrEffect { 263 class GrArithmeticEffect : public GrEffect {
254 public: 264 public:
255 static GrEffectRef* Create(float k1, float k2, float k3, float k4, GrTexture * background) { 265 static GrEffectRef* Create(float k1, float k2, float k3, float k4, bool enfo rcePMColor,
256 AutoEffectUnref effect(SkNEW_ARGS(GrArithmeticEffect, (k1, k2, k3, k4, b ackground))); 266 GrTexture* background) {
267 AutoEffectUnref effect(SkNEW_ARGS(GrArithmeticEffect, (k1, k2, k3, k4, e nforcePMColor,
268 background)));
257 return CreateEffectRef(effect); 269 return CreateEffectRef(effect);
258 } 270 }
259 271
260 virtual ~GrArithmeticEffect(); 272 virtual ~GrArithmeticEffect();
261 273
262 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; 274 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
263 275
264 typedef GrGLArithmeticEffect GLEffect; 276 typedef GrGLArithmeticEffect GLEffect;
265 static const char* Name() { return "Arithmetic"; } 277 static const char* Name() { return "Arithmetic"; }
266 GrTexture* backgroundTexture() const { return fBackgroundAccess.getTexture() ; } 278 GrTexture* backgroundTexture() const { return fBackgroundAccess.getTexture() ; }
267 279
268 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags ) const SK_OVERRIDE; 280 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags ) const SK_OVERRIDE;
269 281
270 float k1() const { return fK1; } 282 float k1() const { return fK1; }
271 float k2() const { return fK2; } 283 float k2() const { return fK2; }
272 float k3() const { return fK3; } 284 float k3() const { return fK3; }
273 float k4() const { return fK4; } 285 float k4() const { return fK4; }
286 bool enforcePMColor() const { return fEnforcePMColor; }
274 287
275 private: 288 private:
276 virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; 289 virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE;
277 290
278 GrArithmeticEffect(float k1, float k2, float k3, float k4, GrTexture* backgr ound); 291 GrArithmeticEffect(float k1, float k2, float k3, float k4, bool enforcePMCol or,
292 GrTexture* background);
279 float fK1, fK2, fK3, fK4; 293 float fK1, fK2, fK3, fK4;
294 bool fEnforcePMColor;
280 GrCoordTransform fBackgroundTransform; 295 GrCoordTransform fBackgroundTransform;
281 GrTextureAccess fBackgroundAccess; 296 GrTextureAccess fBackgroundAccess;
282 297
283 GR_DECLARE_EFFECT_TEST; 298 GR_DECLARE_EFFECT_TEST;
284 typedef GrEffect INHERITED; 299 typedef GrEffect INHERITED;
285 300
286 }; 301 };
287 302
288 /////////////////////////////////////////////////////////////////////////////// 303 ///////////////////////////////////////////////////////////////////////////////
289 304
290 GrArithmeticEffect::GrArithmeticEffect(float k1, float k2, float k3, float k4, 305 GrArithmeticEffect::GrArithmeticEffect(float k1, float k2, float k3, float k4,
291 GrTexture* background) 306 bool enforcePMColor, GrTexture* backgroun d)
292 : fK1(k1), fK2(k2), fK3(k3), fK4(k4) { 307 : fK1(k1), fK2(k2), fK3(k3), fK4(k4), fEnforcePMColor(enforcePMColor) {
293 if (background) { 308 if (background) {
294 fBackgroundTransform.reset(kLocal_GrCoordSet, background); 309 fBackgroundTransform.reset(kLocal_GrCoordSet, background);
295 this->addCoordTransform(&fBackgroundTransform); 310 this->addCoordTransform(&fBackgroundTransform);
296 fBackgroundAccess.reset(background); 311 fBackgroundAccess.reset(background);
297 this->addTextureAccess(&fBackgroundAccess); 312 this->addTextureAccess(&fBackgroundAccess);
298 } else { 313 } else {
299 this->setWillReadDstColor(); 314 this->setWillReadDstColor();
300 } 315 }
301 } 316 }
302 317
303 GrArithmeticEffect::~GrArithmeticEffect() { 318 GrArithmeticEffect::~GrArithmeticEffect() {
304 } 319 }
305 320
306 bool GrArithmeticEffect::onIsEqual(const GrEffect& sBase) const { 321 bool GrArithmeticEffect::onIsEqual(const GrEffect& sBase) const {
307 const GrArithmeticEffect& s = CastEffect<GrArithmeticEffect>(sBase); 322 const GrArithmeticEffect& s = CastEffect<GrArithmeticEffect>(sBase);
308 return fK1 == s.fK1 && 323 return fK1 == s.fK1 &&
309 fK2 == s.fK2 && 324 fK2 == s.fK2 &&
310 fK3 == s.fK3 && 325 fK3 == s.fK3 &&
311 fK4 == s.fK4 && 326 fK4 == s.fK4 &&
327 fEnforcePMColor == s.fEnforcePMColor &&
312 backgroundTexture() == s.backgroundTexture(); 328 backgroundTexture() == s.backgroundTexture();
313 } 329 }
314 330
315 const GrBackendEffectFactory& GrArithmeticEffect::getFactory() const { 331 const GrBackendEffectFactory& GrArithmeticEffect::getFactory() const {
316 return GrTBackendEffectFactory<GrArithmeticEffect>::getInstance(); 332 return GrTBackendEffectFactory<GrArithmeticEffect>::getInstance();
317 } 333 }
318 334
319 void GrArithmeticEffect::getConstantColorComponents(GrColor* color, uint32_t* va lidFlags) const { 335 void GrArithmeticEffect::getConstantColorComponents(GrColor* color, uint32_t* va lidFlags) const {
320 // TODO: optimize this 336 // TODO: optimize this
321 *validFlags = 0; 337 *validFlags = 0;
322 } 338 }
323 339
324 /////////////////////////////////////////////////////////////////////////////// 340 ///////////////////////////////////////////////////////////////////////////////
325 341
326 GrGLArithmeticEffect::GrGLArithmeticEffect(const GrBackendEffectFactory& factory , 342 GrGLArithmeticEffect::GrGLArithmeticEffect(const GrBackendEffectFactory& factory ,
327 const GrDrawEffect& drawEffect) 343 const GrDrawEffect& drawEffect)
328 : INHERITED(factory) { 344 : INHERITED(factory),
345 fEnforcePMColor(true) {
329 } 346 }
330 347
331 GrGLArithmeticEffect::~GrGLArithmeticEffect() { 348 GrGLArithmeticEffect::~GrGLArithmeticEffect() {
332 } 349 }
333 350
334 void GrGLArithmeticEffect::emitCode(GrGLShaderBuilder* builder, 351 void GrGLArithmeticEffect::emitCode(GrGLShaderBuilder* builder,
335 const GrDrawEffect& drawEffect, 352 const GrDrawEffect& drawEffect,
336 EffectKey key, 353 EffectKey key,
337 const char* outputColor, 354 const char* outputColor,
338 const char* inputColor, 355 const char* inputColor,
(...skipping 28 matching lines...) Expand all
367 384
368 builder->fsCodeAppendf("\t\tvec4 dst = %s;\n", dstColor); 385 builder->fsCodeAppendf("\t\tvec4 dst = %s;\n", dstColor);
369 if (gUseUnpremul) { 386 if (gUseUnpremul) {
370 builder->fsCodeAppendf("\t\tdst.rgb = clamp(dst.rgb / dst.a, 0.0, 1.0);\ n"); 387 builder->fsCodeAppendf("\t\tdst.rgb = clamp(dst.rgb / dst.a, 0.0, 1.0);\ n");
371 } 388 }
372 389
373 builder->fsCodeAppendf("\t\t%s = %s.x * src * dst + %s.y * src + %s.z * dst + %s.w;\n", outputColor, kUni, kUni, kUni, kUni); 390 builder->fsCodeAppendf("\t\t%s = %s.x * src * dst + %s.y * src + %s.z * dst + %s.w;\n", outputColor, kUni, kUni, kUni, kUni);
374 builder->fsCodeAppendf("\t\t%s = clamp(%s, 0.0, 1.0);\n", outputColor, outpu tColor); 391 builder->fsCodeAppendf("\t\t%s = clamp(%s, 0.0, 1.0);\n", outputColor, outpu tColor);
375 if (gUseUnpremul) { 392 if (gUseUnpremul) {
376 builder->fsCodeAppendf("\t\t%s.rgb *= %s.a;\n", outputColor, outputColor ); 393 builder->fsCodeAppendf("\t\t%s.rgb *= %s.a;\n", outputColor, outputColor );
377 } else { 394 } else if (fEnforcePMColor) {
378 builder->fsCodeAppendf("\t\t%s.rgb = min(%s.rgb, %s.a);\n", outputColor, outputColor, outputColor); 395 builder->fsCodeAppendf("\t\t%s.rgb = min(%s.rgb, %s.a);\n", outputColor, outputColor, outputColor);
379 } 396 }
380 } 397 }
381 398
382 void GrGLArithmeticEffect::setData(const GrGLUniformManager& uman, const GrDrawE ffect& drawEffect) { 399 void GrGLArithmeticEffect::setData(const GrGLUniformManager& uman, const GrDrawE ffect& drawEffect) {
383 const GrArithmeticEffect& arith = drawEffect.castEffect<GrArithmeticEffect>( ); 400 const GrArithmeticEffect& arith = drawEffect.castEffect<GrArithmeticEffect>( );
384 uman.set4f(fKUni, arith.k1(), arith.k2(), arith.k3(), arith.k4()); 401 uman.set4f(fKUni, arith.k1(), arith.k2(), arith.k3(), arith.k4());
402 fEnforcePMColor = arith.enforcePMColor();
403 }
404
405 GrGLEffect::EffectKey GrGLArithmeticEffect::GenKey(const GrDrawEffect& drawEffec t,
406 const GrGLCaps&) {
407 const GrArithmeticEffect& arith = drawEffect.castEffect<GrArithmeticEffect>( );
408 EffectKey key = arith.enforcePMColor() ? 1 : 0;
409 if (arith.backgroundTexture()) {
410 key |= 2;
411 }
412 return key;
385 } 413 }
386 414
387 GrEffectRef* GrArithmeticEffect::TestCreate(SkRandom* rand, 415 GrEffectRef* GrArithmeticEffect::TestCreate(SkRandom* rand,
388 GrContext*, 416 GrContext*,
389 const GrDrawTargetCaps&, 417 const GrDrawTargetCaps&,
390 GrTexture*[]) { 418 GrTexture*[]) {
391 float k1 = rand->nextF(); 419 float k1 = rand->nextF();
392 float k2 = rand->nextF(); 420 float k2 = rand->nextF();
393 float k3 = rand->nextF(); 421 float k3 = rand->nextF();
394 float k4 = rand->nextF(); 422 float k4 = rand->nextF();
423 bool enforcePMColor = rand->nextBool();
395 424
396 AutoEffectUnref gEffect(SkNEW_ARGS(GrArithmeticEffect, (k1, k2, k3, k4, NULL ))); 425 AutoEffectUnref gEffect(SkNEW_ARGS(GrArithmeticEffect,
426 (k1, k2, k3, k4, enforcePMColor, NULL)));
397 return CreateEffectRef(gEffect); 427 return CreateEffectRef(gEffect);
398 } 428 }
399 429
400 GR_DEFINE_EFFECT_TEST(GrArithmeticEffect); 430 GR_DEFINE_EFFECT_TEST(GrArithmeticEffect);
401 431
402 bool SkArithmeticMode_scalar::asNewEffect(GrEffectRef** effect, GrTexture* backg round) const { 432 bool SkArithmeticMode_scalar::asNewEffect(GrEffectRef** effect, GrTexture* backg round) const {
403 if (effect) { 433 if (effect) {
404 *effect = GrArithmeticEffect::Create(SkScalarToFloat(fK[0]), 434 *effect = GrArithmeticEffect::Create(SkScalarToFloat(fK[0]),
405 SkScalarToFloat(fK[1]), 435 SkScalarToFloat(fK[1]),
406 SkScalarToFloat(fK[2]), 436 SkScalarToFloat(fK[2]),
407 SkScalarToFloat(fK[3]), 437 SkScalarToFloat(fK[3]),
438 fEnforcePMColor,
408 background); 439 background);
409 } 440 }
410 return true; 441 return true;
411 } 442 }
412 443
413 #endif 444 #endif
414 445
415 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkArithmeticMode) 446 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkArithmeticMode)
416 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkArithmeticMode_scalar) 447 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkArithmeticMode_scalar)
417 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 448 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW
« no previous file with comments | « include/effects/SkArithmeticMode.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698