use tool_utils to encapsulate checking for recording canvas and makeSurface

Bug: skia:
Change-Id: Ia93ee09dd213b8d6ad5c18e887add5ff3448c824
Reviewed-on: https://skia-review.googlesource.com/90243
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/gm/bleed.cpp b/gm/bleed.cpp
index 1bb8b2b..b6ee10b 100644
--- a/gm/bleed.cpp
+++ b/gm/bleed.cpp
@@ -13,6 +13,7 @@
 #include "SkImage.h"
 #include "SkTDArray.h"
 #include "SkUtils.h"
+#include "sk_tool_utils.h"
 
 #if SK_SUPPORT_GPU
 #include "GrContext.h"
@@ -449,14 +450,6 @@
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 #include "SkSurface.h"
 
-sk_sp<SkSurface> make_surface(SkCanvas* canvas, const SkImageInfo& info) {
-    auto surface = canvas->makeSurface(info);
-    if (!surface) {
-        surface = SkSurface::MakeRaster(info);
-    }
-    return surface;
-}
-
 // Construct an image and return the inner "src" rect. Build the image such that the interior is
 // blue, with a margin of blue (2px) but then an outer margin of red.
 //
@@ -468,7 +461,7 @@
     // produce different mipmap filtering when we have an odd sized texture.
     const int N = 10 + 2 + 8 + 2 + 10;
     SkImageInfo info = SkImageInfo::MakeN32Premul(N, N);
-    auto surface = make_surface(canvas, info);
+    auto surface = sk_tool_utils::makeSurface(canvas, info);
     SkCanvas* c = surface->getCanvas();
     SkRect r = SkRect::MakeIWH(info.width(), info.height());
     SkPaint paint;
