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

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

Issue 582963002: Solo gp (Closed) Base URL: https://skia.googlesource.com/skia.git@no_peb
Patch Set: fix 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
11 #include "SkTwoPointConicalGradient.h" 11 #include "SkTwoPointConicalGradient.h"
12 12
13 #if SK_SUPPORT_GPU 13 #if SK_SUPPORT_GPU
14 #include "GrTBackendEffectFactory.h" 14 #include "GrTBackendProcessorFactory.h"
15 #include "gl/builders/GrGLProgramBuilder.h" 15 #include "gl/builders/GrGLProgramBuilder.h"
16 // For brevity 16 // For brevity
17 typedef GrGLProgramDataManager::UniformHandle UniformHandle; 17 typedef GrGLProgramDataManager::UniformHandle UniformHandle;
18 18
19 static const SkScalar kErrorTol = 0.00001f; 19 static const SkScalar kErrorTol = 0.00001f;
20 static const SkScalar kEdgeErrorTol = 5.f * kErrorTol; 20 static const SkScalar kEdgeErrorTol = 5.f * kErrorTol;
21 21
22 /** 22 /**
23 * We have three general cases for 2pt conical gradients. First we always assume that 23 * We have three general cases for 2pt conical gradients. First we always assume that
24 * the start radius <= end radius. Our first case (kInside_) is when the start c ircle 24 * the start radius <= end radius. Our first case (kInside_) is when the start c ircle
(...skipping 28 matching lines...) Expand all
53 SkScalarMul(invDiffLen, diff.fX)); 53 SkScalarMul(invDiffLen, diff.fX));
54 invLMatrix->postConcat(rot); 54 invLMatrix->postConcat(rot);
55 } 55 }
56 } 56 }
57 57
58 class GLEdge2PtConicalEffect; 58 class GLEdge2PtConicalEffect;
59 59
60 class Edge2PtConicalEffect : public GrGradientEffect { 60 class Edge2PtConicalEffect : public GrGradientEffect {
61 public: 61 public:
62 62
63 static GrEffect* Create(GrContext* ctx, 63 static GrFragmentProcessor* Create(GrContext* ctx,
64 const SkTwoPointConicalGradient& shader, 64 const SkTwoPointConicalGradient& shader,
65 const SkMatrix& matrix, 65 const SkMatrix& matrix,
66 SkShader::TileMode tm) { 66 SkShader::TileMode tm) {
67 return SkNEW_ARGS(Edge2PtConicalEffect, (ctx, shader, matrix, tm)); 67 return SkNEW_ARGS(Edge2PtConicalEffect, (ctx, shader, matrix, tm));
68 } 68 }
69 69
70 virtual ~Edge2PtConicalEffect() {} 70 virtual ~Edge2PtConicalEffect() {}
71 71
72 static const char* Name() { return "Two-Point Conical Gradient Edge Touching "; } 72 static const char* Name() { return "Two-Point Conical Gradient Edge Touching "; }
73 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; 73 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR IDE;
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 GLProcessor;
81 81
82 private: 82 private:
83 virtual bool onIsEqual(const GrEffect& sBase) const SK_OVERRIDE { 83 virtual bool onIsEqual(const GrProcessor& sBase) const SK_OVERRIDE {
84 const Edge2PtConicalEffect& s = sBase.cast<Edge2PtConicalEffect>(); 84 const Edge2PtConicalEffect& s = sBase.cast<Edge2PtConicalEffect>();
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,
(...skipping 15 matching lines...) Expand all
109 SkScalar r0dr = SkScalarMul(fRadius0, fDiffRadius); 109 SkScalar r0dr = SkScalarMul(fRadius0, fDiffRadius);
110 bMatrix[SkMatrix::kMScaleX] = -2 * (SkScalarMul(fCenterX1, bMatrix[SkMat rix::kMScaleX]) + 110 bMatrix[SkMatrix::kMScaleX] = -2 * (SkScalarMul(fCenterX1, bMatrix[SkMat rix::kMScaleX]) +
111 SkScalarMul(r0dr, bMatrix[SkMatrix:: kMPersp0])); 111 SkScalarMul(r0dr, bMatrix[SkMatrix:: kMPersp0]));
112 bMatrix[SkMatrix::kMSkewX] = -2 * (SkScalarMul(fCenterX1, bMatrix[SkMatr ix::kMSkewX]) + 112 bMatrix[SkMatrix::kMSkewX] = -2 * (SkScalarMul(fCenterX1, bMatrix[SkMatr ix::kMSkewX]) +
113 SkScalarMul(r0dr, bMatrix[SkMatrix::k MPersp1])); 113 SkScalarMul(r0dr, bMatrix[SkMatrix::k MPersp1]));
114 bMatrix[SkMatrix::kMTransX] = -2 * (SkScalarMul(fCenterX1, bMatrix[SkMat rix::kMTransX]) + 114 bMatrix[SkMatrix::kMTransX] = -2 * (SkScalarMul(fCenterX1, bMatrix[SkMat rix::kMTransX]) +
115 SkScalarMul(r0dr, bMatrix[SkMatrix:: kMPersp2])); 115 SkScalarMul(r0dr, bMatrix[SkMatrix:: kMPersp2]));
116 this->addCoordTransform(&fBTransform); 116 this->addCoordTransform(&fBTransform);
117 } 117 }
118 118
119 GR_DECLARE_EFFECT_TEST; 119 GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
120 120
121 // @{ 121 // @{
122 // Cache of values - these can change arbitrarily, EXCEPT 122 // Cache of values - these can change arbitrarily, EXCEPT
123 // we shouldn't change between degenerate and non-degenerate?! 123 // we shouldn't change between degenerate and non-degenerate?!
124 124
125 GrCoordTransform fBTransform; 125 GrCoordTransform fBTransform;
126 SkScalar fCenterX1; 126 SkScalar fCenterX1;
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 GrEffect &); 137 GLEdge2PtConicalEffect(const GrBackendProcessorFactory& factory, const GrPro cessor&);
138 virtual ~GLEdge2PtConicalEffect() { } 138 virtual ~GLEdge2PtConicalEffect() { }
139 139
140 virtual void emitCode(GrGLProgramBuilder*, 140 virtual void emitCode(GrGLProgramBuilder*,
141 const GrEffect&, 141 const GrFragmentProcessor&,
142 const GrEffectKey&, 142 const GrProcessorKey&,
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 GrEffect&) SK_OVER RIDE; 147 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O VERRIDE;
148 148
149 static void GenKey(const GrEffect&, const GrGLCaps& caps, GrEffectKeyBuilder * b); 149 static void GenKey(const GrProcessor&, const GrGLCaps& caps, GrProcessorKeyB uilder* 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
160 SkScalar fCachedRadius; 160 SkScalar fCachedRadius;
161 SkScalar fCachedDiffRadius; 161 SkScalar fCachedDiffRadius;
162 162
163 // @} 163 // @}
164 164
165 private: 165 private:
166 typedef GrGLGradientEffect INHERITED; 166 typedef GrGLGradientEffect INHERITED;
167 167
168 }; 168 };
169 169
170 const GrBackendEffectFactory& Edge2PtConicalEffect::getFactory() const { 170 const GrBackendFragmentProcessorFactory& Edge2PtConicalEffect::getFactory() cons t {
171 return GrTBackendEffectFactory<Edge2PtConicalEffect>::getInstance(); 171 return GrTBackendFragmentProcessorFactory<Edge2PtConicalEffect>::getInstance ();
172 } 172 }
173 173
174 GR_DEFINE_EFFECT_TEST(Edge2PtConicalEffect); 174 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(Edge2PtConicalEffect);
175 175
176 GrEffect* Edge2PtConicalEffect::TestCreate(SkRandom* random, 176 GrFragmentProcessor* Edge2PtConicalEffect::TestCreate(SkRandom* random,
177 GrContext* context, 177 GrContext* context,
178 const GrDrawTargetCaps&, 178 const GrDrawTargetCaps&,
179 GrTexture**) { 179 GrTexture**) {
180 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()}; 180 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()};
181 SkScalar radius1 = random->nextUScalar1(); 181 SkScalar radius1 = random->nextUScalar1();
182 SkPoint center2; 182 SkPoint center2;
183 SkScalar radius2; 183 SkScalar radius2;
184 do { 184 do {
185 center2.set(random->nextUScalar1(), random->nextUScalar1()); 185 center2.set(random->nextUScalar1(), random->nextUScalar1());
186 // If the circles are identical the factory will give us an empty shader . 186 // If the circles are identical the factory will give us an empty shader .
187 // This will happen if we pick identical centers 187 // This will happen if we pick identical centers
188 } while (center1 == center2); 188 } while (center1 == center2);
189 189
190 // Below makes sure that circle one is contained within circle two 190 // Below makes sure that circle one is contained within circle two
191 // and both circles are touching on an edge 191 // and both circles are touching on an edge
192 SkPoint diff = center2 - center1; 192 SkPoint diff = center2 - center1;
193 SkScalar diffLen = diff.length(); 193 SkScalar diffLen = diff.length();
194 radius2 = radius1 + diffLen; 194 radius2 = radius1 + diffLen;
195 195
196 SkColor colors[kMaxRandomGradientColors]; 196 SkColor colors[kMaxRandomGradientColors];
197 SkScalar stopsArray[kMaxRandomGradientColors]; 197 SkScalar stopsArray[kMaxRandomGradientColors];
198 SkScalar* stops = stopsArray; 198 SkScalar* stops = stopsArray;
199 SkShader::TileMode tm; 199 SkShader::TileMode tm;
200 int colorCount = RandomGradientParams(random, colors, &stops, &tm); 200 int colorCount = RandomGradientParams(random, colors, &stops, &tm);
201 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center 1, radius1, 201 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center 1, radius1,
202 center 2, radius2, 202 center 2, radius2,
203 colors , stops, colorCount, 203 colors , stops, colorCount,
204 tm)); 204 tm));
205 SkPaint paint; 205 SkPaint paint;
206 GrEffect* effect; 206 GrFragmentProcessor* fp;
207 GrColor paintColor; 207 GrColor paintColor;
208 SkAssertResult(shader->asNewEffect(context, paint, NULL, &paintColor, &effec t)); 208 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor , &fp));
209 return effect; 209 return fp;
210 } 210 }
211 211
212 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrBackendEffectFactory& fac tory, 212 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrBackendProcessorFactory& factory,
213 const GrEffect& effect) 213 const GrProcessor&)
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 GrEffect&, 221 const GrFragmentProcessor&,
222 const GrEffectKey& key, 222 const GrProcessorKey& 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");
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 269
270 // if r(t) > 0, then t will be the x coordinate 270 // if r(t) > 0, then t will be the x coordinate
271 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(),
272 p2.c_str(), p0.c_str()); 272 p2.c_str(), p0.c_str());
273 fsBuilder->codeAppend("\t"); 273 fsBuilder->codeAppend("\t");
274 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers); 274 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers);
275 fsBuilder->codeAppend("\t}\n"); 275 fsBuilder->codeAppend("\t}\n");
276 } 276 }
277 277
278 void GLEdge2PtConicalEffect::setData(const GrGLProgramDataManager& pdman, 278 void GLEdge2PtConicalEffect::setData(const GrGLProgramDataManager& pdman,
279 const GrEffect& effect) { 279 const GrProcessor& processor) {
280 INHERITED::setData(pdman, effect); 280 INHERITED::setData(pdman, processor);
281 const Edge2PtConicalEffect& data = effect.cast<Edge2PtConicalEffect>(); 281 const Edge2PtConicalEffect& data = processor.cast<Edge2PtConicalEffect>();
282 SkScalar radius0 = data.radius(); 282 SkScalar radius0 = data.radius();
283 SkScalar diffRadius = data.diffRadius(); 283 SkScalar diffRadius = data.diffRadius();
284 284
285 if (fCachedRadius != radius0 || 285 if (fCachedRadius != radius0 ||
286 fCachedDiffRadius != diffRadius) { 286 fCachedDiffRadius != diffRadius) {
287 287
288 float values[3] = { 288 float values[3] = {
289 SkScalarToFloat(radius0), 289 SkScalarToFloat(radius0),
290 SkScalarToFloat(SkScalarMul(radius0, radius0)), 290 SkScalarToFloat(SkScalarMul(radius0, radius0)),
291 SkScalarToFloat(diffRadius) 291 SkScalarToFloat(diffRadius)
292 }; 292 };
293 293
294 pdman.set1fv(fParamUni, 3, values); 294 pdman.set1fv(fParamUni, 3, values);
295 fCachedRadius = radius0; 295 fCachedRadius = radius0;
296 fCachedDiffRadius = diffRadius; 296 fCachedDiffRadius = diffRadius;
297 } 297 }
298 } 298 }
299 299
300 void GLEdge2PtConicalEffect::GenKey(const GrEffect& effect, 300 void GLEdge2PtConicalEffect::GenKey(const GrProcessor& processor,
301 const GrGLCaps&, GrEffectKeyBuilder* b) { 301 const GrGLCaps&, GrProcessorKeyBuilder* b) {
302 b->add32(GenBaseGradientKey(effect)); 302 b->add32(GenBaseGradientKey(processor));
303 } 303 }
304 304
305 ////////////////////////////////////////////////////////////////////////////// 305 //////////////////////////////////////////////////////////////////////////////
306 // Focal Conical Gradients 306 // Focal Conical Gradients
307 ////////////////////////////////////////////////////////////////////////////// 307 //////////////////////////////////////////////////////////////////////////////
308 308
309 static ConicalType set_matrix_focal_conical(const SkTwoPointConicalGradient& sha der, 309 static ConicalType set_matrix_focal_conical(const SkTwoPointConicalGradient& sha der,
310 SkMatrix* invLMatrix, SkScalar* foca lX) { 310 SkMatrix* invLMatrix, SkScalar* foca lX) {
311 // Inverse of the current local matrix is passed in then, 311 // Inverse of the current local matrix is passed in then,
312 // 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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 return conicalType; 362 return conicalType;
363 } 363 }
364 364
365 ////////////////////////////////////////////////////////////////////////////// 365 //////////////////////////////////////////////////////////////////////////////
366 366
367 class GLFocalOutside2PtConicalEffect; 367 class GLFocalOutside2PtConicalEffect;
368 368
369 class FocalOutside2PtConicalEffect : public GrGradientEffect { 369 class FocalOutside2PtConicalEffect : public GrGradientEffect {
370 public: 370 public:
371 371
372 static GrEffect* Create(GrContext* ctx, 372 static GrFragmentProcessor* Create(GrContext* ctx,
373 const SkTwoPointConicalGradient& shader, 373 const SkTwoPointConicalGradient& shader,
374 const SkMatrix& matrix, 374 const SkMatrix& matrix,
375 SkShader::TileMode tm, 375 SkShader::TileMode tm,
376 SkScalar focalX) { 376 SkScalar focalX) {
377 return SkNEW_ARGS(FocalOutside2PtConicalEffect, (ctx, shader, matrix, tm , focalX)); 377 return SkNEW_ARGS(FocalOutside2PtConicalEffect, (ctx, shader, matrix, tm , focalX));
378 } 378 }
379 379
380 virtual ~FocalOutside2PtConicalEffect() { } 380 virtual ~FocalOutside2PtConicalEffect() { }
381 381
382 static const char* Name() { return "Two-Point Conical Gradient Focal Outside "; } 382 static const char* Name() { return "Two-Point Conical Gradient Focal Outside "; }
383 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; 383 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR IDE;
384 384
385 bool isFlipped() const { return fIsFlipped; } 385 bool isFlipped() const { return fIsFlipped; }
386 SkScalar focal() const { return fFocalX; } 386 SkScalar focal() const { return fFocalX; }
387 387
388 typedef GLFocalOutside2PtConicalEffect GLEffect; 388 typedef GLFocalOutside2PtConicalEffect GLProcessor;
389 389
390 private: 390 private:
391 virtual bool onIsEqual(const GrEffect& sBase) const SK_OVERRIDE { 391 virtual bool onIsEqual(const GrProcessor& sBase) const SK_OVERRIDE {
392 const FocalOutside2PtConicalEffect& s = sBase.cast<FocalOutside2PtConica lEffect>(); 392 const FocalOutside2PtConicalEffect& s = sBase.cast<FocalOutside2PtConica lEffect>();
393 return (INHERITED::onIsEqual(sBase) && 393 return (INHERITED::onIsEqual(sBase) &&
394 this->fFocalX == s.fFocalX && 394 this->fFocalX == s.fFocalX &&
395 this->fIsFlipped == s.fIsFlipped); 395 this->fIsFlipped == s.fIsFlipped);
396 } 396 }
397 397
398 FocalOutside2PtConicalEffect(GrContext* ctx, 398 FocalOutside2PtConicalEffect(GrContext* ctx,
399 const SkTwoPointConicalGradient& shader, 399 const SkTwoPointConicalGradient& shader,
400 const SkMatrix& matrix, 400 const SkMatrix& matrix,
401 SkShader::TileMode tm, 401 SkShader::TileMode tm,
402 SkScalar focalX) 402 SkScalar focalX)
403 : INHERITED(ctx, shader, matrix, tm), fFocalX(focalX), fIsFlipped(shader.isF lippedGrad()) {} 403 : INHERITED(ctx, shader, matrix, tm), fFocalX(focalX), fIsFlipped(shader.isF lippedGrad()) {}
404 404
405 GR_DECLARE_EFFECT_TEST; 405 GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
406 406
407 SkScalar fFocalX; 407 SkScalar fFocalX;
408 bool fIsFlipped; 408 bool fIsFlipped;
409 409
410 typedef GrGradientEffect INHERITED; 410 typedef GrGradientEffect INHERITED;
411 }; 411 };
412 412
413 class GLFocalOutside2PtConicalEffect : public GrGLGradientEffect { 413 class GLFocalOutside2PtConicalEffect : public GrGLGradientEffect {
414 public: 414 public:
415 GLFocalOutside2PtConicalEffect(const GrBackendEffectFactory& factory, const GrEffect&); 415 GLFocalOutside2PtConicalEffect(const GrBackendProcessorFactory& factory, con st GrProcessor&);
416 virtual ~GLFocalOutside2PtConicalEffect() { } 416 virtual ~GLFocalOutside2PtConicalEffect() { }
417 417
418 virtual void emitCode(GrGLProgramBuilder*, 418 virtual void emitCode(GrGLProgramBuilder*,
419 const GrEffect&, 419 const GrFragmentProcessor&,
420 const GrEffectKey&, 420 const GrProcessorKey&,
421 const char* outputColor, 421 const char* outputColor,
422 const char* inputColor, 422 const char* inputColor,
423 const TransformedCoordsArray&, 423 const TransformedCoordsArray&,
424 const TextureSamplerArray&) SK_OVERRIDE; 424 const TextureSamplerArray&) SK_OVERRIDE;
425 virtual void setData(const GrGLProgramDataManager&, const GrEffect&) SK_OVER RIDE; 425 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O VERRIDE;
426 426
427 static void GenKey(const GrEffect&, const GrGLCaps& caps, GrEffectKeyBuilder * b); 427 static void GenKey(const GrProcessor&, const GrGLCaps& caps, GrProcessorKeyB uilder* b);
428 428
429 protected: 429 protected:
430 UniformHandle fParamUni; 430 UniformHandle fParamUni;
431 431
432 const char* fVSVaryingName; 432 const char* fVSVaryingName;
433 const char* fFSVaryingName; 433 const char* fFSVaryingName;
434 434
435 bool fIsFlipped; 435 bool fIsFlipped;
436 436
437 // @{ 437 // @{
438 /// Values last uploaded as uniforms 438 /// Values last uploaded as uniforms
439 439
440 SkScalar fCachedFocal; 440 SkScalar fCachedFocal;
441 441
442 // @} 442 // @}
443 443
444 private: 444 private:
445 typedef GrGLGradientEffect INHERITED; 445 typedef GrGLGradientEffect INHERITED;
446 446
447 }; 447 };
448 448
449 const GrBackendEffectFactory& FocalOutside2PtConicalEffect::getFactory() const { 449 const GrBackendFragmentProcessorFactory& FocalOutside2PtConicalEffect::getFactor y() const {
450 return GrTBackendEffectFactory<FocalOutside2PtConicalEffect>::getInstance(); 450 return GrTBackendFragmentProcessorFactory<FocalOutside2PtConicalEffect>::get Instance();
451 } 451 }
452 452
453 GR_DEFINE_EFFECT_TEST(FocalOutside2PtConicalEffect); 453 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(FocalOutside2PtConicalEffect);
454 454
455 GrEffect* FocalOutside2PtConicalEffect::TestCreate(SkRandom* random, 455 GrFragmentProcessor* FocalOutside2PtConicalEffect::TestCreate(SkRandom* random,
456 GrContext* context, 456 GrContext* context ,
457 const GrDrawTargetCaps&, 457 const GrDrawTarget Caps&,
458 GrTexture**) { 458 GrTexture**) {
459 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()}; 459 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()};
460 SkScalar radius1 = 0.f; 460 SkScalar radius1 = 0.f;
461 SkPoint center2; 461 SkPoint center2;
462 SkScalar radius2; 462 SkScalar radius2;
463 do { 463 do {
464 center2.set(random->nextUScalar1(), random->nextUScalar1()); 464 center2.set(random->nextUScalar1(), random->nextUScalar1());
465 // Need to make sure the centers are not the same or else focal point wi ll be inside 465 // Need to make sure the centers are not the same or else focal point wi ll be inside
466 } while (center1 == center2); 466 } while (center1 == center2);
467 SkPoint diff = center2 - center1; 467 SkPoint diff = center2 - center1;
468 SkScalar diffLen = diff.length(); 468 SkScalar diffLen = diff.length();
469 // Below makes sure that the focal point is not contained within circle two 469 // Below makes sure that the focal point is not contained within circle two
470 radius2 = random->nextRangeF(0.f, diffLen); 470 radius2 = random->nextRangeF(0.f, diffLen);
471 471
472 SkColor colors[kMaxRandomGradientColors]; 472 SkColor colors[kMaxRandomGradientColors];
473 SkScalar stopsArray[kMaxRandomGradientColors]; 473 SkScalar stopsArray[kMaxRandomGradientColors];
474 SkScalar* stops = stopsArray; 474 SkScalar* stops = stopsArray;
475 SkShader::TileMode tm; 475 SkShader::TileMode tm;
476 int colorCount = RandomGradientParams(random, colors, &stops, &tm); 476 int colorCount = RandomGradientParams(random, colors, &stops, &tm);
477 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center 1, radius1, 477 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center 1, radius1,
478 center 2, radius2, 478 center 2, radius2,
479 colors , stops, colorCount, 479 colors , stops, colorCount,
480 tm)); 480 tm));
481 SkPaint paint; 481 SkPaint paint;
482 GrEffect* effect; 482 GrFragmentProcessor* effect;
483 GrColor paintColor; 483 GrColor paintColor;
484 SkAssertResult(shader->asNewEffect(context, paint, NULL, &paintColor, &effec t)); 484 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor , &effect));
485 return effect; 485 return effect;
486 } 486 }
487 487
488 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrBackendEf fectFactory& factory, 488 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrBackendPr ocessorFactory& factory,
489 const GrEffect& e ffect) 489 const GrProcessor & processor)
490 : INHERITED(factory) 490 : INHERITED(factory)
491 , fVSVaryingName(NULL) 491 , fVSVaryingName(NULL)
492 , fFSVaryingName(NULL) 492 , fFSVaryingName(NULL)
493 , fCachedFocal(SK_ScalarMax) { 493 , fCachedFocal(SK_ScalarMax) {
494 const FocalOutside2PtConicalEffect& data = effect.cast<FocalOutside2PtConica lEffect>(); 494 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon icalEffect>();
495 fIsFlipped = data.isFlipped(); 495 fIsFlipped = data.isFlipped();
496 } 496 }
497 497
498 void GLFocalOutside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder, 498 void GLFocalOutside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder,
499 const GrEffect&, 499 const GrFragmentProcessor&,
500 const GrEffectKey& key, 500 const GrProcessorKey& key,
501 const char* outputColor, 501 const char* outputColor,
502 const char* inputColor, 502 const char* inputColor,
503 const TransformedCoordsArray& coor ds, 503 const TransformedCoordsArray& coor ds,
504 const TextureSamplerArray& sampler s) { 504 const TextureSamplerArray& sampler s) {
505 uint32_t baseKey = key.get32(0); 505 uint32_t baseKey = key.get32(0);
506 this->emitUniforms(builder, baseKey); 506 this->emitUniforms(builder, baseKey);
507 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit y, 507 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit y,
508 kFloat_GrSLType, "Conical2FSParams", 2) ; 508 kFloat_GrSLType, "Conical2FSParams", 2) ;
509 SkString tName("t"); 509 SkString tName("t");
510 SkString p0; // focalX 510 SkString p0; // focalX
(...skipping 27 matching lines...) Expand all
538 coords2D, p0.c_str()); 538 coords2D, p0.c_str());
539 } 539 }
540 540
541 fsBuilder->codeAppendf("\tif (%s >= 0.0 && d >= 0.0) {\n", tName.c_str()); 541 fsBuilder->codeAppendf("\tif (%s >= 0.0 && d >= 0.0) {\n", tName.c_str());
542 fsBuilder->codeAppend("\t\t"); 542 fsBuilder->codeAppend("\t\t");
543 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers); 543 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers);
544 fsBuilder->codeAppend("\t}\n"); 544 fsBuilder->codeAppend("\t}\n");
545 } 545 }
546 546
547 void GLFocalOutside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman , 547 void GLFocalOutside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman ,
548 const GrEffect& effect) { 548 const GrProcessor& processor) {
549 INHERITED::setData(pdman, effect); 549 INHERITED::setData(pdman, processor);
550 const FocalOutside2PtConicalEffect& data = effect.cast<FocalOutside2PtConica lEffect>(); 550 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon icalEffect>();
551 SkASSERT(data.isFlipped() == fIsFlipped); 551 SkASSERT(data.isFlipped() == fIsFlipped);
552 SkScalar focal = data.focal(); 552 SkScalar focal = data.focal();
553 553
554 if (fCachedFocal != focal) { 554 if (fCachedFocal != focal) {
555 SkScalar oneMinus2F = 1.f - SkScalarMul(focal, focal); 555 SkScalar oneMinus2F = 1.f - SkScalarMul(focal, focal);
556 556
557 float values[2] = { 557 float values[2] = {
558 SkScalarToFloat(focal), 558 SkScalarToFloat(focal),
559 SkScalarToFloat(oneMinus2F), 559 SkScalarToFloat(oneMinus2F),
560 }; 560 };
561 561
562 pdman.set1fv(fParamUni, 2, values); 562 pdman.set1fv(fParamUni, 2, values);
563 fCachedFocal = focal; 563 fCachedFocal = focal;
564 } 564 }
565 } 565 }
566 566
567 void GLFocalOutside2PtConicalEffect::GenKey(const GrEffect& effect, 567 void GLFocalOutside2PtConicalEffect::GenKey(const GrProcessor& processor,
568 const GrGLCaps&, GrEffectKeyBuilder* b) { 568 const GrGLCaps&, GrProcessorKeyBuild er* b) {
569 uint32_t* key = b->add32n(2); 569 uint32_t* key = b->add32n(2);
570 key[0] = GenBaseGradientKey(effect); 570 key[0] = GenBaseGradientKey(processor);
571 key[1] = effect.cast<FocalOutside2PtConicalEffect>().isFlipped(); 571 key[1] = processor.cast<FocalOutside2PtConicalEffect>().isFlipped();
572 } 572 }
573 573
574 ////////////////////////////////////////////////////////////////////////////// 574 //////////////////////////////////////////////////////////////////////////////
575 575
576 class GLFocalInside2PtConicalEffect; 576 class GLFocalInside2PtConicalEffect;
577 577
578 class FocalInside2PtConicalEffect : public GrGradientEffect { 578 class FocalInside2PtConicalEffect : public GrGradientEffect {
579 public: 579 public:
580 580
581 static GrEffect* Create(GrContext* ctx, 581 static GrFragmentProcessor* Create(GrContext* ctx,
582 const SkTwoPointConicalGradient& shader, 582 const SkTwoPointConicalGradient& shader,
583 const SkMatrix& matrix, 583 const SkMatrix& matrix,
584 SkShader::TileMode tm, 584 SkShader::TileMode tm,
585 SkScalar focalX) { 585 SkScalar focalX) {
586 return SkNEW_ARGS(FocalInside2PtConicalEffect, (ctx, shader, matrix, tm, focalX)); 586 return SkNEW_ARGS(FocalInside2PtConicalEffect, (ctx, shader, matrix, tm, focalX));
587 } 587 }
588 588
589 virtual ~FocalInside2PtConicalEffect() {} 589 virtual ~FocalInside2PtConicalEffect() {}
590 590
591 static const char* Name() { return "Two-Point Conical Gradient Focal Inside" ; } 591 static const char* Name() { return "Two-Point Conical Gradient Focal Inside" ; }
592 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; 592 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR IDE;
593 593
594 SkScalar focal() const { return fFocalX; } 594 SkScalar focal() const { return fFocalX; }
595 595
596 typedef GLFocalInside2PtConicalEffect GLEffect; 596 typedef GLFocalInside2PtConicalEffect GLProcessor;
597 597
598 private: 598 private:
599 virtual bool onIsEqual(const GrEffect& sBase) const SK_OVERRIDE { 599 virtual bool onIsEqual(const GrProcessor& sBase) const SK_OVERRIDE {
600 const FocalInside2PtConicalEffect& s = sBase.cast<FocalInside2PtConicalE ffect>(); 600 const FocalInside2PtConicalEffect& s = sBase.cast<FocalInside2PtConicalE ffect>();
601 return (INHERITED::onIsEqual(sBase) && 601 return (INHERITED::onIsEqual(sBase) &&
602 this->fFocalX == s.fFocalX); 602 this->fFocalX == s.fFocalX);
603 } 603 }
604 604
605 FocalInside2PtConicalEffect(GrContext* ctx, 605 FocalInside2PtConicalEffect(GrContext* ctx,
606 const SkTwoPointConicalGradient& shader, 606 const SkTwoPointConicalGradient& shader,
607 const SkMatrix& matrix, 607 const SkMatrix& matrix,
608 SkShader::TileMode tm, 608 SkShader::TileMode tm,
609 SkScalar focalX) 609 SkScalar focalX)
610 : INHERITED(ctx, shader, matrix, tm), fFocalX(focalX) {} 610 : INHERITED(ctx, shader, matrix, tm), fFocalX(focalX) {}
611 611
612 GR_DECLARE_EFFECT_TEST; 612 GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
613 613
614 SkScalar fFocalX; 614 SkScalar fFocalX;
615 615
616 typedef GrGradientEffect INHERITED; 616 typedef GrGradientEffect INHERITED;
617 }; 617 };
618 618
619 class GLFocalInside2PtConicalEffect : public GrGLGradientEffect { 619 class GLFocalInside2PtConicalEffect : public GrGLGradientEffect {
620 public: 620 public:
621 GLFocalInside2PtConicalEffect(const GrBackendEffectFactory& factory, const G rEffect&); 621 GLFocalInside2PtConicalEffect(const GrBackendProcessorFactory& factory, cons t GrProcessor&);
622 virtual ~GLFocalInside2PtConicalEffect() {} 622 virtual ~GLFocalInside2PtConicalEffect() {}
623 623
624 virtual void emitCode(GrGLProgramBuilder*, 624 virtual void emitCode(GrGLProgramBuilder*,
625 const GrEffect&, 625 const GrFragmentProcessor&,
626 const GrEffectKey&, 626 const GrProcessorKey&,
627 const char* outputColor, 627 const char* outputColor,
628 const char* inputColor, 628 const char* inputColor,
629 const TransformedCoordsArray&, 629 const TransformedCoordsArray&,
630 const TextureSamplerArray&) SK_OVERRIDE; 630 const TextureSamplerArray&) SK_OVERRIDE;
631 virtual void setData(const GrGLProgramDataManager&, const GrEffect&) SK_OVER RIDE; 631 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O VERRIDE;
632 632
633 static void GenKey(const GrEffect&, const GrGLCaps& caps, GrEffectKeyBuilder * b); 633 static void GenKey(const GrProcessor&, const GrGLCaps& caps, GrProcessorKeyB uilder* b);
634 634
635 protected: 635 protected:
636 UniformHandle fFocalUni; 636 UniformHandle fFocalUni;
637 637
638 const char* fVSVaryingName; 638 const char* fVSVaryingName;
639 const char* fFSVaryingName; 639 const char* fFSVaryingName;
640 640
641 // @{ 641 // @{
642 /// Values last uploaded as uniforms 642 /// Values last uploaded as uniforms
643 643
644 SkScalar fCachedFocal; 644 SkScalar fCachedFocal;
645 645
646 // @} 646 // @}
647 647
648 private: 648 private:
649 typedef GrGLGradientEffect INHERITED; 649 typedef GrGLGradientEffect INHERITED;
650 650
651 }; 651 };
652 652
653 const GrBackendEffectFactory& FocalInside2PtConicalEffect::getFactory() const { 653 const GrBackendFragmentProcessorFactory& FocalInside2PtConicalEffect::getFactory () const {
654 return GrTBackendEffectFactory<FocalInside2PtConicalEffect>::getInstance(); 654 return GrTBackendFragmentProcessorFactory<FocalInside2PtConicalEffect>::getI nstance();
655 } 655 }
656 656
657 GR_DEFINE_EFFECT_TEST(FocalInside2PtConicalEffect); 657 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(FocalInside2PtConicalEffect);
658 658
659 GrEffect* FocalInside2PtConicalEffect::TestCreate(SkRandom* random, 659 GrFragmentProcessor* FocalInside2PtConicalEffect::TestCreate(SkRandom* random,
660 GrContext* context, 660 GrContext* context,
661 const GrDrawTargetCaps&, 661 const GrDrawTargetC aps&,
662 GrTexture**) { 662 GrTexture**) {
663 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()}; 663 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()};
664 SkScalar radius1 = 0.f; 664 SkScalar radius1 = 0.f;
665 SkPoint center2; 665 SkPoint center2;
666 SkScalar radius2; 666 SkScalar radius2;
667 do { 667 do {
668 center2.set(random->nextUScalar1(), random->nextUScalar1()); 668 center2.set(random->nextUScalar1(), random->nextUScalar1());
669 // Below makes sure radius2 is larger enouch such that the focal point 669 // Below makes sure radius2 is larger enouch such that the focal point
670 // is inside the end circle 670 // is inside the end circle
671 SkScalar increase = random->nextUScalar1(); 671 SkScalar increase = random->nextUScalar1();
672 SkPoint diff = center2 - center1; 672 SkPoint diff = center2 - center1;
673 SkScalar diffLen = diff.length(); 673 SkScalar diffLen = diff.length();
674 radius2 = diffLen + increase; 674 radius2 = diffLen + increase;
675 // If the circles are identical the factory will give us an empty shader . 675 // If the circles are identical the factory will give us an empty shader .
676 } while (radius1 == radius2 && center1 == center2); 676 } while (radius1 == radius2 && center1 == center2);
677 677
678 SkColor colors[kMaxRandomGradientColors]; 678 SkColor colors[kMaxRandomGradientColors];
679 SkScalar stopsArray[kMaxRandomGradientColors]; 679 SkScalar stopsArray[kMaxRandomGradientColors];
680 SkScalar* stops = stopsArray; 680 SkScalar* stops = stopsArray;
681 SkShader::TileMode tm; 681 SkShader::TileMode tm;
682 int colorCount = RandomGradientParams(random, colors, &stops, &tm); 682 int colorCount = RandomGradientParams(random, colors, &stops, &tm);
683 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center 1, radius1, 683 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center 1, radius1,
684 center 2, radius2, 684 center 2, radius2,
685 colors , stops, colorCount, 685 colors , stops, colorCount,
686 tm)); 686 tm));
687 SkPaint paint; 687 SkPaint paint;
688 GrColor paintColor; 688 GrColor paintColor;
689 GrEffect* effect; 689 GrFragmentProcessor* fp;
690 SkAssertResult(shader->asNewEffect(context, paint, NULL, &paintColor, &effec t)); 690 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor , &fp));
691 return effect; 691 return fp;
692 } 692 }
693 693
694 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrBackendEffe ctFactory& factory, 694 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrBackendProc essorFactory& factory,
695 const GrEffect& eff ect) 695 const GrProcessor&)
696 : INHERITED(factory) 696 : INHERITED(factory)
697 , fVSVaryingName(NULL) 697 , fVSVaryingName(NULL)
698 , fFSVaryingName(NULL) 698 , fFSVaryingName(NULL)
699 , fCachedFocal(SK_ScalarMax) {} 699 , fCachedFocal(SK_ScalarMax) {}
700 700
701 void GLFocalInside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder, 701 void GLFocalInside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder,
702 const GrEffect&, 702 const GrFragmentProcessor&,
703 const GrEffectKey& key, 703 const GrProcessorKey& key,
704 const char* outputColor, 704 const char* outputColor,
705 const char* inputColor, 705 const char* inputColor,
706 const TransformedCoordsArray& coord s, 706 const TransformedCoordsArray& coord s,
707 const TextureSamplerArray& samplers ) { 707 const TextureSamplerArray& samplers ) {
708 uint32_t baseKey = key.get32(0); 708 uint32_t baseKey = key.get32(0);
709 this->emitUniforms(builder, baseKey); 709 this->emitUniforms(builder, baseKey);
710 fFocalUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 710 fFocalUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
711 kFloat_GrSLType, "Conical2FSParams"); 711 kFloat_GrSLType, "Conical2FSParams");
712 SkString tName("t"); 712 SkString tName("t");
713 713
714 // this is the distance along x-axis from the end center to focal point in 714 // this is the distance along x-axis from the end center to focal point in
715 // transformed coordinates 715 // transformed coordinates
716 GrGLShaderVar focal = builder->getUniformVariable(fFocalUni); 716 GrGLShaderVar focal = builder->getUniformVariable(fFocalUni);
717 717
718 // if we have a vec3 from being in perspective, convert it to a vec2 first 718 // if we have a vec3 from being in perspective, convert it to a vec2 first
719 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 719 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
720 SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0); 720 SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0);
721 const char* coords2D = coords2DString.c_str(); 721 const char* coords2D = coords2DString.c_str();
722 722
723 // t = p.x * focalX + length(p) 723 // t = p.x * focalX + length(p)
724 fsBuilder->codeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_st r(), 724 fsBuilder->codeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_st r(),
725 coords2D, focal.c_str(), coords2D); 725 coords2D, focal.c_str(), coords2D);
726 726
727 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers); 727 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers);
728 } 728 }
729 729
730 void GLFocalInside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman, 730 void GLFocalInside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman,
731 const GrEffect& effect) { 731 const GrProcessor& processor) {
732 INHERITED::setData(pdman, effect); 732 INHERITED::setData(pdman, processor);
733 const FocalInside2PtConicalEffect& data = effect.cast<FocalInside2PtConicalE ffect>(); 733 const FocalInside2PtConicalEffect& data = processor.cast<FocalInside2PtConic alEffect>();
734 SkScalar focal = data.focal(); 734 SkScalar focal = data.focal();
735 735
736 if (fCachedFocal != focal) { 736 if (fCachedFocal != focal) {
737 pdman.set1f(fFocalUni, SkScalarToFloat(focal)); 737 pdman.set1f(fFocalUni, SkScalarToFloat(focal));
738 fCachedFocal = focal; 738 fCachedFocal = focal;
739 } 739 }
740 } 740 }
741 741
742 void GLFocalInside2PtConicalEffect::GenKey(const GrEffect& effect, 742 void GLFocalInside2PtConicalEffect::GenKey(const GrProcessor& processor,
743 const GrGLCaps&, GrEffectKeyBuilder* b) { 743 const GrGLCaps&, GrProcessorKeyBuilde r* b) {
744 b->add32(GenBaseGradientKey(effect)); 744 b->add32(GenBaseGradientKey(processor));
745 } 745 }
746 746
747 ////////////////////////////////////////////////////////////////////////////// 747 //////////////////////////////////////////////////////////////////////////////
748 // Circle Conical Gradients 748 // Circle Conical Gradients
749 ////////////////////////////////////////////////////////////////////////////// 749 //////////////////////////////////////////////////////////////////////////////
750 750
751 struct CircleConicalInfo { 751 struct CircleConicalInfo {
752 SkPoint fCenterEnd; 752 SkPoint fCenterEnd;
753 SkScalar fA; 753 SkScalar fA;
754 SkScalar fB; 754 SkScalar fB;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
806 return kInside_ConicalType; 806 return kInside_ConicalType;
807 } 807 }
808 return kOutside_ConicalType; 808 return kOutside_ConicalType;
809 } 809 }
810 810
811 class GLCircleInside2PtConicalEffect; 811 class GLCircleInside2PtConicalEffect;
812 812
813 class CircleInside2PtConicalEffect : public GrGradientEffect { 813 class CircleInside2PtConicalEffect : public GrGradientEffect {
814 public: 814 public:
815 815
816 static GrEffect* Create(GrContext* ctx, 816 static GrFragmentProcessor* Create(GrContext* ctx,
817 const SkTwoPointConicalGradient& shader, 817 const SkTwoPointConicalGradient& shader,
818 const SkMatrix& matrix, 818 const SkMatrix& matrix,
819 SkShader::TileMode tm, 819 SkShader::TileMode tm,
820 const CircleConicalInfo& info) { 820 const CircleConicalInfo& info) {
821 return SkNEW_ARGS(CircleInside2PtConicalEffect, (ctx, shader, matrix, tm , info)); 821 return SkNEW_ARGS(CircleInside2PtConicalEffect, (ctx, shader, matrix, tm , info));
822 } 822 }
823 823
824 virtual ~CircleInside2PtConicalEffect() {} 824 virtual ~CircleInside2PtConicalEffect() {}
825 825
826 static const char* Name() { return "Two-Point Conical Gradient Inside"; } 826 static const char* Name() { return "Two-Point Conical Gradient Inside"; }
827 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; 827 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR IDE;
828 828
829 SkScalar centerX() const { return fInfo.fCenterEnd.fX; } 829 SkScalar centerX() const { return fInfo.fCenterEnd.fX; }
830 SkScalar centerY() const { return fInfo.fCenterEnd.fY; } 830 SkScalar centerY() const { return fInfo.fCenterEnd.fY; }
831 SkScalar A() const { return fInfo.fA; } 831 SkScalar A() const { return fInfo.fA; }
832 SkScalar B() const { return fInfo.fB; } 832 SkScalar B() const { return fInfo.fB; }
833 SkScalar C() const { return fInfo.fC; } 833 SkScalar C() const { return fInfo.fC; }
834 834
835 typedef GLCircleInside2PtConicalEffect GLEffect; 835 typedef GLCircleInside2PtConicalEffect GLProcessor;
836 836
837 private: 837 private:
838 virtual bool onIsEqual(const GrEffect& sBase) const SK_OVERRIDE { 838 virtual bool onIsEqual(const GrProcessor& sBase) const SK_OVERRIDE {
839 const CircleInside2PtConicalEffect& s = sBase.cast<CircleInside2PtConica lEffect>(); 839 const CircleInside2PtConicalEffect& s = sBase.cast<CircleInside2PtConica lEffect>();
840 return (INHERITED::onIsEqual(sBase) && 840 return (INHERITED::onIsEqual(sBase) &&
841 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd && 841 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd &&
842 this->fInfo.fA == s.fInfo.fA && 842 this->fInfo.fA == s.fInfo.fA &&
843 this->fInfo.fB == s.fInfo.fB && 843 this->fInfo.fB == s.fInfo.fB &&
844 this->fInfo.fC == s.fInfo.fC); 844 this->fInfo.fC == s.fInfo.fC);
845 } 845 }
846 846
847 CircleInside2PtConicalEffect(GrContext* ctx, 847 CircleInside2PtConicalEffect(GrContext* ctx,
848 const SkTwoPointConicalGradient& shader, 848 const SkTwoPointConicalGradient& shader,
849 const SkMatrix& matrix, 849 const SkMatrix& matrix,
850 SkShader::TileMode tm, 850 SkShader::TileMode tm,
851 const CircleConicalInfo& info) 851 const CircleConicalInfo& info)
852 : INHERITED(ctx, shader, matrix, tm), fInfo(info) {} 852 : INHERITED(ctx, shader, matrix, tm), fInfo(info) {}
853 853
854 GR_DECLARE_EFFECT_TEST; 854 GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
855 855
856 const CircleConicalInfo fInfo; 856 const CircleConicalInfo fInfo;
857 857
858 typedef GrGradientEffect INHERITED; 858 typedef GrGradientEffect INHERITED;
859 }; 859 };
860 860
861 class GLCircleInside2PtConicalEffect : public GrGLGradientEffect { 861 class GLCircleInside2PtConicalEffect : public GrGLGradientEffect {
862 public: 862 public:
863 GLCircleInside2PtConicalEffect(const GrBackendEffectFactory& factory, const GrEffect&); 863 GLCircleInside2PtConicalEffect(const GrBackendProcessorFactory& factory, con st GrProcessor&);
864 virtual ~GLCircleInside2PtConicalEffect() {} 864 virtual ~GLCircleInside2PtConicalEffect() {}
865 865
866 virtual void emitCode(GrGLProgramBuilder*, 866 virtual void emitCode(GrGLProgramBuilder*,
867 const GrEffect&, 867 const GrFragmentProcessor&,
868 const GrEffectKey&, 868 const GrProcessorKey&,
869 const char* outputColor, 869 const char* outputColor,
870 const char* inputColor, 870 const char* inputColor,
871 const TransformedCoordsArray&, 871 const TransformedCoordsArray&,
872 const TextureSamplerArray&) SK_OVERRIDE; 872 const TextureSamplerArray&) SK_OVERRIDE;
873 virtual void setData(const GrGLProgramDataManager&, const GrEffect&) SK_OVER RIDE; 873 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O VERRIDE;
874 874
875 static void GenKey(const GrEffect&, const GrGLCaps& caps, GrEffectKeyBuilder * b); 875 static void GenKey(const GrProcessor&, const GrGLCaps& caps, GrProcessorKeyB uilder* b);
876 876
877 protected: 877 protected:
878 UniformHandle fCenterUni; 878 UniformHandle fCenterUni;
879 UniformHandle fParamUni; 879 UniformHandle fParamUni;
880 880
881 const char* fVSVaryingName; 881 const char* fVSVaryingName;
882 const char* fFSVaryingName; 882 const char* fFSVaryingName;
883 883
884 // @{ 884 // @{
885 /// Values last uploaded as uniforms 885 /// Values last uploaded as uniforms
886 886
887 SkScalar fCachedCenterX; 887 SkScalar fCachedCenterX;
888 SkScalar fCachedCenterY; 888 SkScalar fCachedCenterY;
889 SkScalar fCachedA; 889 SkScalar fCachedA;
890 SkScalar fCachedB; 890 SkScalar fCachedB;
891 SkScalar fCachedC; 891 SkScalar fCachedC;
892 892
893 // @} 893 // @}
894 894
895 private: 895 private:
896 typedef GrGLGradientEffect INHERITED; 896 typedef GrGLGradientEffect INHERITED;
897 897
898 }; 898 };
899 899
900 const GrBackendEffectFactory& CircleInside2PtConicalEffect::getFactory() const { 900 const GrBackendFragmentProcessorFactory& CircleInside2PtConicalEffect::getFactor y() const {
901 return GrTBackendEffectFactory<CircleInside2PtConicalEffect>::getInstance(); 901 return GrTBackendFragmentProcessorFactory<CircleInside2PtConicalEffect>::get Instance();
902 } 902 }
903 903
904 GR_DEFINE_EFFECT_TEST(CircleInside2PtConicalEffect); 904 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(CircleInside2PtConicalEffect);
905 905
906 GrEffect* CircleInside2PtConicalEffect::TestCreate(SkRandom* random, 906 GrFragmentProcessor* CircleInside2PtConicalEffect::TestCreate(SkRandom* random,
907 GrContext* context, 907 GrContext* context ,
908 const GrDrawTargetCaps&, 908 const GrDrawTarget Caps&,
909 GrTexture**) { 909 GrTexture**) {
910 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()}; 910 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()};
911 SkScalar radius1 = random->nextUScalar1() + 0.0001f; // make sure radius1 != 0 911 SkScalar radius1 = random->nextUScalar1() + 0.0001f; // make sure radius1 != 0
912 SkPoint center2; 912 SkPoint center2;
913 SkScalar radius2; 913 SkScalar radius2;
914 do { 914 do {
915 center2.set(random->nextUScalar1(), random->nextUScalar1()); 915 center2.set(random->nextUScalar1(), random->nextUScalar1());
916 // Below makes sure that circle one is contained within circle two 916 // Below makes sure that circle one is contained within circle two
917 SkScalar increase = random->nextUScalar1(); 917 SkScalar increase = random->nextUScalar1();
918 SkPoint diff = center2 - center1; 918 SkPoint diff = center2 - center1;
919 SkScalar diffLen = diff.length(); 919 SkScalar diffLen = diff.length();
920 radius2 = radius1 + diffLen + increase; 920 radius2 = radius1 + diffLen + increase;
921 // If the circles are identical the factory will give us an empty shader . 921 // If the circles are identical the factory will give us an empty shader .
922 } while (radius1 == radius2 && center1 == center2); 922 } while (radius1 == radius2 && center1 == center2);
923 923
924 SkColor colors[kMaxRandomGradientColors]; 924 SkColor colors[kMaxRandomGradientColors];
925 SkScalar stopsArray[kMaxRandomGradientColors]; 925 SkScalar stopsArray[kMaxRandomGradientColors];
926 SkScalar* stops = stopsArray; 926 SkScalar* stops = stopsArray;
927 SkShader::TileMode tm; 927 SkShader::TileMode tm;
928 int colorCount = RandomGradientParams(random, colors, &stops, &tm); 928 int colorCount = RandomGradientParams(random, colors, &stops, &tm);
929 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center 1, radius1, 929 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center 1, radius1,
930 center 2, radius2, 930 center 2, radius2,
931 colors , stops, colorCount, 931 colors , stops, colorCount,
932 tm)); 932 tm));
933 SkPaint paint; 933 SkPaint paint;
934 GrColor paintColor; 934 GrColor paintColor;
935 GrEffect* effect; 935 GrFragmentProcessor* processor;
936 SkAssertResult(shader->asNewEffect(context, paint, NULL, &paintColor, &effec t)); 936 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor , &processor));
937 return effect; 937 return processor;
938 } 938 }
939 939
940 GLCircleInside2PtConicalEffect::GLCircleInside2PtConicalEffect(const GrBackendEf fectFactory& factory, 940 GLCircleInside2PtConicalEffect::GLCircleInside2PtConicalEffect(const GrBackendPr ocessorFactory& factory,
941 const GrEffect& e ffect) 941 const GrProcessor & processor)
942 : INHERITED(factory) 942 : INHERITED(factory)
943 , fVSVaryingName(NULL) 943 , fVSVaryingName(NULL)
944 , fFSVaryingName(NULL) 944 , fFSVaryingName(NULL)
945 , fCachedCenterX(SK_ScalarMax) 945 , fCachedCenterX(SK_ScalarMax)
946 , fCachedCenterY(SK_ScalarMax) 946 , fCachedCenterY(SK_ScalarMax)
947 , fCachedA(SK_ScalarMax) 947 , fCachedA(SK_ScalarMax)
948 , fCachedB(SK_ScalarMax) 948 , fCachedB(SK_ScalarMax)
949 , fCachedC(SK_ScalarMax) {} 949 , fCachedC(SK_ScalarMax) {}
950 950
951 void GLCircleInside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder, 951 void GLCircleInside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder,
952 const GrEffect&, 952 const GrFragmentProcessor&,
953 const GrEffectKey& key, 953 const GrProcessorKey& key,
954 const char* outputColor, 954 const char* outputColor,
955 const char* inputColor, 955 const char* inputColor,
956 const TransformedCoordsArray& coor ds, 956 const TransformedCoordsArray& coor ds,
957 const TextureSamplerArray& sampler s) { 957 const TextureSamplerArray& sampler s) {
958 uint32_t baseKey = key.get32(0); 958 uint32_t baseKey = key.get32(0);
959 this->emitUniforms(builder, baseKey); 959 this->emitUniforms(builder, baseKey);
960 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 960 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
961 kVec2f_GrSLType, "Conical2FSCenter"); 961 kVec2f_GrSLType, "Conical2FSCenter");
962 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 962 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
963 kVec3f_GrSLType, "Conical2FSParams"); 963 kVec3f_GrSLType, "Conical2FSParams");
(...skipping 21 matching lines...) Expand all
985 fsBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D ); 985 fsBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D );
986 fsBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, cente r.c_str(), 986 fsBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, cente r.c_str(),
987 params.c_str()); 987 params.c_str());
988 fsBuilder->codeAppendf("\tfloat %s = d + sqrt(d * d - %s.x * pDotp + %s.z);\ n", 988 fsBuilder->codeAppendf("\tfloat %s = d + sqrt(d * d - %s.x * pDotp + %s.z);\ n",
989 tName.c_str(), params.c_str(), params.c_str()); 989 tName.c_str(), params.c_str(), params.c_str());
990 990
991 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers); 991 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers);
992 } 992 }
993 993
994 void GLCircleInside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman , 994 void GLCircleInside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman ,
995 const GrEffect& effect) { 995 const GrProcessor& processor) {
996 INHERITED::setData(pdman, effect); 996 INHERITED::setData(pdman, processor);
997 const CircleInside2PtConicalEffect& data = effect.cast<CircleInside2PtConica lEffect>(); 997 const CircleInside2PtConicalEffect& data = processor.cast<CircleInside2PtCon icalEffect>();
998 SkScalar centerX = data.centerX(); 998 SkScalar centerX = data.centerX();
999 SkScalar centerY = data.centerY(); 999 SkScalar centerY = data.centerY();
1000 SkScalar A = data.A(); 1000 SkScalar A = data.A();
1001 SkScalar B = data.B(); 1001 SkScalar B = data.B();
1002 SkScalar C = data.C(); 1002 SkScalar C = data.C();
1003 1003
1004 if (fCachedCenterX != centerX || fCachedCenterY != centerY || 1004 if (fCachedCenterX != centerX || fCachedCenterY != centerY ||
1005 fCachedA != A || fCachedB != B || fCachedC != C) { 1005 fCachedA != A || fCachedB != B || fCachedC != C) {
1006 1006
1007 pdman.set2f(fCenterUni, SkScalarToFloat(centerX), SkScalarToFloat(center Y)); 1007 pdman.set2f(fCenterUni, SkScalarToFloat(centerX), SkScalarToFloat(center Y));
1008 pdman.set3f(fParamUni, SkScalarToFloat(A), SkScalarToFloat(B), SkScalarT oFloat(C)); 1008 pdman.set3f(fParamUni, SkScalarToFloat(A), SkScalarToFloat(B), SkScalarT oFloat(C));
1009 1009
1010 fCachedCenterX = centerX; 1010 fCachedCenterX = centerX;
1011 fCachedCenterY = centerY; 1011 fCachedCenterY = centerY;
1012 fCachedA = A; 1012 fCachedA = A;
1013 fCachedB = B; 1013 fCachedB = B;
1014 fCachedC = C; 1014 fCachedC = C;
1015 } 1015 }
1016 } 1016 }
1017 1017
1018 void GLCircleInside2PtConicalEffect::GenKey(const GrEffect& effect, 1018 void GLCircleInside2PtConicalEffect::GenKey(const GrProcessor& processor,
1019 const GrGLCaps&, GrEffectKeyBuilder* b) { 1019 const GrGLCaps&, GrProcessorKeyBuild er* b) {
1020 b->add32(GenBaseGradientKey(effect)); 1020 b->add32(GenBaseGradientKey(processor));
1021 } 1021 }
1022 1022
1023 ////////////////////////////////////////////////////////////////////////////// 1023 //////////////////////////////////////////////////////////////////////////////
1024 1024
1025 class GLCircleOutside2PtConicalEffect; 1025 class GLCircleOutside2PtConicalEffect;
1026 1026
1027 class CircleOutside2PtConicalEffect : public GrGradientEffect { 1027 class CircleOutside2PtConicalEffect : public GrGradientEffect {
1028 public: 1028 public:
1029 1029
1030 static GrEffect* Create(GrContext* ctx, 1030 static GrFragmentProcessor* Create(GrContext* ctx,
1031 const SkTwoPointConicalGradient& shader, 1031 const SkTwoPointConicalGradient& shader,
1032 const SkMatrix& matrix, 1032 const SkMatrix& matrix,
1033 SkShader::TileMode tm, 1033 SkShader::TileMode tm,
1034 const CircleConicalInfo& info) { 1034 const CircleConicalInfo& info) {
1035 return SkNEW_ARGS(CircleOutside2PtConicalEffect, (ctx, shader, matrix, t m, info)); 1035 return SkNEW_ARGS(CircleOutside2PtConicalEffect, (ctx, shader, matrix, t m, info));
1036 } 1036 }
1037 1037
1038 virtual ~CircleOutside2PtConicalEffect() {} 1038 virtual ~CircleOutside2PtConicalEffect() {}
1039 1039
1040 static const char* Name() { return "Two-Point Conical Gradient Outside"; } 1040 static const char* Name() { return "Two-Point Conical Gradient Outside"; }
1041 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; 1041 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR IDE;
1042 1042
1043 SkScalar centerX() const { return fInfo.fCenterEnd.fX; } 1043 SkScalar centerX() const { return fInfo.fCenterEnd.fX; }
1044 SkScalar centerY() const { return fInfo.fCenterEnd.fY; } 1044 SkScalar centerY() const { return fInfo.fCenterEnd.fY; }
1045 SkScalar A() const { return fInfo.fA; } 1045 SkScalar A() const { return fInfo.fA; }
1046 SkScalar B() const { return fInfo.fB; } 1046 SkScalar B() const { return fInfo.fB; }
1047 SkScalar C() const { return fInfo.fC; } 1047 SkScalar C() const { return fInfo.fC; }
1048 SkScalar tLimit() const { return fTLimit; } 1048 SkScalar tLimit() const { return fTLimit; }
1049 bool isFlipped() const { return fIsFlipped; } 1049 bool isFlipped() const { return fIsFlipped; }
1050 1050
1051 typedef GLCircleOutside2PtConicalEffect GLEffect; 1051 typedef GLCircleOutside2PtConicalEffect GLProcessor;
1052 1052
1053 private: 1053 private:
1054 virtual bool onIsEqual(const GrEffect& sBase) const SK_OVERRIDE { 1054 virtual bool onIsEqual(const GrProcessor& sBase) const SK_OVERRIDE {
1055 const CircleOutside2PtConicalEffect& s = sBase.cast<CircleOutside2PtConi calEffect>(); 1055 const CircleOutside2PtConicalEffect& s = sBase.cast<CircleOutside2PtConi calEffect>();
1056 return (INHERITED::onIsEqual(sBase) && 1056 return (INHERITED::onIsEqual(sBase) &&
1057 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd && 1057 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd &&
1058 this->fInfo.fA == s.fInfo.fA && 1058 this->fInfo.fA == s.fInfo.fA &&
1059 this->fInfo.fB == s.fInfo.fB && 1059 this->fInfo.fB == s.fInfo.fB &&
1060 this->fInfo.fC == s.fInfo.fC && 1060 this->fInfo.fC == s.fInfo.fC &&
1061 this->fTLimit == s.fTLimit && 1061 this->fTLimit == s.fTLimit &&
1062 this->fIsFlipped == s.fIsFlipped); 1062 this->fIsFlipped == s.fIsFlipped);
1063 } 1063 }
1064 1064
1065 CircleOutside2PtConicalEffect(GrContext* ctx, 1065 CircleOutside2PtConicalEffect(GrContext* ctx,
1066 const SkTwoPointConicalGradient& shader, 1066 const SkTwoPointConicalGradient& shader,
1067 const SkMatrix& matrix, 1067 const SkMatrix& matrix,
1068 SkShader::TileMode tm, 1068 SkShader::TileMode tm,
1069 const CircleConicalInfo& info) 1069 const CircleConicalInfo& info)
1070 : INHERITED(ctx, shader, matrix, tm), fInfo(info) { 1070 : INHERITED(ctx, shader, matrix, tm), fInfo(info) {
1071 if (shader.getStartRadius() != shader.getEndRadius()) { 1071 if (shader.getStartRadius() != shader.getEndRadius()) {
1072 fTLimit = SkScalarDiv(shader.getStartRadius(), 1072 fTLimit = SkScalarDiv(shader.getStartRadius(),
1073 (shader.getStartRadius() - shader.getEndRadius ())); 1073 (shader.getStartRadius() - shader.getEndRadius ()));
1074 } else { 1074 } else {
1075 fTLimit = SK_ScalarMin; 1075 fTLimit = SK_ScalarMin;
1076 } 1076 }
1077 1077
1078 fIsFlipped = shader.isFlippedGrad(); 1078 fIsFlipped = shader.isFlippedGrad();
1079 } 1079 }
1080 1080
1081 GR_DECLARE_EFFECT_TEST; 1081 GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
1082 1082
1083 const CircleConicalInfo fInfo; 1083 const CircleConicalInfo fInfo;
1084 SkScalar fTLimit; 1084 SkScalar fTLimit;
1085 bool fIsFlipped; 1085 bool fIsFlipped;
1086 1086
1087 typedef GrGradientEffect INHERITED; 1087 typedef GrGradientEffect INHERITED;
1088 }; 1088 };
1089 1089
1090 class GLCircleOutside2PtConicalEffect : public GrGLGradientEffect { 1090 class GLCircleOutside2PtConicalEffect : public GrGLGradientEffect {
1091 public: 1091 public:
1092 GLCircleOutside2PtConicalEffect(const GrBackendEffectFactory& factory, const GrEffect&); 1092 GLCircleOutside2PtConicalEffect(const GrBackendProcessorFactory&, const GrPr ocessor&);
1093 virtual ~GLCircleOutside2PtConicalEffect() {} 1093 virtual ~GLCircleOutside2PtConicalEffect() {}
1094 1094
1095 virtual void emitCode(GrGLProgramBuilder*, 1095 virtual void emitCode(GrGLProgramBuilder*,
1096 const GrEffect&, 1096 const GrFragmentProcessor&,
1097 const GrEffectKey&, 1097 const GrProcessorKey&,
1098 const char* outputColor, 1098 const char* outputColor,
1099 const char* inputColor, 1099 const char* inputColor,
1100 const TransformedCoordsArray&, 1100 const TransformedCoordsArray&,
1101 const TextureSamplerArray&) SK_OVERRIDE; 1101 const TextureSamplerArray&) SK_OVERRIDE;
1102 virtual void setData(const GrGLProgramDataManager&, const GrEffect&) SK_OVER RIDE; 1102 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O VERRIDE;
1103 1103
1104 static void GenKey(const GrEffect&, const GrGLCaps& caps, GrEffectKeyBuilder * b); 1104 static void GenKey(const GrProcessor&, const GrGLCaps& caps, GrProcessorKeyB uilder* b);
1105 1105
1106 protected: 1106 protected:
1107 UniformHandle fCenterUni; 1107 UniformHandle fCenterUni;
1108 UniformHandle fParamUni; 1108 UniformHandle fParamUni;
1109 1109
1110 const char* fVSVaryingName; 1110 const char* fVSVaryingName;
1111 const char* fFSVaryingName; 1111 const char* fFSVaryingName;
1112 1112
1113 bool fIsFlipped; 1113 bool fIsFlipped;
1114 1114
1115 // @{ 1115 // @{
1116 /// Values last uploaded as uniforms 1116 /// Values last uploaded as uniforms
1117 1117
1118 SkScalar fCachedCenterX; 1118 SkScalar fCachedCenterX;
1119 SkScalar fCachedCenterY; 1119 SkScalar fCachedCenterY;
1120 SkScalar fCachedA; 1120 SkScalar fCachedA;
1121 SkScalar fCachedB; 1121 SkScalar fCachedB;
1122 SkScalar fCachedC; 1122 SkScalar fCachedC;
1123 SkScalar fCachedTLimit; 1123 SkScalar fCachedTLimit;
1124 1124
1125 // @} 1125 // @}
1126 1126
1127 private: 1127 private:
1128 typedef GrGLGradientEffect INHERITED; 1128 typedef GrGLGradientEffect INHERITED;
1129 1129
1130 }; 1130 };
1131 1131
1132 const GrBackendEffectFactory& CircleOutside2PtConicalEffect::getFactory() const { 1132 const GrBackendFragmentProcessorFactory& CircleOutside2PtConicalEffect::getFacto ry() const {
1133 return GrTBackendEffectFactory<CircleOutside2PtConicalEffect>::getInstance() ; 1133 return GrTBackendFragmentProcessorFactory<CircleOutside2PtConicalEffect>::ge tInstance();
1134 } 1134 }
1135 1135
1136 GR_DEFINE_EFFECT_TEST(CircleOutside2PtConicalEffect); 1136 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(CircleOutside2PtConicalEffect);
1137 1137
1138 GrEffect* CircleOutside2PtConicalEffect::TestCreate(SkRandom* random, 1138 GrFragmentProcessor* CircleOutside2PtConicalEffect::TestCreate(SkRandom* random,
1139 GrContext* context, 1139 GrContext* contex t,
1140 const GrDrawTargetCaps&, 1140 const GrDrawTarge tCaps&,
1141 GrTexture**) { 1141 GrTexture**) {
1142 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()}; 1142 SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()};
1143 SkScalar radius1 = random->nextUScalar1() + 0.0001f; // make sure radius1 != 0 1143 SkScalar radius1 = random->nextUScalar1() + 0.0001f; // make sure radius1 != 0
1144 SkPoint center2; 1144 SkPoint center2;
1145 SkScalar radius2; 1145 SkScalar radius2;
1146 SkScalar diffLen; 1146 SkScalar diffLen;
1147 do { 1147 do {
1148 center2.set(random->nextUScalar1(), random->nextUScalar1()); 1148 center2.set(random->nextUScalar1(), random->nextUScalar1());
1149 // If the circles share a center than we can't be in the outside case 1149 // If the circles share a center than we can't be in the outside case
1150 } while (center1 == center2); 1150 } while (center1 == center2);
1151 SkPoint diff = center2 - center1; 1151 SkPoint diff = center2 - center1;
1152 diffLen = diff.length(); 1152 diffLen = diff.length();
1153 // Below makes sure that circle one is not contained within circle two 1153 // Below makes sure that circle one is not contained within circle two
1154 // and have radius2 >= radius to match sorting on cpu side 1154 // and have radius2 >= radius to match sorting on cpu side
1155 radius2 = radius1 + random->nextRangeF(0.f, diffLen); 1155 radius2 = radius1 + random->nextRangeF(0.f, diffLen);
1156 1156
1157 SkColor colors[kMaxRandomGradientColors]; 1157 SkColor colors[kMaxRandomGradientColors];
1158 SkScalar stopsArray[kMaxRandomGradientColors]; 1158 SkScalar stopsArray[kMaxRandomGradientColors];
1159 SkScalar* stops = stopsArray; 1159 SkScalar* stops = stopsArray;
1160 SkShader::TileMode tm; 1160 SkShader::TileMode tm;
1161 int colorCount = RandomGradientParams(random, colors, &stops, &tm); 1161 int colorCount = RandomGradientParams(random, colors, &stops, &tm);
1162 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center 1, radius1, 1162 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center 1, radius1,
1163 center 2, radius2, 1163 center 2, radius2,
1164 colors , stops, colorCount, 1164 colors , stops, colorCount,
1165 tm)); 1165 tm));
1166 SkPaint paint; 1166 SkPaint paint;
1167 GrColor paintColor; 1167 GrColor paintColor;
1168 GrEffect* effect; 1168 GrFragmentProcessor* processor;
1169 SkAssertResult(shader->asNewEffect(context, paint, NULL, &paintColor, &effec t)); 1169 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor , &processor));
1170 return effect; 1170 return processor;
1171 } 1171 }
1172 1172
1173 GLCircleOutside2PtConicalEffect::GLCircleOutside2PtConicalEffect(const GrBackend EffectFactory& factory, 1173 GLCircleOutside2PtConicalEffect::GLCircleOutside2PtConicalEffect(const GrBackend ProcessorFactory& factory,
1174 const GrEffect& effect) 1174 const GrProcess or& processor)
1175 : INHERITED(factory) 1175 : INHERITED(factory)
1176 , fVSVaryingName(NULL) 1176 , fVSVaryingName(NULL)
1177 , fFSVaryingName(NULL) 1177 , fFSVaryingName(NULL)
1178 , fCachedCenterX(SK_ScalarMax) 1178 , fCachedCenterX(SK_ScalarMax)
1179 , fCachedCenterY(SK_ScalarMax) 1179 , fCachedCenterY(SK_ScalarMax)
1180 , fCachedA(SK_ScalarMax) 1180 , fCachedA(SK_ScalarMax)
1181 , fCachedB(SK_ScalarMax) 1181 , fCachedB(SK_ScalarMax)
1182 , fCachedC(SK_ScalarMax) 1182 , fCachedC(SK_ScalarMax)
1183 , fCachedTLimit(SK_ScalarMax) { 1183 , fCachedTLimit(SK_ScalarMax) {
1184 const CircleOutside2PtConicalEffect& data = effect.cast<CircleOutside2PtConi calEffect>(); 1184 const CircleOutside2PtConicalEffect& data = processor.cast<CircleOutside2PtC onicalEffect>();
1185 fIsFlipped = data.isFlipped(); 1185 fIsFlipped = data.isFlipped();
1186 } 1186 }
1187 1187
1188 void GLCircleOutside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder, 1188 void GLCircleOutside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder,
1189 const GrEffect&, 1189 const GrFragmentProcessor&,
1190 const GrEffectKey& key, 1190 const GrProcessorKey& key,
1191 const char* outputColor, 1191 const char* outputColor,
1192 const char* inputColor, 1192 const char* inputColor,
1193 const TransformedCoordsArray& coo rds, 1193 const TransformedCoordsArray& coo rds,
1194 const TextureSamplerArray& sample rs) { 1194 const TextureSamplerArray& sample rs) {
1195 uint32_t baseKey = key.get32(0); 1195 uint32_t baseKey = key.get32(0);
1196 this->emitUniforms(builder, baseKey); 1196 this->emitUniforms(builder, baseKey);
1197 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 1197 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
1198 kVec2f_GrSLType, "Conical2FSCenter"); 1198 kVec2f_GrSLType, "Conical2FSCenter");
1199 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 1199 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
1200 kVec4f_GrSLType, "Conical2FSParams"); 1200 kVec4f_GrSLType, "Conical2FSParams");
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1238 fsBuilder->codeAppendf("\tfloat %s = d - sqrt(deter);\n", tName.c_str()) ; 1238 fsBuilder->codeAppendf("\tfloat %s = d - sqrt(deter);\n", tName.c_str()) ;
1239 } 1239 }
1240 1240
1241 fsBuilder->codeAppendf("\tif (%s >= %s.w && deter >= 0.0) {\n", tName.c_str( ), params.c_str()); 1241 fsBuilder->codeAppendf("\tif (%s >= %s.w && deter >= 0.0) {\n", tName.c_str( ), params.c_str());
1242 fsBuilder->codeAppend("\t\t"); 1242 fsBuilder->codeAppend("\t\t");
1243 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers); 1243 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers);
1244 fsBuilder->codeAppend("\t}\n"); 1244 fsBuilder->codeAppend("\t}\n");
1245 } 1245 }
1246 1246
1247 void GLCircleOutside2PtConicalEffect::setData(const GrGLProgramDataManager& pdma n, 1247 void GLCircleOutside2PtConicalEffect::setData(const GrGLProgramDataManager& pdma n,
1248 const GrEffect& effect) { 1248 const GrProcessor& processor) {
1249 INHERITED::setData(pdman, effect); 1249 INHERITED::setData(pdman, processor);
1250 const CircleOutside2PtConicalEffect& data = effect.cast<CircleOutside2PtConi calEffect>(); 1250 const CircleOutside2PtConicalEffect& data = processor.cast<CircleOutside2PtC onicalEffect>();
1251 SkASSERT(data.isFlipped() == fIsFlipped); 1251 SkASSERT(data.isFlipped() == fIsFlipped);
1252 SkScalar centerX = data.centerX(); 1252 SkScalar centerX = data.centerX();
1253 SkScalar centerY = data.centerY(); 1253 SkScalar centerY = data.centerY();
1254 SkScalar A = data.A(); 1254 SkScalar A = data.A();
1255 SkScalar B = data.B(); 1255 SkScalar B = data.B();
1256 SkScalar C = data.C(); 1256 SkScalar C = data.C();
1257 SkScalar tLimit = data.tLimit(); 1257 SkScalar tLimit = data.tLimit();
1258 1258
1259 if (fCachedCenterX != centerX || fCachedCenterY != centerY || 1259 if (fCachedCenterX != centerX || fCachedCenterY != centerY ||
1260 fCachedA != A || fCachedB != B || fCachedC != C || fCachedTLimit != tLim it) { 1260 fCachedA != A || fCachedB != B || fCachedC != C || fCachedTLimit != tLim it) {
1261 1261
1262 pdman.set2f(fCenterUni, SkScalarToFloat(centerX), SkScalarToFloat(center Y)); 1262 pdman.set2f(fCenterUni, SkScalarToFloat(centerX), SkScalarToFloat(center Y));
1263 pdman.set4f(fParamUni, SkScalarToFloat(A), SkScalarToFloat(B), SkScalarT oFloat(C), 1263 pdman.set4f(fParamUni, SkScalarToFloat(A), SkScalarToFloat(B), SkScalarT oFloat(C),
1264 SkScalarToFloat(tLimit)); 1264 SkScalarToFloat(tLimit));
1265 1265
1266 fCachedCenterX = centerX; 1266 fCachedCenterX = centerX;
1267 fCachedCenterY = centerY; 1267 fCachedCenterY = centerY;
1268 fCachedA = A; 1268 fCachedA = A;
1269 fCachedB = B; 1269 fCachedB = B;
1270 fCachedC = C; 1270 fCachedC = C;
1271 fCachedTLimit = tLimit; 1271 fCachedTLimit = tLimit;
1272 } 1272 }
1273 } 1273 }
1274 1274
1275 void GLCircleOutside2PtConicalEffect::GenKey(const GrEffect& effect, 1275 void GLCircleOutside2PtConicalEffect::GenKey(const GrProcessor& processor,
1276 const GrGLCaps&, GrEffectKeyBuilder * b) { 1276 const GrGLCaps&, GrProcessorKeyBuil der* b) {
1277 uint32_t* key = b->add32n(2); 1277 uint32_t* key = b->add32n(2);
1278 key[0] = GenBaseGradientKey(effect); 1278 key[0] = GenBaseGradientKey(processor);
1279 key[1] = effect.cast<CircleOutside2PtConicalEffect>().isFlipped(); 1279 key[1] = processor.cast<CircleOutside2PtConicalEffect>().isFlipped();
1280 } 1280 }
1281 1281
1282 ////////////////////////////////////////////////////////////////////////////// 1282 //////////////////////////////////////////////////////////////////////////////
1283 1283
1284 GrEffect* Gr2PtConicalGradientEffect::Create(GrContext* ctx, 1284 GrFragmentProcessor* Gr2PtConicalGradientEffect::Create(GrContext* ctx,
1285 const SkTwoPointConicalGradient& sh ader, 1285 const SkTwoPointConicalG radient& shader,
1286 SkShader::TileMode tm, 1286 SkShader::TileMode tm,
1287 const SkMatrix* localMatrix) { 1287 const SkMatrix* localMat rix) {
1288 SkMatrix matrix; 1288 SkMatrix matrix;
1289 if (!shader.getLocalMatrix().invert(&matrix)) { 1289 if (!shader.getLocalMatrix().invert(&matrix)) {
1290 return NULL; 1290 return NULL;
1291 } 1291 }
1292 if (localMatrix) { 1292 if (localMatrix) {
1293 SkMatrix inv; 1293 SkMatrix inv;
1294 if (!localMatrix->invert(&inv)) { 1294 if (!localMatrix->invert(&inv)) {
1295 return NULL; 1295 return NULL;
1296 } 1296 }
1297 matrix.postConcat(inv); 1297 matrix.postConcat(inv);
(...skipping 19 matching lines...) Expand all
1317 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf o); 1317 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf o);
1318 } else if (type == kEdge_ConicalType) { 1318 } else if (type == kEdge_ConicalType) {
1319 set_matrix_edge_conical(shader, &matrix); 1319 set_matrix_edge_conical(shader, &matrix);
1320 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); 1320 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm);
1321 } else { 1321 } else {
1322 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in fo); 1322 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in fo);
1323 } 1323 }
1324 } 1324 }
1325 1325
1326 #endif 1326 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698