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 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth),
distance), 1.0);"); | 633 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth),
distance), 1.0);"); |
613 | 634 |
614 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); | 635 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); |
615 } | 636 } |
616 | 637 |
617 virtual void setData(const GrGLProgramDataManager& pdman, | 638 virtual void setData(const GrGLProgramDataManager& pdman, |
618 const GrPrimitiveProcessor& processor, | 639 const GrPrimitiveProcessor& processor, |
619 const GrBatchTracker& bt) override { | 640 const GrBatchTracker& bt) override { |
620 SkASSERT(fDistanceAdjustUni.isValid()); | 641 SkASSERT(fDistanceAdjustUni.isValid()); |
621 | 642 |
622 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = | 643 const GrDistanceFieldLCDTextGeoProc& dflcd = processor.cast<GrDistanceFi
eldLCDTextGeoProc>(); |
623 processor.cast<GrDistanceFieldLCDTextGeoProc>(); | 644 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dflcd.getDistanceAdju
st(); |
624 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dfTexEffect.getDistan
ceAdjust(); | |
625 if (wa != fDistanceAdjust) { | 645 if (wa != fDistanceAdjust) { |
626 pdman.set3f(fDistanceAdjustUni, | 646 pdman.set3f(fDistanceAdjustUni, |
627 wa.fR, | 647 wa.fR, |
628 wa.fG, | 648 wa.fG, |
629 wa.fB); | 649 wa.fB); |
630 fDistanceAdjust = wa; | 650 fDistanceAdjust = wa; |
631 } | 651 } |
632 | 652 |
633 this->setUniformViewMatrix(pdman, dfTexEffect.viewMatrix()); | 653 if (!dflcd.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dflcd.
viewMatrix())) { |
| 654 fViewMatrix = dflcd.viewMatrix(); |
| 655 GrGLfloat viewMatrix[3 * 3]; |
| 656 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); |
| 657 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); |
| 658 } |
634 | 659 |
635 if (dfTexEffect.color() != fColor) { | 660 if (dflcd.color() != fColor) { |
636 GrGLfloat c[4]; | 661 GrGLfloat c[4]; |
637 GrColorToRGBAFloat(dfTexEffect.color(), c); | 662 GrColorToRGBAFloat(dflcd.color(), c); |
638 pdman.set4fv(fColorUniform, 1, c); | 663 pdman.set4fv(fColorUniform, 1, c); |
639 fColor = dfTexEffect.color(); | 664 fColor = dflcd.color(); |
640 } | 665 } |
641 } | 666 } |
642 | 667 |
643 static inline void GenKey(const GrGeometryProcessor& gp, | 668 static inline void GenKey(const GrGeometryProcessor& gp, |
644 const GrBatchTracker& bt, | 669 const GrBatchTracker& bt, |
645 const GrGLSLCaps&, | 670 const GrGLSLCaps&, |
646 GrProcessorKeyBuilder* b) { | 671 GrProcessorKeyBuilder* b) { |
647 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie
ldLCDTextGeoProc>(); | 672 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie
ldLCDTextGeoProc>(); |
648 | 673 |
649 uint32_t key = dfTexEffect.getFlags(); | 674 uint32_t key = dfTexEffect.getFlags(); |
650 key |= dfTexEffect.colorIgnored() << 16; | 675 key |= dfTexEffect.colorIgnored() << 16; |
651 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; | 676 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; |
652 b->add32(key); | 677 b->add32(key); |
653 } | 678 } |
654 | 679 |
655 private: | 680 private: |
| 681 SkMatrix fViewMatrix; |
656 GrColor fColor; | 682 GrColor fColor; |
| 683 UniformHandle fViewMatrixUniform; |
657 UniformHandle fColorUniform; | 684 UniformHandle fColorUniform; |
658 GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust; | 685 GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust; |
659 UniformHandle fDistanceAdjustUni; | 686 UniformHandle fDistanceAdjustUni; |
660 | 687 |
661 typedef GrGLGeometryProcessor INHERITED; | 688 typedef GrGLGeometryProcessor INHERITED; |
662 }; | 689 }; |
663 | 690 |
664 /////////////////////////////////////////////////////////////////////////////// | 691 /////////////////////////////////////////////////////////////////////////////// |
665 | 692 |
666 GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc( | 693 GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc( |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
720 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; | 747 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; |
721 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; | 748 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; |
722 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 749 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
723 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(random), | 750 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(random), |
724 GrTest::TestMatrix(random), | 751 GrTest::TestMatrix(random), |
725 textures[texIdx], params, | 752 textures[texIdx], params, |
726 wa, | 753 wa, |
727 flags, | 754 flags, |
728 random->nextBool()); | 755 random->nextBool()); |
729 } | 756 } |
OLD | NEW |