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 "GrInvariantOutput.h" | 9 #include "GrInvariantOutput.h" |
10 #include "GrTexture.h" | 10 #include "GrTexture.h" |
11 | 11 |
12 #include "SkDistanceFieldGen.h" | 12 #include "SkDistanceFieldGen.h" |
13 | 13 |
14 #include "gl/GrGLFragmentProcessor.h" | 14 #include "gl/GrGLFragmentProcessor.h" |
15 #include "gl/GrGLTexture.h" | 15 #include "gl/GrGLTexture.h" |
16 #include "gl/GrGLGeometryProcessor.h" | 16 #include "gl/GrGLGeometryProcessor.h" |
17 #include "gl/builders/GrGLProgramBuilder.h" | 17 #include "gl/builders/GrGLProgramBuilder.h" |
18 | 18 |
19 // Assuming a radius of a little less than the diagonal of the fragment | 19 // Assuming a radius of a little less than the diagonal of the fragment |
20 #define SK_DistanceFieldAAFactor "0.65" | 20 #define SK_DistanceFieldAAFactor "0.65" |
21 | 21 |
22 class GrGLDistanceFieldA8TextGeoProc : public GrGLGeometryProcessor { | 22 class GrGLDistanceFieldA8TextGeoProc : public GrGLGeometryProcessor { |
23 public: | 23 public: |
24 GrGLDistanceFieldA8TextGeoProc(const GrGeometryProcessor&, | 24 GrGLDistanceFieldA8TextGeoProc() |
25 const GrBatchTracker&) | |
26 : fViewMatrix(SkMatrix::InvalidMatrix()) | 25 : fViewMatrix(SkMatrix::InvalidMatrix()) |
27 , fColor(GrColor_ILLEGAL) | 26 , fColor(GrColor_ILLEGAL) |
28 #ifdef SK_GAMMA_APPLY_TO_A8 | 27 #ifdef SK_GAMMA_APPLY_TO_A8 |
29 , fDistanceAdjust(-1.0f) | 28 , fDistanceAdjust(-1.0f) |
30 #endif | 29 #endif |
31 {} | 30 {} |
32 | 31 |
33 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 32 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
34 const GrDistanceFieldA8TextGeoProc& dfTexEffect = | 33 const GrDistanceFieldA8TextGeoProc& dfTexEffect = |
35 args.fGP.cast<GrDistanceFieldA8TextGeoProc>(); | 34 args.fGP.cast<GrDistanceFieldA8TextGeoProc>(); |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 fsBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_gra
d.y*Jdy.y);"); | 136 fsBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_gra
d.y*Jdy.y);"); |
138 | 137 |
139 // this gives us a smooth step across approximately one fragment | 138 // this gives us a smooth step across approximately one fragment |
140 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length
(grad);"); | 139 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length
(grad);"); |
141 } | 140 } |
142 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc
e);"); | 141 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc
e);"); |
143 | 142 |
144 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); | 143 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); |
145 } | 144 } |
146 | 145 |
147 virtual void setData(const GrGLProgramDataManager& pdman, | 146 void setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor
& proc) override { |
148 const GrPrimitiveProcessor& proc, | |
149 const GrBatchTracker& bt) override { | |
150 #ifdef SK_GAMMA_APPLY_TO_A8 | 147 #ifdef SK_GAMMA_APPLY_TO_A8 |
151 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFi
eldA8TextGeoProc>(); | 148 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFi
eldA8TextGeoProc>(); |
152 float distanceAdjust = dfTexEffect.getDistanceAdjust(); | 149 float distanceAdjust = dfTexEffect.getDistanceAdjust(); |
153 if (distanceAdjust != fDistanceAdjust) { | 150 if (distanceAdjust != fDistanceAdjust) { |
154 pdman.set1f(fDistanceAdjustUni, distanceAdjust); | 151 pdman.set1f(fDistanceAdjustUni, distanceAdjust); |
155 fDistanceAdjust = distanceAdjust; | 152 fDistanceAdjust = distanceAdjust; |
156 } | 153 } |
157 #endif | 154 #endif |
158 const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8
TextGeoProc>(); | 155 const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8
TextGeoProc>(); |
159 | 156 |
160 if (!dfa8gp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfa8g
p.viewMatrix())) { | 157 if (!dfa8gp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfa8g
p.viewMatrix())) { |
161 fViewMatrix = dfa8gp.viewMatrix(); | 158 fViewMatrix = dfa8gp.viewMatrix(); |
162 GrGLfloat viewMatrix[3 * 3]; | 159 GrGLfloat viewMatrix[3 * 3]; |
163 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); | 160 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); |
164 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); | 161 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); |
165 } | 162 } |
166 | 163 |
167 if (dfa8gp.color() != fColor && !dfa8gp.hasVertexColor()) { | 164 if (dfa8gp.color() != fColor && !dfa8gp.hasVertexColor()) { |
168 GrGLfloat c[4]; | 165 GrGLfloat c[4]; |
169 GrColorToRGBAFloat(dfa8gp.color(), c); | 166 GrColorToRGBAFloat(dfa8gp.color(), c); |
170 pdman.set4fv(fColorUniform, 1, c); | 167 pdman.set4fv(fColorUniform, 1, c); |
171 fColor = dfa8gp.color(); | 168 fColor = dfa8gp.color(); |
172 } | 169 } |
173 } | 170 } |
174 | 171 |
175 static inline void GenKey(const GrGeometryProcessor& gp, | 172 static inline void GenKey(const GrGeometryProcessor& gp, |
176 const GrBatchTracker& bt, | |
177 const GrGLSLCaps&, | 173 const GrGLSLCaps&, |
178 GrProcessorKeyBuilder* b) { | 174 GrProcessorKeyBuilder* b) { |
179 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel
dA8TextGeoProc>(); | 175 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel
dA8TextGeoProc>(); |
180 uint32_t key = dfTexEffect.getFlags(); | 176 uint32_t key = dfTexEffect.getFlags(); |
181 key |= dfTexEffect.hasVertexColor() << 16; | 177 key |= dfTexEffect.hasVertexColor() << 16; |
182 key |= dfTexEffect.colorIgnored() << 17; | 178 key |= dfTexEffect.colorIgnored() << 17; |
183 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; | 179 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; |
184 b->add32(key); | 180 b->add32(key); |
185 | 181 |
186 // Currently we hardcode numbers to convert atlas coordinates to normali
zed floating point | 182 // Currently we hardcode numbers to convert atlas coordinates to normali
zed floating point |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, | 225 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, |
230 kHigh_GrSLPrecision)); | 226 kHigh_GrSLPrecision)); |
231 if (flags & kColorAttr_DistanceFieldEffectFlag) { | 227 if (flags & kColorAttr_DistanceFieldEffectFlag) { |
232 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA
ttribType)); | 228 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA
ttribType)); |
233 } | 229 } |
234 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", | 230 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", |
235 kVec2s_GrVertexAttribT
ype)); | 231 kVec2s_GrVertexAttribT
ype)); |
236 this->addTextureAccess(&fTextureAccess); | 232 this->addTextureAccess(&fTextureAccess); |
237 } | 233 } |
238 | 234 |
239 void GrDistanceFieldA8TextGeoProc::getGLProcessorKey(const GrBatchTracker& bt, | 235 void GrDistanceFieldA8TextGeoProc::getGLProcessorKey(const GrGLSLCaps& caps, |
240 const GrGLSLCaps& caps, | |
241 GrProcessorKeyBuilder* b) c
onst { | 236 GrProcessorKeyBuilder* b) c
onst { |
242 GrGLDistanceFieldA8TextGeoProc::GenKey(*this, bt, caps, b); | 237 GrGLDistanceFieldA8TextGeoProc::GenKey(*this, caps, b); |
243 } | 238 } |
244 | 239 |
245 GrGLPrimitiveProcessor* | 240 GrGLPrimitiveProcessor* GrDistanceFieldA8TextGeoProc::createGLInstance(const GrG
LSLCaps&) const { |
246 GrDistanceFieldA8TextGeoProc::createGLInstance(const GrBatchTracker& bt, | 241 return new GrGLDistanceFieldA8TextGeoProc(); |
247 const GrGLSLCaps&) const { | |
248 return new GrGLDistanceFieldA8TextGeoProc(*this, bt); | |
249 } | 242 } |
250 | 243 |
251 /////////////////////////////////////////////////////////////////////////////// | 244 /////////////////////////////////////////////////////////////////////////////// |
252 | 245 |
253 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldA8TextGeoProc); | 246 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldA8TextGeoProc); |
254 | 247 |
255 const GrGeometryProcessor* GrDistanceFieldA8TextGeoProc::TestCreate(GrProcessorT
estData* d) { | 248 const GrGeometryProcessor* GrDistanceFieldA8TextGeoProc::TestCreate(GrProcessorT
estData* d) { |
256 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
: | 249 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
: |
257 GrProcessorUnitTest::kAlphaTextureIdx; | 250 GrProcessorUnitTest::kAlphaTextureIdx; |
258 static const SkShader::TileMode kTileModes[] = { | 251 static const SkShader::TileMode kTileModes[] = { |
(...skipping 16 matching lines...) Expand all Loading... |
275 #endif | 268 #endif |
276 d->fRandom->nextBool() ? | 269 d->fRandom->nextBool() ? |
277 kSimilarity_DistanceFieldEff
ectFlag : 0, | 270 kSimilarity_DistanceFieldEff
ectFlag : 0, |
278 d->fRandom->nextBool()); | 271 d->fRandom->nextBool()); |
279 } | 272 } |
280 | 273 |
281 /////////////////////////////////////////////////////////////////////////////// | 274 /////////////////////////////////////////////////////////////////////////////// |
282 | 275 |
283 class GrGLDistanceFieldPathGeoProc : public GrGLGeometryProcessor { | 276 class GrGLDistanceFieldPathGeoProc : public GrGLGeometryProcessor { |
284 public: | 277 public: |
285 GrGLDistanceFieldPathGeoProc(const GrGeometryProcessor&, | 278 GrGLDistanceFieldPathGeoProc() |
286 const GrBatchTracker&) | |
287 : fViewMatrix(SkMatrix::InvalidMatrix()) | 279 : fViewMatrix(SkMatrix::InvalidMatrix()) |
288 , fColor(GrColor_ILLEGAL) | 280 , fColor(GrColor_ILLEGAL) |
289 , fTextureSize(SkISize::Make(-1, -1)) {} | 281 , fTextureSize(SkISize::Make(-1, -1)) {} |
290 | 282 |
291 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 283 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
292 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance
FieldPathGeoProc>(); | 284 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance
FieldPathGeoProc>(); |
293 | 285 |
294 GrGLGPBuilder* pb = args.fPB; | 286 GrGLGPBuilder* pb = args.fPB; |
295 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 287 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
296 SkAssertResult(fsBuilder->enableFeature( | 288 SkAssertResult(fsBuilder->enableFeature( |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 fsBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_gra
d.y*Jdy.y);"); | 363 fsBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_gra
d.y*Jdy.y);"); |
372 | 364 |
373 // this gives us a smooth step across approximately one fragment | 365 // this gives us a smooth step across approximately one fragment |
374 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length
(grad);"); | 366 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length
(grad);"); |
375 } | 367 } |
376 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc
e);"); | 368 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc
e);"); |
377 | 369 |
378 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); | 370 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); |
379 } | 371 } |
380 | 372 |
381 virtual void setData(const GrGLProgramDataManager& pdman, | 373 void setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor
& proc) override { |
382 const GrPrimitiveProcessor& proc, | |
383 const GrBatchTracker& bt) override { | |
384 SkASSERT(fTextureSizeUni.isValid()); | 374 SkASSERT(fTextureSizeUni.isValid()); |
385 | 375 |
386 GrTexture* texture = proc.texture(0); | 376 GrTexture* texture = proc.texture(0); |
387 if (texture->width() != fTextureSize.width() || | 377 if (texture->width() != fTextureSize.width() || |
388 texture->height() != fTextureSize.height()) { | 378 texture->height() != fTextureSize.height()) { |
389 fTextureSize = SkISize::Make(texture->width(), texture->height()); | 379 fTextureSize = SkISize::Make(texture->width(), texture->height()); |
390 pdman.set2f(fTextureSizeUni, | 380 pdman.set2f(fTextureSizeUni, |
391 SkIntToScalar(fTextureSize.width()), | 381 SkIntToScalar(fTextureSize.width()), |
392 SkIntToScalar(fTextureSize.height())); | 382 SkIntToScalar(fTextureSize.height())); |
393 } | 383 } |
394 | 384 |
395 const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathG
eoProc>(); | 385 const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathG
eoProc>(); |
396 | 386 |
397 if (!dfpgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfpgp.
viewMatrix())) { | 387 if (!dfpgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfpgp.
viewMatrix())) { |
398 fViewMatrix = dfpgp.viewMatrix(); | 388 fViewMatrix = dfpgp.viewMatrix(); |
399 GrGLfloat viewMatrix[3 * 3]; | 389 GrGLfloat viewMatrix[3 * 3]; |
400 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); | 390 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); |
401 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); | 391 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); |
402 } | 392 } |
403 | 393 |
404 if (dfpgp.color() != fColor) { | 394 if (dfpgp.color() != fColor) { |
405 GrGLfloat c[4]; | 395 GrGLfloat c[4]; |
406 GrColorToRGBAFloat(dfpgp.color(), c); | 396 GrColorToRGBAFloat(dfpgp.color(), c); |
407 pdman.set4fv(fColorUniform, 1, c); | 397 pdman.set4fv(fColorUniform, 1, c); |
408 fColor = dfpgp.color(); | 398 fColor = dfpgp.color(); |
409 } | 399 } |
410 } | 400 } |
411 | 401 |
412 static inline void GenKey(const GrGeometryProcessor& gp, | 402 static inline void GenKey(const GrGeometryProcessor& gp, |
413 const GrBatchTracker& bt, | |
414 const GrGLSLCaps&, | 403 const GrGLSLCaps&, |
415 GrProcessorKeyBuilder* b) { | 404 GrProcessorKeyBuilder* b) { |
416 const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldP
athGeoProc>(); | 405 const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldP
athGeoProc>(); |
417 | 406 |
418 uint32_t key = dfTexEffect.getFlags(); | 407 uint32_t key = dfTexEffect.getFlags(); |
419 key |= dfTexEffect.colorIgnored() << 16; | 408 key |= dfTexEffect.colorIgnored() << 16; |
420 key |= dfTexEffect.hasVertexColor() << 17; | 409 key |= dfTexEffect.hasVertexColor() << 17; |
421 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; | 410 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; |
422 b->add32(key); | 411 b->add32(key); |
423 } | 412 } |
(...skipping 29 matching lines...) Expand all Loading... |
453 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, | 442 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, |
454 kHigh_GrSLPrecision)); | 443 kHigh_GrSLPrecision)); |
455 if (flags & kColorAttr_DistanceFieldEffectFlag) { | 444 if (flags & kColorAttr_DistanceFieldEffectFlag) { |
456 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA
ttribType)); | 445 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA
ttribType)); |
457 } | 446 } |
458 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", | 447 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", |
459 kVec2f_GrVertexAttribTyp
e)); | 448 kVec2f_GrVertexAttribTyp
e)); |
460 this->addTextureAccess(&fTextureAccess); | 449 this->addTextureAccess(&fTextureAccess); |
461 } | 450 } |
462 | 451 |
463 void GrDistanceFieldPathGeoProc::getGLProcessorKey(const GrBatchTracker& bt, | 452 void GrDistanceFieldPathGeoProc::getGLProcessorKey(const GrGLSLCaps& caps, |
464 const GrGLSLCaps& caps, | |
465 GrProcessorKeyBuilder* b) con
st { | 453 GrProcessorKeyBuilder* b) con
st { |
466 GrGLDistanceFieldPathGeoProc::GenKey(*this, bt, caps, b); | 454 GrGLDistanceFieldPathGeoProc::GenKey(*this, caps, b); |
467 } | 455 } |
468 | 456 |
469 GrGLPrimitiveProcessor* | 457 GrGLPrimitiveProcessor* GrDistanceFieldPathGeoProc::createGLInstance(const GrGLS
LCaps&) const { |
470 GrDistanceFieldPathGeoProc::createGLInstance(const GrBatchTracker& bt, const GrG
LSLCaps&) const { | 458 return new GrGLDistanceFieldPathGeoProc(); |
471 return new GrGLDistanceFieldPathGeoProc(*this, bt); | |
472 } | 459 } |
473 | 460 |
474 /////////////////////////////////////////////////////////////////////////////// | 461 /////////////////////////////////////////////////////////////////////////////// |
475 | 462 |
476 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldPathGeoProc); | 463 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldPathGeoProc); |
477 | 464 |
478 const GrGeometryProcessor* GrDistanceFieldPathGeoProc::TestCreate(GrProcessorTes
tData* d) { | 465 const GrGeometryProcessor* GrDistanceFieldPathGeoProc::TestCreate(GrProcessorTes
tData* d) { |
479 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx | 466 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx |
480 : GrProcessorUnitTest::kAlphaTextureIdx; | 467 : GrProcessorUnitTest::kAlphaTextureIdx; |
481 static const SkShader::TileMode kTileModes[] = { | 468 static const SkShader::TileMode kTileModes[] = { |
(...skipping 14 matching lines...) Expand all Loading... |
496 params, | 483 params, |
497 d->fRandom->nextBool() ? | 484 d->fRandom->nextBool() ? |
498 kSimilarity_DistanceFieldE
ffectFlag : 0, | 485 kSimilarity_DistanceFieldE
ffectFlag : 0, |
499 d->fRandom->nextBool()); | 486 d->fRandom->nextBool()); |
500 } | 487 } |
501 | 488 |
502 /////////////////////////////////////////////////////////////////////////////// | 489 /////////////////////////////////////////////////////////////////////////////// |
503 | 490 |
504 class GrGLDistanceFieldLCDTextGeoProc : public GrGLGeometryProcessor { | 491 class GrGLDistanceFieldLCDTextGeoProc : public GrGLGeometryProcessor { |
505 public: | 492 public: |
506 GrGLDistanceFieldLCDTextGeoProc(const GrGeometryProcessor&, const GrBatchTra
cker&) | 493 GrGLDistanceFieldLCDTextGeoProc() |
507 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { | 494 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { |
508 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1.
0f, 1.0f, 1.0f); | 495 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1.
0f, 1.0f, 1.0f); |
509 } | 496 } |
510 | 497 |
511 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 498 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
512 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = | 499 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = |
513 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>(); | 500 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>(); |
514 GrGLGPBuilder* pb = args.fPB; | 501 GrGLGPBuilder* pb = args.fPB; |
515 | 502 |
516 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 503 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 // this gives us a smooth step across approximately one fragment | 630 // this gives us a smooth step across approximately one fragment |
644 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length
(grad);"); | 631 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length
(grad);"); |
645 } | 632 } |
646 | 633 |
647 fsBuilder->codeAppend( | 634 fsBuilder->codeAppend( |
648 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth),
distance), 1.0);"); | 635 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth),
distance), 1.0);"); |
649 | 636 |
650 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); | 637 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); |
651 } | 638 } |
652 | 639 |
653 virtual void setData(const GrGLProgramDataManager& pdman, | 640 void setData(const GrGLProgramDataManager& pdman, |
654 const GrPrimitiveProcessor& processor, | 641 const GrPrimitiveProcessor& processor) override { |
655 const GrBatchTracker& bt) override { | |
656 SkASSERT(fDistanceAdjustUni.isValid()); | 642 SkASSERT(fDistanceAdjustUni.isValid()); |
657 | 643 |
658 const GrDistanceFieldLCDTextGeoProc& dflcd = processor.cast<GrDistanceFi
eldLCDTextGeoProc>(); | 644 const GrDistanceFieldLCDTextGeoProc& dflcd = processor.cast<GrDistanceFi
eldLCDTextGeoProc>(); |
659 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dflcd.getDistanceAdju
st(); | 645 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dflcd.getDistanceAdju
st(); |
660 if (wa != fDistanceAdjust) { | 646 if (wa != fDistanceAdjust) { |
661 pdman.set3f(fDistanceAdjustUni, | 647 pdman.set3f(fDistanceAdjustUni, |
662 wa.fR, | 648 wa.fR, |
663 wa.fG, | 649 wa.fG, |
664 wa.fB); | 650 wa.fB); |
665 fDistanceAdjust = wa; | 651 fDistanceAdjust = wa; |
666 } | 652 } |
667 | 653 |
668 if (!dflcd.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dflcd.
viewMatrix())) { | 654 if (!dflcd.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dflcd.
viewMatrix())) { |
669 fViewMatrix = dflcd.viewMatrix(); | 655 fViewMatrix = dflcd.viewMatrix(); |
670 GrGLfloat viewMatrix[3 * 3]; | 656 GrGLfloat viewMatrix[3 * 3]; |
671 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); | 657 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); |
672 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); | 658 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); |
673 } | 659 } |
674 | 660 |
675 if (dflcd.color() != fColor) { | 661 if (dflcd.color() != fColor) { |
676 GrGLfloat c[4]; | 662 GrGLfloat c[4]; |
677 GrColorToRGBAFloat(dflcd.color(), c); | 663 GrColorToRGBAFloat(dflcd.color(), c); |
678 pdman.set4fv(fColorUniform, 1, c); | 664 pdman.set4fv(fColorUniform, 1, c); |
679 fColor = dflcd.color(); | 665 fColor = dflcd.color(); |
680 } | 666 } |
681 } | 667 } |
682 | 668 |
683 static inline void GenKey(const GrGeometryProcessor& gp, | 669 static inline void GenKey(const GrGeometryProcessor& gp, |
684 const GrBatchTracker& bt, | |
685 const GrGLSLCaps&, | 670 const GrGLSLCaps&, |
686 GrProcessorKeyBuilder* b) { | 671 GrProcessorKeyBuilder* b) { |
687 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie
ldLCDTextGeoProc>(); | 672 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie
ldLCDTextGeoProc>(); |
688 | 673 |
689 uint32_t key = dfTexEffect.getFlags(); | 674 uint32_t key = dfTexEffect.getFlags(); |
690 key |= dfTexEffect.colorIgnored() << 16; | 675 key |= dfTexEffect.colorIgnored() << 16; |
691 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; | 676 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; |
692 b->add32(key); | 677 b->add32(key); |
693 | 678 |
694 // Currently we hardcode numbers to convert atlas coordinates to normali
zed floating point | 679 // Currently we hardcode numbers to convert atlas coordinates to normali
zed floating point |
(...skipping 30 matching lines...) Expand all Loading... |
725 , fUsesLocalCoords(usesLocalCoords) { | 710 , fUsesLocalCoords(usesLocalCoords) { |
726 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan
ceFieldEffectFlag)); | 711 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan
ceFieldEffectFlag)); |
727 this->initClassID<GrDistanceFieldLCDTextGeoProc>(); | 712 this->initClassID<GrDistanceFieldLCDTextGeoProc>(); |
728 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, | 713 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, |
729 kHigh_GrSLPrecision)); | 714 kHigh_GrSLPrecision)); |
730 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", | 715 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", |
731 kVec2s_GrVertexAttribTyp
e)); | 716 kVec2s_GrVertexAttribTyp
e)); |
732 this->addTextureAccess(&fTextureAccess); | 717 this->addTextureAccess(&fTextureAccess); |
733 } | 718 } |
734 | 719 |
735 void GrDistanceFieldLCDTextGeoProc::getGLProcessorKey(const GrBatchTracker& bt, | 720 void GrDistanceFieldLCDTextGeoProc::getGLProcessorKey(const GrGLSLCaps& caps, |
736 const GrGLSLCaps& caps, | |
737 GrProcessorKeyBuilder* b)
const { | 721 GrProcessorKeyBuilder* b)
const { |
738 GrGLDistanceFieldLCDTextGeoProc::GenKey(*this, bt, caps, b); | 722 GrGLDistanceFieldLCDTextGeoProc::GenKey(*this, caps, b); |
739 } | 723 } |
740 | 724 |
741 GrGLPrimitiveProcessor* | 725 GrGLPrimitiveProcessor* GrDistanceFieldLCDTextGeoProc::createGLInstance(const Gr
GLSLCaps&) const { |
742 GrDistanceFieldLCDTextGeoProc::createGLInstance(const GrBatchTracker& bt, | 726 return new GrGLDistanceFieldLCDTextGeoProc(); |
743 const GrGLSLCaps&) const { | |
744 return new GrGLDistanceFieldLCDTextGeoProc(*this, bt); | |
745 } | 727 } |
746 | 728 |
747 /////////////////////////////////////////////////////////////////////////////// | 729 /////////////////////////////////////////////////////////////////////////////// |
748 | 730 |
749 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldLCDTextGeoProc); | 731 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldLCDTextGeoProc); |
750 | 732 |
751 const GrGeometryProcessor* GrDistanceFieldLCDTextGeoProc::TestCreate(GrProcessor
TestData* d) { | 733 const GrGeometryProcessor* GrDistanceFieldLCDTextGeoProc::TestCreate(GrProcessor
TestData* d) { |
752 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
: | 734 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
: |
753 GrProcessorUnitTest::kAlphaTextureIdx; | 735 GrProcessorUnitTest::kAlphaTextureIdx; |
754 static const SkShader::TileMode kTileModes[] = { | 736 static const SkShader::TileMode kTileModes[] = { |
(...skipping 11 matching lines...) Expand all Loading... |
766 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; | 748 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; |
767 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; | 749 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; |
768 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 750 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
769 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), | 751 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), |
770 GrTest::TestMatrix(d->fRandom), | 752 GrTest::TestMatrix(d->fRandom), |
771 d->fTextures[texIdx], params, | 753 d->fTextures[texIdx], params, |
772 wa, | 754 wa, |
773 flags, | 755 flags, |
774 d->fRandom->nextBool()); | 756 d->fRandom->nextBool()); |
775 } | 757 } |
OLD | NEW |