From 7628967820994c383f2f01d1c64440488d5d8308 Mon Sep 17 00:00:00 2001 From: reed Date: Wed, 9 Sep 2015 11:29:09 -0700 Subject: add picture-image variant BUG=skia: Review URL: https://codereview.chromium.org/1329283002 --- gm/verylargebitmap.cpp | 46 +++++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 13 deletions(-) (limited to 'gm/verylargebitmap.cpp') diff --git a/gm/verylargebitmap.cpp b/gm/verylargebitmap.cpp index eaf7316687..112092c9fd 100644 --- a/gm/verylargebitmap.cpp +++ b/gm/verylargebitmap.cpp @@ -9,11 +9,10 @@ #include "SkCanvas.h" #include "SkGradientShader.h" #include "SkPath.h" +#include "SkPictureRecorder.h" #include "SkSurface.h" -static SkImage* make_image(int width, int height, SkColor colors[2]) { - SkAutoTUnref surface(SkSurface::NewRasterN32Premul(width, height)); - +static void draw(SkCanvas* canvas, int width, int height, SkColor colors[2]) { const SkPoint center = { SkIntToScalar(width)/2, SkIntToScalar(height)/2 }; const SkScalar radius = 40; SkShader* shader = SkGradientShader::CreateRadial(center, radius, colors, nullptr, 2, @@ -21,12 +20,27 @@ static SkImage* make_image(int width, int height, SkColor colors[2]) { SkPaint paint; paint.setShader(shader)->unref(); paint.setXfermodeMode(SkXfermode::kSrc_Mode); - surface->getCanvas()->drawPaint(paint); + canvas->drawPaint(paint); +} + +static SkImage* make_raster_image(int width, int height, SkColor colors[2]) { + SkAutoTUnref surface(SkSurface::NewRasterN32Premul(width, height)); + draw(surface->getCanvas(), width, height, colors); return surface->newImageSnapshot(); } -static void show_image(SkCanvas* canvas, int width, int height, SkColor colors[2]) { - SkAutoTUnref image(make_image(width, height, colors)); +static SkImage* make_picture_image(int width, int height, SkColor colors[2]) { + SkPictureRecorder recorder; + draw(recorder.beginRecording(SkRect::MakeIWH(width, height)), width, height, colors); + return SkImage::NewFromPicture(recorder.endRecording(), SkISize::Make(width, height), + nullptr, nullptr); +} + +typedef SkImage* (*ImageMakerProc)(int width, int height, SkColor colors[2]); + +static void show_image(SkCanvas* canvas, int width, int height, SkColor colors[2], + ImageMakerProc proc) { + SkAutoTUnref image(proc(width, height, colors)); SkPaint paint; SkRect r; @@ -53,12 +67,17 @@ static void show_image(SkCanvas* canvas, int width, int height, SkColor colors[2 } class VeryLargeBitmapGM : public skiagm::GM { + ImageMakerProc fProc; + SkString fName; + public: - VeryLargeBitmapGM() {} + VeryLargeBitmapGM(ImageMakerProc proc, const char suffix[]) : fProc(proc) { + fName.printf("verylarge%s", suffix); + } protected: SkString onShortName() override { - return SkString("verylargebitmap"); + return fName; } SkISize onISize() override { @@ -77,28 +96,29 @@ protected: canvas->translate(SkIntToScalar(10), SkIntToScalar(10)); colors[0] = SK_ColorRED; colors[1] = SK_ColorGREEN; - show_image(canvas, small, small, colors); + show_image(canvas, small, small, colors, fProc); canvas->translate(0, SkIntToScalar(150)); colors[0] = SK_ColorBLUE; colors[1] = SK_ColorMAGENTA; - show_image(canvas, big, small, colors); + show_image(canvas, big, small, colors, fProc); canvas->translate(0, SkIntToScalar(150)); colors[0] = SK_ColorMAGENTA; colors[1] = SK_ColorYELLOW; - show_image(canvas, medium, medium, colors); + show_image(canvas, medium, medium, colors, fProc); canvas->translate(0, SkIntToScalar(150)); colors[0] = SK_ColorGREEN; colors[1] = SK_ColorYELLOW; // as of this writing, the raster code will fail to draw the scaled version // since it has a 64K limit on x,y coordinates... (but gpu should succeed) - show_image(canvas, veryBig, small, colors); + show_image(canvas, veryBig, small, colors, fProc); } private: typedef skiagm::GM INHERITED; }; -DEF_GM( return new VeryLargeBitmapGM; ) +DEF_GM( return new VeryLargeBitmapGM(make_raster_image, "bitmap"); ) +DEF_GM( return new VeryLargeBitmapGM(make_picture_image, "_picture_image"); ) -- cgit v1.2.3