aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/imagealphathreshold.cpp
diff options
context:
space:
mode:
authorGravatar senorblanco <senorblanco@chromium.org>2016-01-19 08:50:18 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-01-19 08:50:18 -0800
commit1ea67a31c527f4d5d77c59a3ea3a12e39308e8c5 (patch)
tree32b1a746746a8581fa27eac2c932ce51e9ed1808 /gm/imagealphathreshold.cpp
parentb6474dd1a530a543ae799c3822e8bc60180761c0 (diff)
Fix SkAlphaThresholdFilter bounds handling.
SkAlphaThresholdFilter was always allocating a mask texture of the same size as the source texture. In addition to potentially wasting VRAM, this could cause the mask to be offset from the source texture, if the resulting bounds were a different size than the source texture. The fix is to allocate a mask texture only as large as the bounds, and to offset it to the bounds origin on draw. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1609573002 Review URL: https://codereview.chromium.org/1609573002
Diffstat (limited to 'gm/imagealphathreshold.cpp')
-rw-r--r--gm/imagealphathreshold.cpp93
1 files changed, 67 insertions, 26 deletions
diff --git a/gm/imagealphathreshold.cpp b/gm/imagealphathreshold.cpp
index 13a0ffa90b..ea7185be1d 100644
--- a/gm/imagealphathreshold.cpp
+++ b/gm/imagealphathreshold.cpp
@@ -8,10 +8,39 @@
#include "gm.h"
#include "SkAlphaThresholdFilter.h"
#include "SkRandom.h"
+#include "SkSurface.h"
#define WIDTH 500
#define HEIGHT 500
+namespace {
+
+void draw_rects(SkCanvas* canvas) {
+ SkPaint rectPaint;
+ rectPaint.setColor(0xFF0000FF);
+ canvas->drawRect(SkRect::MakeXYWH(0, 0, WIDTH / 2, HEIGHT / 2), rectPaint);
+ rectPaint.setColor(0xBFFF0000);
+ canvas->drawRect(SkRect::MakeXYWH(WIDTH / 2, 0, WIDTH / 2, HEIGHT / 2), rectPaint);
+ rectPaint.setColor(0x3F00FF00);
+ canvas->drawRect(SkRect::MakeXYWH(0, HEIGHT / 2, WIDTH / 2, HEIGHT / 2), rectPaint);
+ rectPaint.setColor(0x00000000);
+ canvas->drawRect(SkRect::MakeXYWH(WIDTH / 2, HEIGHT / 2, WIDTH / 2, HEIGHT / 2), rectPaint);
+}
+
+SkPaint create_filter_paint() {
+ SkIRect rects[2];
+ rects[0] = SkIRect::MakeXYWH(0, 150, WIDTH, HEIGHT - 300);
+ rects[1] = SkIRect::MakeXYWH(150, 0, WIDTH - 300, HEIGHT);
+ SkRegion region;
+ region.setRects(rects, 2);
+
+ SkPaint paint;
+ paint.setImageFilter(SkAlphaThresholdFilter::Create(region, 0.2f, 0.7f))->unref();
+ return paint;
+}
+
+};
+
namespace skiagm {
class ImageAlphaThresholdGM : public GM {
@@ -31,12 +60,6 @@ protected:
}
void onDraw(SkCanvas* canvas) override {
- SkIRect rects[2];
- rects[0] = SkIRect::MakeXYWH(0, 150, WIDTH, HEIGHT - 300);
- rects[1] = SkIRect::MakeXYWH(150, 0, WIDTH - 300, HEIGHT);
- SkRegion region;
- region.setRects(rects, 2);
-
SkMatrix matrix;
matrix.reset();
matrix.setTranslate(WIDTH * .1f, HEIGHT * .1f);
@@ -44,25 +67,9 @@ protected:
canvas->concat(matrix);
- SkPaint paint;
- paint.setImageFilter(
- SkAlphaThresholdFilter::Create(region, 0.2f, 0.7f))->unref();
+ SkPaint paint = create_filter_paint();
canvas->saveLayer(nullptr, &paint);
- paint.setAntiAlias(true);
-
- SkPaint rect_paint;
- rect_paint.setColor(0xFF0000FF);
- canvas->drawRect(SkRect::MakeXYWH(0, 0, WIDTH / 2, HEIGHT / 2),
- rect_paint);
- rect_paint.setColor(0xBFFF0000);
- canvas->drawRect(SkRect::MakeXYWH(WIDTH / 2, 0, WIDTH / 2, HEIGHT / 2),
- rect_paint);
- rect_paint.setColor(0x3F00FF00);
- canvas->drawRect(SkRect::MakeXYWH(0, HEIGHT / 2, WIDTH / 2, HEIGHT / 2),
- rect_paint);
- rect_paint.setColor(0x00000000);
- canvas->drawRect(SkRect::MakeXYWH(WIDTH / 2, HEIGHT / 2, WIDTH / 2, HEIGHT / 2),
- rect_paint);
+ draw_rects(canvas);
canvas->restore();
}
@@ -71,9 +78,43 @@ private:
typedef GM INHERITED;
};
+class ImageAlphaThresholdSurfaceGM : public GM {
+public:
+ ImageAlphaThresholdSurfaceGM() {
+ this->setBGColor(0xFFFFFFFF);
+ }
+
+protected:
+ SkString onShortName() override {
+ return SkString("imagealphathreshold_surface");
+ }
+
+ SkISize onISize() override {
+ return SkISize::Make(WIDTH, HEIGHT);
+ }
+
+ void onDraw(SkCanvas* canvas) override {
+ SkImageInfo info = SkImageInfo::MakeN32(WIDTH, HEIGHT, kOpaque_SkAlphaType);
+ SkAutoTUnref<SkSurface> surface(canvas->newSurface(info));
+ if (nullptr == surface) {
+ surface.reset(SkSurface::NewRaster(info));
+ }
+ surface->getCanvas()->clear(SK_ColorWHITE);
+ draw_rects(surface->getCanvas());
+
+ SkAutoTUnref<SkImage> image(surface->newImageSnapshot());
+ SkPaint paint = create_filter_paint();
+ canvas->clipRect(SkRect::MakeLTRB(100, 100, WIDTH - 100, HEIGHT - 100));
+ canvas->drawImage(image, 0, 0, &paint);
+ }
+
+private:
+ typedef GM INHERITED;
+};
+
//////////////////////////////////////////////////////////////////////////////
-static GM* MyFactory(void*) { return new ImageAlphaThresholdGM; }
-static GMRegistry reg(MyFactory);
+DEF_GM(return new ImageAlphaThresholdGM();)
+DEF_GM(return new ImageAlphaThresholdSurfaceGM();)
}