aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/tileimagefilter.cpp
diff options
context:
space:
mode:
authorGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-04-29 15:20:39 +0000
committerGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-04-29 15:20:39 +0000
commit0a5c233e3b911232c0d6f9a88ded99ecf88b8a97 (patch)
tree54bc91597d65bb936d65f595555f7677dd1cd597 /gm/tileimagefilter.cpp
parentdaaafa6e81860e3dc52660ba019c336f0a43f1e7 (diff)
Implement bounds traversals for tile and matrix convolution filters.
Add a new GM that exercises tiled drawing all pixel-moving filters (and some non-pixel-moving ones) and compares it against non-tiled drawing of the same filters. Fixing this test revealed that tile and matrix convolution filters had no onFilterBounds() traversals (test-driven development FTW). Tile requires (conservatively) the bounds to include the whole source rect, since it may end up in the result. Matrix convolution requires the bounds to be offset by the kernel size and target. R=reed@google.com BUG=skia: Review URL: https://codereview.chromium.org/258243005 git-svn-id: http://skia.googlecode.com/svn/trunk@14432 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'gm/tileimagefilter.cpp')
-rw-r--r--gm/tileimagefilter.cpp33
1 files changed, 29 insertions, 4 deletions
diff --git a/gm/tileimagefilter.cpp b/gm/tileimagefilter.cpp
index d6c8d4cbfc..c7842ee97c 100644
--- a/gm/tileimagefilter.cpp
+++ b/gm/tileimagefilter.cpp
@@ -6,6 +6,8 @@
*/
#include "gm.h"
+#include "SkColorMatrixFilter.h"
+#include "SkColorFilterImageFilter.h"
#include "SkTileImageFilter.h"
#include "SkBitmapSource.h"
@@ -27,15 +29,15 @@ protected:
}
void make_bitmap() {
- fBitmap.allocN32Pixels(80, 80);
+ fBitmap.allocN32Pixels(50, 50);
SkCanvas canvas(fBitmap);
canvas.clear(0xFF000000);
SkPaint paint;
paint.setAntiAlias(true);
paint.setColor(0xD000D000);
- paint.setTextSize(SkIntToScalar(96));
+ paint.setTextSize(SkIntToScalar(50));
const char* str = "e";
- canvas.drawText(str, strlen(str), SkIntToScalar(15), SkIntToScalar(65), paint);
+ canvas.drawText(str, strlen(str), SkIntToScalar(10), SkIntToScalar(45), paint);
}
void make_checkerboard() {
@@ -70,7 +72,6 @@ protected:
fInitialized = true;
}
canvas->clear(0x00000000);
- SkPaint paint;
int x = 0, y = 0;
for (size_t i = 0; i < 4; i++) {
@@ -88,6 +89,7 @@ protected:
SkTileImageFilter::Create(srcRect, dstRect, tileInput));
canvas->save();
canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
+ SkPaint paint;
paint.setImageFilter(filter);
canvas->drawBitmap(fBitmap, 0, 0, &paint);
canvas->restore();
@@ -97,6 +99,29 @@ protected:
y += bitmap->height() + MARGIN;
}
}
+
+ SkScalar matrix[20] = { SK_Scalar1, 0, 0, 0, 0,
+ 0, SK_Scalar1, 0, 0, 0,
+ 0, 0, SK_Scalar1, 0, 0,
+ 0, 0, 0, SK_Scalar1, 0 };
+
+ SkRect srcRect = SkRect::MakeWH(SkIntToScalar(fBitmap.width()),
+ SkIntToScalar(fBitmap.height()));
+ SkRect dstRect = SkRect::MakeWH(SkIntToScalar(fBitmap.width() * 2),
+ SkIntToScalar(fBitmap.height() * 2));
+ SkAutoTUnref<SkImageFilter> tile(SkTileImageFilter::Create(srcRect, dstRect, NULL));
+ SkAutoTUnref<SkColorFilter> cf(SkColorMatrixFilter::Create(matrix));
+
+ SkAutoTUnref<SkImageFilter> cfif(SkColorFilterImageFilter::Create(cf, tile.get()));
+ SkPaint paint;
+ paint.setImageFilter(cfif);
+ canvas->save();
+ canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
+ canvas->clipRect(dstRect);
+ canvas->saveLayer(&dstRect, &paint);
+ canvas->drawBitmap(fBitmap, 0, 0);
+ canvas->restore();
+ canvas->restore();
}
private:
typedef GM INHERITED;