OLD | NEW |
---|---|
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 "GrDistanceFieldGeoProc.h" | 8 #include "GrDistanceFieldGeoProc.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 class GrGLDistanceFieldA8TextGeoProc : public GrGLGeometryProcessor { | 24 class GrGLDistanceFieldA8TextGeoProc : public GrGLGeometryProcessor { |
25 public: | 25 public: |
26 GrGLDistanceFieldA8TextGeoProc(const GrGeometryProcessor&, | 26 GrGLDistanceFieldA8TextGeoProc(const GrGeometryProcessor&, |
27 const GrBatchTracker&) | 27 const GrBatchTracker&) |
28 : fColor(GrColor_ILLEGAL) | 28 : fViewMatrix(SkMatrix::InvalidMatrix()) |
29 , fColor(GrColor_ILLEGAL) | |
29 #ifdef SK_GAMMA_APPLY_TO_A8 | 30 #ifdef SK_GAMMA_APPLY_TO_A8 |
30 , fDistanceAdjust(-1.0f) | 31 , fDistanceAdjust(-1.0f) |
31 #endif | 32 #endif |
32 {} | 33 {} |
33 | 34 |
34 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 35 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
35 const GrDistanceFieldA8TextGeoProc& dfTexEffect = | 36 const GrDistanceFieldA8TextGeoProc& dfTexEffect = |
36 args.fGP.cast<GrDistanceFieldA8TextGeoProc>(); | 37 args.fGP.cast<GrDistanceFieldA8TextGeoProc>(); |
37 GrGLGPBuilder* pb = args.fPB; | 38 GrGLGPBuilder* pb = args.fPB; |
38 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 39 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
(...skipping 17 matching lines...) Expand all Loading... | |
56 // Setup pass through color | 57 // Setup pass through color |
57 if (!dfTexEffect.colorIgnored()) { | 58 if (!dfTexEffect.colorIgnored()) { |
58 if (dfTexEffect.hasVertexColor()) { | 59 if (dfTexEffect.hasVertexColor()) { |
59 pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputC olor); | 60 pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputC olor); |
60 } else { | 61 } else { |
61 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); | 62 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); |
62 } | 63 } |
63 } | 64 } |
64 | 65 |
65 // Setup position | 66 // Setup position |
66 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix()); | 67 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix(), |
68 &fViewMatrixUniform); | |
67 | 69 |
68 // emit transforms | 70 // emit transforms |
69 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName, | 71 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName, |
70 args.fTransformsIn, args.fTransformsOut); | 72 args.fTransformsIn, args.fTransformsOut); |
71 | 73 |
72 // add varyings | 74 // add varyings |
73 GrGLVertToFrag recipScale(kFloat_GrSLType); | 75 GrGLVertToFrag recipScale(kFloat_GrSLType); |
74 GrGLVertToFrag st(kVec2f_GrSLType); | 76 GrGLVertToFrag st(kVec2f_GrSLType); |
75 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan ceFieldEffectFlag); | 77 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan ceFieldEffectFlag); |
76 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); | 78 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
141 const GrPrimitiveProcessor& proc, | 143 const GrPrimitiveProcessor& proc, |
142 const GrBatchTracker& bt) override { | 144 const GrBatchTracker& bt) override { |
143 #ifdef SK_GAMMA_APPLY_TO_A8 | 145 #ifdef SK_GAMMA_APPLY_TO_A8 |
144 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFi eldA8TextGeoProc>(); | 146 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFi eldA8TextGeoProc>(); |
145 float distanceAdjust = dfTexEffect.getDistanceAdjust(); | 147 float distanceAdjust = dfTexEffect.getDistanceAdjust(); |
146 if (distanceAdjust != fDistanceAdjust) { | 148 if (distanceAdjust != fDistanceAdjust) { |
147 pdman.set1f(fDistanceAdjustUni, distanceAdjust); | 149 pdman.set1f(fDistanceAdjustUni, distanceAdjust); |
148 fDistanceAdjust = distanceAdjust; | 150 fDistanceAdjust = distanceAdjust; |
149 } | 151 } |
150 #endif | 152 #endif |
153 const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8 TextGeoProc>(); | |
151 | 154 |
152 const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8 TextGeoProc>(); | 155 if (!dfa8gp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfa8g p.viewMatrix())) { |
153 this->setUniformViewMatrix(pdman, dfa8gp.viewMatrix()); | 156 fViewMatrix = dfa8gp.viewMatrix(); |
157 GrGLfloat viewMatrix[3 * 3]; | |
158 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); | |
159 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); | |
160 } | |
154 | 161 |
155 if (dfa8gp.color() != fColor && !dfa8gp.hasVertexColor()) { | 162 if (dfa8gp.color() != fColor && !dfa8gp.hasVertexColor()) { |
156 GrGLfloat c[4]; | 163 GrGLfloat c[4]; |
157 GrColorToRGBAFloat(dfa8gp.color(), c); | 164 GrColorToRGBAFloat(dfa8gp.color(), c); |
158 pdman.set4fv(fColorUniform, 1, c); | 165 pdman.set4fv(fColorUniform, 1, c); |
159 fColor = dfa8gp.color(); | 166 fColor = dfa8gp.color(); |
160 } | 167 } |
161 } | 168 } |
162 | 169 |
163 static inline void GenKey(const GrGeometryProcessor& gp, | 170 static inline void GenKey(const GrGeometryProcessor& gp, |
164 const GrBatchTracker& bt, | 171 const GrBatchTracker& bt, |
165 const GrGLSLCaps&, | 172 const GrGLSLCaps&, |
166 GrProcessorKeyBuilder* b) { | 173 GrProcessorKeyBuilder* b) { |
167 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel dA8TextGeoProc>(); | 174 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel dA8TextGeoProc>(); |
168 uint32_t key = dfTexEffect.getFlags(); | 175 uint32_t key = dfTexEffect.getFlags(); |
169 key |= dfTexEffect.hasVertexColor() << 16; | 176 key |= dfTexEffect.hasVertexColor() << 16; |
170 key |= dfTexEffect.colorIgnored() << 17; | 177 key |= dfTexEffect.colorIgnored() << 17; |
171 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; | 178 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; |
172 b->add32(key); | 179 b->add32(key); |
173 } | 180 } |
174 | 181 |
175 private: | 182 private: |
183 SkMatrix fViewMatrix; | |
176 GrColor fColor; | 184 GrColor fColor; |
177 UniformHandle fColorUniform; | 185 UniformHandle fColorUniform; |
186 UniformHandle fViewMatrixUniform; | |
178 #ifdef SK_GAMMA_APPLY_TO_A8 | 187 #ifdef SK_GAMMA_APPLY_TO_A8 |
179 float fDistanceAdjust; | 188 float fDistanceAdjust; |
180 UniformHandle fDistanceAdjustUni; | 189 UniformHandle fDistanceAdjustUni; |
181 #endif | 190 #endif |
182 | 191 |
183 typedef GrGLGeometryProcessor INHERITED; | 192 typedef GrGLGeometryProcessor INHERITED; |
184 }; | 193 }; |
185 | 194 |
186 /////////////////////////////////////////////////////////////////////////////// | 195 /////////////////////////////////////////////////////////////////////////////// |
187 | 196 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
259 kSimilarity_DistanceFieldEff ectFlag : 0, | 268 kSimilarity_DistanceFieldEff ectFlag : 0, |
260 random->nextBool()); | 269 random->nextBool()); |
261 } | 270 } |
262 | 271 |
263 /////////////////////////////////////////////////////////////////////////////// | 272 /////////////////////////////////////////////////////////////////////////////// |
264 | 273 |
265 class GrGLDistanceFieldPathGeoProc : public GrGLGeometryProcessor { | 274 class GrGLDistanceFieldPathGeoProc : public GrGLGeometryProcessor { |
266 public: | 275 public: |
267 GrGLDistanceFieldPathGeoProc(const GrGeometryProcessor&, | 276 GrGLDistanceFieldPathGeoProc(const GrGeometryProcessor&, |
268 const GrBatchTracker&) | 277 const GrBatchTracker&) |
269 : fColor(GrColor_ILLEGAL), fTextureSize(SkISize::Make(-1, -1)) {} | 278 : fViewMatrix(SkMatrix::InvalidMatrix()) |
279 , fColor(GrColor_ILLEGAL) | |
280 , fTextureSize(SkISize::Make(-1, -1)) {} | |
270 | 281 |
271 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 282 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
272 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance FieldPathGeoProc>(); | 283 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance FieldPathGeoProc>(); |
273 | 284 |
274 GrGLGPBuilder* pb = args.fPB; | 285 GrGLGPBuilder* pb = args.fPB; |
275 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 286 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
276 SkAssertResult(fsBuilder->enableFeature( | 287 SkAssertResult(fsBuilder->enableFeature( |
277 GrGLFragmentShaderBuilder::kStandardDerivat ives_GLSLFeature)); | 288 GrGLFragmentShaderBuilder::kStandardDerivat ives_GLSLFeature)); |
278 | 289 |
279 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 290 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
280 | 291 |
281 // emit attributes | 292 // emit attributes |
282 vsBuilder->emitAttributes(dfTexEffect); | 293 vsBuilder->emitAttributes(dfTexEffect); |
283 | 294 |
284 GrGLVertToFrag v(kVec2f_GrSLType); | 295 GrGLVertToFrag v(kVec2f_GrSLType); |
285 args.fPB->addVarying("TextureCoords", &v, kHigh_GrSLPrecision); | 296 args.fPB->addVarying("TextureCoords", &v, kHigh_GrSLPrecision); |
286 | 297 |
287 // setup pass through color | 298 // setup pass through color |
288 if (!dfTexEffect.colorIgnored()) { | 299 if (!dfTexEffect.colorIgnored()) { |
289 if (dfTexEffect.hasVertexColor()) { | 300 if (dfTexEffect.hasVertexColor()) { |
290 pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputC olor); | 301 pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputC olor); |
291 } else { | 302 } else { |
292 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); | 303 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); |
293 } | 304 } |
294 } | 305 } |
295 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoord s()->fName); | 306 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoord s()->fName); |
296 | 307 |
297 // Setup position | 308 // Setup position |
298 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix()); | 309 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix(), |
310 &fViewMatrixUniform); | |
299 | 311 |
300 // emit transforms | 312 // emit transforms |
301 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName, | 313 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName, |
302 args.fTransformsIn, args.fTransformsOut); | 314 args.fTransformsIn, args.fTransformsOut); |
303 | 315 |
304 const char* textureSizeUniName = NULL; | 316 const char* textureSizeUniName = NULL; |
305 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis ibility, | 317 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis ibility, |
306 kVec2f_GrSLType, kDefault_GrSLPrec ision, | 318 kVec2f_GrSLType, kDefault_GrSLPrec ision, |
307 "TextureSize", &textureSizeUniName ); | 319 "TextureSize", &textureSizeUniName ); |
308 | 320 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
365 GrTexture* texture = proc.texture(0); | 377 GrTexture* texture = proc.texture(0); |
366 if (texture->width() != fTextureSize.width() || | 378 if (texture->width() != fTextureSize.width() || |
367 texture->height() != fTextureSize.height()) { | 379 texture->height() != fTextureSize.height()) { |
368 fTextureSize = SkISize::Make(texture->width(), texture->height()); | 380 fTextureSize = SkISize::Make(texture->width(), texture->height()); |
369 pdman.set2f(fTextureSizeUni, | 381 pdman.set2f(fTextureSizeUni, |
370 SkIntToScalar(fTextureSize.width()), | 382 SkIntToScalar(fTextureSize.width()), |
371 SkIntToScalar(fTextureSize.height())); | 383 SkIntToScalar(fTextureSize.height())); |
372 } | 384 } |
373 | 385 |
374 const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathG eoProc>(); | 386 const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathG eoProc>(); |
375 this->setUniformViewMatrix(pdman, dfpgp.viewMatrix()); | 387 |
388 if (!dfpgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfpgp. viewMatrix())) { | |
389 fViewMatrix = dfpgp.viewMatrix(); | |
390 GrGLfloat viewMatrix[3 * 3]; | |
391 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); | |
392 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); | |
393 } | |
376 | 394 |
377 if (dfpgp.color() != fColor) { | 395 if (dfpgp.color() != fColor) { |
378 GrGLfloat c[4]; | 396 GrGLfloat c[4]; |
379 GrColorToRGBAFloat(dfpgp.color(), c); | 397 GrColorToRGBAFloat(dfpgp.color(), c); |
380 pdman.set4fv(fColorUniform, 1, c); | 398 pdman.set4fv(fColorUniform, 1, c); |
381 fColor = dfpgp.color(); | 399 fColor = dfpgp.color(); |
382 } | 400 } |
383 } | 401 } |
384 | 402 |
385 static inline void GenKey(const GrGeometryProcessor& gp, | 403 static inline void GenKey(const GrGeometryProcessor& gp, |
386 const GrBatchTracker& bt, | 404 const GrBatchTracker& bt, |
387 const GrGLSLCaps&, | 405 const GrGLSLCaps&, |
388 GrProcessorKeyBuilder* b) { | 406 GrProcessorKeyBuilder* b) { |
389 const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldP athGeoProc>(); | 407 const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldP athGeoProc>(); |
390 | 408 |
391 uint32_t key = dfTexEffect.getFlags(); | 409 uint32_t key = dfTexEffect.getFlags(); |
392 key |= dfTexEffect.colorIgnored() << 16; | 410 key |= dfTexEffect.colorIgnored() << 16; |
393 key |= dfTexEffect.hasVertexColor() << 17; | 411 key |= dfTexEffect.hasVertexColor() << 17; |
394 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; | 412 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; |
395 b->add32(key); | 413 b->add32(key); |
396 } | 414 } |
397 | 415 |
398 private: | 416 private: |
399 UniformHandle fColorUniform; | 417 UniformHandle fColorUniform; |
400 UniformHandle fTextureSizeUni; | 418 UniformHandle fTextureSizeUni; |
419 UniformHandle fViewMatrixUniform; | |
420 SkMatrix fViewMatrix; | |
401 GrColor fColor; | 421 GrColor fColor; |
402 SkISize fTextureSize; | 422 SkISize fTextureSize; |
403 | 423 |
404 typedef GrGLGeometryProcessor INHERITED; | 424 typedef GrGLGeometryProcessor INHERITED; |
405 }; | 425 }; |
406 | 426 |
407 /////////////////////////////////////////////////////////////////////////////// | 427 /////////////////////////////////////////////////////////////////////////////// |
408 | 428 |
409 GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc( | 429 GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc( |
410 GrColor color, | 430 GrColor color, |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
471 random->nextBool() ? | 491 random->nextBool() ? |
472 kSimilarity_DistanceFieldE ffectFlag : 0, | 492 kSimilarity_DistanceFieldE ffectFlag : 0, |
473 random->nextBool()); | 493 random->nextBool()); |
474 } | 494 } |
475 | 495 |
476 /////////////////////////////////////////////////////////////////////////////// | 496 /////////////////////////////////////////////////////////////////////////////// |
477 | 497 |
478 class GrGLDistanceFieldLCDTextGeoProc : public GrGLGeometryProcessor { | 498 class GrGLDistanceFieldLCDTextGeoProc : public GrGLGeometryProcessor { |
479 public: | 499 public: |
480 GrGLDistanceFieldLCDTextGeoProc(const GrGeometryProcessor&, const GrBatchTra cker&) | 500 GrGLDistanceFieldLCDTextGeoProc(const GrGeometryProcessor&, const GrBatchTra cker&) |
481 : fColor(GrColor_ILLEGAL) { | 501 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { |
482 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1. 0f, 1.0f, 1.0f); | 502 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1. 0f, 1.0f, 1.0f); |
483 } | 503 } |
484 | 504 |
485 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 505 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
486 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = | 506 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = |
487 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>(); | 507 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>(); |
488 GrGLGPBuilder* pb = args.fPB; | 508 GrGLGPBuilder* pb = args.fPB; |
489 | 509 |
490 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 510 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
491 | 511 |
492 // emit attributes | 512 // emit attributes |
493 vsBuilder->emitAttributes(dfTexEffect); | 513 vsBuilder->emitAttributes(dfTexEffect); |
494 | 514 |
495 // setup pass through color | 515 // setup pass through color |
496 if (!dfTexEffect.colorIgnored()) { | 516 if (!dfTexEffect.colorIgnored()) { |
497 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); | 517 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); |
498 } | 518 } |
499 | 519 |
500 // Setup position | 520 // Setup position |
501 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix()); | 521 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix(), |
522 &fViewMatrixUniform); | |
502 | 523 |
503 // emit transforms | 524 // emit transforms |
504 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName, | 525 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName, |
505 args.fTransformsIn, args.fTransformsOut); | 526 args.fTransformsIn, args.fTransformsOut); |
506 | 527 |
507 // set up varyings | 528 // set up varyings |
508 bool isUniformScale = SkToBool(dfTexEffect.getFlags() & kUniformScale_Di stanceFieldEffectMask); | 529 bool isUniformScale = SkToBool(dfTexEffect.getFlags() & kUniformScale_Di stanceFieldEffectMask); |
509 GrGLVertToFrag recipScale(kFloat_GrSLType); | 530 GrGLVertToFrag recipScale(kFloat_GrSLType); |
510 GrGLVertToFrag st(kVec2f_GrSLType); | 531 GrGLVertToFrag st(kVec2f_GrSLType); |
511 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); | 532 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
622 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = | 643 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = |
623 processor.cast<GrDistanceFieldLCDTextGeoProc>(); | 644 processor.cast<GrDistanceFieldLCDTextGeoProc>(); |
624 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dfTexEffect.getDistan ceAdjust(); | 645 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dfTexEffect.getDistan ceAdjust(); |
625 if (wa != fDistanceAdjust) { | 646 if (wa != fDistanceAdjust) { |
626 pdman.set3f(fDistanceAdjustUni, | 647 pdman.set3f(fDistanceAdjustUni, |
627 wa.fR, | 648 wa.fR, |
628 wa.fG, | 649 wa.fG, |
629 wa.fB); | 650 wa.fB); |
630 fDistanceAdjust = wa; | 651 fDistanceAdjust = wa; |
631 } | 652 } |
632 | 653 |
robertphillips
2015/05/21 18:07:41
can this if test not all be on 1 line ?
| |
633 this->setUniformViewMatrix(pdman, dfTexEffect.viewMatrix()); | 654 if (!dfTexEffect.viewMatrix().isIdentity() && |
655 !fViewMatrix.cheapEqualTo(dfTexEffect.viewMatrix())) { | |
656 fViewMatrix = dfTexEffect.viewMatrix(); | |
657 GrGLfloat viewMatrix[3 * 3]; | |
658 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); | |
659 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); | |
660 } | |
634 | 661 |
635 if (dfTexEffect.color() != fColor) { | 662 if (dfTexEffect.color() != fColor) { |
636 GrGLfloat c[4]; | 663 GrGLfloat c[4]; |
637 GrColorToRGBAFloat(dfTexEffect.color(), c); | 664 GrColorToRGBAFloat(dfTexEffect.color(), c); |
638 pdman.set4fv(fColorUniform, 1, c); | 665 pdman.set4fv(fColorUniform, 1, c); |
639 fColor = dfTexEffect.color(); | 666 fColor = dfTexEffect.color(); |
640 } | 667 } |
641 } | 668 } |
642 | 669 |
643 static inline void GenKey(const GrGeometryProcessor& gp, | 670 static inline void GenKey(const GrGeometryProcessor& gp, |
644 const GrBatchTracker& bt, | 671 const GrBatchTracker& bt, |
645 const GrGLSLCaps&, | 672 const GrGLSLCaps&, |
646 GrProcessorKeyBuilder* b) { | 673 GrProcessorKeyBuilder* b) { |
647 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie ldLCDTextGeoProc>(); | 674 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie ldLCDTextGeoProc>(); |
648 | 675 |
649 uint32_t key = dfTexEffect.getFlags(); | 676 uint32_t key = dfTexEffect.getFlags(); |
650 key |= dfTexEffect.colorIgnored() << 16; | 677 key |= dfTexEffect.colorIgnored() << 16; |
651 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; | 678 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; |
652 b->add32(key); | 679 b->add32(key); |
653 } | 680 } |
654 | 681 |
655 private: | 682 private: |
683 SkMatrix fViewMatrix; | |
656 GrColor fColor; | 684 GrColor fColor; |
685 UniformHandle fViewMatrixUniform; | |
657 UniformHandle fColorUniform; | 686 UniformHandle fColorUniform; |
658 GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust; | 687 GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust; |
659 UniformHandle fDistanceAdjustUni; | 688 UniformHandle fDistanceAdjustUni; |
660 | 689 |
661 typedef GrGLGeometryProcessor INHERITED; | 690 typedef GrGLGeometryProcessor INHERITED; |
662 }; | 691 }; |
663 | 692 |
664 /////////////////////////////////////////////////////////////////////////////// | 693 /////////////////////////////////////////////////////////////////////////////// |
665 | 694 |
666 GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc( | 695 GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc( |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
720 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; | 749 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; |
721 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; | 750 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; |
722 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 751 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
723 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(random), | 752 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(random), |
724 GrTest::TestMatrix(random), | 753 GrTest::TestMatrix(random), |
725 textures[texIdx], params, | 754 textures[texIdx], params, |
726 wa, | 755 wa, |
727 flags, | 756 flags, |
728 random->nextBool()); | 757 random->nextBool()); |
729 } | 758 } |
OLD | NEW |