Chromium Code Reviews| Index: gm/image.cpp |
| diff --git a/gm/image.cpp b/gm/image.cpp |
| index 27cce2342e24a10ffddb13b3f61c036170de7433..2387ac0af61f10c572aa9e55ab84b02886dbc967 100644 |
| --- a/gm/image.cpp |
| +++ b/gm/image.cpp |
| @@ -192,3 +192,111 @@ private: |
| typedef skiagm::GM INHERITED; |
| }; |
| DEF_GM( return new ImageGM; ) |
| + |
| +/////////////////////////////////////////////////////////////////////////////////////////////////// |
| + |
| +#include "SkPictureRecorder.h" |
| + |
| +static void draw_pixmap(SkCanvas* canvas, const SkPixmap& pmap) { |
| + SkBitmap bitmap; |
| + bitmap.installPixels(pmap.info(), (void*)pmap.addr(), pmap.rowBytes()); |
| + canvas->drawBitmap(bitmap, 0, 0, nullptr); |
| +} |
| + |
| +static void show_scaled_pixels(SkCanvas* canvas, SkImage* image) { |
| + SkAutoCanvasRestore acr(canvas, true); |
| + |
| + // canvas->drawImage(image, 0, 0, nullptr); |
|
f(malita)
2015/11/23 18:06:36
Leftover?
reed1
2015/11/23 20:07:22
Oops, yes, I will uncomment
|
| + canvas->translate(110, 10); |
| + |
| + const SkImageInfo info = SkImageInfo::MakeN32Premul(40, 40); |
| + SkAutoPixmapStorage storage; |
| + storage.alloc(info); |
| + |
| + const SkImage::CachingHint chints[] = { |
| + SkImage::kAllow_CachingHint, // SkImage::kDisallow_CachingHint, |
| + }; |
| + const SkFilterQuality qualities[] = { |
| + kNone_SkFilterQuality, kLow_SkFilterQuality, kMedium_SkFilterQuality, kHigh_SkFilterQuality, |
| + }; |
| + |
| + for (auto ch : chints) { |
| + canvas->save(); |
| + for (auto q : qualities) { |
| + if (image->scalePixels(storage, q, ch)) { |
| + draw_pixmap(canvas, storage); |
| + } |
| + canvas->translate(70, 0); |
| + } |
| + canvas->restore(); |
| + canvas->translate(0, 45); |
| + } |
| +} |
| + |
| +static void draw_contents(SkCanvas* canvas) { |
| + SkPaint paint; |
| + paint.setStyle(SkPaint::kStroke_Style); |
| + paint.setStrokeWidth(20); |
| + canvas->drawCircle(50, 50, 35, paint); |
| +} |
| + |
| +static SkImage* make_raster(const SkImageInfo& info, GrContext*) { |
| + SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(info)); |
| + draw_contents(surface->getCanvas()); |
| + return surface->newImageSnapshot(); |
| +} |
| + |
| +static SkImage* make_picture(const SkImageInfo& info, GrContext*) { |
| + SkPictureRecorder recorder; |
| + draw_contents(recorder.beginRecording(SkRect::MakeIWH(info.width(), info.height()))); |
| + SkAutoTUnref<SkPicture> pict(recorder.endRecording()); |
| + return SkImage::NewFromPicture(pict, info.dimensions(), nullptr, nullptr); |
| +} |
| + |
| +static SkImage* make_codec(const SkImageInfo& info, GrContext*) { |
| + SkAutoTUnref<SkImage> image(make_raster(info, nullptr)); |
| + SkAutoTUnref<SkData> data(image->encode()); |
| + return SkImage::NewFromEncoded(data); |
| +} |
| + |
| +static SkImage* make_gpu(const SkImageInfo& info, GrContext* ctx) { |
| + if (!ctx) { return nullptr; } |
| + SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(ctx, SkSurface::kNo_Budgeted, info)); |
| + draw_contents(surface->getCanvas()); |
| + return surface->newImageSnapshot(); |
| +} |
| + |
| +typedef SkImage* (*ImageMakerProc)(const SkImageInfo&, GrContext*); |
| + |
| +class ScalePixelsGM : public skiagm::GM { |
| +public: |
| + ScalePixelsGM() {} |
| + |
| +protected: |
| + SkString onShortName() override { |
| + return SkString("scale-pixels"); |
| + } |
| + |
| + SkISize onISize() override { |
| + return SkISize::Make(960, 1200); |
| + } |
| + |
| + void onDraw(SkCanvas* canvas) override { |
| + const SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100); |
| + |
| + const ImageMakerProc procs[] = { |
| + make_raster, make_picture, make_codec, make_gpu, |
| + }; |
| + for (auto& proc : procs) { |
| + SkAutoTUnref<SkImage> image(proc(info, canvas->getGrContext())); |
| + if (image) { |
| + show_scaled_pixels(canvas, image); |
| + } |
| + canvas->translate(0, 120); |
| + } |
| + } |
| + |
| +private: |
| + typedef skiagm::GM INHERITED; |
| +}; |
| +DEF_GM( return new ScalePixelsGM; ) |