| 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 | 
|---|