@@ -500,7 +493,7 @@
         canvas->save();
         for (auto quality : qualities) {
             paint.setFilterQuality(quality);
-            auto surf = make_surface(canvas, SkImageInfo::MakeN32Premul(1, 1));
+            auto surf = sk_tool_utils::makeSurface(canvas, SkImageInfo::MakeN32Premul(1, 1));
             surf->getCanvas()->drawImageRect(img, src, SkRect::MakeWH(1, 1), &paint, constraint);
             // now blow up the 1 pixel result
             canvas->drawImageRect(surf->makeImageSnapshot(), SkRect::MakeWH(100, 100), nullptr);
diff --git a/gm/complexclip_blur_tiled.cpp b/gm/complexclip_blur_tiled.cpp
index b2b2061..47234da 100644
--- a/gm/complexclip_blur_tiled.cpp
+++ b/gm/complexclip_blur_tiled.cpp
@@ -10,6 +10,7 @@
 #include "SkRRect.h"
 #include "SkSurface.h"
 #include "SkClipOpPriv.h"
+#include "sk_tool_utils.h"
 
 #define WIDTH 512
 #define HEIGHT 512
@@ -37,10 +38,7 @@
         SkRect bounds = canvas->getLocalClipBounds();
         int ts = SkScalarCeilToInt(tileSize);
         SkImageInfo info = SkImageInfo::MakeN32Premul(ts, ts);
-        auto tileSurface(canvas->makeSurface(info));
-        if (!tileSurface) {
-            tileSurface = SkSurface::MakeRaster(info);
-        }
+        auto tileSurface(sk_tool_utils::makeSurface(canvas, info));
         SkCanvas* tileCanvas = tileSurface->getCanvas();
         for (SkScalar y = bounds.top(); y < bounds.bottom(); y += tileSize) {
             for (SkScalar x = bounds.left(); x < bounds.right(); x += tileSize) {
diff --git a/gm/drawatlas.cpp b/gm/drawatlas.cpp
index 4a23e26..afb197e 100644
--- a/gm/drawatlas.cpp
+++ b/gm/drawatlas.cpp
@@ -11,14 +11,12 @@
 #include "SkCanvas.h"
 #include "SkRSXform.h"
 #include "SkSurface.h"
+#include "sk_tool_utils.h"
 
 class DrawAtlasGM : public skiagm::GM {
     static sk_sp<SkImage> MakeAtlas(SkCanvas* caller, const SkRect& target) {
         SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100);
-        auto surface(caller->makeSurface(info));
-        if (nullptr == surface) {
-            surface = SkSurface::MakeRaster(info);
-        }
+        auto surface(sk_tool_utils::makeSurface(caller, info));
         SkCanvas* canvas = surface->getCanvas();
         // draw red everywhere, but we don't expect to see it in the draw, testing the notion
         // that drawAtlas draws a subset-region of the atlas.
diff --git a/gm/drawatlascolor.cpp b/gm/drawatlascolor.cpp
index 548641b..8d53e31 100644
--- a/gm/drawatlascolor.cpp
+++ b/gm/drawatlascolor.cpp
@@ -20,10 +20,7 @@
     const int kBlockSize = atlasSize/2;
 
     SkImageInfo info = SkImageInfo::MakeN32Premul(atlasSize, atlasSize);
-    auto surface(caller->makeSurface(info));
-    if (nullptr == surface) {
-        surface = SkSurface::MakeRaster(info);
-    }
+    auto surface(sk_tool_utils::makeSurface(caller, info));
     SkCanvas* canvas = surface->getCanvas();
 
     SkPaint paint;
diff --git a/gm/drawbitmaprect.cpp b/gm/drawbitmaprect.cpp
index 2cd1b2f..200a397 100644
--- a/gm/drawbitmaprect.cpp
+++ b/gm/drawbitmaprect.cpp
@@ -35,12 +35,7 @@
 static sk_sp<SkImage> makebm(SkCanvas* origCanvas, SkBitmap* resultBM, int w, int h) {
     SkImageInfo info = SkImageInfo::MakeN32Premul(w, h);
 
-    auto surface(origCanvas->makeSurface(info));
-    if (nullptr == surface) {
-        // picture canvas will return null, so fall-back to raster
-        surface = SkSurface::MakeRaster(info);
-    }
-
+    auto surface(sk_tool_utils::makeSurface(origCanvas, info));
     SkCanvas* canvas = surface->getCanvas();
 
     canvas->clear(SK_ColorTRANSPARENT);
diff --git a/gm/drawminibitmaprect.cpp b/gm/drawminibitmaprect.cpp
index 4a1417c..b463d06 100644
--- a/gm/drawminibitmaprect.cpp
+++ b/gm/drawminibitmaprect.cpp
@@ -13,13 +13,11 @@
 #include "SkRandom.h"
 #include "SkShader.h"
 #include "SkSurface.h"
+#include "sk_tool_utils.h"
 
 static sk_sp<SkImage> makebm(SkCanvas* caller, int w, int h) {
     SkImageInfo info = SkImageInfo::MakeN32Premul(w, h);
-    auto surface(caller->makeSurface(info));
-    if (nullptr == surface) {
-        surface = SkSurface::MakeRaster(info);
-    }
+    auto surface(sk_tool_utils::makeSurface(caller, info));
     SkCanvas* canvas = surface->getCanvas();
 
     const SkScalar wScalar = SkIntToScalar(w);
diff --git a/gm/imagealphathreshold.cpp b/gm/imagealphathreshold.cpp
index 6d01722..3783bfc 100644
--- a/gm/imagealphathreshold.cpp
+++ b/gm/imagealphathreshold.cpp
@@ -12,6 +12,7 @@
 #include "SkRandom.h"
 #include "SkRegion.h"
 #include "SkSurface.h"
+#include "sk_tool_utils.h"
 
 #define WIDTH 500
 #define HEIGHT 500
@@ -101,12 +102,7 @@
 
     SkImageInfo info = SkImageInfo::Make(width, height, ct, alphaType, std::move(cs));
 
-    sk_sp<SkSurface> result = canvas->makeSurface(info);
-    if (!result) {
-        result = SkSurface::MakeRaster(info);
-    }
-
-    return result;
+    return sk_tool_utils::makeSurface(canvas, info);
 }
 
 class ImageAlphaThresholdSurfaceGM : public skiagm::GM {
diff --git a/gm/imageblurclampmode.cpp b/gm/imageblurclampmode.cpp
index f0cad82..51109c5 100644
--- a/gm/imageblurclampmode.cpp
+++ b/gm/imageblurclampmode.cpp
@@ -10,17 +10,9 @@
 #include "SkSurface.h"
 #include "SkBlurImageFilter.h"
 
-static sk_sp<SkSurface> make_surface(SkCanvas* canvas, const SkImageInfo& info) {
-    auto surface = canvas->makeSurface(info);
-    if (!surface) {
-        surface = SkSurface::MakeRaster(info);
-    }
-    return surface;
-}
-
 static sk_sp<SkImage> make_image(SkCanvas* canvas) {
     SkImageInfo info = SkImageInfo::MakeN32Premul(250, 200);
-    auto surface = make_surface(canvas, info);
+    auto surface = sk_tool_utils::makeSurface(canvas, info);
     SkCanvas* c = surface->getCanvas();
     SkPaint paint;
     paint.setAntiAlias(true);
diff --git a/gm/imageblurrepeatmode.cpp b/gm/imageblurrepeatmode.cpp
index 6f38029..b7705be 100644
--- a/gm/imageblurrepeatmode.cpp
+++ b/gm/imageblurrepeatmode.cpp
@@ -10,17 +10,9 @@
 #include "SkSurface.h"
 #include "SkBlurImageFilter.h"
 
-static sk_sp<SkSurface> make_surface(SkCanvas* canvas, const SkImageInfo& info) {
-    auto surface = canvas->makeSurface(info);
-    if (!surface) {
-        surface = SkSurface::MakeRaster(info);
-    }
-    return surface;
-}
-
 static sk_sp<SkImage> make_image(SkCanvas* canvas, int direction) {
     SkImageInfo info = SkImageInfo::MakeN32Premul(250, 200);
-    auto surface = make_surface(canvas, info);
+    auto surface = sk_tool_utils::makeSurface(canvas, info);
     SkCanvas* c = surface->getCanvas();
     SkPaint paint;
     paint.setAntiAlias(true);
diff --git a/gm/imagefilters.cpp b/gm/imagefilters.cpp
index 146388f..bc33a57 100644
--- a/gm/imagefilters.cpp
+++ b/gm/imagefilters.cpp
@@ -11,6 +11,7 @@
 #include "SkImage.h"
 #include "SkImageFilter.h"
 #include "SkSurface.h"
+#include "sk_tool_utils.h"
 
 /**
  *  Test drawing a primitive w/ an imagefilter (in this case, just matrix w/ identity) to see
@@ -69,10 +70,7 @@
 
 static sk_sp<SkImage> make_image(SkCanvas* canvas) {
     const SkImageInfo info = SkImageInfo::MakeS32(100, 100, kPremul_SkAlphaType);
-    auto surface(canvas->makeSurface(info));
-    if (!surface) {
-        surface = SkSurface::MakeRaster(info);
-    }
+    auto surface(sk_tool_utils::makeSurface(canvas, info));
     surface->getCanvas()->drawRect(SkRect::MakeXYWH(25, 25, 50, 50), SkPaint());
     return surface->makeImageSnapshot();
 }
diff --git a/gm/imagemakewithfilter.cpp b/gm/imagemakewithfilter.cpp
index 9c6e870..9805a0b 100644
--- a/gm/imagemakewithfilter.cpp
+++ b/gm/imagemakewithfilter.cpp
@@ -70,10 +70,7 @@
 
         canvas->translate(MARGIN, MARGIN);
 
-        sk_sp<SkSurface> surface = canvas->makeSurface(info);
-        if (!surface) {
-            surface = SkSurface::MakeRaster(info);
-        }
+        sk_sp<SkSurface> surface = sk_tool_utils::makeSurface(canvas, info);
         sk_tool_utils::draw_checkerboard(surface->getCanvas());
         sk_sp<SkImage> source = surface->makeImageSnapshot();
 
diff --git a/gm/lattice.cpp b/gm/lattice.cpp
index d5e2b45..b280910 100644
--- a/gm/lattice.cpp
+++ b/gm/lattice.cpp
@@ -7,16 +7,12 @@
 
 #include "gm.h"
 #include "SkSurface.h"
+#include "sk_tool_utils.h"
 
 static sk_sp<SkSurface> make_surface(SkCanvas* root, int N, int padLeft, int padTop,
                                      int padRight, int padBottom) {
     SkImageInfo info = SkImageInfo::MakeN32Premul(N + padLeft + padRight, N + padTop + padBottom);
-    auto surface = root->makeSurface(info);
-    if (!surface) {
-        surface = SkSurface::MakeRaster(info);
-    }
-
-    return surface;
+    return sk_tool_utils::makeSurface(root, info);
 }
 
 static sk_sp<SkImage> make_image(SkCanvas* root, int* xDivs, int* yDivs, int padLeft, int padTop,
diff --git a/gm/lcdblendmodes.cpp b/gm/lcdblendmodes.cpp
index 1345d23..1627654 100644
--- a/gm/lcdblendmodes.cpp
+++ b/gm/lcdblendmodes.cpp
@@ -62,10 +62,7 @@
         canvas->drawRect(r, p);
 
         SkImageInfo info = SkImageInfo::MakeN32Premul(kWidth, kHeight);
-        auto surface(canvas->makeSurface(info));
-        if (nullptr == surface) {
-            surface = SkSurface::MakeRaster(info);
-        }
+        auto surface(sk_tool_utils::makeSurface(canvas, info));
 
         SkCanvas* surfCanvas = surface->getCanvas();
         this->drawColumn(surfCanvas, SK_ColorBLACK, SK_ColorWHITE, false);
diff --git a/gm/localmatriximagefilter.cpp b/gm/localmatriximagefilter.cpp
index 14bbd32..8280c07 100644
--- a/gm/localmatriximagefilter.cpp
+++ b/gm/localmatriximagefilter.cpp
@@ -13,13 +13,11 @@
 #include "SkMorphologyImageFilter.h"
 #include "SkOffsetImageFilter.h"
 #include "SkSurface.h"
+#include "sk_tool_utils.h"
 
 static sk_sp<SkImage> make_image(SkCanvas* rootCanvas) {
     SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100);
-    auto surface(rootCanvas->makeSurface(info));
-    if (!surface) {
-        surface = SkSurface::MakeRaster(info);
-    }
+    auto surface(sk_tool_utils::makeSurface(rootCanvas, info));
 
     SkPaint paint;
     paint.setAntiAlias(true);
diff --git a/gm/localmatriximageshader.cpp b/gm/localmatriximageshader.cpp
index f63497d..39f5908 100644
--- a/gm/localmatriximageshader.cpp
+++ b/gm/localmatriximageshader.cpp
@@ -8,13 +8,11 @@
 #include "gm.h"
 #include "SkCanvas.h"
 #include "SkSurface.h"
+#include "sk_tool_utils.h"
 
 static sk_sp<SkImage> make_image(SkCanvas* rootCanvas, SkColor color) {
     SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100);
-    auto surface(rootCanvas->makeSurface(info));
-    if (!surface) {
-        surface = SkSurface::MakeRaster(info);
-    }
+    auto surface(sk_tool_utils::makeSurface(rootCanvas, info));
 
     SkPaint paint;
     paint.setAntiAlias(true);
diff --git a/gm/multipicturedraw.cpp b/gm/multipicturedraw.cpp
index b18fb8a..4dd0139 100644
--- a/gm/multipicturedraw.cpp
+++ b/gm/multipicturedraw.cpp
@@ -241,12 +241,7 @@
 static sk_sp<SkSurface> create_compat_surface(SkCanvas* canvas, int width, int height) {
     SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
 
-    auto surface = canvas->makeSurface(info);
-    if (nullptr == surface) {
-        // picture canvas returns nullptr so fall back to raster
-        surface = SkSurface::MakeRaster(info);
-    }
-    return surface;
+    return sk_tool_utils::makeSurface(canvas, info);
 }
 
 // This class stores the information required to compose all the result
diff --git a/gm/ninepatchstretch.cpp b/gm/ninepatchstretch.cpp
index 90a0216..c905cee 100644
--- a/gm/ninepatchstretch.cpp
+++ b/gm/ninepatchstretch.cpp
@@ -7,14 +7,11 @@
 
 #include "gm.h"
 #include "SkSurface.h"
+#include "sk_tool_utils.h"
 
 static sk_sp<SkSurface> make_surface(SkCanvas* root, int N) {
     SkImageInfo info = SkImageInfo::MakeN32Premul(N, N);
-    auto surface = root->makeSurface(info);
-    if (!surface) {
-        surface = SkSurface::MakeRaster(info);
-    }
-    return surface;
+    return sk_tool_utils::makeSurface(root, info);
 }
 
 static sk_sp<SkImage> make_image(SkCanvas* root, SkIRect* center) {
diff --git a/gm/perspshaders.cpp b/gm/perspshaders.cpp
index e39a846..dd1a15a 100644
--- a/gm/perspshaders.cpp
+++ b/gm/perspshaders.cpp
@@ -11,13 +11,11 @@
 #include "SkImage.h"
 #include "SkPath.h"
 #include "SkSurface.h"
+#include "sk_tool_utils.h"
 
 static sk_sp<SkImage> make_image(SkCanvas* origCanvas, int w, int h) {
     SkImageInfo info = SkImageInfo::MakeN32Premul(w, h);
-    auto surface(origCanvas->makeSurface(info));
-    if (nullptr == surface) {
-        surface = SkSurface::MakeRaster(info);
-    }
+    auto surface(sk_tool_utils::makeSurface(origCanvas, info));
     SkCanvas* canvas = surface->getCanvas();
 
     sk_tool_utils::draw_checkerboard(canvas, SK_ColorRED, SK_ColorGREEN, w/10);
diff --git a/gm/surface.cpp b/gm/surface.cpp
index 4b400ca..30a7844 100644
--- a/gm/surface.cpp
+++ b/gm/surface.cpp
@@ -124,10 +124,7 @@
     void onDraw(SkCanvas* canvas) override {
         SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100);
 
-        auto surf(canvas->makeSurface(info, nullptr));
-        if (!surf) {
-            surf = SkSurface::MakeRaster(info);
-        }
+        auto surf(sk_tool_utils::makeSurface(canvas, info, nullptr));
         drawInto(surf->getCanvas());
 
         sk_sp<SkImage> image(surf->makeImageSnapshot());
@@ -152,10 +149,7 @@
 
 DEF_SIMPLE_GM(copy_on_write_retain, canvas, 256, 256) {
     const SkImageInfo info = SkImageInfo::MakeN32Premul(256, 256);
-    sk_sp<SkSurface> surf = canvas->makeSurface(info, nullptr);
-    if (!surf) {
-        surf = SkSurface::MakeRaster(info, nullptr);
-    }
+    sk_sp<SkSurface> surf = sk_tool_utils::makeSurface(canvas, info);
 
     surf->getCanvas()->clear(SK_ColorRED);
     // its important that image survives longer than the next draw, so the surface will see
@@ -173,11 +167,7 @@
 
 DEF_SIMPLE_GM(copy_on_write_savelayer, canvas, 256, 256) {
     const SkImageInfo info = SkImageInfo::MakeN32Premul(256, 256);
-    sk_sp<SkSurface> surf = canvas->makeSurface(info, nullptr);
-    if (!surf) {
-        surf = SkSurface::MakeRaster(info, nullptr);
-    }
-
+    sk_sp<SkSurface> surf = sk_tool_utils::makeSurface(canvas, info);
     surf->getCanvas()->clear(SK_ColorRED);
     // its important that image survives longer than the next draw, so the surface will see
     // an outstanding image, and have to decide if it should retain or discard those pixels
diff --git a/gm/textblobgeometrychange.cpp b/gm/textblobgeometrychange.cpp
index b86ee3a..57f3962 100644
--- a/gm/textblobgeometrychange.cpp
+++ b/gm/textblobgeometrychange.cpp
@@ -45,10 +45,7 @@
 
         SkImageInfo info = SkImageInfo::MakeN32Premul(200, 200);
         SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
-        auto surface = canvas->makeSurface(info, &props);
-        if (!surface) {
-            surface = SkSurface::MakeRaster(info, &props);
-        }
+        auto surface = sk_tool_utils::makeSurface(canvas, info, &props);
         SkCanvas* c = surface->getCanvas();
 
         // LCD text on white background
diff --git a/gm/textblobrandomfont.cpp b/gm/textblobrandomfont.cpp
index e4fbcfa..2e6468a 100644
--- a/gm/textblobrandomfont.cpp
+++ b/gm/textblobrandomfont.cpp
@@ -99,7 +99,7 @@
                                              kPremul_SkAlphaType,
                                              canvas->imageInfo().refColorSpace());
         SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
-        auto surface(canvas->makeSurface(info, &props));
+        auto surface(sk_tool_utils::makeSurface(canvas, info, &props));
         if (surface) {
             SkPaint paint;
             paint.setAntiAlias(true);