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 fRadius = m.radius(); | 317 fRadius = m.radius(); |
318 fType = m.type(); | 318 fType = m.type(); |
319 } | 319 } |
320 | 320 |
321 void GrGLMorphologyEffect::emitCode(GrGLShaderBuilder* builder, | 321 void GrGLMorphologyEffect::emitCode(GrGLShaderBuilder* builder, |
322 const GrDrawEffect&, | 322 const GrDrawEffect&, |
323 EffectKey key, | 323 EffectKey key, |
324 const char* outputColor, | 324 const char* outputColor, |
325 const char* inputColor, | 325 const char* inputColor, |
326 const TextureSamplerArray& samplers) { | 326 const TextureSamplerArray& samplers) { |
327 const char* coords; | 327 SkString coords; |
328 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords); | 328 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords); |
329 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader
Type, | 329 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader
Type, |
330 kVec2f_GrSLType, "ImageIncrement"); | 330 kVec2f_GrSLType, "ImageIncrement"); |
331 | 331 |
332 const char* func; | 332 const char* func; |
333 switch (fType) { | 333 switch (fType) { |
334 case GrMorphologyEffect::kErode_MorphologyType: | 334 case GrMorphologyEffect::kErode_MorphologyType: |
335 builder->fsCodeAppendf("\t\t%s = vec4(1, 1, 1, 1);\n", outputColor); | 335 builder->fsCodeAppendf("\t\t%s = vec4(1, 1, 1, 1);\n", outputColor); |
336 func = "min"; | 336 func = "min"; |
337 break; | 337 break; |
338 case GrMorphologyEffect::kDilate_MorphologyType: | 338 case GrMorphologyEffect::kDilate_MorphologyType: |
339 builder->fsCodeAppendf("\t\t%s = vec4(0, 0, 0, 0);\n", outputColor); | 339 builder->fsCodeAppendf("\t\t%s = vec4(0, 0, 0, 0);\n", outputColor); |
340 func = "max"; | 340 func = "max"; |
341 break; | 341 break; |
342 default: | 342 default: |
343 GrCrash("Unexpected type"); | 343 GrCrash("Unexpected type"); |
344 func = ""; // suppress warning | 344 func = ""; // suppress warning |
345 break; | 345 break; |
346 } | 346 } |
347 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); | 347 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); |
348 | 348 |
349 builder->fsCodeAppendf("\t\tvec2 coord = %s - %d.0 * %s;\n", coords, fRadius
, imgInc); | 349 builder->fsCodeAppendf("\t\tvec2 coord = %s - %d.0 * %s;\n", coords.c_str(),
fRadius, imgInc); |
350 builder->fsCodeAppendf("\t\tfor (int i = 0; i < %d; i++) {\n", this->width()
); | 350 builder->fsCodeAppendf("\t\tfor (int i = 0; i < %d; i++) {\n", this->width()
); |
351 builder->fsCodeAppendf("\t\t\t%s = %s(%s, ", outputColor, func, outputColor)
; | 351 builder->fsCodeAppendf("\t\t\t%s = %s(%s, ", outputColor, func, outputColor)
; |
352 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, sample
rs[0], "coord"); | 352 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, sample
rs[0], "coord"); |
353 builder->fsCodeAppend(");\n"); | 353 builder->fsCodeAppend(");\n"); |
354 builder->fsCodeAppendf("\t\t\tcoord += %s;\n", imgInc); | 354 builder->fsCodeAppendf("\t\t\tcoord += %s;\n", imgInc); |
355 builder->fsCodeAppend("\t\t}\n"); | 355 builder->fsCodeAppend("\t\t}\n"); |
356 SkString modulate; | 356 SkString modulate; |
357 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); | 357 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); |
358 builder->fsCodeAppend(modulate.c_str()); | 358 builder->fsCodeAppend(modulate.c_str()); |
359 } | 359 } |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
523 } | 523 } |
524 GrTexture* input = inputBM.getTexture(); | 524 GrTexture* input = inputBM.getTexture(); |
525 SkIRect bounds; | 525 SkIRect bounds; |
526 src.getBounds(&bounds); | 526 src.getBounds(&bounds); |
527 SkAutoTUnref<GrTexture> resultTex(apply_morphology(input, bounds, | 527 SkAutoTUnref<GrTexture> resultTex(apply_morphology(input, bounds, |
528 GrMorphologyEffect::kErode_MorphologyType, radius())); | 528 GrMorphologyEffect::kErode_MorphologyType, radius())); |
529 return SkImageFilterUtils::WrapTexture(resultTex, src.width(), src.height(),
result); | 529 return SkImageFilterUtils::WrapTexture(resultTex, src.width(), src.height(),
result); |
530 } | 530 } |
531 | 531 |
532 #endif | 532 #endif |
OLD | NEW |