diff options
author | senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-04-29 15:20:39 +0000 |
---|---|---|
committer | senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-04-29 15:20:39 +0000 |
commit | 0a5c233e3b911232c0d6f9a88ded99ecf88b8a97 (patch) | |
tree | 54bc91597d65bb936d65f595555f7677dd1cd597 /gm/tileimagefilter.cpp | |
parent | daaafa6e81860e3dc52660ba019c336f0a43f1e7 (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.cpp | 33 |
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; |