| 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 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 | 271 |
| 272 GR_DECLARE_EFFECT_TEST; | 272 GR_DECLARE_EFFECT_TEST; |
| 273 | 273 |
| 274 typedef Gr1DKernelEffect INHERITED; | 274 typedef Gr1DKernelEffect INHERITED; |
| 275 }; | 275 }; |
| 276 | 276 |
| 277 /////////////////////////////////////////////////////////////////////////////// | 277 /////////////////////////////////////////////////////////////////////////////// |
| 278 | 278 |
| 279 class GrGLMorphologyEffect : public GrGLEffect { | 279 class GrGLMorphologyEffect : public GrGLEffect { |
| 280 public: | 280 public: |
| 281 GrGLMorphologyEffect (const GrBackendEffectFactory&, const GrEffectRef&); | 281 GrGLMorphologyEffect (const GrBackendEffectFactory&, const GrDrawEffect&); |
| 282 | 282 |
| 283 virtual void emitCode(GrGLShaderBuilder*, | 283 virtual void emitCode(GrGLShaderBuilder*, |
| 284 const GrEffectStage&, | 284 const GrDrawEffect&, |
| 285 EffectKey, | 285 EffectKey, |
| 286 const char* vertexCoords, | |
| 287 const char* outputColor, | 286 const char* outputColor, |
| 288 const char* inputColor, | 287 const char* inputColor, |
| 289 const TextureSamplerArray&) SK_OVERRIDE; | 288 const TextureSamplerArray&) SK_OVERRIDE; |
| 290 | 289 |
| 291 static inline EffectKey GenKey(const GrEffectStage&, const GrGLCaps&); | 290 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); |
| 292 | 291 |
| 293 virtual void setData(const GrGLUniformManager&, const GrEffectStage&) SK_OVE
RRIDE; | 292 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER
RIDE; |
| 294 | 293 |
| 295 private: | 294 private: |
| 296 int width() const { return GrMorphologyEffect::WidthFromRadius(fRadius); } | 295 int width() const { return GrMorphologyEffect::WidthFromRadius(fRadius); } |
| 297 | 296 |
| 298 int fRadius; | 297 int fRadius; |
| 299 GrMorphologyEffect::MorphologyType fType; | 298 GrMorphologyEffect::MorphologyType fType; |
| 300 GrGLUniformManager::UniformHandle fImageIncrementUni; | 299 GrGLUniformManager::UniformHandle fImageIncrementUni; |
| 301 GrGLEffectMatrix fEffectMatrix; | 300 GrGLEffectMatrix fEffectMatrix; |
| 302 | 301 |
| 303 typedef GrGLEffect INHERITED; | 302 typedef GrGLEffect INHERITED; |
| 304 }; | 303 }; |
| 305 | 304 |
| 306 GrGLMorphologyEffect::GrGLMorphologyEffect(const GrBackendEffectFactory& factory
, | 305 GrGLMorphologyEffect::GrGLMorphologyEffect(const GrBackendEffectFactory& factory
, |
| 307 const GrEffectRef& effect) | 306 const GrDrawEffect& drawEffect) |
| 308 : INHERITED(factory) | 307 : INHERITED(factory) |
| 309 , fImageIncrementUni(GrGLUniformManager::kInvalidUniformHandle) { | 308 , fImageIncrementUni(GrGLUniformManager::kInvalidUniformHandle) |
| 310 const GrMorphologyEffect& m = CastEffect<GrMorphologyEffect>(effect); | 309 , fEffectMatrix(drawEffect.castEffect<GrMorphologyEffect>().coordsType()) { |
| 310 const GrMorphologyEffect& m = drawEffect.castEffect<GrMorphologyEffect>(); |
| 311 fRadius = m.radius(); | 311 fRadius = m.radius(); |
| 312 fType = m.type(); | 312 fType = m.type(); |
| 313 } | 313 } |
| 314 | 314 |
| 315 void GrGLMorphologyEffect::emitCode(GrGLShaderBuilder* builder, | 315 void GrGLMorphologyEffect::emitCode(GrGLShaderBuilder* builder, |
| 316 const GrEffectStage&, | 316 const GrDrawEffect&, |
| 317 EffectKey key, | 317 EffectKey key, |
| 318 const char* vertexCoords, | |
| 319 const char* outputColor, | 318 const char* outputColor, |
| 320 const char* inputColor, | 319 const char* inputColor, |
| 321 const TextureSamplerArray& samplers) { | 320 const TextureSamplerArray& samplers) { |
| 322 const char* coords; | 321 const char* coords; |
| 323 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, vertexCoords, &coords); | 322 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords); |
| 324 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader
Type, | 323 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader
Type, |
| 325 kVec2f_GrSLType, "ImageIncrement"); | 324 kVec2f_GrSLType, "ImageIncrement"); |
| 326 | 325 |
| 327 const char* func; | 326 const char* func; |
| 328 switch (fType) { | 327 switch (fType) { |
| 329 case GrMorphologyEffect::kErode_MorphologyType: | 328 case GrMorphologyEffect::kErode_MorphologyType: |
| 330 builder->fsCodeAppendf("\t\t%s = vec4(1, 1, 1, 1);\n", outputColor); | 329 builder->fsCodeAppendf("\t\t%s = vec4(1, 1, 1, 1);\n", outputColor); |
| 331 func = "min"; | 330 func = "min"; |
| 332 break; | 331 break; |
| 333 case GrMorphologyEffect::kDilate_MorphologyType: | 332 case GrMorphologyEffect::kDilate_MorphologyType: |
| (...skipping 12 matching lines...) Expand all Loading... |
| 346 builder->fsCodeAppendf("\t\t\t%s = %s(%s, ", outputColor, func, outputColor)
; | 345 builder->fsCodeAppendf("\t\t\t%s = %s(%s, ", outputColor, func, outputColor)
; |
| 347 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, sample
rs[0], "coord"); | 346 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, sample
rs[0], "coord"); |
| 348 builder->fsCodeAppend(");\n"); | 347 builder->fsCodeAppend(");\n"); |
| 349 builder->fsCodeAppendf("\t\t\tcoord += %s;\n", imgInc); | 348 builder->fsCodeAppendf("\t\t\tcoord += %s;\n", imgInc); |
| 350 builder->fsCodeAppend("\t\t}\n"); | 349 builder->fsCodeAppend("\t\t}\n"); |
| 351 SkString modulate; | 350 SkString modulate; |
| 352 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); | 351 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); |
| 353 builder->fsCodeAppend(modulate.c_str()); | 352 builder->fsCodeAppend(modulate.c_str()); |
| 354 } | 353 } |
| 355 | 354 |
| 356 GrGLEffect::EffectKey GrGLMorphologyEffect::GenKey(const GrEffectStage& s, const
GrGLCaps&) { | 355 GrGLEffect::EffectKey GrGLMorphologyEffect::GenKey(const GrDrawEffect& drawEffec
t, |
| 357 const GrMorphologyEffect& m = GetEffectFromStage<GrMorphologyEffect>(s); | 356 const GrGLCaps&) { |
| 357 const GrMorphologyEffect& m = drawEffect.castEffect<GrMorphologyEffect>(); |
| 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 drawEffect, |
| 363 m.coordsType(), |
| 363 m.texture(0)); | 364 m.texture(0)); |
| 364 return key | matrixKey; | 365 return key | matrixKey; |
| 365 } | 366 } |
| 366 | 367 |
| 367 void GrGLMorphologyEffect::setData(const GrGLUniformManager& uman, const GrEffec
tStage& stage) { | 368 void GrGLMorphologyEffect::setData(const GrGLUniformManager& uman, |
| 368 const Gr1DKernelEffect& kern = GetEffectFromStage<Gr1DKernelEffect>(stage); | 369 const GrDrawEffect& drawEffect) { |
| 370 const Gr1DKernelEffect& kern = drawEffect.castEffect<Gr1DKernelEffect>(); |
| 369 GrTexture& texture = *kern.texture(0); | 371 GrTexture& texture = *kern.texture(0); |
| 370 // the code we generated was for a specific kernel radius | 372 // the code we generated was for a specific kernel radius |
| 371 GrAssert(kern.radius() == fRadius); | 373 GrAssert(kern.radius() == fRadius); |
| 372 float imageIncrement[2] = { 0 }; | 374 float imageIncrement[2] = { 0 }; |
| 373 switch (kern.direction()) { | 375 switch (kern.direction()) { |
| 374 case Gr1DKernelEffect::kX_Direction: | 376 case Gr1DKernelEffect::kX_Direction: |
| 375 imageIncrement[0] = 1.0f / texture.width(); | 377 imageIncrement[0] = 1.0f / texture.width(); |
| 376 break; | 378 break; |
| 377 case Gr1DKernelEffect::kY_Direction: | 379 case Gr1DKernelEffect::kY_Direction: |
| 378 imageIncrement[1] = 1.0f / texture.height(); | 380 imageIncrement[1] = 1.0f / texture.height(); |
| 379 break; | 381 break; |
| 380 default: | 382 default: |
| 381 GrCrash("Unknown filter direction."); | 383 GrCrash("Unknown filter direction."); |
| 382 } | 384 } |
| 383 uman.set2fv(fImageIncrementUni, 0, 1, imageIncrement); | 385 uman.set2fv(fImageIncrementUni, 0, 1, imageIncrement); |
| 384 fEffectMatrix.setData(uman, kern.getMatrix(), stage.getCoordChangeMatrix(),
kern.texture(0)); | 386 fEffectMatrix.setData(uman, kern.getMatrix(), drawEffect, kern.texture(0)); |
| 385 } | 387 } |
| 386 | 388 |
| 387 /////////////////////////////////////////////////////////////////////////////// | 389 /////////////////////////////////////////////////////////////////////////////// |
| 388 | 390 |
| 389 GrMorphologyEffect::GrMorphologyEffect(GrTexture* texture, | 391 GrMorphologyEffect::GrMorphologyEffect(GrTexture* texture, |
| 390 Direction direction, | 392 Direction direction, |
| 391 int radius, | 393 int radius, |
| 392 MorphologyType type) | 394 MorphologyType type) |
| 393 : Gr1DKernelEffect(texture, direction, radius) | 395 : Gr1DKernelEffect(texture, direction, radius) |
| 394 , fType(type) { | 396 , fType(type) { |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 512 } | 514 } |
| 513 GrTexture* input = (GrTexture*) inputBM.getTexture(); | 515 GrTexture* input = (GrTexture*) inputBM.getTexture(); |
| 514 SkIRect bounds; | 516 SkIRect bounds; |
| 515 src.getBounds(&bounds); | 517 src.getBounds(&bounds); |
| 516 SkAutoTUnref<GrTexture> resultTex(apply_morphology(input, bounds, | 518 SkAutoTUnref<GrTexture> resultTex(apply_morphology(input, bounds, |
| 517 GrMorphologyEffect::kErode_MorphologyType, radius())); | 519 GrMorphologyEffect::kErode_MorphologyType, radius())); |
| 518 return SkImageFilterUtils::WrapTexture(resultTex, src.width(), src.height(),
result); | 520 return SkImageFilterUtils::WrapTexture(resultTex, src.width(), src.height(),
result); |
| 519 } | 521 } |
| 520 | 522 |
| 521 #endif | 523 #endif |
| OLD | NEW |