#include "SkColorMatrixFilter.h"
#include "SkImage.h"
#include "SkImageSource.h"
+#include "SkMatrixConvolutionImageFilter.h"
#include "SkReadBuffer.h"
#include "SkWriteBuffer.h"
#include "SkMergeImageFilter.h"
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(
DrawClippedImage(canvas, fImage, paint);
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,
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;
return false;
}
- // setup new clip
- GrClip clip(dstRect);
-
GrFragmentProcessor* fp;
offset->fX = bounds.left();
offset->fY = bounds.top();
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);