aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-03-14 16:48:39 +0000
committerGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-03-14 16:48:39 +0000
commit29089179a66c06ef70da387111af75970f04ed53 (patch)
tree82b92dd3dbea630b3b64a55a66a4b501fd59f3fa
parent0ef0501baf615149d6d84398d7594cd89f6e928d (diff)
Revert "Implement support for expanding crop rects in image filters"
Breaking ImageFilterTests unit test. TBR=bsalomon@google.com BUG=skia: Review URL: https://codereview.chromium.org/196353021 git-svn-id: http://skia.googlecode.com/svn/trunk@13806 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r--gm/imagefilterscropexpand.cpp170
-rw-r--r--gm/imagefiltersgraph.cpp4
-rw-r--r--gyp/gmslides.gypi1
-rw-r--r--include/core/SkImageFilter.h23
-rw-r--r--src/core/SkImageFilter.cpp63
-rw-r--r--src/effects/SkBlurImageFilter.cpp16
-rwxr-xr-xsrc/effects/SkColorFilterImageFilter.cpp4
-rw-r--r--src/effects/SkDisplacementMapEffect.cpp60
-rw-r--r--src/effects/SkDropShadowImageFilter.cpp7
-rw-r--r--src/effects/SkLightingImageFilter.cpp25
-rw-r--r--src/effects/SkMatrixConvolutionImageFilter.cpp4
-rwxr-xr-xsrc/effects/SkMergeImageFilter.cpp3
-rw-r--r--src/effects/SkMorphologyImageFilter.cpp8
-rw-r--r--src/effects/SkOffsetImageFilter.cpp5
-rw-r--r--src/effects/SkRectShaderImageFilter.cpp3
-rw-r--r--src/effects/SkXfermodeImageFilter.cpp11
16 files changed, 102 insertions, 305 deletions
diff --git a/gm/imagefilterscropexpand.cpp b/gm/imagefilterscropexpand.cpp
deleted file mode 100644
index 9373696773..0000000000
--- a/gm/imagefilterscropexpand.cpp
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright 2014 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "gm.h"
-#include "SkCanvas.h"
-#include "SkColorFilter.h"
-#include "SkColorPriv.h"
-#include "SkShader.h"
-
-#include "SkBitmapSource.h"
-#include "SkBlurImageFilter.h"
-#include "SkColorMatrixFilter.h"
-#include "SkDisplacementMapEffect.h"
-#include "SkDropShadowImageFilter.h"
-#include "SkGradientShader.h"
-#include "SkMorphologyImageFilter.h"
-#include "SkColorFilterImageFilter.h"
-#include "SkMergeImageFilter.h"
-#include "SkOffsetImageFilter.h"
-
-///////////////////////////////////////////////////////////////////////////////
-
-class ImageFiltersCropExpandGM : public skiagm::GM {
-public:
- ImageFiltersCropExpandGM () {}
-
-protected:
-
- virtual SkString onShortName() {
- return SkString("imagefilterscropexpand");
- }
-
- virtual SkISize onISize() { return SkISize::Make(570, 650); }
-
- void make_checkerboard(SkBitmap* bitmap) {
- bitmap->allocN32Pixels(64, 64);
- SkCanvas canvas(*bitmap);
- canvas.clear(0xFFFF0000);
- SkPaint darkPaint;
- darkPaint.setColor(0xFF404040);
- SkPaint lightPaint;
- lightPaint.setColor(0xFFA0A0A0);
- for (int y = 8; y < 48; y += 16) {
- for (int x = 8; x < 48; x += 16) {
- canvas.save();
- canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
- canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
- canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
- canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
- canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
- canvas.restore();
- }
- }
- }
-
- void make_gradient_circle(int width, int height, SkBitmap* bitmap) {
- SkScalar x = SkIntToScalar(width / 2);
- SkScalar y = SkIntToScalar(height / 2);
- SkScalar radius = SkMinScalar(x, y) * 0.8f;
- bitmap->allocN32Pixels(width, height);
- SkCanvas canvas(*bitmap);
- canvas.clear(0x00000000);
- SkColor colors[2];
- colors[0] = SK_ColorWHITE;
- colors[1] = SK_ColorBLACK;
- SkAutoTUnref<SkShader> shader(
- SkGradientShader::CreateRadial(SkPoint::Make(x, y), radius, colors, NULL, 2,
- SkShader::kClamp_TileMode)
- );
- SkPaint paint;
- paint.setShader(shader);
- canvas.drawCircle(x, y, radius, paint);
- }
-
- static void draw(SkCanvas* canvas, const SkBitmap& bitmap, const SkRect& rect, SkImageFilter* filter) {
- SkPaint paint;
- paint.setImageFilter(filter)->unref();
- canvas->saveLayer(&rect, &paint);
- canvas->drawBitmap(bitmap, 0, 0);
- canvas->restore();
-
- SkPaint strokePaint;
- strokePaint.setColor(0xFFFF0000);
- strokePaint.setStyle(SkPaint::kStroke_Style);
- canvas->drawRect(rect, strokePaint);
-
- canvas->translate(SkIntToScalar(80), 0);
- }
-
- virtual void onDraw(SkCanvas* canvas) {
- SkAutoTUnref<SkColorFilter> cf(
- SkColorFilter::CreateModeFilter(SK_ColorBLUE, SkXfermode::kSrcIn_Mode));
- SkImageFilter::CropRect crop_rect(
- SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)),
- SkImageFilter::CropRect::kHasAll_CropEdge);
-
- SkBitmap gradient_circle, checkerboard;
- make_gradient_circle(64, 64, &gradient_circle);
- make_checkerboard(&checkerboard);
-
- SkAutoTUnref<SkImageFilter> gradient_circle_source(
- SkBitmapSource::Create(gradient_circle));
- SkAutoTUnref<SkImageFilter> noop_cropped(
- SkOffsetImageFilter::Create(0, 0, NULL, &crop_rect));
- SkScalar sk255 = SkIntToScalar(255);
- SkScalar matrix[20] = { 1, 0, 0, 0, 0,
- 0, 1, 0, 0, sk255,
- 0, 0, 1, 0, 0,
- 0, 0, 0, 0, sk255 };
- SkAutoTUnref<SkColorFilter> cf_alpha_trans(SkColorMatrixFilter::Create(matrix));
-
- SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
- SkScalar MARGIN = SkIntToScalar(12);
-
- SkIRect bounds;
- r.roundOut(&bounds);
-
- SkPaint paint;
- canvas->translate(MARGIN, MARGIN);
- for (int outset = -15; outset <= 20; outset += 5) {
- canvas->save();
- SkRect rect = crop_rect.rect();
- rect.outset(SkIntToScalar(outset),
- SkIntToScalar(outset));
- SkImageFilter::CropRect big_rect(rect, SkImageFilter::CropRect::kHasAll_CropEdge);
-
- draw(canvas, checkerboard, rect, SkColorFilterImageFilter::Create(
- cf_alpha_trans, noop_cropped.get(), &big_rect));
-
- draw(canvas, checkerboard, rect, SkBlurImageFilter::Create(
- 8.0f, 8.0f, noop_cropped.get(), &big_rect));
-
- draw(canvas, checkerboard, rect, SkDilateImageFilter::Create(
- 2, 2, noop_cropped.get(), &big_rect));
-
- draw(canvas, checkerboard, rect, SkErodeImageFilter::Create(
- 2, 2, noop_cropped.get(), &big_rect));
-
- draw(canvas, checkerboard, rect, SkDropShadowImageFilter::Create(
- SkIntToScalar(10), SkIntToScalar(10), SkIntToScalar(3), SkIntToScalar(3),
- SK_ColorBLUE, noop_cropped.get(), &big_rect));
-
- draw(canvas, checkerboard, rect, SkDisplacementMapEffect::Create(
- SkDisplacementMapEffect::kR_ChannelSelectorType,
- SkDisplacementMapEffect::kR_ChannelSelectorType,
- SkIntToScalar(12),
- gradient_circle_source.get(),
- noop_cropped.get(),
- &big_rect));
-
- draw(canvas, checkerboard, rect, SkOffsetImageFilter::Create(
- SkIntToScalar(-8), SkIntToScalar(16), noop_cropped.get(), &big_rect));
-
- canvas->restore();
- canvas->translate(0, SkIntToScalar(80));
- }
- }
-
-private:
- typedef GM INHERITED;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-static skiagm::GM* MyFactory(void*) { return new ImageFiltersCropExpandGM; }
-static skiagm::GMRegistry reg(MyFactory);
diff --git a/gm/imagefiltersgraph.cpp b/gm/imagefiltersgraph.cpp
index 8885f0d231..bc34e656d0 100644
--- a/gm/imagefiltersgraph.cpp
+++ b/gm/imagefiltersgraph.cpp
@@ -39,7 +39,9 @@ public:
}
SkIRect bounds;
- if (!this->applyCropRect(ctx, proxy, source, &srcOffset, &bounds, &source)) {
+ source.getBounds(&bounds);
+
+ if (!this->applyCropRect(&bounds, ctx.ctm())) {
return false;
}
diff --git a/gyp/gmslides.gypi b/gyp/gmslides.gypi
index 85258fc7c8..27ecc3c17b 100644
--- a/gyp/gmslides.gypi
+++ b/gyp/gmslides.gypi
@@ -101,7 +101,6 @@
'../gm/imagefiltersbase.cpp',
'../gm/imagefiltersclipped.cpp',
'../gm/imagefilterscropped.cpp',
- '../gm/imagefilterscropexpand.cpp',
'../gm/imagefiltersgraph.cpp',
'../gm/imagefiltersscaled.cpp',
'../gm/internal_links.cpp',
diff --git a/include/core/SkImageFilter.h b/include/core/SkImageFilter.h
index 0f52b69b84..4f33f54b6d 100644
--- a/include/core/SkImageFilter.h
+++ b/include/core/SkImageFilter.h
@@ -223,25 +223,10 @@ protected:
// no inputs.
virtual bool onFilterBounds(const SkIRect&, const SkMatrix&, SkIRect*) const;
- /** Computes source bounds as the src bitmap bounds offset by srcOffset.
- * Apply the transformed crop rect to the bounds if any of the
- * corresponding edge flags are set. Intersects the result against the
- * context's clipBounds, and returns the result in "bounds". If there is
- * no intersection, returns false and leaves "bounds" unchanged.
- */
- bool applyCropRect(const Context&, const SkBitmap& src, const SkIPoint& srcOffset,
- SkIRect* bounds) const;
-
- /** Same as the above call, except that if the resulting crop rect is not
- * entirely contained by the source bitmap's bounds, it creates a new
- * bitmap in "result" and pads the edges with transparent black. In that
- * case, the srcOffset is modified to be the same as the bounds, since no
- * further adjustment is needed by the caller. This version should only
- * be used by filters which are not capable of processing a smaller
- * source bitmap into a larger destination.
- */
- bool applyCropRect(const Context&, Proxy* proxy, const SkBitmap& src, SkIPoint* srcOffset,
- SkIRect* bounds, SkBitmap* result) const;
+ // Applies "matrix" to the crop rect, and sets "rect" to the intersection of
+ // "rect" and the transformed crop rect. If there is no overlap, returns
+ // false and leaves "rect" unchanged.
+ bool applyCropRect(SkIRect* rect, const SkMatrix& matrix) const;
/**
* Returns true if the filter can be expressed a single-pass
diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp
index 2be66e787c..6613f09b93 100644
--- a/src/core/SkImageFilter.cpp
+++ b/src/core/SkImageFilter.cpp
@@ -8,7 +8,6 @@
#include "SkImageFilter.h"
#include "SkBitmap.h"
-#include "SkDevice.h"
#include "SkReadBuffer.h"
#include "SkWriteBuffer.h"
#include "SkRect.h"
@@ -156,7 +155,9 @@ bool SkImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Cont
}
GrTexture* srcTexture = input.getTexture();
SkIRect bounds;
- if (!this->applyCropRect(ctx, proxy, input, &srcOffset, &bounds, &input)) {
+ src.getBounds(&bounds);
+ bounds.offset(srcOffset);
+ if (!this->applyCropRect(&bounds, ctx.ctm())) {
return false;
}
SkRect srcRect = SkRect::Make(bounds);
@@ -195,60 +196,18 @@ bool SkImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Cont
#endif
}
-bool SkImageFilter::applyCropRect(const Context& ctx, const SkBitmap& src,
- const SkIPoint& srcOffset, SkIRect* bounds) const {
- SkIRect srcBounds;
- src.getBounds(&srcBounds);
- srcBounds.offset(srcOffset);
+bool SkImageFilter::applyCropRect(SkIRect* rect, const SkMatrix& matrix) const {
SkRect cropRect;
- ctx.ctm().mapRect(&cropRect, fCropRect.rect());
+ matrix.mapRect(&cropRect, fCropRect.rect());
SkIRect cropRectI;
cropRect.roundOut(&cropRectI);
uint32_t flags = fCropRect.flags();
- if (flags & CropRect::kHasLeft_CropEdge) srcBounds.fLeft = cropRectI.fLeft;
- if (flags & CropRect::kHasTop_CropEdge) srcBounds.fTop = cropRectI.fTop;
- if (flags & CropRect::kHasRight_CropEdge) srcBounds.fRight = cropRectI.fRight;
- if (flags & CropRect::kHasBottom_CropEdge) srcBounds.fBottom = cropRectI.fBottom;
- if (!srcBounds.intersect(ctx.clipBounds())) {
- return false;
- }
- *bounds = srcBounds;
- return true;
-}
-
-bool SkImageFilter::applyCropRect(const Context& ctx, Proxy* proxy, const SkBitmap& src,
- SkIPoint* srcOffset, SkIRect* bounds, SkBitmap* dst) const {
- SkIRect srcBounds;
- src.getBounds(&srcBounds);
- srcBounds.offset(*srcOffset);
- SkRect cropRect;
- ctx.ctm().mapRect(&cropRect, fCropRect.rect());
- SkIRect cropRectI;
- cropRect.roundOut(&cropRectI);
- uint32_t flags = fCropRect.flags();
- *bounds = srcBounds;
- if (flags & CropRect::kHasLeft_CropEdge) bounds->fLeft = cropRectI.fLeft;
- if (flags & CropRect::kHasTop_CropEdge) bounds->fTop = cropRectI.fTop;
- if (flags & CropRect::kHasRight_CropEdge) bounds->fRight = cropRectI.fRight;
- if (flags & CropRect::kHasBottom_CropEdge) bounds->fBottom = cropRectI.fBottom;
- if (!bounds->intersect(ctx.clipBounds())) {
- return false;
- }
- if (srcBounds.contains(*bounds)) {
- *dst = src;
- return true;
- } else {
- SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds->width(), bounds->height()));
- if (!device) {
- return false;
- }
- SkCanvas canvas(device);
- canvas.clear(0x00000000);
- canvas.drawBitmap(src, srcOffset->x() - bounds->x(), srcOffset->y() - bounds->y());
- *srcOffset = SkIPoint::Make(bounds->x(), bounds->y());
- *dst = device->accessBitmap(false);
- return true;
- }
+ // If the original crop rect edges were unset, max out the new crop edges
+ if (!(flags & CropRect::kHasLeft_CropEdge)) cropRectI.fLeft = SK_MinS32;
+ if (!(flags & CropRect::kHasTop_CropEdge)) cropRectI.fTop = SK_MinS32;
+ if (!(flags & CropRect::kHasRight_CropEdge)) cropRectI.fRight = SK_MaxS32;
+ if (!(flags & CropRect::kHasBottom_CropEdge)) cropRectI.fBottom = SK_MaxS32;
+ return rect->intersect(cropRectI);
}
bool SkImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& ctm,
diff --git a/src/effects/SkBlurImageFilter.cpp b/src/effects/SkBlurImageFilter.cpp
index ffebe54225..adcb28f90d 100644
--- a/src/effects/SkBlurImageFilter.cpp
+++ b/src/effects/SkBlurImageFilter.cpp
@@ -146,13 +146,15 @@ bool SkBlurImageFilter::onFilterImage(Proxy* proxy,
return false;
}
- SkIRect srcBounds, dstBounds;
- if (!this->applyCropRect(ctx, proxy, src, &srcOffset, &srcBounds, &src)) {
+ SkAutoLockPixels alp(src);
+ if (!src.getPixels()) {
return false;
}
- SkAutoLockPixels alp(src);
- if (!src.getPixels()) {
+ SkIRect srcBounds, dstBounds;
+ src.getBounds(&srcBounds);
+ srcBounds.offset(srcOffset);
+ if (!this->applyCropRect(&srcBounds, ctx.ctm())) {
return false;
}
@@ -256,11 +258,13 @@ bool SkBlurImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const
if (getInput(0) && !getInput(0)->getInputResultGPU(proxy, src, ctx, &input, &srcOffset)) {
return false;
}
+ GrTexture* source = input.getTexture();
SkIRect rect;
- if (!this->applyCropRect(ctx, proxy, input, &srcOffset, &rect, &input)) {
+ src.getBounds(&rect);
+ rect.offset(srcOffset);
+ if (!this->applyCropRect(&rect, ctx.ctm())) {
return false;
}
- GrTexture* source = input.getTexture();
SkVector sigma, localSigma = SkVector::Make(fSigma.width(), fSigma.height());
ctx.ctm().mapVectors(&sigma, &localSigma, 1);
offset->fX = rect.fLeft;
diff --git a/src/effects/SkColorFilterImageFilter.cpp b/src/effects/SkColorFilterImageFilter.cpp
index 8cdd546b99..0de73301b1 100755
--- a/src/effects/SkColorFilterImageFilter.cpp
+++ b/src/effects/SkColorFilterImageFilter.cpp
@@ -109,7 +109,9 @@ bool SkColorFilterImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& sourc
}
SkIRect bounds;
- if (!this->applyCropRect(ctx, src, srcOffset, &bounds)) {
+ src.getBounds(&bounds);
+ bounds.offset(srcOffset);
+ if (!this->applyCropRect(&bounds, ctx.ctm())) {
return false;
}
diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp
index 4b26a5f846..a1c18c647e 100644
--- a/src/effects/SkDisplacementMapEffect.cpp
+++ b/src/effects/SkDisplacementMapEffect.cpp
@@ -209,23 +209,26 @@ bool SkDisplacementMapEffect::onFilterImage(Proxy* proxy,
(color.colorType() != kPMColor_SkColorType)) {
return false;
}
+
+ SkAutoLockPixels alp_displacement(displ), alp_color(color);
+ if (!displ.getPixels() || !color.getPixels()) {
+ return false;
+ }
SkIRect bounds;
- // Since computeDisplacement does bounds checking on color pixel access, we don't need to pad
- // the color bitmap to bounds here.
- if (!this->applyCropRect(ctx, color, colorOffset, &bounds)) {
+ color.getBounds(&bounds);
+ bounds.offset(colorOffset);
+ if (!this->applyCropRect(&bounds, ctx.ctm())) {
return false;
}
SkIRect displBounds;
- if (!this->applyCropRect(ctx, proxy, displ, &displOffset, &displBounds, &displ)) {
+ displ.getBounds(&displBounds);
+ displBounds.offset(displOffset);
+ if (!this->applyCropRect(&displBounds, ctx.ctm())) {
return false;
}
if (!bounds.intersect(displBounds)) {
return false;
}
- SkAutoLockPixels alp_displacement(displ), alp_color(color);
- if (!displ.getPixels() || !color.getPixels()) {
- return false;
- }
dst->setConfig(color.config(), bounds.width(), bounds.height());
if (!dst->allocPixels()) {
@@ -251,18 +254,14 @@ void SkDisplacementMapEffect::computeFastBounds(const SkRect& src, SkRect* dst)
} else {
*dst = src;
}
- dst->outset(fScale * SK_ScalarHalf, fScale * SK_ScalarHalf);
}
bool SkDisplacementMapEffect::onFilterBounds(const SkIRect& src, const SkMatrix& ctm,
SkIRect* dst) const {
- SkIRect bounds = src;
- if (getColorInput() && !getColorInput()->filterBounds(src, ctm, &bounds)) {
- return false;
+ if (getColorInput()) {
+ return getColorInput()->filterBounds(src, ctm, dst);
}
- bounds.outset(SkScalarCeilToInt(fScale * SK_ScalarHalf),
- SkScalarCeilToInt(fScale * SK_ScalarHalf));
- *dst = bounds;
+ *dst = src;
return true;
}
@@ -357,6 +356,7 @@ bool SkDisplacementMapEffect::filterImageGPU(Proxy* proxy, const SkBitmap& src,
&colorOffset)) {
return false;
}
+ GrTexture* color = colorBM.getTexture();
SkBitmap displacementBM = src;
SkIPoint displacementOffset = SkIPoint::Make(0, 0);
if (getDisplacementInput() &&
@@ -364,21 +364,6 @@ bool SkDisplacementMapEffect::filterImageGPU(Proxy* proxy, const SkBitmap& src,
&displacementOffset)) {
return false;
}
- SkIRect bounds;
- // Since GrDisplacementMapEffect does bounds checking on color pixel access, we don't need to
- // pad the color bitmap to bounds here.
- if (!this->applyCropRect(ctx, colorBM, colorOffset, &bounds)) {
- return false;
- }
- SkIRect displBounds;
- if (!this->applyCropRect(ctx, proxy, displacementBM,
- &displacementOffset, &displBounds, &displacementBM)) {
- return false;
- }
- if (!bounds.intersect(displBounds)) {
- return false;
- }
- GrTexture* color = colorBM.getTexture();
GrTexture* displacement = displacementBM.getTexture();
GrContext* context = color->getContext();
@@ -395,6 +380,21 @@ bool SkDisplacementMapEffect::filterImageGPU(Proxy* proxy, const SkBitmap& src,
SkVector scale = SkVector::Make(fScale, fScale);
ctx.ctm().mapVectors(&scale, 1);
+ SkIRect bounds;
+ colorBM.getBounds(&bounds);
+ bounds.offset(colorOffset);
+ if (!this->applyCropRect(&bounds, ctx.ctm())) {
+ return false;
+ }
+ SkIRect displBounds;
+ displacementBM.getBounds(&displBounds);
+ displBounds.offset(displacementOffset);
+ if (!this->applyCropRect(&displBounds, ctx.ctm())) {
+ return false;
+ }
+ if (!bounds.intersect(displBounds)) {
+ return false;
+ }
GrPaint paint;
SkMatrix offsetMatrix = GrEffect::MakeDivByTextureWHMatrix(displacement);
diff --git a/src/effects/SkDropShadowImageFilter.cpp b/src/effects/SkDropShadowImageFilter.cpp
index 40ab8cf641..94055ce8ae 100644
--- a/src/effects/SkDropShadowImageFilter.cpp
+++ b/src/effects/SkDropShadowImageFilter.cpp
@@ -66,7 +66,9 @@ bool SkDropShadowImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& source
return false;
SkIRect bounds;
- if (!this->applyCropRect(ctx, src, srcOffset, &bounds)) {
+ src.getBounds(&bounds);
+ bounds.offset(srcOffset);
+ if (!this->applyCropRect(&bounds, ctx.ctm())) {
return false;
}
@@ -88,8 +90,7 @@ bool SkDropShadowImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& source
paint.setXfermodeMode(SkXfermode::kSrcOver_Mode);
SkVector offsetVec, localOffsetVec = SkVector::Make(fDx, fDy);
ctx.ctm().mapVectors(&offsetVec, &localOffsetVec, 1);
- canvas.translate(SkIntToScalar(srcOffset.fX - bounds.fLeft),
- SkIntToScalar(srcOffset.fY - bounds.fTop));
+ canvas.translate(-SkIntToScalar(bounds.fLeft), -SkIntToScalar(bounds.fTop));
canvas.drawBitmap(src, offsetVec.fX, offsetVec.fY, &paint);
canvas.drawBitmap(src, 0, 0);
*result = device->accessBitmap(false);
diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp
index 54bb1c890b..206be1b62d 100644
--- a/src/effects/SkLightingImageFilter.cpp
+++ b/src/effects/SkLightingImageFilter.cpp
@@ -946,17 +946,19 @@ bool SkDiffuseLightingImageFilter::onFilterImage(Proxy* proxy,
if (src.colorType() != kPMColor_SkColorType) {
return false;
}
- SkIRect bounds;
- if (!this->applyCropRect(ctx, proxy, src, &srcOffset, &bounds, &src)) {
+ SkAutoLockPixels alp(src);
+ if (!src.getPixels()) {
return false;
}
- if (bounds.width() < 2 || bounds.height() < 2) {
+ SkIRect bounds;
+ src.getBounds(&bounds);
+ bounds.offset(srcOffset);
+ if (!this->applyCropRect(&bounds, ctx.ctm())) {
return false;
}
- SkAutoLockPixels alp(src);
- if (!src.getPixels()) {
+ if (bounds.width() < 2 || bounds.height() < 2) {
return false;
}
@@ -1037,18 +1039,19 @@ bool SkSpecularLightingImageFilter::onFilterImage(Proxy* proxy,
if (src.colorType() != kPMColor_SkColorType) {
return false;
}
-
- SkIRect bounds;
- if (!this->applyCropRect(ctx, proxy, src, &srcOffset, &bounds, &src)) {
+ SkAutoLockPixels alp(src);
+ if (!src.getPixels()) {
return false;
}
- if (bounds.width() < 2 || bounds.height() < 2) {
+ SkIRect bounds;
+ src.getBounds(&bounds);
+ bounds.offset(srcOffset);
+ if (!this->applyCropRect(&bounds, ctx.ctm())) {
return false;
}
- SkAutoLockPixels alp(src);
- if (!src.getPixels()) {
+ if (bounds.width() < 2 || bounds.height() < 2) {
return false;
}
diff --git a/src/effects/SkMatrixConvolutionImageFilter.cpp b/src/effects/SkMatrixConvolutionImageFilter.cpp
index 7b9812ddbc..1df1ff9de0 100644
--- a/src/effects/SkMatrixConvolutionImageFilter.cpp
+++ b/src/effects/SkMatrixConvolutionImageFilter.cpp
@@ -265,7 +265,9 @@ bool SkMatrixConvolutionImageFilter::onFilterImage(Proxy* proxy,
}
SkIRect bounds;
- if (!this->applyCropRect(ctx, proxy, src, &srcOffset, &bounds, &src)) {
+ src.getBounds(&bounds);
+ bounds.offset(srcOffset);
+ if (!this->applyCropRect(&bounds, ctx.ctm())) {
return false;
}
diff --git a/src/effects/SkMergeImageFilter.cpp b/src/effects/SkMergeImageFilter.cpp
index adf9afe9b3..ff36e5b068 100755
--- a/src/effects/SkMergeImageFilter.cpp
+++ b/src/effects/SkMergeImageFilter.cpp
@@ -73,7 +73,8 @@ bool SkMergeImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src,
}
SkIRect bounds;
- if (!this->applyCropRect(ctx, src, SkIPoint::Make(0, 0), &bounds)) {
+ src.getBounds(&bounds);
+ if (!this->applyCropRect(&bounds, ctx.ctm())) {
return false;
}
diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp
index fb69758edd..90940b9452 100644
--- a/src/effects/SkMorphologyImageFilter.cpp
+++ b/src/effects/SkMorphologyImageFilter.cpp
@@ -154,7 +154,9 @@ bool SkMorphologyImageFilter::filterImageGeneric(SkMorphologyImageFilter::Proc p
}
SkIRect bounds;
- if (!this->applyCropRect(ctx, proxy, src, &srcOffset, &bounds, &src)) {
+ src.getBounds(&bounds);
+ bounds.offset(srcOffset);
+ if (!this->applyCropRect(&bounds, ctx.ctm())) {
return false;
}
@@ -545,7 +547,9 @@ bool SkMorphologyImageFilter::filterImageGPUGeneric(bool dilate,
return false;
}
SkIRect bounds;
- if (!this->applyCropRect(ctx, proxy, input, &srcOffset, &bounds, &input)) {
+ input.getBounds(&bounds);
+ bounds.offset(srcOffset);
+ if (!this->applyCropRect(&bounds, ctx.ctm())) {
return false;
}
SkVector radius = SkVector::Make(SkIntToScalar(this->radius().width()),
diff --git a/src/effects/SkOffsetImageFilter.cpp b/src/effects/SkOffsetImageFilter.cpp
index ae35a4ca2f..98eb05bf1d 100644
--- a/src/effects/SkOffsetImageFilter.cpp
+++ b/src/effects/SkOffsetImageFilter.cpp
@@ -42,7 +42,10 @@ bool SkOffsetImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& source,
}
SkIRect bounds;
- if (!this->applyCropRect(ctx, src, srcOffset, &bounds)) {
+ src.getBounds(&bounds);
+ bounds.offset(srcOffset);
+
+ if (!applyCropRect(&bounds, ctx.ctm())) {
return false;
}
diff --git a/src/effects/SkRectShaderImageFilter.cpp b/src/effects/SkRectShaderImageFilter.cpp
index 13e59c2c27..dad0e02525 100644
--- a/src/effects/SkRectShaderImageFilter.cpp
+++ b/src/effects/SkRectShaderImageFilter.cpp
@@ -56,7 +56,8 @@ bool SkRectShaderImageFilter::onFilterImage(Proxy* proxy,
SkBitmap* result,
SkIPoint* offset) const {
SkIRect bounds;
- if (!this->applyCropRect(ctx, source, SkIPoint::Make(0, 0), &bounds)) {
+ source.getBounds(&bounds);
+ if (!this->applyCropRect(&bounds, ctx.ctm())) {
return false;
}
diff --git a/src/effects/SkXfermodeImageFilter.cpp b/src/effects/SkXfermodeImageFilter.cpp
index 901353fabe..ebfd16c4db 100644
--- a/src/effects/SkXfermodeImageFilter.cpp
+++ b/src/effects/SkXfermodeImageFilter.cpp
@@ -62,13 +62,14 @@ bool SkXfermodeImageFilter::onFilterImage(Proxy* proxy,
}
SkIRect bounds, foregroundBounds;
- if (!applyCropRect(ctx, foreground, foregroundOffset, &foregroundBounds)) {
- return false;
- }
- if (!applyCropRect(ctx, background, backgroundOffset, &bounds)) {
+ background.getBounds(&bounds);
+ bounds.offset(backgroundOffset);
+ foreground.getBounds(&foregroundBounds);
+ foregroundBounds.offset(foregroundOffset);
+ bounds.join(foregroundBounds);
+ if (!applyCropRect(&bounds, ctx.ctm())) {
return false;
}
- bounds.join(foregroundBounds);
SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(), bounds.height()));
if (NULL == device.get()) {