| 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 "gl/builders/GrGLProgramBuilder.h" | 8 #include "gl/builders/GrGLProgramBuilder.h" |
| 9 #include "GrDistanceFieldTextureEffect.h" | 9 #include "GrDistanceFieldTextureEffect.h" |
| 10 #include "gl/GrGLEffect.h" | 10 #include "gl/GrGLEffect.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 #define SK_DistanceFieldLCDFactor "0.05" | 25 #define SK_DistanceFieldLCDFactor "0.05" |
| 26 #define SK_DistanceFieldNonLCDFactor "0.05" | 26 #define SK_DistanceFieldNonLCDFactor "0.05" |
| 27 #endif | 27 #endif |
| 28 | 28 |
| 29 // Assuming a radius of the diagonal of the fragment, hence a factor of sqrt(2)/
2 | 29 // Assuming a radius of the diagonal of the fragment, hence a factor of sqrt(2)/
2 |
| 30 #define SK_DistanceFieldAAFactor "0.7071" | 30 #define SK_DistanceFieldAAFactor "0.7071" |
| 31 | 31 |
| 32 class GrGLDistanceFieldTextureEffect : public GrGLGeometryProcessor { | 32 class GrGLDistanceFieldTextureEffect : public GrGLGeometryProcessor { |
| 33 public: | 33 public: |
| 34 GrGLDistanceFieldTextureEffect(const GrBackendEffectFactory& factory, | 34 GrGLDistanceFieldTextureEffect(const GrBackendEffectFactory& factory, |
| 35 const GrDrawEffect& drawEffect) | 35 const GrEffect& effect) |
| 36 : INHERITED (factory) | 36 : INHERITED (factory) |
| 37 , fTextureSize(SkISize::Make(-1,-1)) {} | 37 , fTextureSize(SkISize::Make(-1,-1)) {} |
| 38 | 38 |
| 39 virtual void emitCode(GrGLFullProgramBuilder* builder, | 39 virtual void emitCode(GrGLFullProgramBuilder* builder, |
| 40 const GrDrawEffect& drawEffect, | 40 const GrEffect& effect, |
| 41 const GrEffectKey& key, | 41 const GrEffectKey& key, |
| 42 const char* outputColor, | 42 const char* outputColor, |
| 43 const char* inputColor, | 43 const char* inputColor, |
| 44 const TransformedCoordsArray&, | 44 const TransformedCoordsArray&, |
| 45 const TextureSamplerArray& samplers) SK_OVERRIDE { | 45 const TextureSamplerArray& samplers) SK_OVERRIDE { |
| 46 const GrDistanceFieldTextureEffect& dfTexEffect = | 46 const GrDistanceFieldTextureEffect& dfTexEffect = |
| 47 drawEffect.castEffect<GrDistanceFi
eldTextureEffect>(); | 47 GrEffect::CastEffect<GrDistanceFieldTextureEffect>(effect); |
| 48 SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); | 48 SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); |
| 49 | 49 |
| 50 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder
(); | 50 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder
(); |
| 51 SkAssertResult(fsBuilder->enableFeature( | 51 SkAssertResult(fsBuilder->enableFeature( |
| 52 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); | 52 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); |
| 53 | 53 |
| 54 SkString fsCoordName; | 54 SkString fsCoordName; |
| 55 const char* vsCoordName; | 55 const char* vsCoordName; |
| 56 const char* fsCoordNamePtr; | 56 const char* fsCoordNamePtr; |
| 57 builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsC
oordNamePtr); | 57 builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsC
oordNamePtr); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType); | 120 fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType); |
| 121 fsBuilder->codeAppend(";\n"); | 121 fsBuilder->codeAppend(";\n"); |
| 122 fsBuilder->codeAppend("\tval = gammaColor.r;\n"); | 122 fsBuilder->codeAppend("\tval = gammaColor.r;\n"); |
| 123 #endif | 123 #endif |
| 124 | 124 |
| 125 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, | 125 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, |
| 126 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("val")
).c_str()); | 126 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("val")
).c_str()); |
| 127 } | 127 } |
| 128 | 128 |
| 129 virtual void setData(const GrGLProgramDataManager& pdman, | 129 virtual void setData(const GrGLProgramDataManager& pdman, |
| 130 const GrDrawEffect& drawEffect) SK_OVERRIDE { | 130 const GrEffect& effect) SK_OVERRIDE { |
| 131 SkASSERT(fTextureSizeUni.isValid()); | 131 SkASSERT(fTextureSizeUni.isValid()); |
| 132 | 132 |
| 133 GrTexture* texture = drawEffect.effect()->texture(0); | 133 GrTexture* texture = effect.texture(0); |
| 134 if (texture->width() != fTextureSize.width() || | 134 if (texture->width() != fTextureSize.width() || |
| 135 texture->height() != fTextureSize.height()) { | 135 texture->height() != fTextureSize.height()) { |
| 136 fTextureSize = SkISize::Make(texture->width(), texture->height()); | 136 fTextureSize = SkISize::Make(texture->width(), texture->height()); |
| 137 pdman.set2f(fTextureSizeUni, | 137 pdman.set2f(fTextureSizeUni, |
| 138 SkIntToScalar(fTextureSize.width()), | 138 SkIntToScalar(fTextureSize.width()), |
| 139 SkIntToScalar(fTextureSize.height())); | 139 SkIntToScalar(fTextureSize.height())); |
| 140 } | 140 } |
| 141 #ifdef SK_GAMMA_APPLY_TO_A8 | 141 #ifdef SK_GAMMA_APPLY_TO_A8 |
| 142 const GrDistanceFieldTextureEffect& dfTexEffect = | 142 const GrDistanceFieldTextureEffect& dfTexEffect = |
| 143 drawEffect.castEffect<GrDistanceFi
eldTextureEffect>(); | 143 GrEffect::CastEffect<GrDistanceFie
ldTextureEffect>(effect); |
| 144 float luminance = dfTexEffect.getLuminance(); | 144 float luminance = dfTexEffect.getLuminance(); |
| 145 if (luminance != fLuminance) { | 145 if (luminance != fLuminance) { |
| 146 pdman.set1f(fLuminanceUni, luminance); | 146 pdman.set1f(fLuminanceUni, luminance); |
| 147 fLuminance = luminance; | 147 fLuminance = luminance; |
| 148 } | 148 } |
| 149 #endif | 149 #endif |
| 150 } | 150 } |
| 151 | 151 |
| 152 static inline void GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, | 152 static inline void GenKey(const GrEffect& effect, const GrGLCaps&, |
| 153 GrEffectKeyBuilder* b) { | 153 GrEffectKeyBuilder* b) { |
| 154 const GrDistanceFieldTextureEffect& dfTexEffect = | 154 const GrDistanceFieldTextureEffect& dfTexEffect = |
| 155 drawEffect.castEffect<GrDistanceFi
eldTextureEffect>(); | 155 GrEffect::CastEffect<GrDistanceFieldTextureEffect>(effect); |
| 156 | 156 |
| 157 b->add32(dfTexEffect.getFlags()); | 157 b->add32(dfTexEffect.getFlags()); |
| 158 } | 158 } |
| 159 | 159 |
| 160 private: | 160 private: |
| 161 GrGLProgramDataManager::UniformHandle fTextureSizeUni; | 161 GrGLProgramDataManager::UniformHandle fTextureSizeUni; |
| 162 SkISize fTextureSize; | 162 SkISize fTextureSize; |
| 163 GrGLProgramDataManager::UniformHandle fLuminanceUni; | 163 GrGLProgramDataManager::UniformHandle fLuminanceUni; |
| 164 float fLuminance; | 164 float fLuminance; |
| 165 | 165 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 186 kVec2f_GrSLType, | 186 kVec2f_GrSLType, |
| 187 GrShaderVar::kAttribute
_TypeModifier))) { | 187 GrShaderVar::kAttribute
_TypeModifier))) { |
| 188 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); | 188 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); |
| 189 this->addTextureAccess(&fTextureAccess); | 189 this->addTextureAccess(&fTextureAccess); |
| 190 #ifdef SK_GAMMA_APPLY_TO_A8 | 190 #ifdef SK_GAMMA_APPLY_TO_A8 |
| 191 this->addTextureAccess(&fGammaTextureAccess); | 191 this->addTextureAccess(&fGammaTextureAccess); |
| 192 #endif | 192 #endif |
| 193 } | 193 } |
| 194 | 194 |
| 195 bool GrDistanceFieldTextureEffect::onIsEqual(const GrEffect& other) const { | 195 bool GrDistanceFieldTextureEffect::onIsEqual(const GrEffect& other) const { |
| 196 const GrDistanceFieldTextureEffect& cte = CastEffect<GrDistanceFieldTextureE
ffect>(other); | 196 const GrDistanceFieldTextureEffect& cte = |
| 197 GrEffect::CastEffect<GrDistanceFieldTextureEffect>(other); |
| 197 return fTextureAccess == cte.fTextureAccess && | 198 return fTextureAccess == cte.fTextureAccess && |
| 198 #ifdef SK_GAMMA_APPLY_TO_A8 | 199 #ifdef SK_GAMMA_APPLY_TO_A8 |
| 199 fGammaTextureAccess == cte.fGammaTextureAccess && | 200 fGammaTextureAccess == cte.fGammaTextureAccess && |
| 200 fLuminance == cte.fLuminance && | 201 fLuminance == cte.fLuminance && |
| 201 #endif | 202 #endif |
| 202 fFlags == cte.fFlags; | 203 fFlags == cte.fFlags; |
| 203 } | 204 } |
| 204 | 205 |
| 205 void GrDistanceFieldTextureEffect::getConstantColorComponents(GrColor* color, | 206 void GrDistanceFieldTextureEffect::getConstantColorComponents(GrColor* color, |
| 206 uint32_t* validFlag
s) const { | 207 uint32_t* validFlag
s) const { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 #endif | 254 #endif |
| 254 random->nextBool() ? | 255 random->nextBool() ? |
| 255 kSimilarity_DistanceFieldEff
ectFlag : 0); | 256 kSimilarity_DistanceFieldEff
ectFlag : 0); |
| 256 } | 257 } |
| 257 | 258 |
| 258 /////////////////////////////////////////////////////////////////////////////// | 259 /////////////////////////////////////////////////////////////////////////////// |
| 259 | 260 |
| 260 class GrGLDistanceFieldLCDTextureEffect : public GrGLGeometryProcessor { | 261 class GrGLDistanceFieldLCDTextureEffect : public GrGLGeometryProcessor { |
| 261 public: | 262 public: |
| 262 GrGLDistanceFieldLCDTextureEffect(const GrBackendEffectFactory& factory, | 263 GrGLDistanceFieldLCDTextureEffect(const GrBackendEffectFactory& factory, |
| 263 const GrDrawEffect& drawEffect) | 264 const GrEffect& effect) |
| 264 : INHERITED (factory) | 265 : INHERITED (factory) |
| 265 , fTextureSize(SkISize::Make(-1,-1)) {} | 266 , fTextureSize(SkISize::Make(-1,-1)) {} |
| 266 | 267 |
| 267 virtual void emitCode(GrGLFullProgramBuilder* builder, | 268 virtual void emitCode(GrGLFullProgramBuilder* builder, |
| 268 const GrDrawEffect& drawEffect, | 269 const GrEffect& effect, |
| 269 const GrEffectKey& key, | 270 const GrEffectKey& key, |
| 270 const char* outputColor, | 271 const char* outputColor, |
| 271 const char* inputColor, | 272 const char* inputColor, |
| 272 const TransformedCoordsArray&, | 273 const TransformedCoordsArray&, |
| 273 const TextureSamplerArray& samplers) SK_OVERRIDE { | 274 const TextureSamplerArray& samplers) SK_OVERRIDE { |
| 274 const GrDistanceFieldLCDTextureEffect& dfTexEffect = | 275 const GrDistanceFieldLCDTextureEffect& dfTexEffect = |
| 275 drawEffect.castEffect<GrDistanceField
LCDTextureEffect>(); | 276 GrEffect::CastEffect<GrDistanceFieldLCDTextureEffect>(effect); |
| 276 SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); | 277 SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); |
| 277 | 278 |
| 278 SkString fsCoordName; | 279 SkString fsCoordName; |
| 279 const char* vsCoordName; | 280 const char* vsCoordName; |
| 280 const char* fsCoordNamePtr; | 281 const char* fsCoordNamePtr; |
| 281 builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsC
oordNamePtr); | 282 builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsC
oordNamePtr); |
| 282 fsCoordName = fsCoordNamePtr; | 283 fsCoordName = fsCoordNamePtr; |
| 283 | 284 |
| 284 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder(); | 285 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder(); |
| 285 vsBuilder->codeAppendf("\t%s = %s;\n", vsCoordName, dfTexEffect.inTextur
eCoords().c_str()); | 286 vsBuilder->codeAppendf("\t%s = %s;\n", vsCoordName, dfTexEffect.inTextur
eCoords().c_str()); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 fsBuilder->codeAppend("\tgammaColor = "); | 389 fsBuilder->codeAppend("\tgammaColor = "); |
| 389 fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType); | 390 fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType); |
| 390 fsBuilder->codeAppend(";\n"); | 391 fsBuilder->codeAppend(";\n"); |
| 391 fsBuilder->codeAppend("\tval.z = gammaColor.r;\n"); | 392 fsBuilder->codeAppend("\tval.z = gammaColor.r;\n"); |
| 392 | 393 |
| 393 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, | 394 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, |
| 394 (GrGLSLExpr4(inputColor) * GrGLSLExpr4("val")).c_
str()); | 395 (GrGLSLExpr4(inputColor) * GrGLSLExpr4("val")).c_
str()); |
| 395 } | 396 } |
| 396 | 397 |
| 397 virtual void setData(const GrGLProgramDataManager& pdman, | 398 virtual void setData(const GrGLProgramDataManager& pdman, |
| 398 const GrDrawEffect& drawEffect) SK_OVERRIDE { | 399 const GrEffect& effect) SK_OVERRIDE { |
| 399 SkASSERT(fTextureSizeUni.isValid()); | 400 SkASSERT(fTextureSizeUni.isValid()); |
| 400 SkASSERT(fTextColorUni.isValid()); | 401 SkASSERT(fTextColorUni.isValid()); |
| 401 | 402 |
| 402 const GrDistanceFieldLCDTextureEffect& dfTexEffect = | 403 const GrDistanceFieldLCDTextureEffect& dfTexEffect = |
| 403 drawEffect.castEffect<GrDistanceFieldLCDText
ureEffect>(); | 404 GrEffect::CastEffect<GrDistanceFieldLCDTextu
reEffect>(effect); |
| 404 GrTexture* texture = drawEffect.effect()->texture(0); | 405 GrTexture* texture = effect.texture(0); |
| 405 if (texture->width() != fTextureSize.width() || | 406 if (texture->width() != fTextureSize.width() || |
| 406 texture->height() != fTextureSize.height()) { | 407 texture->height() != fTextureSize.height()) { |
| 407 fTextureSize = SkISize::Make(texture->width(), texture->height()); | 408 fTextureSize = SkISize::Make(texture->width(), texture->height()); |
| 408 float delta = 1.0f/(3.0f*texture->width()); | 409 float delta = 1.0f/(3.0f*texture->width()); |
| 409 if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) { | 410 if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) { |
| 410 delta = -delta; | 411 delta = -delta; |
| 411 } | 412 } |
| 412 pdman.set3f(fTextureSizeUni, | 413 pdman.set3f(fTextureSizeUni, |
| 413 SkIntToScalar(fTextureSize.width()), | 414 SkIntToScalar(fTextureSize.width()), |
| 414 SkIntToScalar(fTextureSize.height()), | 415 SkIntToScalar(fTextureSize.height()), |
| 415 delta); | 416 delta); |
| 416 } | 417 } |
| 417 | 418 |
| 418 GrColor textColor = dfTexEffect.getTextColor(); | 419 GrColor textColor = dfTexEffect.getTextColor(); |
| 419 if (textColor != fTextColor) { | 420 if (textColor != fTextColor) { |
| 420 static const float ONE_OVER_255 = 1.f / 255.f; | 421 static const float ONE_OVER_255 = 1.f / 255.f; |
| 421 pdman.set3f(fTextColorUni, | 422 pdman.set3f(fTextColorUni, |
| 422 GrColorUnpackR(textColor) * ONE_OVER_255, | 423 GrColorUnpackR(textColor) * ONE_OVER_255, |
| 423 GrColorUnpackG(textColor) * ONE_OVER_255, | 424 GrColorUnpackG(textColor) * ONE_OVER_255, |
| 424 GrColorUnpackB(textColor) * ONE_OVER_255); | 425 GrColorUnpackB(textColor) * ONE_OVER_255); |
| 425 fTextColor = textColor; | 426 fTextColor = textColor; |
| 426 } | 427 } |
| 427 } | 428 } |
| 428 | 429 |
| 429 static inline void GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, | 430 static inline void GenKey(const GrEffect& effect, const GrGLCaps&, |
| 430 GrEffectKeyBuilder* b) { | 431 GrEffectKeyBuilder* b) { |
| 431 const GrDistanceFieldLCDTextureEffect& dfTexEffect = | 432 const GrDistanceFieldLCDTextureEffect& dfTexEffect = |
| 432 drawEffect.castEffect<GrDistanceField
LCDTextureEffect>(); | 433 GrEffect::CastEffect<GrDistanceFieldLCDTextureEffect>(effect); |
| 433 | 434 |
| 434 b->add32(dfTexEffect.getFlags()); | 435 b->add32(dfTexEffect.getFlags()); |
| 435 } | 436 } |
| 436 | 437 |
| 437 private: | 438 private: |
| 438 GrGLProgramDataManager::UniformHandle fTextureSizeUni; | 439 GrGLProgramDataManager::UniformHandle fTextureSizeUni; |
| 439 SkISize fTextureSize; | 440 SkISize fTextureSize; |
| 440 GrGLProgramDataManager::UniformHandle fTextColorUni; | 441 GrGLProgramDataManager::UniformHandle fTextColorUni; |
| 441 SkColor fTextColor; | 442 SkColor fTextColor; |
| 442 | 443 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 458 kVec2f_GrSLType, | 459 kVec2f_GrSLType, |
| 459 GrShaderVar::kAttribute
_TypeModifier))) { | 460 GrShaderVar::kAttribute
_TypeModifier))) { |
| 460 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan
ceFieldEffectFlag)); | 461 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan
ceFieldEffectFlag)); |
| 461 | 462 |
| 462 this->addTextureAccess(&fTextureAccess); | 463 this->addTextureAccess(&fTextureAccess); |
| 463 this->addTextureAccess(&fGammaTextureAccess); | 464 this->addTextureAccess(&fGammaTextureAccess); |
| 464 } | 465 } |
| 465 | 466 |
| 466 bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrEffect& other) const { | 467 bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrEffect& other) const { |
| 467 const GrDistanceFieldLCDTextureEffect& cte = | 468 const GrDistanceFieldLCDTextureEffect& cte = |
| 468 CastEffect<GrDistanceFieldLCDTexture
Effect>(other); | 469 GrEffect::CastEffect<GrDistanceFieldLCDTextureEffect>(other); |
| 469 return (fTextureAccess == cte.fTextureAccess && | 470 return (fTextureAccess == cte.fTextureAccess && |
| 470 fGammaTextureAccess == cte.fGammaTextureAccess && | 471 fGammaTextureAccess == cte.fGammaTextureAccess && |
| 471 fTextColor == cte.fTextColor && | 472 fTextColor == cte.fTextColor && |
| 472 fFlags == cte.fFlags); | 473 fFlags == cte.fFlags); |
| 473 } | 474 } |
| 474 | 475 |
| 475 void GrDistanceFieldLCDTextureEffect::getConstantColorComponents(GrColor* color, | 476 void GrDistanceFieldLCDTextureEffect::getConstantColorComponents(GrColor* color, |
| 476 uint32_t* valid
Flags) const { | 477 uint32_t* valid
Flags) const { |
| 477 if ((*validFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(*color
) && | 478 if ((*validFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(*color
) && |
| 478 GrPixelConfigIsOpaque(this->texture(0)->config())) { | 479 GrPixelConfigIsOpaque(this->texture(0)->config())) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 516 random->nextULessThan(256), | 517 random->nextULessThan(256), |
| 517 random->nextULessThan(256)); | 518 random->nextULessThan(256)); |
| 518 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; | 519 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; |
| 519 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; | 520 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; |
| 520 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 521 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
| 521 return GrDistanceFieldLCDTextureEffect::Create(textures[texIdx], params, | 522 return GrDistanceFieldLCDTextureEffect::Create(textures[texIdx], params, |
| 522 textures[texIdx2], params2, | 523 textures[texIdx2], params2, |
| 523 textColor, | 524 textColor, |
| 524 flags); | 525 flags); |
| 525 } | 526 } |
| OLD | NEW |