aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gm/imagefiltersgraph.cpp37
-rw-r--r--src/core/SkImageFilter.cpp8
2 files changed, 39 insertions, 6 deletions
diff --git a/gm/imagefiltersgraph.cpp b/gm/imagefiltersgraph.cpp
index 14752dbab5..e783789124 100644
--- a/gm/imagefiltersgraph.cpp
+++ b/gm/imagefiltersgraph.cpp
@@ -15,6 +15,7 @@
#include "SkColorMatrixFilter.h"
#include "SkImage.h"
#include "SkImageSource.h"
+#include "SkMatrixConvolutionImageFilter.h"
#include "SkReadBuffer.h"
#include "SkWriteBuffer.h"
#include "SkMergeImageFilter.h"
@@ -107,7 +108,7 @@ protected:
return SkString("imagefiltersgraph");
}
- SkISize onISize() override { return SkISize::Make(500, 150); }
+ SkISize onISize() override { return SkISize::Make(600, 150); }
void onOnceBeforeDraw() override {
fImage.reset(SkImage::NewFromBitmap(
@@ -182,6 +183,40 @@ protected:
canvas->translate(SkIntToScalar(100), 0);
}
{
+ // Dilate -> matrix convolution.
+ // This tests that a filter using asFragmentProcessor (matrix
+ // convolution) correctly handles a non-zero source offset
+ // (supplied by the dilate).
+ SkAutoTUnref<SkImageFilter> dilate(SkDilateImageFilter::Create(5, 5));
+
+ SkAutoTUnref<SkXfermode> mode(SkXfermode::Create(SkXfermode::kSrcIn_Mode));
+
+ SkScalar kernel[9] = {
+ SkIntToScalar(-1), SkIntToScalar( -1 ), SkIntToScalar(-1),
+ SkIntToScalar(-1), SkIntToScalar( 7 ), SkIntToScalar(-1),
+ SkIntToScalar(-1), SkIntToScalar( -1 ), SkIntToScalar(-1),
+ };
+ SkISize kernelSize = SkISize::Make(3, 3);
+ SkScalar gain = 1.0f, bias = SkIntToScalar(0);
+ SkIPoint kernelOffset = SkIPoint::Make(1, 1);
+ auto tileMode = SkMatrixConvolutionImageFilter::kClamp_TileMode;
+ bool convolveAlpha = false;
+ SkAutoTUnref<SkImageFilter> convolve(
+ SkMatrixConvolutionImageFilter::Create(kernelSize,
+ kernel,
+ gain,
+ bias,
+ kernelOffset,
+ tileMode,
+ convolveAlpha,
+ dilate));
+
+ SkPaint paint;
+ paint.setImageFilter(convolve);
+ DrawClippedImage(canvas, fImage, paint);
+ canvas->translate(SkIntToScalar(100), 0);
+ }
+ {
// Test that crop offsets are absolute, not relative to the parent's crop rect.
SkAutoTUnref<SkColorFilter> cf1(SkColorFilter::CreateModeFilter(SK_ColorBLUE,
SkXfermode::kSrcIn_Mode));
diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp
index 141d2e03fb..821edc0e1a 100644
--- a/src/core/SkImageFilter.cpp
+++ b/src/core/SkImageFilter.cpp
@@ -334,8 +334,6 @@ bool SkImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Cont
if (!this->applyCropRect(ctx, proxy, input, &srcOffset, &bounds, &input)) {
return false;
}
- SkRect srcRect = SkRect::Make(bounds);
- SkRect dstRect = SkRect::MakeWH(srcRect.width(), srcRect.height());
GrContext* context = srcTexture->getContext();
GrSurfaceDesc desc;
@@ -349,9 +347,6 @@ bool SkImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Cont
return false;
}
- // setup new clip
- GrClip clip(dstRect);
-
GrFragmentProcessor* fp;
offset->fX = bounds.left();
offset->fY = bounds.top();
@@ -366,6 +361,9 @@ bool SkImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Cont
SkAutoTUnref<GrDrawContext> drawContext(context->drawContext(dst->asRenderTarget()));
if (drawContext) {
+ SkRect srcRect = SkRect::Make(bounds);
+ SkRect dstRect = SkRect::MakeWH(srcRect.width(), srcRect.height());
+ GrClip clip(dstRect);
drawContext->fillRectToRect(clip, paint, SkMatrix::I(), dstRect, srcRect);
GrWrapTextureInBitmap(dst, bounds.width(), bounds.height(), false, result);