aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
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 /src
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
Diffstat (limited to 'src')
-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
12 files changed, 95 insertions, 114 deletions
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()) {