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 "SkMatrixConvolutionImageFilter.h" | 8 #include "SkMatrixConvolutionImageFilter.h" |
9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
11 #include "SkFlattenableBuffers.h" | 11 #include "SkFlattenableBuffers.h" |
12 #include "SkRect.h" | 12 #include "SkRect.h" |
13 #include "SkUnPreMultiply.h" | 13 #include "SkUnPreMultiply.h" |
14 | 14 |
15 #if SK_SUPPORT_GPU | 15 #if SK_SUPPORT_GPU |
16 #include "gl/GrGLEffect.h" | 16 #include "gl/GrGLEffect.h" |
17 #include "gl/GrGLEffectMatrix.h" | 17 #include "gl/GrGLEffectMatrix.h" |
18 #include "effects/GrSingleTextureEffect.h" | 18 #include "effects/GrSingleTextureEffect.h" |
19 #include "GrTBackendEffectFactory.h" | 19 #include "GrTBackendEffectFactory.h" |
20 #include "GrTexture.h" | 20 #include "GrTexture.h" |
21 #include "SkMatrix.h" | 21 #include "SkMatrix.h" |
22 | 22 #include "gl/GrGLShaderBuilder.h" |
23 #endif | 23 #endif |
24 | 24 |
25 SkMatrixConvolutionImageFilter::SkMatrixConvolutionImageFilter(const SkISize& ke
rnelSize, const SkScalar* kernel, SkScalar gain, SkScalar bias, const SkIPoint&
target, TileMode tileMode, bool convolveAlpha, SkImageFilter* input) | 25 SkMatrixConvolutionImageFilter::SkMatrixConvolutionImageFilter(const SkISize& ke
rnelSize, const SkScalar* kernel, SkScalar gain, SkScalar bias, const SkIPoint&
target, TileMode tileMode, bool convolveAlpha, SkImageFilter* input) |
26 : INHERITED(input), | 26 : INHERITED(input), |
27 fKernelSize(kernelSize), | 27 fKernelSize(kernelSize), |
28 fGain(gain), | 28 fGain(gain), |
29 fBias(bias), | 29 fBias(bias), |
30 fTarget(target), | 30 fTarget(target), |
31 fTileMode(tileMode), | 31 fTileMode(tileMode), |
32 fConvolveAlpha(convolveAlpha) { | 32 fConvolveAlpha(convolveAlpha) { |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 const GrDrawEffect& effect); | 321 const GrDrawEffect& effect); |
322 virtual void emitCode(GrGLShaderBuilder*, | 322 virtual void emitCode(GrGLShaderBuilder*, |
323 const GrDrawEffect&, | 323 const GrDrawEffect&, |
324 EffectKey, | 324 EffectKey, |
325 const char* outputColor, | 325 const char* outputColor, |
326 const char* inputColor, | 326 const char* inputColor, |
327 const TextureSamplerArray&) SK_OVERRIDE; | 327 const TextureSamplerArray&) SK_OVERRIDE; |
328 | 328 |
329 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); | 329 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); |
330 | 330 |
331 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER
RIDE; | 331 virtual void setData(const GrGLContext&, const GrDrawEffect&) SK_OVERRIDE; |
332 | 332 |
333 private: | 333 private: |
334 typedef GrGLUniformManager::UniformHandle UniformHandle; | |
335 typedef SkMatrixConvolutionImageFilter::TileMode TileMode; | 334 typedef SkMatrixConvolutionImageFilter::TileMode TileMode; |
336 SkISize fKernelSize; | 335 SkISize fKernelSize; |
337 TileMode fTileMode; | 336 TileMode fTileMode; |
338 bool fConvolveAlpha; | 337 bool fConvolveAlpha; |
339 | 338 |
340 UniformHandle fKernelUni; | 339 GrGLUniform* fKernelUni; |
341 UniformHandle fImageIncrementUni; | 340 GrGLUniform* fImageIncrementUni; |
342 UniformHandle fTargetUni; | 341 GrGLUniform* fTargetUni; |
343 UniformHandle fGainUni; | 342 GrGLUniform* fGainUni; |
344 UniformHandle fBiasUni; | 343 GrGLUniform* fBiasUni; |
345 | 344 |
346 GrGLEffectMatrix fEffectMatrix; | 345 GrGLEffectMatrix fEffectMatrix; |
347 | 346 |
348 typedef GrGLEffect INHERITED; | 347 typedef GrGLEffect INHERITED; |
349 }; | 348 }; |
350 | 349 |
351 GrGLMatrixConvolutionEffect::GrGLMatrixConvolutionEffect(const GrBackendEffectFa
ctory& factory, | 350 GrGLMatrixConvolutionEffect::GrGLMatrixConvolutionEffect(const GrBackendEffectFa
ctory& factory, |
352 const GrDrawEffect& dra
wEffect) | 351 const GrDrawEffect& dra
wEffect) |
353 : INHERITED(factory) | 352 : INHERITED(factory) |
354 , fKernelUni(GrGLUniformManager::kInvalidUniformHandle) | 353 , fKernelUni(NULL) |
355 , fImageIncrementUni(GrGLUniformManager::kInvalidUniformHandle) | 354 , fImageIncrementUni(NULL) |
356 , fTargetUni(GrGLUniformManager::kInvalidUniformHandle) | 355 , fTargetUni(NULL) |
357 , fGainUni(GrGLUniformManager::kInvalidUniformHandle) | 356 , fGainUni(NULL) |
358 , fBiasUni(GrGLUniformManager::kInvalidUniformHandle) | 357 , fBiasUni(NULL) |
359 , fEffectMatrix(drawEffect.castEffect<GrMatrixConvolutionEffect>().coordsTyp
e()) { | 358 , fEffectMatrix(drawEffect.castEffect<GrMatrixConvolutionEffect>().coordsTyp
e()) { |
360 const GrMatrixConvolutionEffect& m = drawEffect.castEffect<GrMatrixConvoluti
onEffect>(); | 359 const GrMatrixConvolutionEffect& m = drawEffect.castEffect<GrMatrixConvoluti
onEffect>(); |
361 fKernelSize = m.kernelSize(); | 360 fKernelSize = m.kernelSize(); |
362 fTileMode = m.tileMode(); | 361 fTileMode = m.tileMode(); |
363 fConvolveAlpha = m.convolveAlpha(); | 362 fConvolveAlpha = m.convolveAlpha(); |
364 } | 363 } |
365 | 364 |
366 static void appendTextureLookup(GrGLShaderBuilder* builder, | 365 static void appendTextureLookup(GrGLShaderBuilder* builder, |
367 const GrGLShaderBuilder::TextureSampler& sampler
, | 366 const GrGLShaderBuilder::TextureSampler& sampler
, |
368 const char* coord, | 367 const char* coord, |
(...skipping 16 matching lines...) Expand all Loading... |
385 } | 384 } |
386 | 385 |
387 void GrGLMatrixConvolutionEffect::emitCode(GrGLShaderBuilder* builder, | 386 void GrGLMatrixConvolutionEffect::emitCode(GrGLShaderBuilder* builder, |
388 const GrDrawEffect&, | 387 const GrDrawEffect&, |
389 EffectKey key, | 388 EffectKey key, |
390 const char* outputColor, | 389 const char* outputColor, |
391 const char* inputColor, | 390 const char* inputColor, |
392 const TextureSamplerArray& samplers)
{ | 391 const TextureSamplerArray& samplers)
{ |
393 const char* coords; | 392 const char* coords; |
394 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords); | 393 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords); |
395 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader
Type, | |
396 kVec2f_GrSLType, "ImageIncrement"); | |
397 fKernelUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_ShaderTyp
e, | |
398 kFloat_GrSLType, "Kernel", fKernelS
ize.width() * fKernelSize.height()); | |
399 fTargetUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | |
400 kVec2f_GrSLType, "Target"); | |
401 fGainUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | |
402 kFloat_GrSLType, "Gain"); | |
403 fBiasUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | |
404 kFloat_GrSLType, "Bias"); | |
405 | 394 |
406 const char* target = builder->getUniformCStr(fTargetUni); | 395 GrGLShaderBuilder::Uniform* imageIncrementUni = |
407 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); | 396 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec2f_GrSL
Type, "ImageIncrement"); |
408 const char* kernel = builder->getUniformCStr(fKernelUni); | 397 fImageIncrementUni = imageIncrementUni->glUniform(); |
409 const char* gain = builder->getUniformCStr(fGainUni); | 398 |
410 const char* bias = builder->getUniformCStr(fBiasUni); | 399 GrGLShaderBuilder::Uniform* kernelUni = |
| 400 builder->addUniformArray(GrGLShaderBuilder::kFragment_ShaderType, |
| 401 kFloat_GrSLType, "Kernel", fKernelSize.width()
* fKernelSize.height()); |
| 402 fKernelUni = kernelUni->glUniform(); |
| 403 |
| 404 GrGLShaderBuilder::Uniform* targetUni = |
| 405 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec2f_GrSL
Type, "Target"); |
| 406 fTargetUni = targetUni->glUniform(); |
| 407 |
| 408 GrGLShaderBuilder::Uniform* gainUni = |
| 409 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kFloat_GrSL
Type, "Gain"); |
| 410 fGainUni = gainUni->glUniform(); |
| 411 |
| 412 GrGLShaderBuilder::Uniform* biasUni = |
| 413 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kFloat_GrSL
Type, "Bias"); |
| 414 fBiasUni = biasUni->glUniform(); |
| 415 |
| 416 const char* target = targetUni->c_str(); |
| 417 const char* imgInc = imageIncrementUni->c_str(); |
| 418 const char* kernel = kernelUni->c_str(); |
| 419 const char* gain = gainUni->c_str(); |
| 420 const char* bias = biasUni->c_str(); |
411 int kWidth = fKernelSize.width(); | 421 int kWidth = fKernelSize.width(); |
412 int kHeight = fKernelSize.height(); | 422 int kHeight = fKernelSize.height(); |
413 | 423 |
414 builder->fsCodeAppend("\t\tvec4 sum = vec4(0, 0, 0, 0);\n"); | 424 builder->fsCodeAppend("\t\tvec4 sum = vec4(0, 0, 0, 0);\n"); |
415 builder->fsCodeAppendf("\t\tvec2 coord = %s - %s * %s;\n", coords, target, i
mgInc); | 425 builder->fsCodeAppendf("\t\tvec2 coord = %s - %s * %s;\n", coords, target, i
mgInc); |
416 builder->fsCodeAppendf("\t\tfor (int y = 0; y < %d; y++) {\n", kHeight); | 426 builder->fsCodeAppendf("\t\tfor (int y = 0; y < %d; y++) {\n", kHeight); |
417 builder->fsCodeAppendf("\t\t\tfor (int x = 0; x < %d; x++) {\n", kWidth); | 427 builder->fsCodeAppendf("\t\t\tfor (int x = 0; x < %d; x++) {\n", kWidth); |
418 builder->fsCodeAppendf("\t\t\t\tfloat k = %s[y * %d + x];\n", kernel, kWidth
); | 428 builder->fsCodeAppendf("\t\t\t\tfloat k = %s[y * %d + x];\n", kernel, kWidth
); |
419 builder->fsCodeAppendf("\t\t\t\tvec2 coord2 = coord + vec2(x, y) * %s;\n", i
mgInc); | 429 builder->fsCodeAppendf("\t\t\t\tvec2 coord2 = coord + vec2(x, y) * %s;\n", i
mgInc); |
420 builder->fsCodeAppend("\t\t\t\tvec4 c = "); | 430 builder->fsCodeAppend("\t\t\t\tvec4 c = "); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
458 key |= m.tileMode() << 7; | 468 key |= m.tileMode() << 7; |
459 key |= m.convolveAlpha() ? 1 << 9 : 0; | 469 key |= m.convolveAlpha() ? 1 << 9 : 0; |
460 key <<= GrGLEffectMatrix::kKeyBits; | 470 key <<= GrGLEffectMatrix::kKeyBits; |
461 EffectKey matrixKey = GrGLEffectMatrix::GenKey(m.getMatrix(), | 471 EffectKey matrixKey = GrGLEffectMatrix::GenKey(m.getMatrix(), |
462 drawEffect, | 472 drawEffect, |
463 m.coordsType(), | 473 m.coordsType(), |
464 m.texture(0)); | 474 m.texture(0)); |
465 return key | matrixKey; | 475 return key | matrixKey; |
466 } | 476 } |
467 | 477 |
468 void GrGLMatrixConvolutionEffect::setData(const GrGLUniformManager& uman, | 478 void GrGLMatrixConvolutionEffect::setData(const GrGLContext& context, |
469 const GrDrawEffect& drawEffect) { | 479 const GrDrawEffect& drawEffect) { |
470 const GrMatrixConvolutionEffect& conv = drawEffect.castEffect<GrMatrixConvol
utionEffect>(); | 480 const GrMatrixConvolutionEffect& conv = drawEffect.castEffect<GrMatrixConvol
utionEffect>(); |
471 GrTexture& texture = *conv.texture(0); | 481 GrTexture& texture = *conv.texture(0); |
472 // the code we generated was for a specific kernel size | 482 // the code we generated was for a specific kernel size |
473 GrAssert(conv.kernelSize() == fKernelSize); | 483 GrAssert(conv.kernelSize() == fKernelSize); |
474 GrAssert(conv.tileMode() == fTileMode); | 484 GrAssert(conv.tileMode() == fTileMode); |
475 float imageIncrement[2]; | 485 float imageIncrement[2]; |
476 float ySign = texture.origin() == kTopLeft_GrSurfaceOrigin ? 1.0f : -1.0f; | 486 float ySign = texture.origin() == kTopLeft_GrSurfaceOrigin ? 1.0f : -1.0f; |
477 imageIncrement[0] = 1.0f / texture.width(); | 487 imageIncrement[0] = 1.0f / texture.width(); |
478 imageIncrement[1] = ySign / texture.height(); | 488 imageIncrement[1] = ySign / texture.height(); |
479 uman.set2fv(fImageIncrementUni, 0, 1, imageIncrement); | 489 fImageIncrementUni->set2fv(context, 0, 1, imageIncrement); |
480 uman.set2fv(fTargetUni, 0, 1, conv.target()); | 490 fTargetUni->set2fv(context, 0, 1, conv.target()); |
481 uman.set1fv(fKernelUni, 0, fKernelSize.width() * fKernelSize.height(), conv.
kernel()); | 491 fKernelUni->set1fv(context, 0, fKernelSize.width() * fKernelSize.height(), c
onv.kernel()); |
482 uman.set1f(fGainUni, conv.gain()); | 492 fGainUni->set1f(context, conv.gain()); |
483 uman.set1f(fBiasUni, conv.bias()); | 493 fBiasUni->set1f(context, conv.bias()); |
484 fEffectMatrix.setData(uman, | 494 fEffectMatrix.setData(context, |
485 conv.getMatrix(), | 495 conv.getMatrix(), |
486 drawEffect, | 496 drawEffect, |
487 conv.texture(0)); | 497 conv.texture(0)); |
488 } | 498 } |
489 | 499 |
490 GrMatrixConvolutionEffect::GrMatrixConvolutionEffect(GrTexture* texture, | 500 GrMatrixConvolutionEffect::GrMatrixConvolutionEffect(GrTexture* texture, |
491 const SkISize& kernelSize, | 501 const SkISize& kernelSize, |
492 const SkScalar* kernel, | 502 const SkScalar* kernel, |
493 SkScalar gain, | 503 SkScalar gain, |
494 SkScalar bias, | 504 SkScalar bias, |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
578 fBias, | 588 fBias, |
579 fTarget, | 589 fTarget, |
580 fTileMode, | 590 fTileMode, |
581 fConvolveAlpha); | 591 fConvolveAlpha); |
582 return true; | 592 return true; |
583 } | 593 } |
584 | 594 |
585 /////////////////////////////////////////////////////////////////////////////// | 595 /////////////////////////////////////////////////////////////////////////////// |
586 | 596 |
587 #endif | 597 #endif |
OLD | NEW |