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/GrGLGeometryProcessor.h" | |
15 #include "glsl/GrGLSLFragmentProcessor.h" | |
16 #include "glsl/GrGLSLFragmentShaderBuilder.h" | 14 #include "glsl/GrGLSLFragmentShaderBuilder.h" |
| 15 #include "glsl/GrGLSLGeometryProcessor.h" |
17 #include "glsl/GrGLSLProgramBuilder.h" | 16 #include "glsl/GrGLSLProgramBuilder.h" |
18 #include "glsl/GrGLSLProgramDataManager.h" | 17 #include "glsl/GrGLSLProgramDataManager.h" |
19 #include "glsl/GrGLSLVertexShaderBuilder.h" | 18 #include "glsl/GrGLSLVertexShaderBuilder.h" |
20 #include "glsl/GrGLSLUtil.h" | 19 #include "glsl/GrGLSLUtil.h" |
21 | 20 |
22 // 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 |
23 #define SK_DistanceFieldAAFactor "0.65" | 22 #define SK_DistanceFieldAAFactor "0.65" |
24 | 23 |
25 class GrGLDistanceFieldA8TextGeoProc : public GrGLGeometryProcessor { | 24 class GrGLDistanceFieldA8TextGeoProc : public GrGLSLGeometryProcessor { |
26 public: | 25 public: |
27 GrGLDistanceFieldA8TextGeoProc() | 26 GrGLDistanceFieldA8TextGeoProc() |
28 : fViewMatrix(SkMatrix::InvalidMatrix()) | 27 : fViewMatrix(SkMatrix::InvalidMatrix()) |
29 , fColor(GrColor_ILLEGAL) | 28 , fColor(GrColor_ILLEGAL) |
30 #ifdef SK_GAMMA_APPLY_TO_A8 | 29 #ifdef SK_GAMMA_APPLY_TO_A8 |
31 , fDistanceAdjust(-1.0f) | 30 , fDistanceAdjust(-1.0f) |
32 #endif | 31 #endif |
33 {} | 32 {} |
34 | 33 |
35 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 34 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 private: | 192 private: |
194 SkMatrix fViewMatrix; | 193 SkMatrix fViewMatrix; |
195 GrColor fColor; | 194 GrColor fColor; |
196 UniformHandle fColorUniform; | 195 UniformHandle fColorUniform; |
197 UniformHandle fViewMatrixUniform; | 196 UniformHandle fViewMatrixUniform; |
198 #ifdef SK_GAMMA_APPLY_TO_A8 | 197 #ifdef SK_GAMMA_APPLY_TO_A8 |
199 float fDistanceAdjust; | 198 float fDistanceAdjust; |
200 UniformHandle fDistanceAdjustUni; | 199 UniformHandle fDistanceAdjustUni; |
201 #endif | 200 #endif |
202 | 201 |
203 typedef GrGLGeometryProcessor INHERITED; | 202 typedef GrGLSLGeometryProcessor INHERITED; |
204 }; | 203 }; |
205 | 204 |
206 /////////////////////////////////////////////////////////////////////////////// | 205 /////////////////////////////////////////////////////////////////////////////// |
207 | 206 |
208 GrDistanceFieldA8TextGeoProc::GrDistanceFieldA8TextGeoProc(GrColor color, | 207 GrDistanceFieldA8TextGeoProc::GrDistanceFieldA8TextGeoProc(GrColor color, |
209 const SkMatrix& viewM
atrix, | 208 const SkMatrix& viewM
atrix, |
210 GrTexture* texture, | 209 GrTexture* texture, |
211 const GrTextureParams
& params, | 210 const GrTextureParams
& params, |
212 #ifdef SK_GAMMA_APPLY_TO_A8 | 211 #ifdef SK_GAMMA_APPLY_TO_A8 |
213 float distanceAdjust, | 212 float distanceAdjust, |
(...skipping 19 matching lines...) Expand all Loading... |
233 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", | 232 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", |
234 kVec2s_GrVertexAttribT
ype)); | 233 kVec2s_GrVertexAttribT
ype)); |
235 this->addTextureAccess(&fTextureAccess); | 234 this->addTextureAccess(&fTextureAccess); |
236 } | 235 } |
237 | 236 |
238 void GrDistanceFieldA8TextGeoProc::getGLProcessorKey(const GrGLSLCaps& caps, | 237 void GrDistanceFieldA8TextGeoProc::getGLProcessorKey(const GrGLSLCaps& caps, |
239 GrProcessorKeyBuilder* b) c
onst { | 238 GrProcessorKeyBuilder* b) c
onst { |
240 GrGLDistanceFieldA8TextGeoProc::GenKey(*this, caps, b); | 239 GrGLDistanceFieldA8TextGeoProc::GenKey(*this, caps, b); |
241 } | 240 } |
242 | 241 |
243 GrGLPrimitiveProcessor* GrDistanceFieldA8TextGeoProc::createGLInstance(const GrG
LSLCaps&) const { | 242 GrGLSLPrimitiveProcessor* GrDistanceFieldA8TextGeoProc::createGLInstance(const G
rGLSLCaps&) const { |
244 return new GrGLDistanceFieldA8TextGeoProc(); | 243 return new GrGLDistanceFieldA8TextGeoProc(); |
245 } | 244 } |
246 | 245 |
247 /////////////////////////////////////////////////////////////////////////////// | 246 /////////////////////////////////////////////////////////////////////////////// |
248 | 247 |
249 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldA8TextGeoProc); | 248 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldA8TextGeoProc); |
250 | 249 |
251 const GrGeometryProcessor* GrDistanceFieldA8TextGeoProc::TestCreate(GrProcessorT
estData* d) { | 250 const GrGeometryProcessor* GrDistanceFieldA8TextGeoProc::TestCreate(GrProcessorT
estData* d) { |
252 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
: | 251 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
: |
253 GrProcessorUnitTest::kAlphaTextureIdx; | 252 GrProcessorUnitTest::kAlphaTextureIdx; |
(...skipping 15 matching lines...) Expand all Loading... |
269 #ifdef SK_GAMMA_APPLY_TO_A8 | 268 #ifdef SK_GAMMA_APPLY_TO_A8 |
270 d->fRandom->nextF(), | 269 d->fRandom->nextF(), |
271 #endif | 270 #endif |
272 d->fRandom->nextBool() ? | 271 d->fRandom->nextBool() ? |
273 kSimilarity_DistanceFieldEff
ectFlag : 0, | 272 kSimilarity_DistanceFieldEff
ectFlag : 0, |
274 d->fRandom->nextBool()); | 273 d->fRandom->nextBool()); |
275 } | 274 } |
276 | 275 |
277 /////////////////////////////////////////////////////////////////////////////// | 276 /////////////////////////////////////////////////////////////////////////////// |
278 | 277 |
279 class GrGLDistanceFieldPathGeoProc : public GrGLGeometryProcessor { | 278 class GrGLDistanceFieldPathGeoProc : public GrGLSLGeometryProcessor { |
280 public: | 279 public: |
281 GrGLDistanceFieldPathGeoProc() | 280 GrGLDistanceFieldPathGeoProc() |
282 : fViewMatrix(SkMatrix::InvalidMatrix()) | 281 : fViewMatrix(SkMatrix::InvalidMatrix()) |
283 , fColor(GrColor_ILLEGAL) | 282 , fColor(GrColor_ILLEGAL) |
284 , fTextureSize(SkISize::Make(-1, -1)) {} | 283 , fTextureSize(SkISize::Make(-1, -1)) {} |
285 | 284 |
286 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 285 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
287 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance
FieldPathGeoProc>(); | 286 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance
FieldPathGeoProc>(); |
288 | 287 |
289 GrGLSLGPBuilder* pb = args.fPB; | 288 GrGLSLGPBuilder* pb = args.fPB; |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
415 } | 414 } |
416 | 415 |
417 private: | 416 private: |
418 UniformHandle fColorUniform; | 417 UniformHandle fColorUniform; |
419 UniformHandle fTextureSizeUni; | 418 UniformHandle fTextureSizeUni; |
420 UniformHandle fViewMatrixUniform; | 419 UniformHandle fViewMatrixUniform; |
421 SkMatrix fViewMatrix; | 420 SkMatrix fViewMatrix; |
422 GrColor fColor; | 421 GrColor fColor; |
423 SkISize fTextureSize; | 422 SkISize fTextureSize; |
424 | 423 |
425 typedef GrGLGeometryProcessor INHERITED; | 424 typedef GrGLSLGeometryProcessor INHERITED; |
426 }; | 425 }; |
427 | 426 |
428 /////////////////////////////////////////////////////////////////////////////// | 427 /////////////////////////////////////////////////////////////////////////////// |
429 | 428 |
430 GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc( | 429 GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc( |
431 GrColor color, | 430 GrColor color, |
432 const SkMatrix& viewMatrix, | 431 const SkMatrix& viewMatrix, |
433 GrTexture* texture, | 432 GrTexture* texture, |
434 const GrTextureParams& params, | 433 const GrTextureParams& params, |
435 uint32_t flags, | 434 uint32_t flags, |
(...skipping 14 matching lines...) Expand all Loading... |
450 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", | 449 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", |
451 kVec2f_GrVertexAttribTyp
e)); | 450 kVec2f_GrVertexAttribTyp
e)); |
452 this->addTextureAccess(&fTextureAccess); | 451 this->addTextureAccess(&fTextureAccess); |
453 } | 452 } |
454 | 453 |
455 void GrDistanceFieldPathGeoProc::getGLProcessorKey(const GrGLSLCaps& caps, | 454 void GrDistanceFieldPathGeoProc::getGLProcessorKey(const GrGLSLCaps& caps, |
456 GrProcessorKeyBuilder* b) con
st { | 455 GrProcessorKeyBuilder* b) con
st { |
457 GrGLDistanceFieldPathGeoProc::GenKey(*this, caps, b); | 456 GrGLDistanceFieldPathGeoProc::GenKey(*this, caps, b); |
458 } | 457 } |
459 | 458 |
460 GrGLPrimitiveProcessor* GrDistanceFieldPathGeoProc::createGLInstance(const GrGLS
LCaps&) const { | 459 GrGLSLPrimitiveProcessor* GrDistanceFieldPathGeoProc::createGLInstance(const GrG
LSLCaps&) const { |
461 return new GrGLDistanceFieldPathGeoProc(); | 460 return new GrGLDistanceFieldPathGeoProc(); |
462 } | 461 } |
463 | 462 |
464 /////////////////////////////////////////////////////////////////////////////// | 463 /////////////////////////////////////////////////////////////////////////////// |
465 | 464 |
466 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldPathGeoProc); | 465 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldPathGeoProc); |
467 | 466 |
468 const GrGeometryProcessor* GrDistanceFieldPathGeoProc::TestCreate(GrProcessorTes
tData* d) { | 467 const GrGeometryProcessor* GrDistanceFieldPathGeoProc::TestCreate(GrProcessorTes
tData* d) { |
469 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx | 468 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx |
470 : GrProcessorUnitTest::kAlphaTextureIdx; | 469 : GrProcessorUnitTest::kAlphaTextureIdx; |
(...skipping 13 matching lines...) Expand all Loading... |
484 GrTest::TestMatrix(d->fRandom), | 483 GrTest::TestMatrix(d->fRandom), |
485 d->fTextures[texIdx], | 484 d->fTextures[texIdx], |
486 params, | 485 params, |
487 d->fRandom->nextBool() ? | 486 d->fRandom->nextBool() ? |
488 kSimilarity_DistanceFieldE
ffectFlag : 0, | 487 kSimilarity_DistanceFieldE
ffectFlag : 0, |
489 d->fRandom->nextBool()); | 488 d->fRandom->nextBool()); |
490 } | 489 } |
491 | 490 |
492 /////////////////////////////////////////////////////////////////////////////// | 491 /////////////////////////////////////////////////////////////////////////////// |
493 | 492 |
494 class GrGLDistanceFieldLCDTextGeoProc : public GrGLGeometryProcessor { | 493 class GrGLDistanceFieldLCDTextGeoProc : public GrGLSLGeometryProcessor { |
495 public: | 494 public: |
496 GrGLDistanceFieldLCDTextGeoProc() | 495 GrGLDistanceFieldLCDTextGeoProc() |
497 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { | 496 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { |
498 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1.
0f, 1.0f, 1.0f); | 497 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1.
0f, 1.0f, 1.0f); |
499 } | 498 } |
500 | 499 |
501 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 500 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
502 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = | 501 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = |
503 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>(); | 502 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>(); |
504 GrGLSLGPBuilder* pb = args.fPB; | 503 GrGLSLGPBuilder* pb = args.fPB; |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
690 } | 689 } |
691 | 690 |
692 private: | 691 private: |
693 SkMatrix fViewMatrix; | 692 SkMatrix fViewMatrix; |
694 GrColor fColor; | 693 GrColor fColor; |
695 UniformHandle fViewMatrixUniform; | 694 UniformHandle fViewMatrixUniform; |
696 UniformHandle fColorUniform; | 695 UniformHandle fColorUniform; |
697 GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust; | 696 GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust; |
698 UniformHandle fDistanceAdjustUni; | 697 UniformHandle fDistanceAdjustUni; |
699 | 698 |
700 typedef GrGLGeometryProcessor INHERITED; | 699 typedef GrGLSLGeometryProcessor INHERITED; |
701 }; | 700 }; |
702 | 701 |
703 /////////////////////////////////////////////////////////////////////////////// | 702 /////////////////////////////////////////////////////////////////////////////// |
704 | 703 |
705 GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc( | 704 GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc( |
706 GrColor color, const SkMatrix&
viewMatrix, | 705 GrColor color, const SkMatrix&
viewMatrix, |
707 GrTexture* texture, const GrTe
xtureParams& params, | 706 GrTexture* texture, const GrTe
xtureParams& params, |
708 DistanceAdjust distanceAdjust, | 707 DistanceAdjust distanceAdjust, |
709 uint32_t flags, bool usesLocal
Coords) | 708 uint32_t flags, bool usesLocal
Coords) |
710 : fColor(color) | 709 : fColor(color) |
711 , fViewMatrix(viewMatrix) | 710 , fViewMatrix(viewMatrix) |
712 , fTextureAccess(texture, params) | 711 , fTextureAccess(texture, params) |
713 , fDistanceAdjust(distanceAdjust) | 712 , fDistanceAdjust(distanceAdjust) |
714 , fFlags(flags & kLCD_DistanceFieldEffectMask) | 713 , fFlags(flags & kLCD_DistanceFieldEffectMask) |
715 , fUsesLocalCoords(usesLocalCoords) { | 714 , fUsesLocalCoords(usesLocalCoords) { |
716 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan
ceFieldEffectFlag)); | 715 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan
ceFieldEffectFlag)); |
717 this->initClassID<GrDistanceFieldLCDTextGeoProc>(); | 716 this->initClassID<GrDistanceFieldLCDTextGeoProc>(); |
718 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, | 717 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType, |
719 kHigh_GrSLPrecision)); | 718 kHigh_GrSLPrecision)); |
720 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", | 719 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", |
721 kVec2s_GrVertexAttribTyp
e)); | 720 kVec2s_GrVertexAttribTyp
e)); |
722 this->addTextureAccess(&fTextureAccess); | 721 this->addTextureAccess(&fTextureAccess); |
723 } | 722 } |
724 | 723 |
725 void GrDistanceFieldLCDTextGeoProc::getGLProcessorKey(const GrGLSLCaps& caps, | 724 void GrDistanceFieldLCDTextGeoProc::getGLProcessorKey(const GrGLSLCaps& caps, |
726 GrProcessorKeyBuilder* b)
const { | 725 GrProcessorKeyBuilder* b)
const { |
727 GrGLDistanceFieldLCDTextGeoProc::GenKey(*this, caps, b); | 726 GrGLDistanceFieldLCDTextGeoProc::GenKey(*this, caps, b); |
728 } | 727 } |
729 | 728 |
730 GrGLPrimitiveProcessor* GrDistanceFieldLCDTextGeoProc::createGLInstance(const Gr
GLSLCaps&) const { | 729 GrGLSLPrimitiveProcessor* GrDistanceFieldLCDTextGeoProc::createGLInstance(const
GrGLSLCaps&) const { |
731 return new GrGLDistanceFieldLCDTextGeoProc(); | 730 return new GrGLDistanceFieldLCDTextGeoProc(); |
732 } | 731 } |
733 | 732 |
734 /////////////////////////////////////////////////////////////////////////////// | 733 /////////////////////////////////////////////////////////////////////////////// |
735 | 734 |
736 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldLCDTextGeoProc); | 735 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldLCDTextGeoProc); |
737 | 736 |
738 const GrGeometryProcessor* GrDistanceFieldLCDTextGeoProc::TestCreate(GrProcessor
TestData* d) { | 737 const GrGeometryProcessor* GrDistanceFieldLCDTextGeoProc::TestCreate(GrProcessor
TestData* d) { |
739 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
: | 738 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
: |
740 GrProcessorUnitTest::kAlphaTextureIdx; | 739 GrProcessorUnitTest::kAlphaTextureIdx; |
(...skipping 12 matching lines...) Expand all Loading... |
753 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; | 752 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; |
754 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; | 753 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; |
755 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 754 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
756 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), | 755 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), |
757 GrTest::TestMatrix(d->fRandom), | 756 GrTest::TestMatrix(d->fRandom), |
758 d->fTextures[texIdx], params, | 757 d->fTextures[texIdx], params, |
759 wa, | 758 wa, |
760 flags, | 759 flags, |
761 d->fRandom->nextBool()); | 760 d->fRandom->nextBool()); |
762 } | 761 } |
OLD | NEW |