| 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 "SkMorphologyImageFilter.h" | 8 #include "SkMorphologyImageFilter.h" |
| 9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
| 10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 EffectKey key, | 317 EffectKey key, |
| 318 const char* vertexCoords, | 318 const char* vertexCoords, |
| 319 const char* outputColor, | 319 const char* outputColor, |
| 320 const char* inputColor, | 320 const char* inputColor, |
| 321 const TextureSamplerArray& samplers) { | 321 const TextureSamplerArray& samplers) { |
| 322 const char* coords; | 322 const char* coords; |
| 323 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, vertexCoords, &coords); | 323 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, vertexCoords, &coords); |
| 324 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader
Type, | 324 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader
Type, |
| 325 kVec2f_GrSLType, "ImageIncrement"); | 325 kVec2f_GrSLType, "ImageIncrement"); |
| 326 | 326 |
| 327 SkString* code = &builder->fFSCode; | |
| 328 | |
| 329 const char* func; | 327 const char* func; |
| 330 switch (fType) { | 328 switch (fType) { |
| 331 case GrMorphologyEffect::kErode_MorphologyType: | 329 case GrMorphologyEffect::kErode_MorphologyType: |
| 332 code->appendf("\t\t%s = vec4(1, 1, 1, 1);\n", outputColor); | 330 builder->fsCodeAppendf("\t\t%s = vec4(1, 1, 1, 1);\n", outputColor); |
| 333 func = "min"; | 331 func = "min"; |
| 334 break; | 332 break; |
| 335 case GrMorphologyEffect::kDilate_MorphologyType: | 333 case GrMorphologyEffect::kDilate_MorphologyType: |
| 336 code->appendf("\t\t%s = vec4(0, 0, 0, 0);\n", outputColor); | 334 builder->fsCodeAppendf("\t\t%s = vec4(0, 0, 0, 0);\n", outputColor); |
| 337 func = "max"; | 335 func = "max"; |
| 338 break; | 336 break; |
| 339 default: | 337 default: |
| 340 GrCrash("Unexpected type"); | 338 GrCrash("Unexpected type"); |
| 341 func = ""; // suppress warning | 339 func = ""; // suppress warning |
| 342 break; | 340 break; |
| 343 } | 341 } |
| 344 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); | 342 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); |
| 345 | 343 |
| 346 code->appendf("\t\tvec2 coord = %s - %d.0 * %s;\n", coords, fRadius, imgInc)
; | 344 builder->fsCodeAppendf("\t\tvec2 coord = %s - %d.0 * %s;\n", coords, fRadius
, imgInc); |
| 347 code->appendf("\t\tfor (int i = 0; i < %d; i++) {\n", this->width()); | 345 builder->fsCodeAppendf("\t\tfor (int i = 0; i < %d; i++) {\n", this->width()
); |
| 348 code->appendf("\t\t\t%s = %s(%s, ", outputColor, func, outputColor); | 346 builder->fsCodeAppendf("\t\t\t%s = %s(%s, ", outputColor, func, outputColor)
; |
| 349 builder->appendTextureLookup(&builder->fFSCode, samplers[0], "coord"); | 347 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, sample
rs[0], "coord"); |
| 350 code->appendf(");\n"); | 348 builder->fsCodeAppend(");\n"); |
| 351 code->appendf("\t\t\tcoord += %s;\n", imgInc); | 349 builder->fsCodeAppendf("\t\t\tcoord += %s;\n", imgInc); |
| 352 code->appendf("\t\t}\n"); | 350 builder->fsCodeAppend("\t\t}\n"); |
| 353 GrGLSLMulVarBy4f(code, 2, outputColor, inputColor); | 351 SkString modulate; |
| 352 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); |
| 353 builder->fsCodeAppend(modulate.c_str()); |
| 354 } | 354 } |
| 355 | 355 |
| 356 GrGLEffect::EffectKey GrGLMorphologyEffect::GenKey(const GrEffectStage& s, const
GrGLCaps&) { | 356 GrGLEffect::EffectKey GrGLMorphologyEffect::GenKey(const GrEffectStage& s, const
GrGLCaps&) { |
| 357 const GrMorphologyEffect& m = GetEffectFromStage<GrMorphologyEffect>(s); | 357 const GrMorphologyEffect& m = GetEffectFromStage<GrMorphologyEffect>(s); |
| 358 EffectKey key = static_cast<EffectKey>(m.radius()); | 358 EffectKey key = static_cast<EffectKey>(m.radius()); |
| 359 key |= (m.type() << 8); | 359 key |= (m.type() << 8); |
| 360 key <<= GrGLEffectMatrix::kKeyBits; | 360 key <<= GrGLEffectMatrix::kKeyBits; |
| 361 EffectKey matrixKey = GrGLEffectMatrix::GenKey(m.getMatrix(), | 361 EffectKey matrixKey = GrGLEffectMatrix::GenKey(m.getMatrix(), |
| 362 s.getCoordChangeMatrix(), | 362 s.getCoordChangeMatrix(), |
| 363 m.texture(0)); | 363 m.texture(0)); |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 512 } | 512 } |
| 513 GrTexture* input = (GrTexture*) inputBM.getTexture(); | 513 GrTexture* input = (GrTexture*) inputBM.getTexture(); |
| 514 SkIRect bounds; | 514 SkIRect bounds; |
| 515 src.getBounds(&bounds); | 515 src.getBounds(&bounds); |
| 516 SkAutoTUnref<GrTexture> resultTex(apply_morphology(input, bounds, | 516 SkAutoTUnref<GrTexture> resultTex(apply_morphology(input, bounds, |
| 517 GrMorphologyEffect::kErode_MorphologyType, radius())); | 517 GrMorphologyEffect::kErode_MorphologyType, radius())); |
| 518 return SkImageFilterUtils::WrapTexture(resultTex, src.width(), src.height(),
result); | 518 return SkImageFilterUtils::WrapTexture(resultTex, src.width(), src.height(),
result); |
| 519 } | 519 } |
| 520 | 520 |
| 521 #endif | 521 #endif |
| OLD | NEW |