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

Side by Side Diff: src/gpu/effects/GrDistanceFieldTextureEffect.cpp

Issue 1075543002: Rename the distance field geoprocs to something more reasonable. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/effects/GrDistanceFieldTextureEffect.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "GrDistanceFieldTextureEffect.h" 8 #include "GrDistanceFieldTextureEffect.h"
9 #include "GrFontAtlasSizes.h" 9 #include "GrFontAtlasSizes.h"
10 #include "GrInvariantOutput.h" 10 #include "GrInvariantOutput.h"
11 #include "GrTexture.h" 11 #include "GrTexture.h"
12 12
13 #include "SkDistanceFieldGen.h" 13 #include "SkDistanceFieldGen.h"
14 14
15 #include "gl/GrGLProcessor.h" 15 #include "gl/GrGLProcessor.h"
16 #include "gl/GrGLSL.h" 16 #include "gl/GrGLSL.h"
17 #include "gl/GrGLTexture.h" 17 #include "gl/GrGLTexture.h"
18 #include "gl/GrGLGeometryProcessor.h" 18 #include "gl/GrGLGeometryProcessor.h"
19 #include "gl/builders/GrGLProgramBuilder.h" 19 #include "gl/builders/GrGLProgramBuilder.h"
20 20
21 // Assuming a radius of a little less than the diagonal of the fragment 21 // Assuming a radius of a little less than the diagonal of the fragment
22 #define SK_DistanceFieldAAFactor "0.65" 22 #define SK_DistanceFieldAAFactor "0.65"
23 23
24 struct DistanceFieldBatchTracker { 24 struct DistanceFieldBatchTracker {
25 GrGPInput fInputColorType; 25 GrGPInput fInputColorType;
26 GrColor fColor; 26 GrColor fColor;
27 bool fUsesLocalCoords; 27 bool fUsesLocalCoords;
28 }; 28 };
29 29
30 class GrGLDistanceFieldTextureEffect : public GrGLGeometryProcessor { 30 class GrGLDistanceFieldA8TextGeoProc : public GrGLGeometryProcessor {
31 public: 31 public:
32 GrGLDistanceFieldTextureEffect(const GrGeometryProcessor&, 32 GrGLDistanceFieldA8TextGeoProc(const GrGeometryProcessor&,
33 const GrBatchTracker&) 33 const GrBatchTracker&)
34 : fColor(GrColor_ILLEGAL) 34 : fColor(GrColor_ILLEGAL)
35 #ifdef SK_GAMMA_APPLY_TO_A8 35 #ifdef SK_GAMMA_APPLY_TO_A8
36 , fDistanceAdjust(-1.0f) 36 , fDistanceAdjust(-1.0f)
37 #endif 37 #endif
38 {} 38 {}
39 39
40 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ 40 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
41 const GrDistanceFieldTextureEffect& dfTexEffect = 41 const GrDistanceFieldA8TextGeoProc& dfTexEffect = args.fGP.cast<GrDistan ceFieldA8TextGeoProc>();
joshualitt 2015/04/08 18:20:51 Line wrap but I have not strong preference
jvanverth1 2015/04/08 18:45:21 Done.
42 args.fGP.cast<GrDistanceFieldTextureEffect>();
43 const DistanceFieldBatchTracker& local = args.fBT.cast<DistanceFieldBatc hTracker>(); 42 const DistanceFieldBatchTracker& local = args.fBT.cast<DistanceFieldBatc hTracker>();
44 GrGLGPBuilder* pb = args.fPB; 43 GrGLGPBuilder* pb = args.fPB;
45 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); 44 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
46 SkAssertResult(fsBuilder->enableFeature( 45 SkAssertResult(fsBuilder->enableFeature(
47 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); 46 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
48 47
49 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 48 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
50 49
51 // emit attributes 50 // emit attributes
52 vsBuilder->emitAttributes(dfTexEffect); 51 vsBuilder->emitAttributes(dfTexEffect);
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 } 152 }
154 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc e);"); 153 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc e);");
155 154
156 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); 155 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage);
157 } 156 }
158 157
159 virtual void setData(const GrGLProgramDataManager& pdman, 158 virtual void setData(const GrGLProgramDataManager& pdman,
160 const GrPrimitiveProcessor& proc, 159 const GrPrimitiveProcessor& proc,
161 const GrBatchTracker& bt) override { 160 const GrBatchTracker& bt) override {
162 #ifdef SK_GAMMA_APPLY_TO_A8 161 #ifdef SK_GAMMA_APPLY_TO_A8
163 const GrDistanceFieldTextureEffect& dfTexEffect = 162 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFi eldA8TextGeoProc>();
164 proc.cast<GrDistanceFieldTextureEffect>();
165 float distanceAdjust = dfTexEffect.getDistanceAdjust(); 163 float distanceAdjust = dfTexEffect.getDistanceAdjust();
166 if (distanceAdjust != fDistanceAdjust) { 164 if (distanceAdjust != fDistanceAdjust) {
167 pdman.set1f(fDistanceAdjustUni, distanceAdjust); 165 pdman.set1f(fDistanceAdjustUni, distanceAdjust);
168 fDistanceAdjust = distanceAdjust; 166 fDistanceAdjust = distanceAdjust;
169 } 167 }
170 #endif 168 #endif
171 169
172 this->setUniformViewMatrix(pdman, proc.viewMatrix()); 170 this->setUniformViewMatrix(pdman, proc.viewMatrix());
173 171
174 const DistanceFieldBatchTracker& local = bt.cast<DistanceFieldBatchTrack er>(); 172 const DistanceFieldBatchTracker& local = bt.cast<DistanceFieldBatchTrack er>();
175 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColo r) { 173 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColo r) {
176 GrGLfloat c[4]; 174 GrGLfloat c[4];
177 GrColorToRGBAFloat(local.fColor, c); 175 GrColorToRGBAFloat(local.fColor, c);
178 pdman.set4fv(fColorUniform, 1, c); 176 pdman.set4fv(fColorUniform, 1, c);
179 fColor = local.fColor; 177 fColor = local.fColor;
180 } 178 }
181 } 179 }
182 180
183 static inline void GenKey(const GrGeometryProcessor& gp, 181 static inline void GenKey(const GrGeometryProcessor& gp,
184 const GrBatchTracker& bt, 182 const GrBatchTracker& bt,
185 const GrGLCaps&, 183 const GrGLCaps&,
186 GrProcessorKeyBuilder* b) { 184 GrProcessorKeyBuilder* b) {
187 const GrDistanceFieldTextureEffect& dfTexEffect = gp.cast<GrDistanceFiel dTextureEffect>(); 185 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel dA8TextGeoProc>();
188 const DistanceFieldBatchTracker& local = bt.cast<DistanceFieldBatchTrack er>(); 186 const DistanceFieldBatchTracker& local = bt.cast<DistanceFieldBatchTrack er>();
189 uint32_t key = dfTexEffect.getFlags(); 187 uint32_t key = dfTexEffect.getFlags();
190 key |= local.fInputColorType << 16; 188 key |= local.fInputColorType << 16;
191 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1 << 24: 0x0; 189 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1 << 24: 0x0;
192 key |= ComputePosKey(gp.viewMatrix()) << 25; 190 key |= ComputePosKey(gp.viewMatrix()) << 25;
193 key |= (!gp.viewMatrix().isIdentity() && !gp.localMatrix().isIdentity()) ? 0x1 << 27 : 0x0; 191 key |= (!gp.viewMatrix().isIdentity() && !gp.localMatrix().isIdentity()) ? 0x1 << 27 : 0x0;
194 b->add32(key); 192 b->add32(key);
195 } 193 }
196 194
197 private: 195 private:
198 GrColor fColor; 196 GrColor fColor;
199 UniformHandle fColorUniform; 197 UniformHandle fColorUniform;
200 #ifdef SK_GAMMA_APPLY_TO_A8 198 #ifdef SK_GAMMA_APPLY_TO_A8
201 float fDistanceAdjust; 199 float fDistanceAdjust;
202 UniformHandle fDistanceAdjustUni; 200 UniformHandle fDistanceAdjustUni;
203 #endif 201 #endif
204 202
205 typedef GrGLGeometryProcessor INHERITED; 203 typedef GrGLGeometryProcessor INHERITED;
206 }; 204 };
207 205
208 /////////////////////////////////////////////////////////////////////////////// 206 ///////////////////////////////////////////////////////////////////////////////
209 207
210 GrDistanceFieldTextureEffect::GrDistanceFieldTextureEffect(GrColor color, 208 GrDistanceFieldA8TextGeoProc::GrDistanceFieldA8TextGeoProc(GrColor color,
211 const SkMatrix& viewM atrix, 209 const SkMatrix& viewM atrix,
212 const SkMatrix& local Matrix, 210 const SkMatrix& local Matrix,
213 GrTexture* texture, 211 GrTexture* texture,
214 const GrTextureParams & params, 212 const GrTextureParams & params,
215 #ifdef SK_GAMMA_APPLY_TO_A8 213 #ifdef SK_GAMMA_APPLY_TO_A8
216 float distanceAdjust, 214 float distanceAdjust,
217 #endif 215 #endif
218 uint32_t flags, bool opaqueVertexColors) 216 uint32_t flags, bool opaqueVertexColors)
219 : INHERITED(color, viewMatrix, localMatrix, opaqueVertexColors) 217 : INHERITED(color, viewMatrix, localMatrix, opaqueVertexColors)
220 , fTextureAccess(texture, params) 218 , fTextureAccess(texture, params)
221 #ifdef SK_GAMMA_APPLY_TO_A8 219 #ifdef SK_GAMMA_APPLY_TO_A8
222 , fDistanceAdjust(distanceAdjust) 220 , fDistanceAdjust(distanceAdjust)
223 #endif 221 #endif
224 , fFlags(flags & kNonLCD_DistanceFieldEffectMask) 222 , fFlags(flags & kNonLCD_DistanceFieldEffectMask)
225 , fInColor(NULL) { 223 , fInColor(NULL) {
226 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); 224 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask));
227 this->initClassID<GrDistanceFieldTextureEffect>(); 225 this->initClassID<GrDistanceFieldA8TextGeoProc>();
228 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex AttribType)); 226 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex AttribType));
229 if (flags & kColorAttr_DistanceFieldEffectFlag) { 227 if (flags & kColorAttr_DistanceFieldEffectFlag) {
230 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA ttribType)); 228 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA ttribType));
231 this->setHasVertexColor(); 229 this->setHasVertexColor();
232 } 230 }
233 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", 231 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords",
234 kVec2s_GrVertexAttribT ype)); 232 kVec2s_GrVertexAttribT ype));
235 this->addTextureAccess(&fTextureAccess); 233 this->addTextureAccess(&fTextureAccess);
236 } 234 }
237 235
238 bool GrDistanceFieldTextureEffect::onIsEqual(const GrGeometryProcessor& other) c onst { 236 bool GrDistanceFieldA8TextGeoProc::onIsEqual(const GrGeometryProcessor& other) c onst {
239 const GrDistanceFieldTextureEffect& cte = other.cast<GrDistanceFieldTextureE ffect>(); 237 const GrDistanceFieldA8TextGeoProc& cte = other.cast<GrDistanceFieldA8TextGe oProc>();
240 return 238 return
241 #ifdef SK_GAMMA_APPLY_TO_A8 239 #ifdef SK_GAMMA_APPLY_TO_A8
242 fDistanceAdjust == cte.fDistanceAdjust && 240 fDistanceAdjust == cte.fDistanceAdjust &&
243 #endif 241 #endif
244 fFlags == cte.fFlags; 242 fFlags == cte.fFlags;
245 } 243 }
246 244
247 void GrDistanceFieldTextureEffect::onGetInvariantOutputCoverage(GrInitInvariantO utput* out) const { 245 void GrDistanceFieldA8TextGeoProc::onGetInvariantOutputCoverage(GrInitInvariantO utput* out) const {
248 out->setUnknownSingleComponent(); 246 out->setUnknownSingleComponent();
249 } 247 }
250 248
251 void GrDistanceFieldTextureEffect::getGLProcessorKey(const GrBatchTracker& bt, 249 void GrDistanceFieldA8TextGeoProc::getGLProcessorKey(const GrBatchTracker& bt,
252 const GrGLCaps& caps, 250 const GrGLCaps& caps,
253 GrProcessorKeyBuilder* b) c onst { 251 GrProcessorKeyBuilder* b) c onst {
254 GrGLDistanceFieldTextureEffect::GenKey(*this, bt, caps, b); 252 GrGLDistanceFieldA8TextGeoProc::GenKey(*this, bt, caps, b);
255 } 253 }
256 254
257 GrGLPrimitiveProcessor* 255 GrGLPrimitiveProcessor*
258 GrDistanceFieldTextureEffect::createGLInstance(const GrBatchTracker& bt, 256 GrDistanceFieldA8TextGeoProc::createGLInstance(const GrBatchTracker& bt,
259 const GrGLCaps&) const { 257 const GrGLCaps&) const {
260 return SkNEW_ARGS(GrGLDistanceFieldTextureEffect, (*this, bt)); 258 return SkNEW_ARGS(GrGLDistanceFieldA8TextGeoProc, (*this, bt));
261 } 259 }
262 260
263 void GrDistanceFieldTextureEffect::initBatchTracker(GrBatchTracker* bt, 261 void GrDistanceFieldA8TextGeoProc::initBatchTracker(GrBatchTracker* bt,
264 const GrPipelineInfo& init) const { 262 const GrPipelineInfo& init) const {
265 DistanceFieldBatchTracker* local = bt->cast<DistanceFieldBatchTracker>(); 263 DistanceFieldBatchTracker* local = bt->cast<DistanceFieldBatchTracker>();
266 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in it, 264 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in it,
267 SkToBool(fInColor)); 265 SkToBool(fInColor));
268 local->fUsesLocalCoords = init.fUsesLocalCoords; 266 local->fUsesLocalCoords = init.fUsesLocalCoords;
269 } 267 }
270 268
271 bool GrDistanceFieldTextureEffect::onCanMakeEqual(const GrBatchTracker& m, 269 bool GrDistanceFieldA8TextGeoProc::onCanMakeEqual(const GrBatchTracker& m,
272 const GrGeometryProcessor& tha t, 270 const GrGeometryProcessor& tha t,
273 const GrBatchTracker& t) const { 271 const GrBatchTracker& t) const {
274 const DistanceFieldBatchTracker& mine = m.cast<DistanceFieldBatchTracker>(); 272 const DistanceFieldBatchTracker& mine = m.cast<DistanceFieldBatchTracker>();
275 const DistanceFieldBatchTracker& theirs = t.cast<DistanceFieldBatchTracker>( ); 273 const DistanceFieldBatchTracker& theirs = t.cast<DistanceFieldBatchTracker>( );
276 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords, 274 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords,
277 that, theirs.fUsesLocalCoords) && 275 that, theirs.fUsesLocalCoords) &&
278 CanCombineOutput(mine.fInputColorType, mine.fColor, 276 CanCombineOutput(mine.fInputColorType, mine.fColor,
279 theirs.fInputColorType, theirs.fColor); 277 theirs.fInputColorType, theirs.fColor);
280 } 278 }
281 279
282 /////////////////////////////////////////////////////////////////////////////// 280 ///////////////////////////////////////////////////////////////////////////////
283 281
284 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldTextureEffect); 282 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldA8TextGeoProc);
285 283
286 GrGeometryProcessor* GrDistanceFieldTextureEffect::TestCreate(SkRandom* random, 284 GrGeometryProcessor* GrDistanceFieldA8TextGeoProc::TestCreate(SkRandom* random,
287 GrContext*, 285 GrContext*,
288 const GrDrawTarget Caps&, 286 const GrDrawTarget Caps&,
289 GrTexture* texture s[]) { 287 GrTexture* texture s[]) {
290 int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx : 288 int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx :
291 GrProcessorUnitTest::kAlphaTextureIdx; 289 GrProcessorUnitTest::kAlphaTextureIdx;
292 static const SkShader::TileMode kTileModes[] = { 290 static const SkShader::TileMode kTileModes[] = {
293 SkShader::kClamp_TileMode, 291 SkShader::kClamp_TileMode,
294 SkShader::kRepeat_TileMode, 292 SkShader::kRepeat_TileMode,
295 SkShader::kMirror_TileMode, 293 SkShader::kMirror_TileMode,
296 }; 294 };
297 SkShader::TileMode tileModes[] = { 295 SkShader::TileMode tileModes[] = {
298 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], 296 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
299 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], 297 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
300 }; 298 };
301 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBil erp_FilterMode : 299 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBil erp_FilterMode :
302 GrTextureParams::kNon e_FilterMode); 300 GrTextureParams::kNon e_FilterMode);
303 301
304 return GrDistanceFieldTextureEffect::Create(GrRandomColor(random), 302 return GrDistanceFieldA8TextGeoProc::Create(GrRandomColor(random),
305 GrProcessorUnitTest::TestMatrix( random), 303 GrProcessorUnitTest::TestMatrix( random),
306 GrProcessorUnitTest::TestMatrix( random), 304 GrProcessorUnitTest::TestMatrix( random),
307 textures[texIdx], params, 305 textures[texIdx], params,
308 #ifdef SK_GAMMA_APPLY_TO_A8 306 #ifdef SK_GAMMA_APPLY_TO_A8
309 random->nextF(), 307 random->nextF(),
310 #endif 308 #endif
311 random->nextBool() ? 309 random->nextBool() ?
312 kSimilarity_DistanceFieldEff ectFlag : 0, 310 kSimilarity_DistanceFieldEff ectFlag : 0,
313 random->nextBool()); 311 random->nextBool());
314 } 312 }
315 313
316 /////////////////////////////////////////////////////////////////////////////// 314 ///////////////////////////////////////////////////////////////////////////////
317 315
318 struct DistanceFieldNoGammaBatchTracker { 316 struct DistanceFieldPathBatchTracker {
319 GrGPInput fInputColorType; 317 GrGPInput fInputColorType;
320 GrColor fColor; 318 GrColor fColor;
321 bool fUsesLocalCoords; 319 bool fUsesLocalCoords;
322 }; 320 };
323 321
324 class GrGLDistanceFieldNoGammaTextureEffect : public GrGLGeometryProcessor { 322 class GrGLDistanceFieldPathGeoProc : public GrGLGeometryProcessor {
325 public: 323 public:
326 GrGLDistanceFieldNoGammaTextureEffect(const GrGeometryProcessor&, 324 GrGLDistanceFieldPathGeoProc(const GrGeometryProcessor&,
327 const GrBatchTracker&) 325 const GrBatchTracker&)
328 : fColor(GrColor_ILLEGAL), fTextureSize(SkISize::Make(-1, -1)) {} 326 : fColor(GrColor_ILLEGAL), fTextureSize(SkISize::Make(-1, -1)) {}
329 327
330 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ 328 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
331 const GrDistanceFieldNoGammaTextureEffect& dfTexEffect = 329 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance FieldPathGeoProc>();
332 args.fGP.cast<GrDistanceFieldNoGammaTextureEffect>();
333 330
334 const DistanceFieldNoGammaBatchTracker& local = 331 const DistanceFieldPathBatchTracker& local = args.fBT.cast<DistanceField PathBatchTracker>();
335 args.fBT.cast<DistanceFieldNoGammaBatchTracker>();
336 GrGLGPBuilder* pb = args.fPB; 332 GrGLGPBuilder* pb = args.fPB;
337 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); 333 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
338 SkAssertResult(fsBuilder->enableFeature( 334 SkAssertResult(fsBuilder->enableFeature(
339 GrGLFragmentShaderBuilder::kStandardDerivat ives_GLSLFeature)); 335 GrGLFragmentShaderBuilder::kStandardDerivat ives_GLSLFeature));
340 336
341 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 337 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
342 338
343 // emit attributes 339 // emit attributes
344 vsBuilder->emitAttributes(dfTexEffect); 340 vsBuilder->emitAttributes(dfTexEffect);
345 341
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 if (texture->width() != fTextureSize.width() || 420 if (texture->width() != fTextureSize.width() ||
425 texture->height() != fTextureSize.height()) { 421 texture->height() != fTextureSize.height()) {
426 fTextureSize = SkISize::Make(texture->width(), texture->height()); 422 fTextureSize = SkISize::Make(texture->width(), texture->height());
427 pdman.set2f(fTextureSizeUni, 423 pdman.set2f(fTextureSizeUni,
428 SkIntToScalar(fTextureSize.width()), 424 SkIntToScalar(fTextureSize.width()),
429 SkIntToScalar(fTextureSize.height())); 425 SkIntToScalar(fTextureSize.height()));
430 } 426 }
431 427
432 this->setUniformViewMatrix(pdman, proc.viewMatrix()); 428 this->setUniformViewMatrix(pdman, proc.viewMatrix());
433 429
434 const DistanceFieldNoGammaBatchTracker& local = bt.cast<DistanceFieldNoG ammaBatchTracker>(); 430 const DistanceFieldPathBatchTracker& local = bt.cast<DistanceFieldPathBa tchTracker>();
435 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColo r) { 431 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColo r) {
436 GrGLfloat c[4]; 432 GrGLfloat c[4];
437 GrColorToRGBAFloat(local.fColor, c); 433 GrColorToRGBAFloat(local.fColor, c);
438 pdman.set4fv(fColorUniform, 1, c); 434 pdman.set4fv(fColorUniform, 1, c);
439 fColor = local.fColor; 435 fColor = local.fColor;
440 } 436 }
441 } 437 }
442 438
443 static inline void GenKey(const GrGeometryProcessor& gp, 439 static inline void GenKey(const GrGeometryProcessor& gp,
444 const GrBatchTracker& bt, 440 const GrBatchTracker& bt,
445 const GrGLCaps&, 441 const GrGLCaps&,
446 GrProcessorKeyBuilder* b) { 442 GrProcessorKeyBuilder* b) {
447 const GrDistanceFieldNoGammaTextureEffect& dfTexEffect = 443 const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldP athGeoProc>();
448 gp.cast<GrDistanceFieldNoGammaTextureEffect>();
449 444
450 const DistanceFieldNoGammaBatchTracker& local = bt.cast<DistanceFieldNoG ammaBatchTracker>(); 445 const DistanceFieldPathBatchTracker& local = bt.cast<DistanceFieldPathBa tchTracker>();
451 uint32_t key = dfTexEffect.getFlags(); 446 uint32_t key = dfTexEffect.getFlags();
452 key |= local.fInputColorType << 16; 447 key |= local.fInputColorType << 16;
453 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1 << 24: 0x0; 448 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1 << 24: 0x0;
454 key |= ComputePosKey(gp.viewMatrix()) << 25; 449 key |= ComputePosKey(gp.viewMatrix()) << 25;
455 b->add32(key); 450 b->add32(key);
456 } 451 }
457 452
458 private: 453 private:
459 UniformHandle fColorUniform; 454 UniformHandle fColorUniform;
460 UniformHandle fTextureSizeUni; 455 UniformHandle fTextureSizeUni;
461 GrColor fColor; 456 GrColor fColor;
462 SkISize fTextureSize; 457 SkISize fTextureSize;
463 458
464 typedef GrGLGeometryProcessor INHERITED; 459 typedef GrGLGeometryProcessor INHERITED;
465 }; 460 };
466 461
467 /////////////////////////////////////////////////////////////////////////////// 462 ///////////////////////////////////////////////////////////////////////////////
468 463
469 GrDistanceFieldNoGammaTextureEffect::GrDistanceFieldNoGammaTextureEffect( 464 GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc(
470 GrColor color, 465 GrColor color,
471 const SkMatrix& viewMatrix, 466 const SkMatrix& viewMatrix,
472 GrTexture* texture, 467 GrTexture* texture,
473 const GrTextureParams& params, 468 const GrTextureParams& params,
474 uint32_t flags, 469 uint32_t flags,
475 bool opaqueVertexColors) 470 bool opaqueVertexColors)
476 : INHERITED(color, viewMatrix, SkMatrix::I(), opaqueVertexColors) 471 : INHERITED(color, viewMatrix, SkMatrix::I(), opaqueVertexColors)
477 , fTextureAccess(texture, params) 472 , fTextureAccess(texture, params)
478 , fFlags(flags & kNonLCD_DistanceFieldEffectMask) 473 , fFlags(flags & kNonLCD_DistanceFieldEffectMask)
479 , fInColor(NULL) { 474 , fInColor(NULL) {
480 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); 475 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask));
481 this->initClassID<GrDistanceFieldNoGammaTextureEffect>(); 476 this->initClassID<GrDistanceFieldPathGeoProc>();
482 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex AttribType)); 477 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex AttribType));
483 if (flags & kColorAttr_DistanceFieldEffectFlag) { 478 if (flags & kColorAttr_DistanceFieldEffectFlag) {
484 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA ttribType)); 479 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA ttribType));
485 this->setHasVertexColor(); 480 this->setHasVertexColor();
486 } 481 }
487 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", 482 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords",
488 kVec2f_GrVertexAttribT ype)); 483 kVec2f_GrVertexAttribT ype));
489 this->addTextureAccess(&fTextureAccess); 484 this->addTextureAccess(&fTextureAccess);
490 } 485 }
491 486
492 bool GrDistanceFieldNoGammaTextureEffect::onIsEqual(const GrGeometryProcessor& o ther) const { 487 bool GrDistanceFieldPathGeoProc::onIsEqual(const GrGeometryProcessor& other) con st {
493 const GrDistanceFieldNoGammaTextureEffect& cte = 488 const GrDistanceFieldPathGeoProc& cte = other.cast<GrDistanceFieldPathGeoPro c>();
494 other.cast<GrDistanceFieldNoGam maTextureEffect>();
495 return fFlags == cte.fFlags; 489 return fFlags == cte.fFlags;
496 } 490 }
497 491
498 void GrDistanceFieldNoGammaTextureEffect::onGetInvariantOutputCoverage(GrInitInv ariantOutput* out) 492 void GrDistanceFieldPathGeoProc::onGetInvariantOutputCoverage(GrInitInvariantOut put* out) const {
499 const {
500 out->setUnknownSingleComponent(); 493 out->setUnknownSingleComponent();
501 } 494 }
502 495
503 void GrDistanceFieldNoGammaTextureEffect::getGLProcessorKey(const GrBatchTracker & bt, 496 void GrDistanceFieldPathGeoProc::getGLProcessorKey(const GrBatchTracker& bt,
504 const GrGLCaps& caps , 497 const GrGLCaps& caps,
505 GrProcessorKeyBuilde r* b) const { 498 GrProcessorKeyBuilder* b) con st {
506 GrGLDistanceFieldNoGammaTextureEffect::GenKey(*this, bt, caps, b); 499 GrGLDistanceFieldPathGeoProc::GenKey(*this, bt, caps, b);
507 } 500 }
508 501
509 GrGLPrimitiveProcessor* 502 GrGLPrimitiveProcessor*
510 GrDistanceFieldNoGammaTextureEffect::createGLInstance(const GrBatchTracker& bt, 503 GrDistanceFieldPathGeoProc::createGLInstance(const GrBatchTracker& bt, const GrG LCaps&) const {
511 const GrGLCaps&) const { 504 return SkNEW_ARGS(GrGLDistanceFieldPathGeoProc, (*this, bt));
512 return SkNEW_ARGS(GrGLDistanceFieldNoGammaTextureEffect, (*this, bt));
513 } 505 }
514 506
515 void GrDistanceFieldNoGammaTextureEffect::initBatchTracker(GrBatchTracker* bt, 507 void GrDistanceFieldPathGeoProc::initBatchTracker(GrBatchTracker* bt,
516 const GrPipelineInfo& init) const { 508 const GrPipelineInfo& init) co nst {
517 DistanceFieldNoGammaBatchTracker* local = bt->cast<DistanceFieldNoGammaBatch Tracker>(); 509 DistanceFieldPathBatchTracker* local = bt->cast<DistanceFieldPathBatchTracke r>();
518 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in it, 510 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in it,
519 SkToBool(fInColor)); 511 SkToBool(fInColor));
520 local->fUsesLocalCoords = init.fUsesLocalCoords; 512 local->fUsesLocalCoords = init.fUsesLocalCoords;
521 } 513 }
522 514
523 bool GrDistanceFieldNoGammaTextureEffect::onCanMakeEqual(const GrBatchTracker& m , 515 bool GrDistanceFieldPathGeoProc::onCanMakeEqual(const GrBatchTracker& m,
524 const GrGeometryProcess or& that, 516 const GrGeometryProcessor& that,
525 const GrBatchTracker& t ) const { 517 const GrBatchTracker& t) const {
526 const DistanceFieldNoGammaBatchTracker& mine = m.cast<DistanceFieldNoGammaBa tchTracker>(); 518 const DistanceFieldPathBatchTracker& mine = m.cast<DistanceFieldPathBatchTra cker>();
527 const DistanceFieldNoGammaBatchTracker& theirs = t.cast<DistanceFieldNoGamma BatchTracker>(); 519 const DistanceFieldPathBatchTracker& theirs = t.cast<DistanceFieldPathBatchT racker>();
528 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords, 520 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords,
529 that, theirs.fUsesLocalCoords) && 521 that, theirs.fUsesLocalCoords) &&
530 CanCombineOutput(mine.fInputColorType, mine.fColor, 522 CanCombineOutput(mine.fInputColorType, mine.fColor,
531 theirs.fInputColorType, theirs.fColor); 523 theirs.fInputColorType, theirs.fColor);
532 } 524 }
533 525
534 /////////////////////////////////////////////////////////////////////////////// 526 ///////////////////////////////////////////////////////////////////////////////
535 527
536 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldNoGammaTextureEffect); 528 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldPathGeoProc);
537 529
538 GrGeometryProcessor* GrDistanceFieldNoGammaTextureEffect::TestCreate(SkRandom* r andom, 530 GrGeometryProcessor* GrDistanceFieldPathGeoProc::TestCreate(SkRandom* random,
539 GrContext*, 531 GrContext*,
540 const GrDra wTargetCaps&, 532 const GrDrawTargetCa ps&,
541 GrTexture* textures[]) { 533 GrTexture* textures[ ]) {
542 int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx 534 int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
543 : GrProcessorUnitTest::kAlphaTextureIdx; 535 : GrProcessorUnitTest::kAlphaTextureIdx;
544 static const SkShader::TileMode kTileModes[] = { 536 static const SkShader::TileMode kTileModes[] = {
545 SkShader::kClamp_TileMode, 537 SkShader::kClamp_TileMode,
546 SkShader::kRepeat_TileMode, 538 SkShader::kRepeat_TileMode,
547 SkShader::kMirror_TileMode, 539 SkShader::kMirror_TileMode,
548 }; 540 };
549 SkShader::TileMode tileModes[] = { 541 SkShader::TileMode tileModes[] = {
550 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], 542 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
551 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], 543 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
552 }; 544 };
553 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBil erp_FilterMode 545 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBil erp_FilterMode
554 : GrTextureParams::kNon e_FilterMode); 546 : GrTextureParams::kNon e_FilterMode);
555 547
556 return GrDistanceFieldNoGammaTextureEffect::Create(GrRandomColor(random), 548 return GrDistanceFieldPathGeoProc::Create(GrRandomColor(random),
557 GrProcessorUnitTest::Test Matrix(random), 549 GrProcessorUnitTest::TestMatrix(ra ndom),
558 textures[texIdx], 550 textures[texIdx],
559 params, 551 params,
560 random->nextBool() ? kSimilarity_DistanceFieldEffectFlag : 0, random->ne xtBool()); 552 random->nextBool() ? kSimilarity_DistanceFieldEffectFlag : 0, random->ne xtBool());
561 } 553 }
562 554
563 /////////////////////////////////////////////////////////////////////////////// 555 ///////////////////////////////////////////////////////////////////////////////
564 556
565 struct DistanceFieldLCDBatchTracker { 557 struct DistanceFieldLCDBatchTracker {
566 GrGPInput fInputColorType; 558 GrGPInput fInputColorType;
567 GrColor fColor; 559 GrColor fColor;
568 bool fUsesLocalCoords; 560 bool fUsesLocalCoords;
569 }; 561 };
570 562
571 class GrGLDistanceFieldLCDTextureEffect : public GrGLGeometryProcessor { 563 class GrGLDistanceFieldLCDTextGeoProc : public GrGLGeometryProcessor {
572 public: 564 public:
573 GrGLDistanceFieldLCDTextureEffect(const GrGeometryProcessor&, 565 GrGLDistanceFieldLCDTextGeoProc(const GrGeometryProcessor&, const GrBatchTra cker&)
574 const GrBatchTracker&)
575 : fColor(GrColor_ILLEGAL) { 566 : fColor(GrColor_ILLEGAL) {
576 fDistanceAdjust = GrDistanceFieldLCDTextureEffect::DistanceAdjust::Make( 1.0f, 1.0f, 1.0f); 567 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1. 0f, 1.0f, 1.0f);
577 } 568 }
578 569
579 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ 570 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
580 const GrDistanceFieldLCDTextureEffect& dfTexEffect = 571 const GrDistanceFieldLCDTextGeoProc& dfTexEffect =
581 args.fGP.cast<GrDistanceFieldLCDTextureEffect>(); 572 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>();
582 const DistanceFieldLCDBatchTracker& local = args.fBT.cast<DistanceFieldL CDBatchTracker>(); 573 const DistanceFieldLCDBatchTracker& local = args.fBT.cast<DistanceFieldL CDBatchTracker>();
583 GrGLGPBuilder* pb = args.fPB; 574 GrGLGPBuilder* pb = args.fPB;
584 575
585 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 576 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
586 577
587 // emit attributes 578 // emit attributes
588 vsBuilder->emitAttributes(dfTexEffect); 579 vsBuilder->emitAttributes(dfTexEffect);
589 580
590 // setup pass through color 581 // setup pass through color
591 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor , NULL, 582 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor , NULL,
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
722 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth), distance), 1.0);"); 713 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth), distance), 1.0);");
723 714
724 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); 715 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage);
725 } 716 }
726 717
727 virtual void setData(const GrGLProgramDataManager& pdman, 718 virtual void setData(const GrGLProgramDataManager& pdman,
728 const GrPrimitiveProcessor& processor, 719 const GrPrimitiveProcessor& processor,
729 const GrBatchTracker& bt) override { 720 const GrBatchTracker& bt) override {
730 SkASSERT(fDistanceAdjustUni.isValid()); 721 SkASSERT(fDistanceAdjustUni.isValid());
731 722
732 const GrDistanceFieldLCDTextureEffect& dfTexEffect = 723 const GrDistanceFieldLCDTextGeoProc& dfTexEffect =
733 processor.cast<GrDistanceFieldLCDTextureEffect>(); 724 processor.cast<GrDistanceFieldLCDTextGeoProc>();
734 GrDistanceFieldLCDTextureEffect::DistanceAdjust wa = dfTexEffect.getDist anceAdjust(); 725 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dfTexEffect.getDistan ceAdjust();
735 if (wa != fDistanceAdjust) { 726 if (wa != fDistanceAdjust) {
736 pdman.set3f(fDistanceAdjustUni, 727 pdman.set3f(fDistanceAdjustUni,
737 wa.fR, 728 wa.fR,
738 wa.fG, 729 wa.fG,
739 wa.fB); 730 wa.fB);
740 fDistanceAdjust = wa; 731 fDistanceAdjust = wa;
741 } 732 }
742 733
743 this->setUniformViewMatrix(pdman, processor.viewMatrix()); 734 this->setUniformViewMatrix(pdman, processor.viewMatrix());
744 735
745 const DistanceFieldLCDBatchTracker& local = bt.cast<DistanceFieldLCDBatc hTracker>(); 736 const DistanceFieldLCDBatchTracker& local = bt.cast<DistanceFieldLCDBatc hTracker>();
746 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColo r) { 737 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColo r) {
747 GrGLfloat c[4]; 738 GrGLfloat c[4];
748 GrColorToRGBAFloat(local.fColor, c); 739 GrColorToRGBAFloat(local.fColor, c);
749 pdman.set4fv(fColorUniform, 1, c); 740 pdman.set4fv(fColorUniform, 1, c);
750 fColor = local.fColor; 741 fColor = local.fColor;
751 } 742 }
752 } 743 }
753 744
754 static inline void GenKey(const GrGeometryProcessor& gp, 745 static inline void GenKey(const GrGeometryProcessor& gp,
755 const GrBatchTracker& bt, 746 const GrBatchTracker& bt,
756 const GrGLCaps&, 747 const GrGLCaps&,
757 GrProcessorKeyBuilder* b) { 748 GrProcessorKeyBuilder* b) {
758 const GrDistanceFieldLCDTextureEffect& dfTexEffect = 749 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie ldLCDTextGeoProc>();
759 gp.cast<GrDistanceFieldLCDTextureEffect>();
760 750
761 const DistanceFieldLCDBatchTracker& local = bt.cast<DistanceFieldLCDBatc hTracker>(); 751 const DistanceFieldLCDBatchTracker& local = bt.cast<DistanceFieldLCDBatc hTracker>();
762 uint32_t key = dfTexEffect.getFlags(); 752 uint32_t key = dfTexEffect.getFlags();
763 key |= local.fInputColorType << 16; 753 key |= local.fInputColorType << 16;
764 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1 << 24: 0x0; 754 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1 << 24: 0x0;
765 key |= ComputePosKey(gp.viewMatrix()) << 25; 755 key |= ComputePosKey(gp.viewMatrix()) << 25;
766 key |= (!gp.viewMatrix().isIdentity() && !gp.localMatrix().isIdentity()) ? 0x1 << 27 : 0x0; 756 key |= (!gp.viewMatrix().isIdentity() && !gp.localMatrix().isIdentity()) ? 0x1 << 27 : 0x0;
767 b->add32(key); 757 b->add32(key);
768 } 758 }
769 759
770 private: 760 private:
771 GrColor fColor; 761 GrColor fColor;
772 UniformHandle fColorUniform; 762 UniformHandle fColorUniform;
773 GrDistanceFieldLCDTextureEffect::DistanceAdjust fDistanceAdjust; 763 GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust;
774 UniformHandle fDistanceAdjustUni; 764 UniformHandle fDistanceAdjustUni;
775 765
776 typedef GrGLGeometryProcessor INHERITED; 766 typedef GrGLGeometryProcessor INHERITED;
777 }; 767 };
778 768
779 /////////////////////////////////////////////////////////////////////////////// 769 ///////////////////////////////////////////////////////////////////////////////
780 770
781 GrDistanceFieldLCDTextureEffect::GrDistanceFieldLCDTextureEffect( 771 GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc(
782 GrColor color, const SkMatrix& viewMatrix, 772 GrColor color, const SkMatrix& viewMatrix,
783 const SkMatrix& localMatrix, 773 const SkMatrix& localMatrix,
784 GrTexture* texture, const GrTe xtureParams& params, 774 GrTexture* texture, const GrTe xtureParams& params,
785 DistanceAdjust distanceAdjust, 775 DistanceAdjust distanceAdjust,
786 uint32_t flags) 776 uint32_t flags)
787 : INHERITED(color, viewMatrix, localMatrix) 777 : INHERITED(color, viewMatrix, localMatrix)
788 , fTextureAccess(texture, params) 778 , fTextureAccess(texture, params)
789 , fDistanceAdjust(distanceAdjust) 779 , fDistanceAdjust(distanceAdjust)
790 , fFlags(flags & kLCD_DistanceFieldEffectMask){ 780 , fFlags(flags & kLCD_DistanceFieldEffectMask){
791 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan ceFieldEffectFlag)); 781 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan ceFieldEffectFlag));
792 this->initClassID<GrDistanceFieldLCDTextureEffect>(); 782 this->initClassID<GrDistanceFieldLCDTextGeoProc>();
793 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex AttribType)); 783 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex AttribType));
794 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", 784 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords",
795 kVec2s_GrVertexAttribT ype)); 785 kVec2s_GrVertexAttribT ype));
796 this->addTextureAccess(&fTextureAccess); 786 this->addTextureAccess(&fTextureAccess);
797 } 787 }
798 788
799 bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrGeometryProcessor& other ) const { 789 bool GrDistanceFieldLCDTextGeoProc::onIsEqual(const GrGeometryProcessor& other) const {
800 const GrDistanceFieldLCDTextureEffect& cte = other.cast<GrDistanceFieldLCDTe xtureEffect>(); 790 const GrDistanceFieldLCDTextGeoProc& cte = other.cast<GrDistanceFieldLCDText GeoProc>();
801 return (fDistanceAdjust == cte.fDistanceAdjust && 791 return (fDistanceAdjust == cte.fDistanceAdjust &&
802 fFlags == cte.fFlags); 792 fFlags == cte.fFlags);
803 } 793 }
804 794
805 void GrDistanceFieldLCDTextureEffect::onGetInvariantOutputCoverage(GrInitInvaria ntOutput* out) 795 void GrDistanceFieldLCDTextGeoProc::onGetInvariantOutputCoverage(GrInitInvariant Output* out) const {
806 const {
807 out->setUnknownFourComponents(); 796 out->setUnknownFourComponents();
808 out->setUsingLCDCoverage(); 797 out->setUsingLCDCoverage();
809 } 798 }
810 799
811 void GrDistanceFieldLCDTextureEffect::getGLProcessorKey(const GrBatchTracker& bt , 800 void GrDistanceFieldLCDTextGeoProc::getGLProcessorKey(const GrBatchTracker& bt,
812 const GrGLCaps& caps, 801 const GrGLCaps& caps,
813 GrProcessorKeyBuilder* b ) const { 802 GrProcessorKeyBuilder* b) const {
814 GrGLDistanceFieldLCDTextureEffect::GenKey(*this, bt, caps, b); 803 GrGLDistanceFieldLCDTextGeoProc::GenKey(*this, bt, caps, b);
815 } 804 }
816 805
817 GrGLPrimitiveProcessor* 806 GrGLPrimitiveProcessor*
818 GrDistanceFieldLCDTextureEffect::createGLInstance(const GrBatchTracker& bt, 807 GrDistanceFieldLCDTextGeoProc::createGLInstance(const GrBatchTracker& bt,
819 const GrGLCaps&) const { 808 const GrGLCaps&) const {
820 return SkNEW_ARGS(GrGLDistanceFieldLCDTextureEffect, (*this, bt)); 809 return SkNEW_ARGS(GrGLDistanceFieldLCDTextGeoProc, (*this, bt));
821 } 810 }
822 811
823 void GrDistanceFieldLCDTextureEffect::initBatchTracker(GrBatchTracker* bt, 812 void GrDistanceFieldLCDTextGeoProc::initBatchTracker(GrBatchTracker* bt,
824 const GrPipelineInfo& ini t) const { 813 const GrPipelineInfo& init) const {
825 DistanceFieldLCDBatchTracker* local = bt->cast<DistanceFieldLCDBatchTracker> (); 814 DistanceFieldLCDBatchTracker* local = bt->cast<DistanceFieldLCDBatchTracker> ();
826 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in it, false); 815 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in it, false);
827 local->fUsesLocalCoords = init.fUsesLocalCoords; 816 local->fUsesLocalCoords = init.fUsesLocalCoords;
828 } 817 }
829 818
830 bool GrDistanceFieldLCDTextureEffect::onCanMakeEqual(const GrBatchTracker& m, 819 bool GrDistanceFieldLCDTextGeoProc::onCanMakeEqual(const GrBatchTracker& m,
831 const GrGeometryProcessor& that, 820 const GrGeometryProcessor& th at,
832 const GrBatchTracker& t) co nst { 821 const GrBatchTracker& t) cons t {
833 const DistanceFieldLCDBatchTracker& mine = m.cast<DistanceFieldLCDBatchTrack er>(); 822 const DistanceFieldLCDBatchTracker& mine = m.cast<DistanceFieldLCDBatchTrack er>();
834 const DistanceFieldLCDBatchTracker& theirs = t.cast<DistanceFieldLCDBatchTra cker>(); 823 const DistanceFieldLCDBatchTracker& theirs = t.cast<DistanceFieldLCDBatchTra cker>();
835 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords, 824 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords,
836 that, theirs.fUsesLocalCoords) && 825 that, theirs.fUsesLocalCoords) &&
837 CanCombineOutput(mine.fInputColorType, mine.fColor, 826 CanCombineOutput(mine.fInputColorType, mine.fColor,
838 theirs.fInputColorType, theirs.fColor); 827 theirs.fInputColorType, theirs.fColor);
839 } 828 }
840 829
841 /////////////////////////////////////////////////////////////////////////////// 830 ///////////////////////////////////////////////////////////////////////////////
842 831
843 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldLCDTextureEffect); 832 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldLCDTextGeoProc);
844 833
845 GrGeometryProcessor* GrDistanceFieldLCDTextureEffect::TestCreate(SkRandom* rando m, 834 GrGeometryProcessor* GrDistanceFieldLCDTextGeoProc::TestCreate(SkRandom* random,
846 GrContext*, 835 GrContext*,
847 const GrDrawTar getCaps&, 836 const GrDrawTar getCaps&,
848 GrTexture* text ures[]) { 837 GrTexture* text ures[]) {
849 int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx : 838 int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx :
850 GrProcessorUnitTest::kAlphaTextureIdx; 839 GrProcessorUnitTest::kAlphaTextureIdx;
851 static const SkShader::TileMode kTileModes[] = { 840 static const SkShader::TileMode kTileModes[] = {
852 SkShader::kClamp_TileMode, 841 SkShader::kClamp_TileMode,
853 SkShader::kRepeat_TileMode, 842 SkShader::kRepeat_TileMode,
854 SkShader::kMirror_TileMode, 843 SkShader::kMirror_TileMode,
855 }; 844 };
856 SkShader::TileMode tileModes[] = { 845 SkShader::TileMode tileModes[] = {
857 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], 846 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
858 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], 847 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
859 }; 848 };
860 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBil erp_FilterMode : 849 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBil erp_FilterMode :
861 GrTextureParams::kNone_FilterMode); 850 GrTextureParams::kNone_FilterMode);
862 DistanceAdjust wa = { 0.0f, 0.1f, -0.1f }; 851 DistanceAdjust wa = { 0.0f, 0.1f, -0.1f };
863 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; 852 uint32_t flags = kUseLCD_DistanceFieldEffectFlag;
864 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; 853 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0;
865 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; 854 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0;
866 return GrDistanceFieldLCDTextureEffect::Create(GrRandomColor(random), 855 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(random),
867 GrProcessorUnitTest::TestMatr ix(random), 856 GrProcessorUnitTest::TestMatrix (random),
868 GrProcessorUnitTest::TestMatr ix(random), 857 GrProcessorUnitTest::TestMatrix (random),
869 textures[texIdx], params, 858 textures[texIdx], params,
870 wa, 859 wa,
871 flags); 860 flags);
872 } 861 }
OLDNEW
« no previous file with comments | « src/gpu/effects/GrDistanceFieldTextureEffect.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698