Chromium Code Reviews| 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; ) |
| + |