Index: gm/spritebitmap.cpp |
diff --git a/gm/spritebitmap.cpp b/gm/spritebitmap.cpp |
index ceed50acaac31504488fe44486733171073709e1..4424001cf5231246d9a2db091dac01712db288d4 100644 |
--- a/gm/spritebitmap.cpp |
+++ b/gm/spritebitmap.cpp |
@@ -97,3 +97,109 @@ private: |
}; |
DEF_GM( return new SpriteBitmapGM; ) |
+/////////////////////////////////////////////////////////////////////////////////////////////////// |
+ |
+#include "SkColorFilterImageFilter.h" |
+#include "SkModeColorFilter.h" |
+#include "SkMorphologyImageFilter.h" |
+#include "SkOffsetImageFilter.h" |
+ |
+static SkImage* make_image(SkCanvas* rootCanvas) { |
+ SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100); |
+ SkAutoTUnref<SkSurface> surface(rootCanvas->newSurface(info)); |
+ if (!surface) { |
+ surface.reset(SkSurface::NewRaster(info)); |
+ } |
+ |
+ SkPaint paint; |
+ paint.setAntiAlias(true); |
+ paint.setColor(SK_ColorRED); |
+ surface->getCanvas()->drawCircle(50, 50, 50, paint); |
+ return surface->newImageSnapshot(); |
+} |
+ |
+static void show_image(SkCanvas* canvas, SkImage* image, const SkIPoint& offset) { |
+ SkScalar x = SkIntToScalar(offset.x()); |
+ SkScalar y = SkIntToScalar(offset.y()); |
+ |
+ SkPaint paint; |
robertphillips
2015/10/12 16:43:32
sk_tool_utils::color_to_565 ?
reed1
2015/10/12 18:02:19
Done.
|
+ paint.setColor(0xFFEEEEEE); |
+ |
+ SkRect r = SkRect::MakeIWH(image->width(), image->height()); |
+ r.offset(x, y); |
+ canvas->drawRect(r, paint); |
+ |
+ canvas->drawImage(image, x, y, nullptr); |
+} |
+ |
+typedef SkImageFilter* (*ImageFilterFactory)(); |
+ |
+/** |
+ * Compare output of drawSprite and drawBitmap (esp. clipping and imagefilters) |
+ */ |
+class ApplyFilterGM : public skiagm::GM { |
+public: |
+ ApplyFilterGM() {} |
+ |
+protected: |
+ SkString onShortName() override { |
+ return SkString("apply-filter"); |
+ } |
+ |
+ SkISize onISize() override { |
+ return SkISize::Make(640, 480); |
+ } |
+ |
+ void onDraw(SkCanvas* canvas) override { |
+ SkAutoTUnref<SkImage> image0(make_image(canvas)); |
+ |
+ const ImageFilterFactory factories[] = { |
+ (ImageFilterFactory)[]{ return SkBlurImageFilter::Create(8, 8); }, |
+ (ImageFilterFactory)[]{ SkAutoTUnref<SkColorFilter> cf(new SkModeColorFilter(SK_ColorBLUE, |
+ SkXfermode::kSrcIn_Mode)); |
+ return (SkImageFilter*)SkColorFilterImageFilter::Create(cf); |
+ }, |
+ (ImageFilterFactory)[]{ return SkDilateImageFilter::Create(8, 8); }, |
+ (ImageFilterFactory)[]{ return SkErodeImageFilter::Create(8, 8); }, |
+ (ImageFilterFactory)[]{ return SkOffsetImageFilter::Create(8, 8); }, |
+ }; |
+ |
+ for (auto&& factory : factories) { |
+ SkAutoTUnref<SkImageFilter> filter(factory()); |
+ |
robertphillips
2015/10/12 16:43:32
put "offset1.setZero();" on its own line or use "=
reed1
2015/10/12 18:02:19
Done.
|
+ SkIPoint offset1, offset2; offset1.setZero(); |
+ SkAutoTUnref<SkImage> image1(image0->applyFilter(filter, &offset1, true)); |
+ SkAutoTUnref<SkImage> image2(image0->applyFilter(filter, &offset2, false)); |
+ |
+ canvas->save(); |
+ canvas->translate(30, 30); |
+ show_image(canvas, image0, SkIPoint::Make(0, 0)); |
robertphillips
2015/10/12 16:43:32
150 -> kImageWHWithPath ?
reed1
2015/10/12 18:02:19
Done.
|
+ canvas->translate(150, 0); |
+ show_image(canvas, image1, offset1); |
+ canvas->translate(150, 0); |
+ show_image(canvas, image2, offset2); |
+ { |
robertphillips
2015/10/12 16:43:32
// draw with old paths (drawSprite & drawImage w/
reed1
2015/10/12 18:02:19
Done.
|
+ SkPaint paint; |
+ paint.setImageFilter(filter); |
+ |
+ SkBitmap bm; |
+ image0->asLegacyBitmap(&bm, SkImage::kRO_LegacyBitmapMode); |
+ SkPoint loc = { 0, 0 }; |
+ canvas->translate(150, 0); |
+ canvas->getTotalMatrix().mapPoints(&loc, 1); |
+ canvas->drawSprite(bm, (int)loc.x(), (int)loc.y(), &paint); |
+ |
+ canvas->translate(150, 0); |
+ canvas->drawImage(image0, 0, 0, &paint); |
+ } |
+ canvas->restore(); |
+ |
+ canvas->translate(0, 150); |
+ } |
+ } |
+ |
+private: |
+ typedef GM INHERITED; |
+}; |
+DEF_GM( return new ApplyFilterGM; ) |
+ |