add picture-image variant

BUG=skia:

Review URL: https://codereview.chromium.org/1329283002
diff --git a/gm/verylargebitmap.cpp b/gm/verylargebitmap.cpp
index eaf7316..112092c 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<SkSurface> 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 @@
     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<SkSurface> 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<SkImage> 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<SkImage> image(proc(width, height, colors));
 
     SkPaint paint;
     SkRect r;
@@ -53,12 +67,17 @@
 }
 
 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 @@
         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"); )