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

Side by Side Diff: src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp

Issue 571163002: removing GrDrawEffect (Closed) Base URL: https://skia.googlesource.com/skia.git@gp3
Patch Set: rebase Created 6 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
1 1
2 /* 2 /*
3 * Copyright 2014 Google Inc. 3 * Copyright 2014 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 #include "SkTwoPointConicalGradient_gpu.h" 9 #include "SkTwoPointConicalGradient_gpu.h"
10 10
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 74
75 // The radial gradient parameters can collapse to a linear (instead of quadr atic) equation. 75 // The radial gradient parameters can collapse to a linear (instead of quadr atic) equation.
76 SkScalar center() const { return fCenterX1; } 76 SkScalar center() const { return fCenterX1; }
77 SkScalar diffRadius() const { return fDiffRadius; } 77 SkScalar diffRadius() const { return fDiffRadius; }
78 SkScalar radius() const { return fRadius0; } 78 SkScalar radius() const { return fRadius0; }
79 79
80 typedef GLEdge2PtConicalEffect GLEffect; 80 typedef GLEdge2PtConicalEffect GLEffect;
81 81
82 private: 82 private:
83 virtual bool onIsEqual(const GrEffect& sBase) const SK_OVERRIDE { 83 virtual bool onIsEqual(const GrEffect& sBase) const SK_OVERRIDE {
84 const Edge2PtConicalEffect& s = CastEffect<Edge2PtConicalEffect>(sBase); 84 const Edge2PtConicalEffect& s = GrEffect::CastEffect<Edge2PtConicalEffec t>(sBase);
85 return (INHERITED::onIsEqual(sBase) && 85 return (INHERITED::onIsEqual(sBase) &&
86 this->fCenterX1 == s.fCenterX1 && 86 this->fCenterX1 == s.fCenterX1 &&
87 this->fRadius0 == s.fRadius0 && 87 this->fRadius0 == s.fRadius0 &&
88 this->fDiffRadius == s.fDiffRadius); 88 this->fDiffRadius == s.fDiffRadius);
89 } 89 }
90 90
91 Edge2PtConicalEffect(GrContext* ctx, 91 Edge2PtConicalEffect(GrContext* ctx,
92 const SkTwoPointConicalGradient& shader, 92 const SkTwoPointConicalGradient& shader,
93 const SkMatrix& matrix, 93 const SkMatrix& matrix,
94 SkShader::TileMode tm) 94 SkShader::TileMode tm)
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 SkScalar fRadius0; 127 SkScalar fRadius0;
128 SkScalar fDiffRadius; 128 SkScalar fDiffRadius;
129 129
130 // @} 130 // @}
131 131
132 typedef GrGradientEffect INHERITED; 132 typedef GrGradientEffect INHERITED;
133 }; 133 };
134 134
135 class GLEdge2PtConicalEffect : public GrGLGradientEffect { 135 class GLEdge2PtConicalEffect : public GrGLGradientEffect {
136 public: 136 public:
137 GLEdge2PtConicalEffect(const GrBackendEffectFactory& factory, const GrDrawEf fect&); 137 GLEdge2PtConicalEffect(const GrBackendEffectFactory& factory, const GrEffect &);
138 virtual ~GLEdge2PtConicalEffect() { } 138 virtual ~GLEdge2PtConicalEffect() { }
139 139
140 virtual void emitCode(GrGLProgramBuilder*, 140 virtual void emitCode(GrGLProgramBuilder*,
141 const GrDrawEffect&, 141 const GrEffect&,
142 const GrEffectKey&, 142 const GrEffectKey&,
143 const char* outputColor, 143 const char* outputColor,
144 const char* inputColor, 144 const char* inputColor,
145 const TransformedCoordsArray&, 145 const TransformedCoordsArray&,
146 const TextureSamplerArray&) SK_OVERRIDE; 146 const TextureSamplerArray&) SK_OVERRIDE;
147 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE; 147 virtual void setData(const GrGLProgramDataManager&, const GrEffect&) SK_OVER RIDE;
148 148
149 static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBui lder* b); 149 static void GenKey(const GrEffect&, const GrGLCaps& caps, GrEffectKeyBuilder * b);
150 150
151 protected: 151 protected:
152 UniformHandle fParamUni; 152 UniformHandle fParamUni;
153 153
154 const char* fVSVaryingName; 154 const char* fVSVaryingName;
155 const char* fFSVaryingName; 155 const char* fFSVaryingName;
156 156
157 // @{ 157 // @{
158 /// Values last uploaded as uniforms 158 /// Values last uploaded as uniforms
159 159
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 colors , stops, colorCount, 203 colors , stops, colorCount,
204 tm)); 204 tm));
205 SkPaint paint; 205 SkPaint paint;
206 GrEffect* effect; 206 GrEffect* effect;
207 GrColor paintColor; 207 GrColor paintColor;
208 SkAssertResult(shader->asNewEffect(context, paint, NULL, &paintColor, &effec t)); 208 SkAssertResult(shader->asNewEffect(context, paint, NULL, &paintColor, &effec t));
209 return effect; 209 return effect;
210 } 210 }
211 211
212 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrBackendEffectFactory& fac tory, 212 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrBackendEffectFactory& fac tory,
213 const GrDrawEffect& drawEffect) 213 const GrEffect& effect)
214 : INHERITED(factory) 214 : INHERITED(factory)
215 , fVSVaryingName(NULL) 215 , fVSVaryingName(NULL)
216 , fFSVaryingName(NULL) 216 , fFSVaryingName(NULL)
217 , fCachedRadius(-SK_ScalarMax) 217 , fCachedRadius(-SK_ScalarMax)
218 , fCachedDiffRadius(-SK_ScalarMax) {} 218 , fCachedDiffRadius(-SK_ScalarMax) {}
219 219
220 void GLEdge2PtConicalEffect::emitCode(GrGLProgramBuilder* builder, 220 void GLEdge2PtConicalEffect::emitCode(GrGLProgramBuilder* builder,
221 const GrDrawEffect&, 221 const GrEffect&,
222 const GrEffectKey& key, 222 const GrEffectKey& key,
223 const char* outputColor, 223 const char* outputColor,
224 const char* inputColor, 224 const char* inputColor,
225 const TransformedCoordsArray& coords, 225 const TransformedCoordsArray& coords,
226 const TextureSamplerArray& samplers) { 226 const TextureSamplerArray& samplers) {
227 uint32_t baseKey = key.get32(0); 227 uint32_t baseKey = key.get32(0);
228 this->emitUniforms(builder, baseKey); 228 this->emitUniforms(builder, baseKey);
229 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit y, 229 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit y,
230 kFloat_GrSLType, "Conical2FSParams", 3) ; 230 kFloat_GrSLType, "Conical2FSParams", 3) ;
231 231
232 SkString cName("c"); 232 SkString cName("c");
233 SkString tName("t"); 233 SkString tName("t");
234 SkString p0; // start radius 234 SkString p0; // start radius
235 SkString p1; // start radius squared 235 SkString p1; // start radius squared
236 SkString p2; // difference in radii (r1 - r0) 236 SkString p2; // difference in radii (r1 - r0)
237 237
238 builder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); 238 builder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0);
239 builder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); 239 builder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1);
240 builder->getUniformVariable(fParamUni).appendArrayAccess(2, &p2); 240 builder->getUniformVariable(fParamUni).appendArrayAccess(2, &p2);
241 241
242 // We interpolate the linear component in coords[1]. 242 // We interpolate the linear component in coords[1].
243 SkASSERT(coords[0].type() == coords[1].type()); 243 SkASSERT(coords[0].type() == coords[1].type());
244 const char* coords2D; 244 const char* coords2D;
245 SkString bVar; 245 SkString bVar;
246 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 246 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
247 if (kVec3f_GrSLType == coords[0].type()) { 247 if (kVec3f_GrSLType == coords[0].type()) {
248 fsBuilder->codeAppendf("\tvec3 interpolants = vec3(%s.xy / %s.z, %s.x / %s.z);\n", 248 fsBuilder->codeAppendf("\tvec3 interpolants = vec3(%s.xy / %s.z, %s.x / %s.z);\n",
249 coords[0].c_str(), coords[0].c_str(), coords[1].c _str(), coords[1].c_str()); 249 coords[0].c_str(), coords[0].c_str(), coords[1].c _str(),
250 coords[1].c_str());
250 coords2D = "interpolants.xy"; 251 coords2D = "interpolants.xy";
251 bVar = "interpolants.z"; 252 bVar = "interpolants.z";
252 } else { 253 } else {
253 coords2D = coords[0].c_str(); 254 coords2D = coords[0].c_str();
254 bVar.printf("%s.x", coords[1].c_str()); 255 bVar.printf("%s.x", coords[1].c_str());
255 } 256 }
256 257
257 // output will default to transparent black (we simply won't write anything 258 // output will default to transparent black (we simply won't write anything
258 // else to it if invalid, instead of discarding or returning prematurely) 259 // else to it if invalid, instead of discarding or returning prematurely)
259 fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor); 260 fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor);
260 261
261 // c = (x^2)+(y^2) - params[1] 262 // c = (x^2)+(y^2) - params[1]
262 fsBuilder->codeAppendf("\tfloat %s = dot(%s, %s) - %s;\n", 263 fsBuilder->codeAppendf("\tfloat %s = dot(%s, %s) - %s;\n",
263 cName.c_str(), coords2D, coords2D, p1.c_str()); 264 cName.c_str(), coords2D, coords2D, p1.c_str());
264 265
265 // linear case: t = -c/b 266 // linear case: t = -c/b
266 fsBuilder->codeAppendf("\tfloat %s = -(%s / %s);\n", tName.c_str(), 267 fsBuilder->codeAppendf("\tfloat %s = -(%s / %s);\n", tName.c_str(),
267 cName.c_str(), bVar.c_str()); 268 cName.c_str(), bVar.c_str());
268 269
269 // if r(t) > 0, then t will be the x coordinate 270 // if r(t) > 0, then t will be the x coordinate
270 fsBuilder->codeAppendf("\tif (%s * %s + %s > 0.0) {\n", tName.c_str(), 271 fsBuilder->codeAppendf("\tif (%s * %s + %s > 0.0) {\n", tName.c_str(),
271 p2.c_str(), p0.c_str()); 272 p2.c_str(), p0.c_str());
272 fsBuilder->codeAppend("\t"); 273 fsBuilder->codeAppend("\t");
273 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers); 274 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers);
274 fsBuilder->codeAppend("\t}\n"); 275 fsBuilder->codeAppend("\t}\n");
275 } 276 }
276 277
277 void GLEdge2PtConicalEffect::setData(const GrGLProgramDataManager& pdman, 278 void GLEdge2PtConicalEffect::setData(const GrGLProgramDataManager& pdman,
278 const GrDrawEffect& drawEffect) { 279 const GrEffect& effect) {
279 INHERITED::setData(pdman, drawEffect); 280 INHERITED::setData(pdman, effect);
280 const Edge2PtConicalEffect& data = drawEffect.castEffect<Edge2PtConicalEffec t>(); 281 const Edge2PtConicalEffect& data = GrEffect::CastEffect<Edge2PtConicalEffect >(effect);
281 SkScalar radius0 = data.radius(); 282 SkScalar radius0 = data.radius();
282 SkScalar diffRadius = data.diffRadius(); 283 SkScalar diffRadius = data.diffRadius();
283 284
284 if (fCachedRadius != radius0 || 285 if (fCachedRadius != radius0 ||
285 fCachedDiffRadius != diffRadius) { 286 fCachedDiffRadius != diffRadius) {
286 287
287 float values[3] = { 288 float values[3] = {
288 SkScalarToFloat(radius0), 289 SkScalarToFloat(radius0),
289 SkScalarToFloat(SkScalarMul(radius0, radius0)), 290 SkScalarToFloat(SkScalarMul(radius0, radius0)),
290 SkScalarToFloat(diffRadius) 291 SkScalarToFloat(diffRadius)
291 }; 292 };
292 293
293 pdman.set1fv(fParamUni, 3, values); 294 pdman.set1fv(fParamUni, 3, values);
294 fCachedRadius = radius0; 295 fCachedRadius = radius0;
295 fCachedDiffRadius = diffRadius; 296 fCachedDiffRadius = diffRadius;
296 } 297 }
297 } 298 }
298 299
299 void GLEdge2PtConicalEffect::GenKey(const GrDrawEffect& drawEffect, 300 void GLEdge2PtConicalEffect::GenKey(const GrEffect& effect,
300 const GrGLCaps&, GrEffectKeyBuilder* b) { 301 const GrGLCaps&, GrEffectKeyBuilder* b) {
301 b->add32(GenBaseGradientKey(drawEffect)); 302 b->add32(GenBaseGradientKey(effect));
302 } 303 }
303 304
304 ////////////////////////////////////////////////////////////////////////////// 305 //////////////////////////////////////////////////////////////////////////////
305 // Focal Conical Gradients 306 // Focal Conical Gradients
306 ////////////////////////////////////////////////////////////////////////////// 307 //////////////////////////////////////////////////////////////////////////////
307 308
308 static ConicalType set_matrix_focal_conical(const SkTwoPointConicalGradient& sha der, 309 static ConicalType set_matrix_focal_conical(const SkTwoPointConicalGradient& sha der,
309 SkMatrix* invLMatrix, SkScalar* foca lX) { 310 SkMatrix* invLMatrix, SkScalar* foca lX) {
310 // Inverse of the current local matrix is passed in then, 311 // Inverse of the current local matrix is passed in then,
311 // translate, scale, and rotate such that endCircle is unit circle on x-axis , 312 // translate, scale, and rotate such that endCircle is unit circle on x-axis ,
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 static const char* Name() { return "Two-Point Conical Gradient Focal Outside "; } 382 static const char* Name() { return "Two-Point Conical Gradient Focal Outside "; }
382 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; 383 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
383 384
384 bool isFlipped() const { return fIsFlipped; } 385 bool isFlipped() const { return fIsFlipped; }
385 SkScalar focal() const { return fFocalX; } 386 SkScalar focal() const { return fFocalX; }
386 387
387 typedef GLFocalOutside2PtConicalEffect GLEffect; 388 typedef GLFocalOutside2PtConicalEffect GLEffect;
388 389
389 private: 390 private:
390 virtual bool onIsEqual(const GrEffect& sBase) const SK_OVERRIDE { 391 virtual bool onIsEqual(const GrEffect& sBase) const SK_OVERRIDE {
391 const FocalOutside2PtConicalEffect& s = CastEffect<FocalOutside2PtConica lEffect>(sBase); 392 const FocalOutside2PtConicalEffect& s =
393 GrEffect::CastEffect<FocalOutside2PtConicalEffect>(sBase);
392 return (INHERITED::onIsEqual(sBase) && 394 return (INHERITED::onIsEqual(sBase) &&
393 this->fFocalX == s.fFocalX && 395 this->fFocalX == s.fFocalX &&
394 this->fIsFlipped == s.fIsFlipped); 396 this->fIsFlipped == s.fIsFlipped);
395 } 397 }
396 398
397 FocalOutside2PtConicalEffect(GrContext* ctx, 399 FocalOutside2PtConicalEffect(GrContext* ctx,
398 const SkTwoPointConicalGradient& shader, 400 const SkTwoPointConicalGradient& shader,
399 const SkMatrix& matrix, 401 const SkMatrix& matrix,
400 SkShader::TileMode tm, 402 SkShader::TileMode tm,
401 SkScalar focalX) 403 SkScalar focalX)
402 : INHERITED(ctx, shader, matrix, tm), fFocalX(focalX), fIsFlipped(shader.isF lippedGrad()) {} 404 : INHERITED(ctx, shader, matrix, tm), fFocalX(focalX), fIsFlipped(shader.isF lippedGrad()) {}
403 405
404 GR_DECLARE_EFFECT_TEST; 406 GR_DECLARE_EFFECT_TEST;
405 407
406 SkScalar fFocalX; 408 SkScalar fFocalX;
407 bool fIsFlipped; 409 bool fIsFlipped;
408 410
409 typedef GrGradientEffect INHERITED; 411 typedef GrGradientEffect INHERITED;
410 }; 412 };
411 413
412 class GLFocalOutside2PtConicalEffect : public GrGLGradientEffect { 414 class GLFocalOutside2PtConicalEffect : public GrGLGradientEffect {
413 public: 415 public:
414 GLFocalOutside2PtConicalEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&); 416 GLFocalOutside2PtConicalEffect(const GrBackendEffectFactory& factory, const GrEffect&);
415 virtual ~GLFocalOutside2PtConicalEffect() { } 417 virtual ~GLFocalOutside2PtConicalEffect() { }
416 418
417 virtual void emitCode(GrGLProgramBuilder*, 419 virtual void emitCode(GrGLProgramBuilder*,
418 const GrDrawEffect&, 420 const GrEffect&,
419 const GrEffectKey&, 421 const GrEffectKey&,
420 const char* outputColor, 422 const char* outputColor,
421 const char* inputColor, 423 const char* inputColor,
422 const TransformedCoordsArray&, 424 const TransformedCoordsArray&,
423 const TextureSamplerArray&) SK_OVERRIDE; 425 const TextureSamplerArray&) SK_OVERRIDE;
424 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE; 426 virtual void setData(const GrGLProgramDataManager&, const GrEffect&) SK_OVER RIDE;
425 427
426 static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBui lder* b); 428 static void GenKey(const GrEffect&, const GrGLCaps& caps, GrEffectKeyBuilder * b);
427 429
428 protected: 430 protected:
429 UniformHandle fParamUni; 431 UniformHandle fParamUni;
430 432
431 const char* fVSVaryingName; 433 const char* fVSVaryingName;
432 const char* fFSVaryingName; 434 const char* fFSVaryingName;
433 435
434 bool fIsFlipped; 436 bool fIsFlipped;
435 437
436 // @{ 438 // @{
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 colors , stops, colorCount, 480 colors , stops, colorCount,
479 tm)); 481 tm));
480 SkPaint paint; 482 SkPaint paint;
481 GrEffect* effect; 483 GrEffect* effect;
482 GrColor paintColor; 484 GrColor paintColor;
483 SkAssertResult(shader->asNewEffect(context, paint, NULL, &paintColor, &effec t)); 485 SkAssertResult(shader->asNewEffect(context, paint, NULL, &paintColor, &effec t));
484 return effect; 486 return effect;
485 } 487 }
486 488
487 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrBackendEf fectFactory& factory, 489 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrBackendEf fectFactory& factory,
488 const GrDrawEffec t& drawEffect) 490 const GrEffect& e ffect)
489 : INHERITED(factory) 491 : INHERITED(factory)
490 , fVSVaryingName(NULL) 492 , fVSVaryingName(NULL)
491 , fFSVaryingName(NULL) 493 , fFSVaryingName(NULL)
492 , fCachedFocal(SK_ScalarMax) { 494 , fCachedFocal(SK_ScalarMax) {
493 const FocalOutside2PtConicalEffect& data = drawEffect.castEffect<FocalOutsid e2PtConicalEffect>(); 495 const FocalOutside2PtConicalEffect& data =
496 GrEffect::CastEffect<FocalOutside2PtConicalEffect>(effect);
494 fIsFlipped = data.isFlipped(); 497 fIsFlipped = data.isFlipped();
495 } 498 }
496 499
497 void GLFocalOutside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder, 500 void GLFocalOutside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder,
498 const GrDrawEffect&, 501 const GrEffect&,
499 const GrEffectKey& key, 502 const GrEffectKey& key,
500 const char* outputColor, 503 const char* outputColor,
501 const char* inputColor, 504 const char* inputColor,
502 const TransformedCoordsArray& coor ds, 505 const TransformedCoordsArray& coor ds,
503 const TextureSamplerArray& sampler s) { 506 const TextureSamplerArray& sampler s) {
504 uint32_t baseKey = key.get32(0); 507 uint32_t baseKey = key.get32(0);
505 this->emitUniforms(builder, baseKey); 508 this->emitUniforms(builder, baseKey);
506 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit y, 509 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit y,
507 kFloat_GrSLType, "Conical2FSParams", 2) ; 510 kFloat_GrSLType, "Conical2FSParams", 2) ;
508 SkString tName("t"); 511 SkString tName("t");
(...skipping 28 matching lines...) Expand all
537 coords2D, p0.c_str()); 540 coords2D, p0.c_str());
538 } 541 }
539 542
540 fsBuilder->codeAppendf("\tif (%s >= 0.0 && d >= 0.0) {\n", tName.c_str()); 543 fsBuilder->codeAppendf("\tif (%s >= 0.0 && d >= 0.0) {\n", tName.c_str());
541 fsBuilder->codeAppend("\t\t"); 544 fsBuilder->codeAppend("\t\t");
542 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers); 545 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers);
543 fsBuilder->codeAppend("\t}\n"); 546 fsBuilder->codeAppend("\t}\n");
544 } 547 }
545 548
546 void GLFocalOutside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman , 549 void GLFocalOutside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman ,
547 const GrDrawEffect& drawEffect) { 550 const GrEffect& effect) {
548 INHERITED::setData(pdman, drawEffect); 551 INHERITED::setData(pdman, effect);
549 const FocalOutside2PtConicalEffect& data = drawEffect.castEffect<FocalOutsid e2PtConicalEffect>(); 552 const FocalOutside2PtConicalEffect& data =
553 GrEffect::CastEffect<FocalOutside2PtConicalEffect>(effect);
550 SkASSERT(data.isFlipped() == fIsFlipped); 554 SkASSERT(data.isFlipped() == fIsFlipped);
551 SkScalar focal = data.focal(); 555 SkScalar focal = data.focal();
552 556
553 if (fCachedFocal != focal) { 557 if (fCachedFocal != focal) {
554 SkScalar oneMinus2F = 1.f - SkScalarMul(focal, focal); 558 SkScalar oneMinus2F = 1.f - SkScalarMul(focal, focal);
555 559
556 float values[2] = { 560 float values[2] = {
557 SkScalarToFloat(focal), 561 SkScalarToFloat(focal),
558 SkScalarToFloat(oneMinus2F), 562 SkScalarToFloat(oneMinus2F),
559 }; 563 };
560 564
561 pdman.set1fv(fParamUni, 2, values); 565 pdman.set1fv(fParamUni, 2, values);
562 fCachedFocal = focal; 566 fCachedFocal = focal;
563 } 567 }
564 } 568 }
565 569
566 void GLFocalOutside2PtConicalEffect::GenKey(const GrDrawEffect& drawEffect, 570 void GLFocalOutside2PtConicalEffect::GenKey(const GrEffect& effect,
567 const GrGLCaps&, GrEffectKeyBuilder* b) { 571 const GrGLCaps&, GrEffectKeyBuilder* b) {
568 uint32_t* key = b->add32n(2); 572 uint32_t* key = b->add32n(2);
569 key[0] = GenBaseGradientKey(drawEffect); 573 key[0] = GenBaseGradientKey(effect);
570 key[1] = drawEffect.castEffect<FocalOutside2PtConicalEffect>().isFlipped(); 574 key[1] = GrEffect::CastEffect<FocalOutside2PtConicalEffect>(effect).isFlippe d();
571 } 575 }
572 576
573 ////////////////////////////////////////////////////////////////////////////// 577 //////////////////////////////////////////////////////////////////////////////
574 578
575 class GLFocalInside2PtConicalEffect; 579 class GLFocalInside2PtConicalEffect;
576 580
577 class FocalInside2PtConicalEffect : public GrGradientEffect { 581 class FocalInside2PtConicalEffect : public GrGradientEffect {
578 public: 582 public:
579 583
580 static GrEffect* Create(GrContext* ctx, 584 static GrEffect* Create(GrContext* ctx,
581 const SkTwoPointConicalGradient& shader, 585 const SkTwoPointConicalGradient& shader,
582 const SkMatrix& matrix, 586 const SkMatrix& matrix,
583 SkShader::TileMode tm, 587 SkShader::TileMode tm,
584 SkScalar focalX) { 588 SkScalar focalX) {
585 return SkNEW_ARGS(FocalInside2PtConicalEffect, (ctx, shader, matrix, tm, focalX)); 589 return SkNEW_ARGS(FocalInside2PtConicalEffect, (ctx, shader, matrix, tm, focalX));
586 } 590 }
587 591
588 virtual ~FocalInside2PtConicalEffect() {} 592 virtual ~FocalInside2PtConicalEffect() {}
589 593
590 static const char* Name() { return "Two-Point Conical Gradient Focal Inside" ; } 594 static const char* Name() { return "Two-Point Conical Gradient Focal Inside" ; }
591 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; 595 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
592 596
593 SkScalar focal() const { return fFocalX; } 597 SkScalar focal() const { return fFocalX; }
594 598
595 typedef GLFocalInside2PtConicalEffect GLEffect; 599 typedef GLFocalInside2PtConicalEffect GLEffect;
596 600
597 private: 601 private:
598 virtual bool onIsEqual(const GrEffect& sBase) const SK_OVERRIDE { 602 virtual bool onIsEqual(const GrEffect& sBase) const SK_OVERRIDE {
599 const FocalInside2PtConicalEffect& s = CastEffect<FocalInside2PtConicalE ffect>(sBase); 603 const FocalInside2PtConicalEffect& s =
604 GrEffect::CastEffect<FocalInside2PtConicalEffect>(sBase);
600 return (INHERITED::onIsEqual(sBase) && 605 return (INHERITED::onIsEqual(sBase) &&
601 this->fFocalX == s.fFocalX); 606 this->fFocalX == s.fFocalX);
602 } 607 }
603 608
604 FocalInside2PtConicalEffect(GrContext* ctx, 609 FocalInside2PtConicalEffect(GrContext* ctx,
605 const SkTwoPointConicalGradient& shader, 610 const SkTwoPointConicalGradient& shader,
606 const SkMatrix& matrix, 611 const SkMatrix& matrix,
607 SkShader::TileMode tm, 612 SkShader::TileMode tm,
608 SkScalar focalX) 613 SkScalar focalX)
609 : INHERITED(ctx, shader, matrix, tm), fFocalX(focalX) {} 614 : INHERITED(ctx, shader, matrix, tm), fFocalX(focalX) {}
610 615
611 GR_DECLARE_EFFECT_TEST; 616 GR_DECLARE_EFFECT_TEST;
612 617
613 SkScalar fFocalX; 618 SkScalar fFocalX;
614 619
615 typedef GrGradientEffect INHERITED; 620 typedef GrGradientEffect INHERITED;
616 }; 621 };
617 622
618 class GLFocalInside2PtConicalEffect : public GrGLGradientEffect { 623 class GLFocalInside2PtConicalEffect : public GrGLGradientEffect {
619 public: 624 public:
620 GLFocalInside2PtConicalEffect(const GrBackendEffectFactory& factory, const G rDrawEffect&); 625 GLFocalInside2PtConicalEffect(const GrBackendEffectFactory& factory, const G rEffect&);
621 virtual ~GLFocalInside2PtConicalEffect() {} 626 virtual ~GLFocalInside2PtConicalEffect() {}
622 627
623 virtual void emitCode(GrGLProgramBuilder*, 628 virtual void emitCode(GrGLProgramBuilder*,
624 const GrDrawEffect&, 629 const GrEffect&,
625 const GrEffectKey&, 630 const GrEffectKey&,
626 const char* outputColor, 631 const char* outputColor,
627 const char* inputColor, 632 const char* inputColor,
628 const TransformedCoordsArray&, 633 const TransformedCoordsArray&,
629 const TextureSamplerArray&) SK_OVERRIDE; 634 const TextureSamplerArray&) SK_OVERRIDE;
630 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE; 635 virtual void setData(const GrGLProgramDataManager&, const GrEffect&) SK_OVER RIDE;
631 636
632 static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBui lder* b); 637 static void GenKey(const GrEffect&, const GrGLCaps& caps, GrEffectKeyBuilder * b);
633 638
634 protected: 639 protected:
635 UniformHandle fFocalUni; 640 UniformHandle fFocalUni;
636 641
637 const char* fVSVaryingName; 642 const char* fVSVaryingName;
638 const char* fFSVaryingName; 643 const char* fFSVaryingName;
639 644
640 // @{ 645 // @{
641 /// Values last uploaded as uniforms 646 /// Values last uploaded as uniforms
642 647
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 colors , stops, colorCount, 689 colors , stops, colorCount,
685 tm)); 690 tm));
686 SkPaint paint; 691 SkPaint paint;
687 GrColor paintColor; 692 GrColor paintColor;
688 GrEffect* effect; 693 GrEffect* effect;
689 SkAssertResult(shader->asNewEffect(context, paint, NULL, &paintColor, &effec t)); 694 SkAssertResult(shader->asNewEffect(context, paint, NULL, &paintColor, &effec t));
690 return effect; 695 return effect;
691 } 696 }
692 697
693 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrBackendEffe ctFactory& factory, 698 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrBackendEffe ctFactory& factory,
694 const GrDrawEffect& drawEffect) 699 const GrEffect& eff ect)
695 : INHERITED(factory) 700 : INHERITED(factory)
696 , fVSVaryingName(NULL) 701 , fVSVaryingName(NULL)
697 , fFSVaryingName(NULL) 702 , fFSVaryingName(NULL)
698 , fCachedFocal(SK_ScalarMax) {} 703 , fCachedFocal(SK_ScalarMax) {}
699 704
700 void GLFocalInside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder, 705 void GLFocalInside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder,
701 const GrDrawEffect&, 706 const GrEffect&,
702 const GrEffectKey& key, 707 const GrEffectKey& key,
703 const char* outputColor, 708 const char* outputColor,
704 const char* inputColor, 709 const char* inputColor,
705 const TransformedCoordsArray& coord s, 710 const TransformedCoordsArray& coord s,
706 const TextureSamplerArray& samplers ) { 711 const TextureSamplerArray& samplers ) {
707 uint32_t baseKey = key.get32(0); 712 uint32_t baseKey = key.get32(0);
708 this->emitUniforms(builder, baseKey); 713 this->emitUniforms(builder, baseKey);
709 fFocalUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 714 fFocalUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
710 kFloat_GrSLType, "Conical2FSParams"); 715 kFloat_GrSLType, "Conical2FSParams");
711 SkString tName("t"); 716 SkString tName("t");
712 717
713 // this is the distance along x-axis from the end center to focal point in 718 // this is the distance along x-axis from the end center to focal point in
714 // transformed coordinates 719 // transformed coordinates
715 GrGLShaderVar focal = builder->getUniformVariable(fFocalUni); 720 GrGLShaderVar focal = builder->getUniformVariable(fFocalUni);
716 721
717 // if we have a vec3 from being in perspective, convert it to a vec2 first 722 // if we have a vec3 from being in perspective, convert it to a vec2 first
718 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 723 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
719 SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0); 724 SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0);
720 const char* coords2D = coords2DString.c_str(); 725 const char* coords2D = coords2DString.c_str();
721 726
722 // t = p.x * focalX + length(p) 727 // t = p.x * focalX + length(p)
723 fsBuilder->codeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_st r(), 728 fsBuilder->codeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_st r(),
724 coords2D, focal.c_str(), coords2D); 729 coords2D, focal.c_str(), coords2D);
725 730
726 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers); 731 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers);
727 } 732 }
728 733
729 void GLFocalInside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman, 734 void GLFocalInside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman,
730 const GrDrawEffect& drawEffect) { 735 const GrEffect& effect) {
731 INHERITED::setData(pdman, drawEffect); 736 INHERITED::setData(pdman, effect);
732 const FocalInside2PtConicalEffect& data = drawEffect.castEffect<FocalInside2 PtConicalEffect>(); 737 const FocalInside2PtConicalEffect& data =
738 GrEffect::CastEffect<FocalInside2PtConicalEffect>(effect);
733 SkScalar focal = data.focal(); 739 SkScalar focal = data.focal();
734 740
735 if (fCachedFocal != focal) { 741 if (fCachedFocal != focal) {
736 pdman.set1f(fFocalUni, SkScalarToFloat(focal)); 742 pdman.set1f(fFocalUni, SkScalarToFloat(focal));
737 fCachedFocal = focal; 743 fCachedFocal = focal;
738 } 744 }
739 } 745 }
740 746
741 void GLFocalInside2PtConicalEffect::GenKey(const GrDrawEffect& drawEffect, 747 void GLFocalInside2PtConicalEffect::GenKey(const GrEffect& effect,
742 const GrGLCaps&, GrEffectKeyBuilder* b) { 748 const GrGLCaps&, GrEffectKeyBuilder* b) {
743 b->add32(GenBaseGradientKey(drawEffect)); 749 b->add32(GenBaseGradientKey(effect));
744 } 750 }
745 751
746 ////////////////////////////////////////////////////////////////////////////// 752 //////////////////////////////////////////////////////////////////////////////
747 // Circle Conical Gradients 753 // Circle Conical Gradients
748 ////////////////////////////////////////////////////////////////////////////// 754 //////////////////////////////////////////////////////////////////////////////
749 755
750 struct CircleConicalInfo { 756 struct CircleConicalInfo {
751 SkPoint fCenterEnd; 757 SkPoint fCenterEnd;
752 SkScalar fA; 758 SkScalar fA;
753 SkScalar fB; 759 SkScalar fB;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
828 SkScalar centerX() const { return fInfo.fCenterEnd.fX; } 834 SkScalar centerX() const { return fInfo.fCenterEnd.fX; }
829 SkScalar centerY() const { return fInfo.fCenterEnd.fY; } 835 SkScalar centerY() const { return fInfo.fCenterEnd.fY; }
830 SkScalar A() const { return fInfo.fA; } 836 SkScalar A() const { return fInfo.fA; }
831 SkScalar B() const { return fInfo.fB; } 837 SkScalar B() const { return fInfo.fB; }
832 SkScalar C() const { return fInfo.fC; } 838 SkScalar C() const { return fInfo.fC; }
833 839
834 typedef GLCircleInside2PtConicalEffect GLEffect; 840 typedef GLCircleInside2PtConicalEffect GLEffect;
835 841
836 private: 842 private:
837 virtual bool onIsEqual(const GrEffect& sBase) const SK_OVERRIDE { 843 virtual bool onIsEqual(const GrEffect& sBase) const SK_OVERRIDE {
838 const CircleInside2PtConicalEffect& s = CastEffect<CircleInside2PtConica lEffect>(sBase); 844 const CircleInside2PtConicalEffect& s =
845 GrEffect::CastEffect<CircleInside2PtConicalEffect>(sBase);
839 return (INHERITED::onIsEqual(sBase) && 846 return (INHERITED::onIsEqual(sBase) &&
840 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd && 847 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd &&
841 this->fInfo.fA == s.fInfo.fA && 848 this->fInfo.fA == s.fInfo.fA &&
842 this->fInfo.fB == s.fInfo.fB && 849 this->fInfo.fB == s.fInfo.fB &&
843 this->fInfo.fC == s.fInfo.fC); 850 this->fInfo.fC == s.fInfo.fC);
844 } 851 }
845 852
846 CircleInside2PtConicalEffect(GrContext* ctx, 853 CircleInside2PtConicalEffect(GrContext* ctx,
847 const SkTwoPointConicalGradient& shader, 854 const SkTwoPointConicalGradient& shader,
848 const SkMatrix& matrix, 855 const SkMatrix& matrix,
849 SkShader::TileMode tm, 856 SkShader::TileMode tm,
850 const CircleConicalInfo& info) 857 const CircleConicalInfo& info)
851 : INHERITED(ctx, shader, matrix, tm), fInfo(info) {} 858 : INHERITED(ctx, shader, matrix, tm), fInfo(info) {}
852 859
853 GR_DECLARE_EFFECT_TEST; 860 GR_DECLARE_EFFECT_TEST;
854 861
855 const CircleConicalInfo fInfo; 862 const CircleConicalInfo fInfo;
856 863
857 typedef GrGradientEffect INHERITED; 864 typedef GrGradientEffect INHERITED;
858 }; 865 };
859 866
860 class GLCircleInside2PtConicalEffect : public GrGLGradientEffect { 867 class GLCircleInside2PtConicalEffect : public GrGLGradientEffect {
861 public: 868 public:
862 GLCircleInside2PtConicalEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&); 869 GLCircleInside2PtConicalEffect(const GrBackendEffectFactory& factory, const GrEffect&);
863 virtual ~GLCircleInside2PtConicalEffect() {} 870 virtual ~GLCircleInside2PtConicalEffect() {}
864 871
865 virtual void emitCode(GrGLProgramBuilder*, 872 virtual void emitCode(GrGLProgramBuilder*,
866 const GrDrawEffect&, 873 const GrEffect&,
867 const GrEffectKey&, 874 const GrEffectKey&,
868 const char* outputColor, 875 const char* outputColor,
869 const char* inputColor, 876 const char* inputColor,
870 const TransformedCoordsArray&, 877 const TransformedCoordsArray&,
871 const TextureSamplerArray&) SK_OVERRIDE; 878 const TextureSamplerArray&) SK_OVERRIDE;
872 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE; 879 virtual void setData(const GrGLProgramDataManager&, const GrEffect&) SK_OVER RIDE;
873 880
874 static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBui lder* b); 881 static void GenKey(const GrEffect&, const GrGLCaps& caps, GrEffectKeyBuilder * b);
875 882
876 protected: 883 protected:
877 UniformHandle fCenterUni; 884 UniformHandle fCenterUni;
878 UniformHandle fParamUni; 885 UniformHandle fParamUni;
879 886
880 const char* fVSVaryingName; 887 const char* fVSVaryingName;
881 const char* fFSVaryingName; 888 const char* fFSVaryingName;
882 889
883 // @{ 890 // @{
884 /// Values last uploaded as uniforms 891 /// Values last uploaded as uniforms
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
930 colors , stops, colorCount, 937 colors , stops, colorCount,
931 tm)); 938 tm));
932 SkPaint paint; 939 SkPaint paint;
933 GrColor paintColor; 940 GrColor paintColor;
934 GrEffect* effect; 941 GrEffect* effect;
935 SkAssertResult(shader->asNewEffect(context, paint, NULL, &paintColor, &effec t)); 942 SkAssertResult(shader->asNewEffect(context, paint, NULL, &paintColor, &effec t));
936 return effect; 943 return effect;
937 } 944 }
938 945
939 GLCircleInside2PtConicalEffect::GLCircleInside2PtConicalEffect(const GrBackendEf fectFactory& factory, 946 GLCircleInside2PtConicalEffect::GLCircleInside2PtConicalEffect(const GrBackendEf fectFactory& factory,
940 const GrDrawEffec t& drawEffect) 947 const GrEffect& e ffect)
941 : INHERITED(factory) 948 : INHERITED(factory)
942 , fVSVaryingName(NULL) 949 , fVSVaryingName(NULL)
943 , fFSVaryingName(NULL) 950 , fFSVaryingName(NULL)
944 , fCachedCenterX(SK_ScalarMax) 951 , fCachedCenterX(SK_ScalarMax)
945 , fCachedCenterY(SK_ScalarMax) 952 , fCachedCenterY(SK_ScalarMax)
946 , fCachedA(SK_ScalarMax) 953 , fCachedA(SK_ScalarMax)
947 , fCachedB(SK_ScalarMax) 954 , fCachedB(SK_ScalarMax)
948 , fCachedC(SK_ScalarMax) {} 955 , fCachedC(SK_ScalarMax) {}
949 956
950 void GLCircleInside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder, 957 void GLCircleInside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder,
951 const GrDrawEffect&, 958 const GrEffect&,
952 const GrEffectKey& key, 959 const GrEffectKey& key,
953 const char* outputColor, 960 const char* outputColor,
954 const char* inputColor, 961 const char* inputColor,
955 const TransformedCoordsArray& coor ds, 962 const TransformedCoordsArray& coor ds,
956 const TextureSamplerArray& sampler s) { 963 const TextureSamplerArray& sampler s) {
957 uint32_t baseKey = key.get32(0); 964 uint32_t baseKey = key.get32(0);
958 this->emitUniforms(builder, baseKey); 965 this->emitUniforms(builder, baseKey);
959 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 966 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
960 kVec2f_GrSLType, "Conical2FSCenter"); 967 kVec2f_GrSLType, "Conical2FSCenter");
961 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 968 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
(...skipping 13 matching lines...) Expand all
975 982
976 // p = coords2D 983 // p = coords2D
977 // e = center end 984 // e = center end
978 // r = radius end 985 // r = radius end
979 // A = dot(e, e) - r^2 + 2 * r - 1 986 // A = dot(e, e) - r^2 + 2 * r - 1
980 // B = (r -1) / A 987 // B = (r -1) / A
981 // C = 1 / A 988 // C = 1 / A
982 // d = dot(e, p) + B 989 // d = dot(e, p) + B
983 // t = d +/- sqrt(d^2 - A * dot(p, p) + C) 990 // t = d +/- sqrt(d^2 - A * dot(p, p) + C)
984 fsBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D ); 991 fsBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D );
985 fsBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, cente r.c_str(), params.c_str()); 992 fsBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, cente r.c_str(),
993 params.c_str());
986 fsBuilder->codeAppendf("\tfloat %s = d + sqrt(d * d - %s.x * pDotp + %s.z);\ n", 994 fsBuilder->codeAppendf("\tfloat %s = d + sqrt(d * d - %s.x * pDotp + %s.z);\ n",
987 tName.c_str(), params.c_str(), params.c_str()); 995 tName.c_str(), params.c_str(), params.c_str());
988 996
989 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers); 997 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers);
990 } 998 }
991 999
992 void GLCircleInside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman , 1000 void GLCircleInside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman ,
993 const GrDrawEffect& drawEffect) { 1001 const GrEffect& effect) {
994 INHERITED::setData(pdman, drawEffect); 1002 INHERITED::setData(pdman, effect);
995 const CircleInside2PtConicalEffect& data = drawEffect.castEffect<CircleInsid e2PtConicalEffect>(); 1003 const CircleInside2PtConicalEffect& data =
1004 GrEffect::CastEffect<CircleInside2PtConicalEffect>(effect);
996 SkScalar centerX = data.centerX(); 1005 SkScalar centerX = data.centerX();
997 SkScalar centerY = data.centerY(); 1006 SkScalar centerY = data.centerY();
998 SkScalar A = data.A(); 1007 SkScalar A = data.A();
999 SkScalar B = data.B(); 1008 SkScalar B = data.B();
1000 SkScalar C = data.C(); 1009 SkScalar C = data.C();
1001 1010
1002 if (fCachedCenterX != centerX || fCachedCenterY != centerY || 1011 if (fCachedCenterX != centerX || fCachedCenterY != centerY ||
1003 fCachedA != A || fCachedB != B || fCachedC != C) { 1012 fCachedA != A || fCachedB != B || fCachedC != C) {
1004 1013
1005 pdman.set2f(fCenterUni, SkScalarToFloat(centerX), SkScalarToFloat(center Y)); 1014 pdman.set2f(fCenterUni, SkScalarToFloat(centerX), SkScalarToFloat(center Y));
1006 pdman.set3f(fParamUni, SkScalarToFloat(A), SkScalarToFloat(B), SkScalarT oFloat(C)); 1015 pdman.set3f(fParamUni, SkScalarToFloat(A), SkScalarToFloat(B), SkScalarT oFloat(C));
1007 1016
1008 fCachedCenterX = centerX; 1017 fCachedCenterX = centerX;
1009 fCachedCenterY = centerY; 1018 fCachedCenterY = centerY;
1010 fCachedA = A; 1019 fCachedA = A;
1011 fCachedB = B; 1020 fCachedB = B;
1012 fCachedC = C; 1021 fCachedC = C;
1013 } 1022 }
1014 } 1023 }
1015 1024
1016 void GLCircleInside2PtConicalEffect::GenKey(const GrDrawEffect& drawEffect, 1025 void GLCircleInside2PtConicalEffect::GenKey(const GrEffect& effect,
1017 const GrGLCaps&, GrEffectKeyBuilder* b) { 1026 const GrGLCaps&, GrEffectKeyBuilder* b) {
1018 b->add32(GenBaseGradientKey(drawEffect)); 1027 b->add32(GenBaseGradientKey(effect));
1019 } 1028 }
1020 1029
1021 ////////////////////////////////////////////////////////////////////////////// 1030 //////////////////////////////////////////////////////////////////////////////
1022 1031
1023 class GLCircleOutside2PtConicalEffect; 1032 class GLCircleOutside2PtConicalEffect;
1024 1033
1025 class CircleOutside2PtConicalEffect : public GrGradientEffect { 1034 class CircleOutside2PtConicalEffect : public GrGradientEffect {
1026 public: 1035 public:
1027 1036
1028 static GrEffect* Create(GrContext* ctx, 1037 static GrEffect* Create(GrContext* ctx,
(...skipping 14 matching lines...) Expand all
1043 SkScalar A() const { return fInfo.fA; } 1052 SkScalar A() const { return fInfo.fA; }
1044 SkScalar B() const { return fInfo.fB; } 1053 SkScalar B() const { return fInfo.fB; }
1045 SkScalar C() const { return fInfo.fC; } 1054 SkScalar C() const { return fInfo.fC; }
1046 SkScalar tLimit() const { return fTLimit; } 1055 SkScalar tLimit() const { return fTLimit; }
1047 bool isFlipped() const { return fIsFlipped; } 1056 bool isFlipped() const { return fIsFlipped; }
1048 1057
1049 typedef GLCircleOutside2PtConicalEffect GLEffect; 1058 typedef GLCircleOutside2PtConicalEffect GLEffect;
1050 1059
1051 private: 1060 private:
1052 virtual bool onIsEqual(const GrEffect& sBase) const SK_OVERRIDE { 1061 virtual bool onIsEqual(const GrEffect& sBase) const SK_OVERRIDE {
1053 const CircleOutside2PtConicalEffect& s = CastEffect<CircleOutside2PtConi calEffect>(sBase); 1062 const CircleOutside2PtConicalEffect& s =
1063 GrEffect::CastEffect<CircleOutside2PtConicalEffect>(sBase);
1054 return (INHERITED::onIsEqual(sBase) && 1064 return (INHERITED::onIsEqual(sBase) &&
1055 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd && 1065 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd &&
1056 this->fInfo.fA == s.fInfo.fA && 1066 this->fInfo.fA == s.fInfo.fA &&
1057 this->fInfo.fB == s.fInfo.fB && 1067 this->fInfo.fB == s.fInfo.fB &&
1058 this->fInfo.fC == s.fInfo.fC && 1068 this->fInfo.fC == s.fInfo.fC &&
1059 this->fTLimit == s.fTLimit && 1069 this->fTLimit == s.fTLimit &&
1060 this->fIsFlipped == s.fIsFlipped); 1070 this->fIsFlipped == s.fIsFlipped);
1061 } 1071 }
1062 1072
1063 CircleOutside2PtConicalEffect(GrContext* ctx, 1073 CircleOutside2PtConicalEffect(GrContext* ctx,
1064 const SkTwoPointConicalGradient& shader, 1074 const SkTwoPointConicalGradient& shader,
1065 const SkMatrix& matrix, 1075 const SkMatrix& matrix,
1066 SkShader::TileMode tm, 1076 SkShader::TileMode tm,
1067 const CircleConicalInfo& info) 1077 const CircleConicalInfo& info)
1068 : INHERITED(ctx, shader, matrix, tm), fInfo(info) { 1078 : INHERITED(ctx, shader, matrix, tm), fInfo(info) {
1069 if (shader.getStartRadius() != shader.getEndRadius()) { 1079 if (shader.getStartRadius() != shader.getEndRadius()) {
1070 fTLimit = SkScalarDiv(shader.getStartRadius(), (shader.getStartRadiu s() - shader.getEndRadius())); 1080 fTLimit = SkScalarDiv(shader.getStartRadius(),
1081 (shader.getStartRadius() - shader.getEndRadius ()));
1071 } else { 1082 } else {
1072 fTLimit = SK_ScalarMin; 1083 fTLimit = SK_ScalarMin;
1073 } 1084 }
1074 1085
1075 fIsFlipped = shader.isFlippedGrad(); 1086 fIsFlipped = shader.isFlippedGrad();
1076 } 1087 }
1077 1088
1078 GR_DECLARE_EFFECT_TEST; 1089 GR_DECLARE_EFFECT_TEST;
1079 1090
1080 const CircleConicalInfo fInfo; 1091 const CircleConicalInfo fInfo;
1081 SkScalar fTLimit; 1092 SkScalar fTLimit;
1082 bool fIsFlipped; 1093 bool fIsFlipped;
1083 1094
1084 typedef GrGradientEffect INHERITED; 1095 typedef GrGradientEffect INHERITED;
1085 }; 1096 };
1086 1097
1087 class GLCircleOutside2PtConicalEffect : public GrGLGradientEffect { 1098 class GLCircleOutside2PtConicalEffect : public GrGLGradientEffect {
1088 public: 1099 public:
1089 GLCircleOutside2PtConicalEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&); 1100 GLCircleOutside2PtConicalEffect(const GrBackendEffectFactory& factory, const GrEffect&);
1090 virtual ~GLCircleOutside2PtConicalEffect() {} 1101 virtual ~GLCircleOutside2PtConicalEffect() {}
1091 1102
1092 virtual void emitCode(GrGLProgramBuilder*, 1103 virtual void emitCode(GrGLProgramBuilder*,
1093 const GrDrawEffect&, 1104 const GrEffect&,
1094 const GrEffectKey&, 1105 const GrEffectKey&,
1095 const char* outputColor, 1106 const char* outputColor,
1096 const char* inputColor, 1107 const char* inputColor,
1097 const TransformedCoordsArray&, 1108 const TransformedCoordsArray&,
1098 const TextureSamplerArray&) SK_OVERRIDE; 1109 const TextureSamplerArray&) SK_OVERRIDE;
1099 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE; 1110 virtual void setData(const GrGLProgramDataManager&, const GrEffect&) SK_OVER RIDE;
1100 1111
1101 static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBui lder* b); 1112 static void GenKey(const GrEffect&, const GrGLCaps& caps, GrEffectKeyBuilder * b);
1102 1113
1103 protected: 1114 protected:
1104 UniformHandle fCenterUni; 1115 UniformHandle fCenterUni;
1105 UniformHandle fParamUni; 1116 UniformHandle fParamUni;
1106 1117
1107 const char* fVSVaryingName; 1118 const char* fVSVaryingName;
1108 const char* fFSVaryingName; 1119 const char* fFSVaryingName;
1109 1120
1110 bool fIsFlipped; 1121 bool fIsFlipped;
1111 1122
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1161 colors , stops, colorCount, 1172 colors , stops, colorCount,
1162 tm)); 1173 tm));
1163 SkPaint paint; 1174 SkPaint paint;
1164 GrColor paintColor; 1175 GrColor paintColor;
1165 GrEffect* effect; 1176 GrEffect* effect;
1166 SkAssertResult(shader->asNewEffect(context, paint, NULL, &paintColor, &effec t)); 1177 SkAssertResult(shader->asNewEffect(context, paint, NULL, &paintColor, &effec t));
1167 return effect; 1178 return effect;
1168 } 1179 }
1169 1180
1170 GLCircleOutside2PtConicalEffect::GLCircleOutside2PtConicalEffect(const GrBackend EffectFactory& factory, 1181 GLCircleOutside2PtConicalEffect::GLCircleOutside2PtConicalEffect(const GrBackend EffectFactory& factory,
1171 const GrDrawEff ect& drawEffect) 1182 const GrEffect& effect)
1172 : INHERITED(factory) 1183 : INHERITED(factory)
1173 , fVSVaryingName(NULL) 1184 , fVSVaryingName(NULL)
1174 , fFSVaryingName(NULL) 1185 , fFSVaryingName(NULL)
1175 , fCachedCenterX(SK_ScalarMax) 1186 , fCachedCenterX(SK_ScalarMax)
1176 , fCachedCenterY(SK_ScalarMax) 1187 , fCachedCenterY(SK_ScalarMax)
1177 , fCachedA(SK_ScalarMax) 1188 , fCachedA(SK_ScalarMax)
1178 , fCachedB(SK_ScalarMax) 1189 , fCachedB(SK_ScalarMax)
1179 , fCachedC(SK_ScalarMax) 1190 , fCachedC(SK_ScalarMax)
1180 , fCachedTLimit(SK_ScalarMax) { 1191 , fCachedTLimit(SK_ScalarMax) {
1181 const CircleOutside2PtConicalEffect& data = drawEffect.castEffect<CircleOuts ide2PtConicalEffect>(); 1192 const CircleOutside2PtConicalEffect& data =
1193 GrEffect::CastEffect<CircleOutside2PtConicalEffect>(effect);
1182 fIsFlipped = data.isFlipped(); 1194 fIsFlipped = data.isFlipped();
1183 } 1195 }
1184 1196
1185 void GLCircleOutside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder, 1197 void GLCircleOutside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder,
1186 const GrDrawEffect&, 1198 const GrEffect&,
1187 const GrEffectKey& key, 1199 const GrEffectKey& key,
1188 const char* outputColor, 1200 const char* outputColor,
1189 const char* inputColor, 1201 const char* inputColor,
1190 const TransformedCoordsArray& coo rds, 1202 const TransformedCoordsArray& coo rds,
1191 const TextureSamplerArray& sample rs) { 1203 const TextureSamplerArray& sample rs) {
1192 uint32_t baseKey = key.get32(0); 1204 uint32_t baseKey = key.get32(0);
1193 this->emitUniforms(builder, baseKey); 1205 this->emitUniforms(builder, baseKey);
1194 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 1206 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
1195 kVec2f_GrSLType, "Conical2FSCenter"); 1207 kVec2f_GrSLType, "Conical2FSCenter");
1196 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 1208 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
(...skipping 18 matching lines...) Expand all
1215 // p = coords2D 1227 // p = coords2D
1216 // e = center end 1228 // e = center end
1217 // r = radius end 1229 // r = radius end
1218 // A = dot(e, e) - r^2 + 2 * r - 1 1230 // A = dot(e, e) - r^2 + 2 * r - 1
1219 // B = (r -1) / A 1231 // B = (r -1) / A
1220 // C = 1 / A 1232 // C = 1 / A
1221 // d = dot(e, p) + B 1233 // d = dot(e, p) + B
1222 // t = d +/- sqrt(d^2 - A * dot(p, p) + C) 1234 // t = d +/- sqrt(d^2 - A * dot(p, p) + C)
1223 1235
1224 fsBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D ); 1236 fsBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D );
1225 fsBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, cente r.c_str(), params.c_str()); 1237 fsBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, cente r.c_str(),
1226 fsBuilder->codeAppendf("\tfloat deter = d * d - %s.x * pDotp + %s.z;\n", par ams.c_str(), params.c_str()); 1238 params.c_str());
1239 fsBuilder->codeAppendf("\tfloat deter = d * d - %s.x * pDotp + %s.z;\n", par ams.c_str(),
1240 params.c_str());
1227 1241
1228 // Must check to see if we flipped the circle order (to make sure start radi us < end radius) 1242 // Must check to see if we flipped the circle order (to make sure start radi us < end radius)
1229 // If so we must also flip sign on sqrt 1243 // If so we must also flip sign on sqrt
1230 if (!fIsFlipped) { 1244 if (!fIsFlipped) {
1231 fsBuilder->codeAppendf("\tfloat %s = d + sqrt(deter);\n", tName.c_str()) ; 1245 fsBuilder->codeAppendf("\tfloat %s = d + sqrt(deter);\n", tName.c_str()) ;
1232 } else { 1246 } else {
1233 fsBuilder->codeAppendf("\tfloat %s = d - sqrt(deter);\n", tName.c_str()) ; 1247 fsBuilder->codeAppendf("\tfloat %s = d - sqrt(deter);\n", tName.c_str()) ;
1234 } 1248 }
1235 1249
1236 fsBuilder->codeAppendf("\tif (%s >= %s.w && deter >= 0.0) {\n", tName.c_str( ), params.c_str()); 1250 fsBuilder->codeAppendf("\tif (%s >= %s.w && deter >= 0.0) {\n", tName.c_str( ), params.c_str());
1237 fsBuilder->codeAppend("\t\t"); 1251 fsBuilder->codeAppend("\t\t");
1238 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers); 1252 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers);
1239 fsBuilder->codeAppend("\t}\n"); 1253 fsBuilder->codeAppend("\t}\n");
1240 } 1254 }
1241 1255
1242 void GLCircleOutside2PtConicalEffect::setData(const GrGLProgramDataManager& pdma n, 1256 void GLCircleOutside2PtConicalEffect::setData(const GrGLProgramDataManager& pdma n,
1243 const GrDrawEffect& drawEffect) { 1257 const GrEffect& effect) {
1244 INHERITED::setData(pdman, drawEffect); 1258 INHERITED::setData(pdman, effect);
1245 const CircleOutside2PtConicalEffect& data = drawEffect.castEffect<CircleOuts ide2PtConicalEffect>(); 1259 const CircleOutside2PtConicalEffect& data =
1260 GrEffect::CastEffect<CircleOutside2PtConicalEffect>(effect);
1246 SkASSERT(data.isFlipped() == fIsFlipped); 1261 SkASSERT(data.isFlipped() == fIsFlipped);
1247 SkScalar centerX = data.centerX(); 1262 SkScalar centerX = data.centerX();
1248 SkScalar centerY = data.centerY(); 1263 SkScalar centerY = data.centerY();
1249 SkScalar A = data.A(); 1264 SkScalar A = data.A();
1250 SkScalar B = data.B(); 1265 SkScalar B = data.B();
1251 SkScalar C = data.C(); 1266 SkScalar C = data.C();
1252 SkScalar tLimit = data.tLimit(); 1267 SkScalar tLimit = data.tLimit();
1253 1268
1254 if (fCachedCenterX != centerX || fCachedCenterY != centerY || 1269 if (fCachedCenterX != centerX || fCachedCenterY != centerY ||
1255 fCachedA != A || fCachedB != B || fCachedC != C || fCachedTLimit != tLim it) { 1270 fCachedA != A || fCachedB != B || fCachedC != C || fCachedTLimit != tLim it) {
1256 1271
1257 pdman.set2f(fCenterUni, SkScalarToFloat(centerX), SkScalarToFloat(center Y)); 1272 pdman.set2f(fCenterUni, SkScalarToFloat(centerX), SkScalarToFloat(center Y));
1258 pdman.set4f(fParamUni, SkScalarToFloat(A), SkScalarToFloat(B), SkScalarT oFloat(C), 1273 pdman.set4f(fParamUni, SkScalarToFloat(A), SkScalarToFloat(B), SkScalarT oFloat(C),
1259 SkScalarToFloat(tLimit)); 1274 SkScalarToFloat(tLimit));
1260 1275
1261 fCachedCenterX = centerX; 1276 fCachedCenterX = centerX;
1262 fCachedCenterY = centerY; 1277 fCachedCenterY = centerY;
1263 fCachedA = A; 1278 fCachedA = A;
1264 fCachedB = B; 1279 fCachedB = B;
1265 fCachedC = C; 1280 fCachedC = C;
1266 fCachedTLimit = tLimit; 1281 fCachedTLimit = tLimit;
1267 } 1282 }
1268 } 1283 }
1269 1284
1270 void GLCircleOutside2PtConicalEffect::GenKey(const GrDrawEffect& drawEffect, 1285 void GLCircleOutside2PtConicalEffect::GenKey(const GrEffect& effect,
1271 const GrGLCaps&, GrEffectKeyBuilder * b) { 1286 const GrGLCaps&, GrEffectKeyBuilder * b) {
1272 uint32_t* key = b->add32n(2); 1287 uint32_t* key = b->add32n(2);
1273 key[0] = GenBaseGradientKey(drawEffect); 1288 key[0] = GenBaseGradientKey(effect);
1274 key[1] = drawEffect.castEffect<CircleOutside2PtConicalEffect>().isFlipped(); 1289 key[1] = GrEffect::CastEffect<CircleOutside2PtConicalEffect>(effect).isFlipp ed();
1275 } 1290 }
1276 1291
1277 ////////////////////////////////////////////////////////////////////////////// 1292 //////////////////////////////////////////////////////////////////////////////
1278 1293
1279 GrEffect* Gr2PtConicalGradientEffect::Create(GrContext* ctx, 1294 GrEffect* Gr2PtConicalGradientEffect::Create(GrContext* ctx,
1280 const SkTwoPointConicalGradient& sh ader, 1295 const SkTwoPointConicalGradient& sh ader,
1281 SkShader::TileMode tm, 1296 SkShader::TileMode tm,
1282 const SkMatrix* localMatrix) { 1297 const SkMatrix* localMatrix) {
1283 SkMatrix matrix; 1298 SkMatrix matrix;
1284 if (!shader.getLocalMatrix().invert(&matrix)) { 1299 if (!shader.getLocalMatrix().invert(&matrix)) {
(...skipping 27 matching lines...) Expand all
1312 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf o); 1327 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf o);
1313 } else if (type == kEdge_ConicalType) { 1328 } else if (type == kEdge_ConicalType) {
1314 set_matrix_edge_conical(shader, &matrix); 1329 set_matrix_edge_conical(shader, &matrix);
1315 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); 1330 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm);
1316 } else { 1331 } else {
1317 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in fo); 1332 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in fo);
1318 } 1333 }
1319 } 1334 }
1320 1335
1321 #endif 1336 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698