diff --git a/experimental/PdfViewer/SkTrackDevice.cpp b/experimental/PdfViewer/SkTrackDevice.cpp index b7f6d62603..877b9cb415 100644 --- a/experimental/PdfViewer/SkTrackDevice.cpp +++ b/experimental/PdfViewer/SkTrackDevice.cpp @@ -1,2 +1,3 @@ #include "SkTrackDevice.h" + diff --git a/experimental/PdfViewer/SkTracker.cpp b/experimental/PdfViewer/SkTracker.cpp index b7f56bd176..89f9012306 100644 --- a/experimental/PdfViewer/SkTracker.cpp +++ b/experimental/PdfViewer/SkTracker.cpp @@ -1,2 +1,3 @@ #include "SkTracker.h" + diff --git a/gm/imagefilterscropped.cpp b/gm/imagefilterscropped.cpp deleted file mode 100644 index f6045f61a4..0000000000 --- a/gm/imagefilterscropped.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright 2011 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 "SkBlurImageFilter.h" -#include "SkColorFilterImageFilter.h" -#include "SkTestImageFilters.h" - -/////////////////////////////////////////////////////////////////////////////// - -static void draw_paint(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { - SkPaint paint; - paint.setImageFilter(imf); - paint.setColor(SK_ColorBLACK); - canvas->save(); - canvas->clipRect(r); - canvas->drawPaint(paint); - canvas->restore(); -} - -static void draw_path(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { - SkPaint paint; - paint.setColor(SK_ColorMAGENTA); - paint.setImageFilter(imf); - paint.setAntiAlias(true); - canvas->save(); - canvas->clipRect(r); - canvas->drawCircle(r.centerX(), r.centerY(), r.width()*2/5, paint); - canvas->restore(); -} - -static void draw_text(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { - SkPaint paint; - paint.setImageFilter(imf); - paint.setColor(SK_ColorGREEN); - paint.setAntiAlias(true); - paint.setTextSize(r.height()/2); - paint.setTextAlign(SkPaint::kCenter_Align); - canvas->save(); - canvas->clipRect(r); - canvas->drawText("Text", 4, r.centerX(), r.centerY(), paint); - canvas->restore(); -} - -static void draw_bitmap(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { - SkPaint paint; - - SkIRect bounds; - r.roundOut(&bounds); - - SkBitmap bm; - bm.setConfig(SkBitmap::kARGB_8888_Config, bounds.width(), bounds.height()); - bm.allocPixels(); - bm.eraseColor(SK_ColorTRANSPARENT); - SkCanvas c(bm); - draw_path(&c, r, NULL); - - paint.setImageFilter(imf); - canvas->save(); - canvas->clipRect(r); - canvas->drawBitmap(bm, 0, 0, &paint); - canvas->restore(); -} - -static void draw_sprite(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { - SkPaint paint; - - SkIRect bounds; - r.roundOut(&bounds); - - SkBitmap bm; - bm.setConfig(SkBitmap::kARGB_8888_Config, bounds.width(), bounds.height()); - bm.allocPixels(); - bm.eraseColor(SK_ColorRED); - SkCanvas c(bm); - - SkIRect cropRect = SkIRect::MakeXYWH(10, 10, 44, 44); - paint.setColor(SK_ColorGREEN); - c.drawRect(SkRect::Make(cropRect), paint); - - paint.setImageFilter(imf); - SkPoint loc = { r.fLeft, r.fTop }; - canvas->getTotalMatrix().mapPoints(&loc, 1); - canvas->drawSprite(bm, - SkScalarRoundToInt(loc.fX), SkScalarRoundToInt(loc.fY), - &paint); -} - -/////////////////////////////////////////////////////////////////////////////// - -class ImageFiltersCroppedGM : public skiagm::GM { -public: - ImageFiltersCroppedGM () {} - -protected: - - virtual SkString onShortName() { - return SkString("imagefilterscropped"); - } - - virtual SkISize onISize() { return SkISize::Make(700, 460); } - - void draw_frame(SkCanvas* canvas, const SkRect& r) { - SkPaint paint; - paint.setStyle(SkPaint::kStroke_Style); - paint.setColor(SK_ColorRED); - canvas->drawRect(r, paint); - } - - virtual uint32_t onGetFlags() const { - // Because of the use of drawSprite, this test is excluded - // from scaled replay tests because drawSprite ignores the - // reciprocal scale that is applied at record time, which is - // the intended behavior of drawSprite. - return kSkipScaledReplay_Flag; - } - - virtual void onDraw(SkCanvas* canvas) { - void (*drawProc[])(SkCanvas*, const SkRect&, SkImageFilter*) = { - draw_sprite, draw_bitmap, draw_path, draw_paint, draw_text - }; - - SkColorFilter* cf = SkColorFilter::CreateModeFilter(SK_ColorRED, - SkXfermode::kSrcIn_Mode); - SkIRect cropRect = SkIRect::MakeXYWH(10, 10, 44, 44); - SkIRect bogusRect = SkIRect::MakeXYWH(-100, -100, 10, 10); - - SkImageFilter* filters[] = { - NULL, - SkColorFilterImageFilter::Create(cf, NULL, &cropRect), - new SkBlurImageFilter(8.0f, 0.0f, NULL, &cropRect), - new SkBlurImageFilter(0.0f, 8.0f, NULL, &cropRect), - new SkBlurImageFilter(8.0f, 8.0f, NULL, &cropRect), - new SkBlurImageFilter(8.0f, 8.0f, NULL, &bogusRect), - SkColorFilterImageFilter::Create(cf, NULL, &bogusRect), - }; - cf->unref(); - - SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); - SkScalar MARGIN = SkIntToScalar(16); - SkScalar DX = r.width() + MARGIN; - SkScalar DY = r.height() + MARGIN; - - canvas->translate(MARGIN, MARGIN); - for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { - canvas->save(); - for (size_t j = 0; j < SK_ARRAY_COUNT(drawProc); ++j) { - drawProc[j](canvas, r, filters[i]); - canvas->translate(0, DY); - } - canvas->restore(); - canvas->translate(DX, 0); - } - - for(size_t j = 0; j < SK_ARRAY_COUNT(filters); ++j) { - SkSafeUnref(filters[j]); - } - } - -private: - typedef GM INHERITED; -}; - -/////////////////////////////////////////////////////////////////////////////// - -static skiagm::GM* MyFactory(void*) { return new ImageFiltersCroppedGM; } -static skiagm::GMRegistry reg(MyFactory); diff --git a/gyp/gmslides.gypi b/gyp/gmslides.gypi index 46b1bd5bfc..9d335496eb 100644 --- a/gyp/gmslides.gypi +++ b/gyp/gmslides.gypi @@ -63,7 +63,6 @@ '../gm/lighting.cpp', '../gm/image.cpp', '../gm/imagefiltersbase.cpp', - '../gm/imagefilterscropped.cpp', '../gm/imagefiltersgraph.cpp', '../gm/internal_links.cpp', '../gm/lcdtext.cpp', diff --git a/include/core/SkImageFilter.h b/include/core/SkImageFilter.h index e467761a1f..fe383ae9e3 100644 --- a/include/core/SkImageFilter.h +++ b/include/core/SkImageFilter.h @@ -9,13 +9,13 @@ #define SkImageFilter_DEFINED #include "SkFlattenable.h" -#include "SkRect.h" class SkBitmap; class SkColorFilter; class SkDevice; class SkMatrix; struct SkIPoint; +struct SkIRect; class SkShader; class GrEffectRef; class GrTexture; @@ -139,25 +139,14 @@ public: return fInputs[i]; } - /** - * Returns the crop rectangle of this filter. This is set at construction - * time, and determines which pixels from the input image will - * be processed. The size of this rectangle should be used as the size - * of the destination image. The origin of this rect should be used to - * offset access to the input images, and should also be added to the - * "offset" parameter in onFilterImage and filterImageGPU(). (The latter - * ensures that the resulting buffer is drawn in the correct location.) - */ - const SkIRect& cropRect() const { return fCropRect; } - protected: - SkImageFilter(int inputCount, SkImageFilter** inputs, const SkIRect* cropRect = NULL); + SkImageFilter(int inputCount, SkImageFilter** inputs); // Convenience constructor for 1-input filters. - explicit SkImageFilter(SkImageFilter* input, const SkIRect* cropRect = NULL); + explicit SkImageFilter(SkImageFilter* input); // Convenience constructor for 2-input filters. - SkImageFilter(SkImageFilter* input1, SkImageFilter* input2, const SkIRect* cropRect = NULL); + SkImageFilter(SkImageFilter* input1, SkImageFilter* input2); virtual ~SkImageFilter(); @@ -171,15 +160,10 @@ protected: // Default impl copies src into dst and returns true virtual bool onFilterBounds(const SkIRect&, const SkMatrix&, SkIRect*); - // Sets rect to the intersection of rect and the crop rect. If there - // is no overlap, returns false and leaves rect unchanged. - bool applyCropRect(SkIRect* rect) const; - private: typedef SkFlattenable INHERITED; int fInputCount; SkImageFilter** fInputs; - SkIRect fCropRect; }; #endif diff --git a/include/core/SkRect.h b/include/core/SkRect.h index 9f3b59a38f..b2f515129d 100644 --- a/include/core/SkRect.h +++ b/include/core/SkRect.h @@ -26,12 +26,6 @@ struct SK_API SkIRect { return r; } - static SkIRect SK_WARN_UNUSED_RESULT MakeLargest() { - SkIRect r; - r.setLargest(); - return r; - } - static SkIRect SK_WARN_UNUSED_RESULT MakeWH(int32_t w, int32_t h) { SkIRect r; r.set(0, 0, w, h); @@ -100,11 +94,6 @@ struct SK_API SkIRect { */ bool isEmpty() const { return fLeft >= fRight || fTop >= fBottom; } - bool isLargest() const { return SK_MinS32 == fLeft && - SK_MinS32 == fTop && - SK_MaxS32 == fRight && - SK_MaxS32 == fBottom; } - friend bool operator==(const SkIRect& a, const SkIRect& b) { return !memcmp(&a, &b, sizeof(a)); } diff --git a/include/effects/SkBicubicImageFilter.h b/include/effects/SkBicubicImageFilter.h index 6696365433..75cd27df74 100644 --- a/include/effects/SkBicubicImageFilter.h +++ b/include/effects/SkBicubicImageFilter.h @@ -27,8 +27,7 @@ public: passed to filterImage() is used instead. */ - SkBicubicImageFilter(const SkSize& scale, - const SkScalar coefficients[16], + SkBicubicImageFilter(const SkSize& scale, const SkScalar coefficients[16], SkImageFilter* input = NULL); static SkBicubicImageFilter* CreateMitchell(const SkSize& scale, SkImageFilter* input = NULL); virtual ~SkBicubicImageFilter(); diff --git a/include/effects/SkBlurImageFilter.h b/include/effects/SkBlurImageFilter.h index f2677353e0..56b1f3543e 100644 --- a/include/effects/SkBlurImageFilter.h +++ b/include/effects/SkBlurImageFilter.h @@ -13,10 +13,7 @@ class SK_API SkBlurImageFilter : public SkImageFilter { public: - SkBlurImageFilter(SkScalar sigmaX, - SkScalar sigmaY, - SkImageFilter* input = NULL, - const SkIRect* cropRect = NULL); + SkBlurImageFilter(SkScalar sigmaX, SkScalar sigmaY, SkImageFilter* input = NULL); SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBlurImageFilter) diff --git a/include/effects/SkColorFilterImageFilter.h b/include/effects/SkColorFilterImageFilter.h index 314ab070b6..2e5e59c3c0 100755 --- a/include/effects/SkColorFilterImageFilter.h +++ b/include/effects/SkColorFilterImageFilter.h @@ -14,9 +14,7 @@ class SkColorFilter; class SK_API SkColorFilterImageFilter : public SkImageFilter { public: - static SkColorFilterImageFilter* Create(SkColorFilter* cf, - SkImageFilter* input = NULL, - const SkIRect* cropRect = NULL); + static SkColorFilterImageFilter* Create(SkColorFilter* cf, SkImageFilter* input = NULL); virtual ~SkColorFilterImageFilter(); SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkColorFilterImageFilter) @@ -31,9 +29,7 @@ protected: virtual bool asColorFilter(SkColorFilter**) const SK_OVERRIDE; private: - SkColorFilterImageFilter(SkColorFilter* cf, - SkImageFilter* input, - const SkIRect* cropRect = NULL); + SkColorFilterImageFilter(SkColorFilter* cf, SkImageFilter* input); SkColorFilter* fColorFilter; typedef SkImageFilter INHERITED; diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp index ab3babaad7..37c5026797 100644 --- a/src/core/SkBitmapProcState.cpp +++ b/src/core/SkBitmapProcState.cpp @@ -94,13 +94,13 @@ static bool valid_for_filtering(unsigned dimension) { static bool effective_matrix_scale_sqrd(const SkMatrix& mat) { SkPoint v1, v2; - + v1.fX = mat.getScaleX(); v1.fY = mat.getSkewY(); - + v2.fX = mat.getSkewX(); v2.fY = mat.getScaleY(); - + return SkMaxScalar(v1.lengthSqd(), v2.lengthSqd()); } @@ -216,7 +216,7 @@ void SkBitmapProcState::possiblyScaleImage() { // want to reqeust mipmaps fFilterLevel = SkPaint::kMedium_FilterLevel; } - + SkASSERT(SkPaint::kMedium_FilterLevel == fFilterLevel); /** diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp index ff060a1a52..ddd6449490 100644 --- a/src/core/SkImageFilter.cpp +++ b/src/core/SkImageFilter.cpp @@ -18,27 +18,22 @@ SK_DEFINE_INST_COUNT(SkImageFilter) -SkImageFilter::SkImageFilter(int inputCount, SkImageFilter** inputs, const SkIRect* cropRect) - : fInputCount(inputCount), - fInputs(new SkImageFilter*[inputCount]), - fCropRect(cropRect ? *cropRect : SkIRect::MakeLargest()) { +SkImageFilter::SkImageFilter(int inputCount, SkImageFilter** inputs) + : fInputCount(inputCount), fInputs(new SkImageFilter*[inputCount]) { for (int i = 0; i < inputCount; ++i) { fInputs[i] = inputs[i]; SkSafeRef(fInputs[i]); } } -SkImageFilter::SkImageFilter(SkImageFilter* input, const SkIRect* cropRect) - : fInputCount(1), - fInputs(new SkImageFilter*[1]), - fCropRect(cropRect ? *cropRect : SkIRect::MakeLargest()) { +SkImageFilter::SkImageFilter(SkImageFilter* input) + : fInputCount(1), fInputs(new SkImageFilter*[1]) { fInputs[0] = input; SkSafeRef(fInputs[0]); } -SkImageFilter::SkImageFilter(SkImageFilter* input1, SkImageFilter* input2, const SkIRect* cropRect) - : fInputCount(2), fInputs(new SkImageFilter*[2]), - fCropRect(cropRect ? *cropRect : SkIRect::MakeLargest()) { +SkImageFilter::SkImageFilter(SkImageFilter* input1, SkImageFilter* input2) + : fInputCount(2), fInputs(new SkImageFilter*[2]) { fInputs[0] = input1; fInputs[1] = input2; SkSafeRef(fInputs[0]); @@ -61,7 +56,6 @@ SkImageFilter::SkImageFilter(SkFlattenableReadBuffer& buffer) fInputs[i] = NULL; } } - buffer.readIRect(&fCropRect); } void SkImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { @@ -73,7 +67,6 @@ void SkImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { buffer.writeFlattenable(input); } } - buffer.writeIRect(fCropRect); } bool SkImageFilter::filterImage(Proxy* proxy, const SkBitmap& src, @@ -144,10 +137,6 @@ bool SkImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, SkBitmap* #endif } -bool SkImageFilter::applyCropRect(SkIRect* rect) const { - return rect->intersect(fCropRect); -} - bool SkImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& ctm, SkIRect* dst) { *dst = src; diff --git a/src/effects/SkBlurImageFilter.cpp b/src/effects/SkBlurImageFilter.cpp index f75d0c16d5..157a0c3335 100644 --- a/src/effects/SkBlurImageFilter.cpp +++ b/src/effects/SkBlurImageFilter.cpp @@ -21,11 +21,8 @@ SkBlurImageFilter::SkBlurImageFilter(SkFlattenableReadBuffer& buffer) fSigma.fHeight = buffer.readScalar(); } -SkBlurImageFilter::SkBlurImageFilter(SkScalar sigmaX, - SkScalar sigmaY, - SkImageFilter* input, - const SkIRect* cropRect) - : INHERITED(input, cropRect), fSigma(SkSize::Make(sigmaX, sigmaY)) { +SkBlurImageFilter::SkBlurImageFilter(SkScalar sigmaX, SkScalar sigmaY, SkImageFilter* input) + : INHERITED(input), fSigma(SkSize::Make(sigmaX, sigmaY)) { SkASSERT(sigmaX >= 0 && sigmaY >= 0); } @@ -36,13 +33,13 @@ void SkBlurImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { } static void boxBlurX(const SkBitmap& src, SkBitmap* dst, int kernelSize, - int leftOffset, int rightOffset, const SkIRect& bounds) + int leftOffset, int rightOffset) { - int width = bounds.width(), height = bounds.height(); + int width = src.width(), height = src.height(); int rightBorder = SkMin32(rightOffset + 1, width); for (int y = 0; y < height; ++y) { int sumA = 0, sumR = 0, sumG = 0, sumB = 0; - SkPMColor* p = src.getAddr32(bounds.fLeft, y + bounds.fTop); + SkPMColor* p = src.getAddr32(0, y); for (int i = 0; i < rightBorder; ++i) { sumA += SkGetPackedA32(*p); sumR += SkGetPackedR32(*p); @@ -51,7 +48,7 @@ static void boxBlurX(const SkBitmap& src, SkBitmap* dst, int kernelSize, p++; } - const SkColor* sptr = src.getAddr32(bounds.fLeft, bounds.fTop + y); + const SkColor* sptr = src.getAddr32(0, y); SkColor* dptr = dst->getAddr32(0, y); for (int x = 0; x < width; ++x) { *dptr = SkPackARGB32(sumA / kernelSize, @@ -79,15 +76,15 @@ static void boxBlurX(const SkBitmap& src, SkBitmap* dst, int kernelSize, } static void boxBlurY(const SkBitmap& src, SkBitmap* dst, int kernelSize, - int topOffset, int bottomOffset, const SkIRect& bounds) + int topOffset, int bottomOffset) { - int width = bounds.width(), height = bounds.height(); + int width = src.width(), height = src.height(); int bottomBorder = SkMin32(bottomOffset + 1, height); int srcStride = src.rowBytesAsPixels(); int dstStride = dst->rowBytesAsPixels(); for (int x = 0; x < width; ++x) { int sumA = 0, sumR = 0, sumG = 0, sumB = 0; - SkColor* p = src.getAddr32(bounds.fLeft + x, bounds.fTop); + SkColor* p = src.getAddr32(x, 0); for (int i = 0; i < bottomBorder; ++i) { sumA += SkGetPackedA32(*p); sumR += SkGetPackedR32(*p); @@ -96,7 +93,7 @@ static void boxBlurY(const SkBitmap& src, SkBitmap* dst, int kernelSize, p += srcStride; } - const SkColor* sptr = src.getAddr32(bounds.fLeft + x, bounds.fTop); + const SkColor* sptr = src.getAddr32(x, 0); SkColor* dptr = dst->getAddr32(x, 0); for (int y = 0; y < height; ++y) { *dptr = SkPackARGB32(sumA / kernelSize, @@ -156,14 +153,7 @@ bool SkBlurImageFilter::onFilterImage(Proxy* proxy, return false; } - SkIRect srcBounds, dstBounds; - src.getBounds(&srcBounds); - if (!this->applyCropRect(&srcBounds)) { - return false; - } - - dst->setConfig(src.config(), srcBounds.width(), srcBounds.height()); - dst->getBounds(&dstBounds); + dst->setConfig(src.config(), src.width(), src.height()); dst->allocPixels(); int kernelSizeX, kernelSizeX3, lowOffsetX, highOffsetX; int kernelSizeY, kernelSizeY3, lowOffsetY, highOffsetY; @@ -186,23 +176,21 @@ bool SkBlurImageFilter::onFilterImage(Proxy* proxy, } if (kernelSizeX > 0 && kernelSizeY > 0) { - boxBlurX(src, &temp, kernelSizeX, lowOffsetX, highOffsetX, srcBounds); - boxBlurY(temp, dst, kernelSizeY, lowOffsetY, highOffsetY, dstBounds); - boxBlurX(*dst, &temp, kernelSizeX, highOffsetX, lowOffsetX, dstBounds); - boxBlurY(temp, dst, kernelSizeY, highOffsetY, lowOffsetY, dstBounds); - boxBlurX(*dst, &temp, kernelSizeX3, highOffsetX, highOffsetX, dstBounds); - boxBlurY(temp, dst, kernelSizeY3, highOffsetY, highOffsetY, dstBounds); + boxBlurX(src, &temp, kernelSizeX, lowOffsetX, highOffsetX); + boxBlurY(temp, dst, kernelSizeY, lowOffsetY, highOffsetY); + boxBlurX(*dst, &temp, kernelSizeX, highOffsetX, lowOffsetX); + boxBlurY(temp, dst, kernelSizeY, highOffsetY, lowOffsetY); + boxBlurX(*dst, &temp, kernelSizeX3, highOffsetX, highOffsetX); + boxBlurY(temp, dst, kernelSizeY3, highOffsetY, highOffsetY); } else if (kernelSizeX > 0) { - boxBlurX(src, dst, kernelSizeX, lowOffsetX, highOffsetX, srcBounds); - boxBlurX(*dst, &temp, kernelSizeX, highOffsetX, lowOffsetX, dstBounds); - boxBlurX(temp, dst, kernelSizeX3, highOffsetX, highOffsetX, dstBounds); + boxBlurX(src, dst, kernelSizeX, lowOffsetX, highOffsetX); + boxBlurX(*dst, &temp, kernelSizeX, highOffsetX, lowOffsetX); + boxBlurX(temp, dst, kernelSizeX3, highOffsetX, highOffsetX); } else if (kernelSizeY > 0) { - boxBlurY(src, dst, kernelSizeY, lowOffsetY, highOffsetY, srcBounds); - boxBlurY(*dst, &temp, kernelSizeY, highOffsetY, lowOffsetY, dstBounds); - boxBlurY(temp, dst, kernelSizeY3, highOffsetY, highOffsetY, dstBounds); + boxBlurY(src, dst, kernelSizeY, lowOffsetY, highOffsetY); + boxBlurY(*dst, &temp, kernelSizeY, highOffsetY, lowOffsetY); + boxBlurY(temp, dst, kernelSizeY3, highOffsetY, highOffsetY); } - offset->fX += srcBounds.fLeft; - offset->fY += srcBounds.fTop; return true; } @@ -214,17 +202,12 @@ bool SkBlurImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, SkBitm return false; } GrTexture* source = input.getTexture(); - SkIRect rect; + SkRect rect; src.getBounds(&rect); - if (!this->applyCropRect(&rect)) { - return false; - } SkAutoTUnref tex(SkGpuBlurUtils::GaussianBlur(source->getContext(), - source, false, SkRect::Make(rect), + source, false, rect, fSigma.width(), fSigma.height())); - offset->fX += rect.fLeft; - offset->fY += rect.fTop; - return SkImageFilterUtils::WrapTexture(tex, rect.width(), rect.height(), result); + return SkImageFilterUtils::WrapTexture(tex, src.width(), src.height(), result); #else SkDEBUGFAIL("Should not call in GPU-less build"); return false; diff --git a/src/effects/SkColorFilterImageFilter.cpp b/src/effects/SkColorFilterImageFilter.cpp index a24934e0e2..1d3cfee1c3 100755 --- a/src/effects/SkColorFilterImageFilter.cpp +++ b/src/effects/SkColorFilterImageFilter.cpp @@ -57,7 +57,7 @@ bool matrix_needs_clamping(SkScalar matrix[20]) { }; SkColorFilterImageFilter* SkColorFilterImageFilter::Create(SkColorFilter* cf, - SkImageFilter* input, const SkIRect* cropRect) { + SkImageFilter* input) { SkASSERT(cf); SkScalar colorMatrix[20], inputMatrix[20]; SkColorFilter* inputColorFilter; @@ -69,15 +69,13 @@ SkColorFilterImageFilter* SkColorFilterImageFilter::Create(SkColorFilter* cf, SkScalar combinedMatrix[20]; mult_color_matrix(inputMatrix, colorMatrix, combinedMatrix); SkAutoTUnref newCF(SkNEW_ARGS(SkColorMatrixFilter, (combinedMatrix))); - return SkNEW_ARGS(SkColorFilterImageFilter, (newCF, input->getInput(0), cropRect)); + return SkNEW_ARGS(SkColorFilterImageFilter, (newCF, input->getInput(0))); } } - return SkNEW_ARGS(SkColorFilterImageFilter, (cf, input, cropRect)); + return SkNEW_ARGS(SkColorFilterImageFilter, (cf, input)); } -SkColorFilterImageFilter::SkColorFilterImageFilter(SkColorFilter* cf, - SkImageFilter* input, const SkIRect* cropRect) - : INHERITED(input, cropRect), fColorFilter(cf) { +SkColorFilterImageFilter::SkColorFilterImageFilter(SkColorFilter* cf, SkImageFilter* input) : INHERITED(input), fColorFilter(cf) { SkASSERT(cf); SkSafeRef(cf); } @@ -105,31 +103,22 @@ bool SkColorFilterImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& sourc return false; } - SkIRect bounds; - src.getBounds(&bounds); - if (!this->applyCropRect(&bounds)) { - return false; - } - - SkAutoTUnref device(proxy->createDevice(bounds.width(), bounds.height())); + SkAutoTUnref device(proxy->createDevice(src.width(), src.height())); SkCanvas canvas(device.get()); SkPaint paint; paint.setXfermodeMode(SkXfermode::kSrc_Mode); paint.setColorFilter(fColorFilter); - canvas.drawSprite(src, -bounds.fLeft, -bounds.fTop, &paint); + canvas.drawSprite(src, 0, 0, &paint); *result = device.get()->accessBitmap(false); - loc->fX += bounds.fLeft; - loc->fY += bounds.fTop; return true; } bool SkColorFilterImageFilter::asColorFilter(SkColorFilter** filter) const { - if (filter && cropRect().isLargest()) { + if (filter) { *filter = fColorFilter; fColorFilter->ref(); - return true; } - return false; + return true; } diff --git a/src/effects/SkGpuBlurUtils.cpp b/src/effects/SkGpuBlurUtils.cpp index 5b52ad3cea..479648850c 100644 --- a/src/effects/SkGpuBlurUtils.cpp +++ b/src/effects/SkGpuBlurUtils.cpp @@ -11,7 +11,6 @@ #if SK_SUPPORT_GPU #include "effects/GrConvolutionEffect.h" -#include "effects/GrTextureDomainEffect.h" #include "GrContext.h" #endif @@ -41,29 +40,18 @@ static float adjust_sigma(float sigma, int *scaleFactor, int *radius) { static void convolve_gaussian(GrContext* context, GrTexture* texture, - const SkRect& srcRect, - const SkRect& dstRect, + const SkRect& rect, float sigma, int radius, Gr1DKernelEffect::Direction direction) { GrPaint paint; - paint.reset(); - float cropRect[4] = { 0.0f, 1.0f, 0.0f, 1.0f }; - if (direction == Gr1DKernelEffect::kX_Direction) { - cropRect[0] = SkScalarToFloat(srcRect.left()) / texture->width(); - cropRect[1] = SkScalarToFloat(srcRect.right()) / texture->width(); - } else { - cropRect[2] = SkScalarToFloat(srcRect.top()) / texture->height(); - cropRect[3] = SkScalarToFloat(srcRect.bottom()) / texture->height(); - } SkAutoTUnref conv(GrConvolutionEffect::CreateGaussian(texture, direction, radius, - sigma, - cropRect)); + sigma)); paint.addColorEffect(conv); - context->drawRectToRect(paint, dstRect, srcRect); + context->drawRect(paint, rect); } GrTexture* GaussianBlur(GrContext* context, @@ -91,7 +79,7 @@ GrTexture* GaussianBlur(GrContext* context, scale_rect(&srcRect, static_cast(scaleFactorX), static_cast(scaleFactorY)); - GrContext::AutoClip acs(context, SkRect::MakeWH(srcRect.width(), srcRect.height())); + GrContext::AutoClip acs(context, srcRect); GrAssert(kBGRA_8888_GrPixelConfig == srcTexture->config() || kRGBA_8888_GrPixelConfig == srcTexture->config() || @@ -116,25 +104,10 @@ GrTexture* GaussianBlur(GrContext* context, matrix.setIDiv(srcTexture->width(), srcTexture->height()); context->setRenderTarget(dstTexture->asRenderTarget()); SkRect dstRect(srcRect); - if (i == 1) { - dstRect.offset(-dstRect.fLeft, -dstRect.fTop); - SkRect domain; - matrix.mapRect(&domain, rect); - domain.inset(i < scaleFactorX ? SK_ScalarHalf / srcTexture->width() : 0.0f, - i < scaleFactorY ? SK_ScalarHalf / srcTexture->height() : 0.0f); - SkAutoTUnref effect(GrTextureDomainEffect::Create( - srcTexture, - matrix, - domain, - GrTextureDomainEffect::kDecal_WrapMode, - true)); - paint.addColorEffect(effect); - } else { - GrTextureParams params(SkShader::kClamp_TileMode, true); - paint.addColorTextureEffect(srcTexture, matrix, params); - } scale_rect(&dstRect, i < scaleFactorX ? 0.5f : 1.0f, i < scaleFactorY ? 0.5f : 1.0f); + GrTextureParams params(SkShader::kClamp_TileMode, true); + paint.addColorTextureEffect(srcTexture, matrix, params); context->drawRectToRect(paint, dstRect, srcRect); srcRect = dstRect; srcTexture = dstTexture; @@ -153,11 +126,9 @@ GrTexture* GaussianBlur(GrContext* context, context->clear(&clearRect, 0x0); } context->setRenderTarget(dstTexture->asRenderTarget()); - SkRect dstRect = SkRect::MakeWH(srcRect.width(), srcRect.height()); - convolve_gaussian(context, srcTexture, srcRect, dstRect, sigmaX, radiusX, + convolve_gaussian(context, srcTexture, srcRect, sigmaX, radiusX, Gr1DKernelEffect::kX_Direction); srcTexture = dstTexture; - srcRect = dstRect; SkTSwap(dstTexture, tempTexture); } @@ -171,11 +142,9 @@ GrTexture* GaussianBlur(GrContext* context, } context->setRenderTarget(dstTexture->asRenderTarget()); - SkRect dstRect = SkRect::MakeWH(srcRect.width(), srcRect.height()); - convolve_gaussian(context, srcTexture, srcRect, dstRect, sigmaY, radiusY, + convolve_gaussian(context, srcTexture, srcRect, sigmaY, radiusY, Gr1DKernelEffect::kY_Direction); srcTexture = dstTexture; - srcRect = dstRect; SkTSwap(dstTexture, tempTexture); } diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index 4456f513c4..eaac5ab12c 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -1387,7 +1387,7 @@ void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, SkAutoCachedTexture act(this, bitmap, NULL, &texture); SkImageFilter* filter = paint.getImageFilter(); - SkIPoint offset = SkIPoint::Make(left, top); + SkIPoint offset = SkIPoint::Make(0, 0); // This bitmap will own the filtered result as a texture. SkBitmap filteredBitmap; @@ -1396,8 +1396,6 @@ void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, texture = (GrTexture*) filteredBitmap.getTexture(); w = filteredBitmap.width(); h = filteredBitmap.height(); - } else { - return; } } @@ -1409,12 +1407,12 @@ void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, } fContext->drawRectToRect(grPaint, - SkRect::MakeXYWH(SkIntToScalar(offset.fX), - SkIntToScalar(offset.fY), + SkRect::MakeXYWH(SkIntToScalar(left), + SkIntToScalar(top), SkIntToScalar(w), SkIntToScalar(h)), - SkRect::MakeXYWH(0, - 0, + SkRect::MakeXYWH(SkIntToScalar(offset.fX), + SkIntToScalar(offset.fY), SK_Scalar1 * w / texture->width(), SK_Scalar1 * h / texture->height())); } @@ -1483,8 +1481,6 @@ void SkGpuDevice::drawDevice(const SkDraw& draw, SkDevice* device, h = filteredBitmap.height(); x += offset.fX; y += offset.fY; - } else { - return; } } diff --git a/src/gpu/effects/GrConvolutionEffect.cpp b/src/gpu/effects/GrConvolutionEffect.cpp index 5682b9c65c..380581fae3 100644 --- a/src/gpu/effects/GrConvolutionEffect.cpp +++ b/src/gpu/effects/GrConvolutionEffect.cpp @@ -37,7 +37,6 @@ private: int fRadius; UniformHandle fKernelUni; UniformHandle fImageIncrementUni; - UniformHandle fCropRectUni; GrGLEffectMatrix fEffectMatrix; typedef GrGLEffect INHERITED; @@ -48,7 +47,6 @@ GrGLConvolutionEffect::GrGLConvolutionEffect(const GrBackendEffectFactory& facto : INHERITED(factory) , fKernelUni(kInvalidUniformHandle) , fImageIncrementUni(kInvalidUniformHandle) - , fCropRectUni(kInvalidUniformHandle) , fEffectMatrix(drawEffect.castEffect().coordsType()) { const GrConvolutionEffect& c = drawEffect.castEffect(); fRadius = c.radius(); @@ -64,8 +62,6 @@ void GrGLConvolutionEffect::emitCode(GrGLShaderBuilder* builder, fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords); fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec2f_GrSLType, "ImageIncrement"); - fCropRectUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, - kVec4f_GrSLType, "CropRect"); fKernelUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_ShaderType, kFloat_GrSLType, "Kernel", this->width()); @@ -74,7 +70,6 @@ void GrGLConvolutionEffect::emitCode(GrGLShaderBuilder* builder, int width = this ->width(); const GrGLShaderVar& kernel = builder->getUniformVariable(fKernelUni); const char* imgInc = builder->getUniformCStr(fImageIncrementUni); - const char* cropRect = builder->getUniformCStr(fCropRectUni); builder->fsCodeAppendf("\t\tvec2 coord = %s - %d.0 * %s;\n", coords, fRadius, imgInc); @@ -86,11 +81,9 @@ void GrGLConvolutionEffect::emitCode(GrGLShaderBuilder* builder, kernel.appendArrayAccess(index.c_str(), &kernelIndex); builder->fsCodeAppendf("\t\t%s += ", outputColor); builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, samplers[0], "coord"); - builder->fsCodeAppendf(" * float(coord.x >= %s.x && coord.x <= %s.y && coord.y >= %s.z && coord.y <= %s.w) * %s;\n", - cropRect, cropRect, cropRect, cropRect, kernelIndex.c_str()); + builder->fsCodeAppendf(" * %s;\n", kernelIndex.c_str()); builder->fsCodeAppendf("\t\tcoord += %s;\n", imgInc); } - SkString modulate; GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); builder->fsCodeAppend(modulate.c_str()); @@ -103,26 +96,17 @@ void GrGLConvolutionEffect::setData(const GrGLUniformManager& uman, // the code we generated was for a specific kernel radius GrAssert(conv.radius() == fRadius); float imageIncrement[2] = { 0 }; - float ySign = texture.origin() != kTopLeft_GrSurfaceOrigin ? 1.0f : -1.0f; switch (conv.direction()) { case Gr1DKernelEffect::kX_Direction: imageIncrement[0] = 1.0f / texture.width(); break; case Gr1DKernelEffect::kY_Direction: - imageIncrement[1] = ySign / texture.height(); + imageIncrement[1] = 1.0f / texture.height(); break; default: GrCrash("Unknown filter direction."); } uman.set2fv(fImageIncrementUni, 0, 1, imageIncrement); - float c[4]; - memcpy(c, conv.cropRect(), sizeof(c)); - if (texture.origin() != kTopLeft_GrSurfaceOrigin) { - float tmp = 1.0f - c[2]; - c[2] = 1.0f - c[3]; - c[3] = tmp; - } - uman.set4fv(fCropRectUni, 0, 1, c); uman.set1fv(fKernelUni, 0, this->width(), conv.kernel()); fEffectMatrix.setData(uman, conv.getMatrix(), drawEffect, conv.texture(0)); } @@ -144,8 +128,7 @@ GrGLEffect::EffectKey GrGLConvolutionEffect::GenKey(const GrDrawEffect& drawEffe GrConvolutionEffect::GrConvolutionEffect(GrTexture* texture, Direction direction, int radius, - const float* kernel, - float cropRect[4]) + const float* kernel) : Gr1DKernelEffect(texture, direction, radius) { GrAssert(radius <= kMaxKernelRadius); GrAssert(NULL != kernel); @@ -153,14 +136,12 @@ GrConvolutionEffect::GrConvolutionEffect(GrTexture* texture, for (int i = 0; i < width; i++) { fKernel[i] = kernel[i]; } - memcpy(fCropRect, cropRect, sizeof(fCropRect)); } GrConvolutionEffect::GrConvolutionEffect(GrTexture* texture, Direction direction, int radius, - float gaussianSigma, - float cropRect[4]) + float gaussianSigma) : Gr1DKernelEffect(texture, direction, radius) { GrAssert(radius <= kMaxKernelRadius); int width = this->width(); @@ -179,7 +160,6 @@ GrConvolutionEffect::GrConvolutionEffect(GrTexture* texture, for (int i = 0; i < width; ++i) { fKernel[i] *= scale; } - memcpy(fCropRect, cropRect, sizeof(fCropRect)); } GrConvolutionEffect::~GrConvolutionEffect() { @@ -194,7 +174,6 @@ bool GrConvolutionEffect::onIsEqual(const GrEffect& sBase) const { return (this->texture(0) == s.texture(0) && this->radius() == s.radius() && this->direction() == s.direction() && - 0 == memcmp(fCropRect, s.fCropRect, sizeof(fCropRect)) && 0 == memcmp(fKernel, s.fKernel, this->width() * sizeof(float))); } @@ -211,13 +190,9 @@ GrEffectRef* GrConvolutionEffect::TestCreate(SkMWCRandom* random, Direction dir = random->nextBool() ? kX_Direction : kY_Direction; int radius = random->nextRangeU(1, kMaxKernelRadius); float kernel[kMaxKernelRadius]; - float cropRect[4]; for (int i = 0; i < kMaxKernelRadius; ++i) { kernel[i] = random->nextSScalar1(); } - for (int i = 0; i < 4; ++i) { - cropRect[i] = random->nextF(); - } - return GrConvolutionEffect::Create(textures[texIdx], dir, radius, kernel, cropRect); + return GrConvolutionEffect::Create(textures[texIdx], dir, radius,kernel); } diff --git a/src/gpu/effects/GrConvolutionEffect.h b/src/gpu/effects/GrConvolutionEffect.h index f75cfe9155..e4faa945b8 100644 --- a/src/gpu/effects/GrConvolutionEffect.h +++ b/src/gpu/effects/GrConvolutionEffect.h @@ -22,16 +22,11 @@ class GrConvolutionEffect : public Gr1DKernelEffect { public: /// Convolve with an arbitrary user-specified kernel - static GrEffectRef* Create(GrTexture* tex, - Direction dir, - int halfWidth, - const float* kernel, - float cropRect[4]) { + static GrEffectRef* Create(GrTexture* tex, Direction dir, int halfWidth, const float* kernel) { AutoEffectUnref effect(SkNEW_ARGS(GrConvolutionEffect, (tex, dir, halfWidth, - kernel, - cropRect))); + kernel))); return CreateEffectRef(effect); } @@ -39,13 +34,11 @@ public: static GrEffectRef* CreateGaussian(GrTexture* tex, Direction dir, int halfWidth, - float gaussianSigma, - float cropRect[4]) { + float gaussianSigma) { AutoEffectUnref effect(SkNEW_ARGS(GrConvolutionEffect, (tex, dir, halfWidth, - gaussianSigma, - cropRect))); + gaussianSigma))); return CreateEffectRef(effect); } @@ -53,8 +46,6 @@ public: const float* kernel() const { return fKernel; } - const float* cropRect() const { return fCropRect; } - static const char* Name() { return "Convolution"; } typedef GrGLConvolutionEffect GLEffect; @@ -81,17 +72,15 @@ public: protected: float fKernel[kMaxKernelWidth]; - float fCropRect[4]; private: GrConvolutionEffect(GrTexture*, Direction, - int halfWidth, const float* kernel, float cropRect[4]); + int halfWidth, const float* kernel); /// Convolve with a Gaussian kernel GrConvolutionEffect(GrTexture*, Direction, int halfWidth, - float gaussianSigma, - float cropRect[4]); + float gaussianSigma); virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; diff --git a/tests/PaintTest.cpp b/tests/PaintTest.cpp index e25c7c3f08..dc131f20e2 100644 --- a/tests/PaintTest.cpp +++ b/tests/PaintTest.cpp @@ -111,10 +111,10 @@ static void test_cmap(skiatest::Reporter* reporter) { // temparary api for bicubic, just be sure we can set/clear it static void test_filterlevel(skiatest::Reporter* reporter) { SkPaint p0, p1; - + REPORTER_ASSERT(reporter, SkPaint::kNone_FilterLevel == p0.getFilterLevel()); - + static const SkPaint::FilterLevel gLevels[] = { SkPaint::kNone_FilterLevel, SkPaint::kLow_FilterLevel,