| Index: src/core/SkImageFilter.cpp
|
| diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp
|
| index cd7c01b4e67e66cf55fda7dd21849f53574c5462..4a380c52eb7a9549c4c7792a75c6c2367e13743e 100644
|
| --- a/src/core/SkImageFilter.cpp
|
| +++ b/src/core/SkImageFilter.cpp
|
| @@ -14,8 +14,8 @@
|
| #include "SkValidationUtils.h"
|
| #if SK_SUPPORT_GPU
|
| #include "GrContext.h"
|
| -#include "GrTexture.h"
|
| -#include "SkImageFilterUtils.h"
|
| +#include "SkGrPixelRef.h"
|
| +#include "SkGr.h"
|
| #endif
|
|
|
| SkImageFilter::SkImageFilter(int inputCount, SkImageFilter** inputs, const CropRect* cropRect)
|
| @@ -146,10 +146,11 @@ bool SkImageFilter::canFilterImageGPU() const {
|
| bool SkImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const SkMatrix& ctm,
|
| SkBitmap* result, SkIPoint* offset) const {
|
| #if SK_SUPPORT_GPU
|
| - SkBitmap input;
|
| + SkBitmap input = src;
|
| SkASSERT(fInputCount == 1);
|
| SkIPoint srcOffset = SkIPoint::Make(0, 0);
|
| - if (!SkImageFilterUtils::GetInputResultGPU(this->getInput(0), proxy, src, ctm, &input, &srcOffset)) {
|
| + if (this->getInput(0) &&
|
| + !this->getInput(0)->getInputResultGPU(proxy, src, ctm, &input, &srcOffset)) {
|
| return false;
|
| }
|
| GrTexture* srcTexture = input.getTexture();
|
| @@ -188,7 +189,7 @@ bool SkImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const SkMa
|
| context->drawRectToRect(paint, dstRect, srcRect);
|
|
|
| SkAutoTUnref<GrTexture> resultTex(dst.detach());
|
| - SkImageFilterUtils::WrapTexture(resultTex, bounds.width(), bounds.height(), result);
|
| + WrapTexture(resultTex, bounds.width(), bounds.height(), result);
|
| return true;
|
| #else
|
| return false;
|
| @@ -242,3 +243,40 @@ bool SkImageFilter::asNewEffect(GrEffectRef**, GrTexture*, const SkMatrix&, cons
|
| bool SkImageFilter::asColorFilter(SkColorFilter**) const {
|
| return false;
|
| }
|
| +
|
| +#if SK_SUPPORT_GPU
|
| +
|
| +void SkImageFilter::WrapTexture(GrTexture* texture, int width, int height, SkBitmap* result) {
|
| + SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
|
| + result->setConfig(info);
|
| + result->setPixelRef(SkNEW_ARGS(SkGrPixelRef, (info, texture)))->unref();
|
| +}
|
| +
|
| +bool SkImageFilter::getInputResultGPU(SkImageFilter::Proxy* proxy,
|
| + const SkBitmap& src, const SkMatrix& ctm,
|
| + SkBitmap* result, SkIPoint* offset) const {
|
| + // Ensure that GrContext calls under filterImage and filterImageGPU below will see an identity
|
| + // matrix with no clip and that the matrix, clip, and render target set before this function was
|
| + // called are restored before we return to the caller.
|
| + GrContext* context = src.getTexture()->getContext();
|
| + GrContext::AutoWideOpenIdentityDraw awoid(context, NULL);
|
| + if (this->canFilterImageGPU()) {
|
| + return this->filterImageGPU(proxy, src, ctm, result, offset);
|
| + } else {
|
| + if (this->filterImage(proxy, src, ctm, result, offset)) {
|
| + if (!result->getTexture()) {
|
| + SkImageInfo info;
|
| + if (!result->asImageInfo(&info)) {
|
| + return false;
|
| + }
|
| + GrTexture* resultTex = GrLockAndRefCachedBitmapTexture(context, *result, NULL);
|
| + result->setPixelRef(new SkGrPixelRef(info, resultTex))->unref();
|
| + GrUnlockAndUnrefCachedBitmapTexture(resultTex);
|
| + }
|
| + return true;
|
| + } else {
|
| + return false;
|
| + }
|
| + }
|
| +}
|
| +#endif
|
|
|