| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 The Android Open Source Project | 2 * Copyright 2012 The Android Open Source Project |
| 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 "SkBlendImageFilter.h" | 8 #include "SkBlendImageFilter.h" |
| 9 #include "SkCanvas.h" | 9 #include "SkCanvas.h" |
| 10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 const char* outputColor, | 239 const char* outputColor, |
| 240 const char* inputColor, | 240 const char* inputColor, |
| 241 const TextureSamplerArray& samplers) { | 241 const TextureSamplerArray& samplers) { |
| 242 const char* fgCoords; | 242 const char* fgCoords; |
| 243 const char* bgCoords; | 243 const char* bgCoords; |
| 244 GrSLType fgCoordsType = fForegroundEffectMatrix.emitCode( | 244 GrSLType fgCoordsType = fForegroundEffectMatrix.emitCode( |
| 245 builder, key, vertexCoords, &fgCoords, NULL, "FG"); | 245 builder, key, vertexCoords, &fgCoords, NULL, "FG"); |
| 246 GrSLType bgCoordsType = fBackgroundEffectMatrix.emitCode( | 246 GrSLType bgCoordsType = fBackgroundEffectMatrix.emitCode( |
| 247 builder, key, vertexCoords, &bgCoords, NULL, "BG"); | 247 builder, key, vertexCoords, &bgCoords, NULL, "BG"); |
| 248 | 248 |
| 249 SkString* code = &builder->fFSCode; | |
| 250 const char* bgColor = "bgColor"; | 249 const char* bgColor = "bgColor"; |
| 251 const char* fgColor = "fgColor"; | 250 const char* fgColor = "fgColor"; |
| 252 | 251 |
| 253 code->appendf("\t\tvec4 %s = ", fgColor); | 252 builder->fsCodeAppendf("\t\tvec4 %s = ", fgColor); |
| 254 builder->appendTextureLookup(code, samplers[0], fgCoords, fgCoordsType); | 253 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, |
| 255 code->append(";\n"); | 254 samplers[0], |
| 255 fgCoords, |
| 256 fgCoordsType); |
| 257 builder->fsCodeAppend(";\n"); |
| 256 | 258 |
| 257 code->appendf("\t\tvec4 %s = ", bgColor); | 259 builder->fsCodeAppendf("\t\tvec4 %s = ", bgColor); |
| 258 builder->appendTextureLookup(code, samplers[1], bgCoords, bgCoordsType); | 260 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, |
| 259 code->append(";\n"); | 261 samplers[1], |
| 262 bgCoords, |
| 263 bgCoordsType); |
| 264 builder->fsCodeAppendf(";\n"); |
| 260 | 265 |
| 261 code->appendf("\t\t%s.a = 1.0 - (1.0 - %s.a) * (1.0 - %s.b);\n", outputColor
, bgColor, fgColor); | 266 builder->fsCodeAppendf("\t\t%s.a = 1.0 - (1.0 - %s.a) * (1.0 - %s.b);\n", ou
tputColor, bgColor, fgColor); |
| 262 switch (fMode) { | 267 switch (fMode) { |
| 263 case SkBlendImageFilter::kNormal_Mode: | 268 case SkBlendImageFilter::kNormal_Mode: |
| 264 code->appendf("\t\t%s.rgb = (1.0 - %s.a) * %s.rgb + %s.rgb;\n", outputCo
lor, fgColor, bgColor, fgColor); | 269 builder->fsCodeAppendf("\t\t%s.rgb = (1.0 - %s.a) * %s.rgb + %s.rgb;\n",
outputColor, fgColor, bgColor, fgColor); |
| 265 break; | 270 break; |
| 266 case SkBlendImageFilter::kMultiply_Mode: | 271 case SkBlendImageFilter::kMultiply_Mode: |
| 267 code->appendf("\t\t%s.rgb = (1.0 - %s.a) * %s.rgb + (1.0 - %s.a) * %s.rg
b + %s.rgb * %s.rgb;\n", outputColor, fgColor, bgColor, bgColor, fgColor, fgColo
r, bgColor); | 272 builder->fsCodeAppendf("\t\t%s.rgb = (1.0 - %s.a) * %s.rgb + (1.0 - %s.a
) * %s.rgb + %s.rgb * %s.rgb;\n", outputColor, fgColor, bgColor, bgColor, fgColo
r, fgColor, bgColor); |
| 268 break; | 273 break; |
| 269 case SkBlendImageFilter::kScreen_Mode: | 274 case SkBlendImageFilter::kScreen_Mode: |
| 270 code->appendf("\t\t%s.rgb = %s.rgb + %s.rgb - %s.rgb * %s.rgb;\n", outpu
tColor, bgColor, fgColor, fgColor, bgColor); | 275 builder->fsCodeAppendf("\t\t%s.rgb = %s.rgb + %s.rgb - %s.rgb * %s.rgb;\
n", outputColor, bgColor, fgColor, fgColor, bgColor); |
| 271 break; | 276 break; |
| 272 case SkBlendImageFilter::kDarken_Mode: | 277 case SkBlendImageFilter::kDarken_Mode: |
| 273 code->appendf("\t\t%s.rgb = min((1.0 - %s.a) * %s.rgb + %s.rgb, (1.0 - %
s.a) * %s.rgb + %s.rgb);\n", outputColor, fgColor, bgColor, fgColor, bgColor, fg
Color, bgColor); | 278 builder->fsCodeAppendf("\t\t%s.rgb = min((1.0 - %s.a) * %s.rgb + %s.rgb,
(1.0 - %s.a) * %s.rgb + %s.rgb);\n", outputColor, fgColor, bgColor, fgColor, bg
Color, fgColor, bgColor); |
| 274 break; | 279 break; |
| 275 case SkBlendImageFilter::kLighten_Mode: | 280 case SkBlendImageFilter::kLighten_Mode: |
| 276 code->appendf("\t\t%s.rgb = max((1.0 - %s.a) * %s.rgb + %s.rgb, (1.0 - %
s.a) * %s.rgb + %s.rgb);\n", outputColor, fgColor, bgColor, fgColor, bgColor, fg
Color, bgColor); | 281 builder->fsCodeAppendf("\t\t%s.rgb = max((1.0 - %s.a) * %s.rgb + %s.rgb,
(1.0 - %s.a) * %s.rgb + %s.rgb);\n", outputColor, fgColor, bgColor, fgColor, bg
Color, fgColor, bgColor); |
| 277 break; | 282 break; |
| 278 } | 283 } |
| 279 } | 284 } |
| 280 | 285 |
| 281 void GrGLBlendEffect::setData(const GrGLUniformManager& uman, const GrEffectStag
e& stage) { | 286 void GrGLBlendEffect::setData(const GrGLUniformManager& uman, const GrEffectStag
e& stage) { |
| 282 const GrBlendEffect& blend = GetEffectFromStage<GrBlendEffect>(stage); | 287 const GrBlendEffect& blend = GetEffectFromStage<GrBlendEffect>(stage); |
| 283 GrTexture* fgTex = blend.texture(0); | 288 GrTexture* fgTex = blend.texture(0); |
| 284 GrTexture* bgTex = blend.texture(1); | 289 GrTexture* bgTex = blend.texture(1); |
| 285 fForegroundEffectMatrix.setData(uman, | 290 fForegroundEffectMatrix.setData(uman, |
| 286 GrEffect::MakeDivByTextureWHMatrix(fgTex), | 291 GrEffect::MakeDivByTextureWHMatrix(fgTex), |
| (...skipping 18 matching lines...) Expand all Loading... |
| 305 | 310 |
| 306 EffectKey bgKey = GrGLEffectMatrix::GenKey(GrEffect::MakeDivByTextureWHMatri
x(bgTex), | 311 EffectKey bgKey = GrGLEffectMatrix::GenKey(GrEffect::MakeDivByTextureWHMatri
x(bgTex), |
| 307 stage.getCoordChangeMatrix(), | 312 stage.getCoordChangeMatrix(), |
| 308 bgTex); | 313 bgTex); |
| 309 bgKey <<= GrGLEffectMatrix::kKeyBits; | 314 bgKey <<= GrGLEffectMatrix::kKeyBits; |
| 310 EffectKey modeKey = blend.mode() << (2 * GrGLEffectMatrix::kKeyBits); | 315 EffectKey modeKey = blend.mode() << (2 * GrGLEffectMatrix::kKeyBits); |
| 311 | 316 |
| 312 return modeKey | bgKey | fgKey; | 317 return modeKey | bgKey | fgKey; |
| 313 } | 318 } |
| 314 #endif | 319 #endif |
| OLD | NEW |