Index: src/core/SkImageFilter.cpp |
diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp |
index 56fb1ae47e356e25d1df5e847797152a42ac7a42..ba19a9772366818c620a8051f6c96a2e37698737 100644 |
--- a/src/core/SkImageFilter.cpp |
+++ b/src/core/SkImageFilter.cpp |
@@ -10,6 +10,11 @@ |
#include "SkBitmap.h" |
#include "SkFlattenableBuffers.h" |
#include "SkRect.h" |
+#if SK_SUPPORT_GPU |
+#include "GrContext.h" |
+#include "GrTexture.h" |
+#include "SkImageFilterUtils.h" |
+#endif |
SK_DEFINE_INST_COUNT(SkImageFilter) |
@@ -104,12 +109,45 @@ bool SkImageFilter::onFilterImage(Proxy*, const SkBitmap&, const SkMatrix&, |
} |
bool SkImageFilter::canFilterImageGPU() const { |
- return false; |
+ return asNewEffect(NULL, NULL); |
bsalomon
2013/04/08 19:38:30
this->
|
} |
bool SkImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, SkBitmap* result) { |
- SkASSERT(false); // Should never be called, since canFilterImageGPU() returned false. |
+#if SK_SUPPORT_GPU |
+ SkBitmap input; |
+ SkASSERT(fInputCount == 1); |
+ if (!SkImageFilterUtils::GetInputResultGPU(getInput(0), proxy, src, &input)) { |
bsalomon
2013/04/08 19:38:30
this->
|
+ return false; |
+ } |
+ GrTexture* srcTexture = (GrTexture*) input.getTexture(); |
+ SkRect rect; |
+ src.getBounds(&rect); |
+ GrContext* context = srcTexture->getContext(); |
+ |
+ GrTextureDesc desc; |
+ desc.fFlags = kRenderTarget_GrTextureFlagBit, |
+ desc.fWidth = input.width(); |
+ desc.fHeight = input.height(); |
+ desc.fConfig = kRGBA_8888_GrPixelConfig; |
+ |
+ GrAutoScratchTexture dst(context, desc); |
+ GrContext::AutoMatrix am; |
+ am.setIdentity(context); |
+ GrContext::AutoRenderTarget art(context, dst.texture()->asRenderTarget()); |
+ GrContext::AutoClip acs(context, rect); |
+ GrEffectRef* effect; |
+ asNewEffect(&effect, srcTexture); |
bsalomon
2013/04/08 19:38:30
this->
|
+ SkASSERT(effect); |
+ SkAutoUnref effectRef(effect); |
+ GrPaint paint; |
+ paint.colorStage(0)->setEffect(effect); |
+ context->drawRect(paint, rect); |
+ SkAutoTUnref<GrTexture> resultTex(dst.detach()); |
+ SkImageFilterUtils::WrapTexture(resultTex, input.width(), input.height(), result); |
+ return true; |
+#else |
return false; |
+#endif |
} |
bool SkImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& ctm, |