diff --git a/gm/blurrect.cpp b/gm/blurrect.cpp
index 2489f0c..b88132c 100644
--- a/gm/blurrect.cpp
+++ b/gm/blurrect.cpp
@@ -98,16 +98,14 @@
 typedef void (*PaintProc)(SkPaint*, SkScalar width);
 
 class BlurRectGM : public skiagm::GM {
-      sk_sp<SkMaskFilter> fMaskFilters[kLastEnum_SkBlurStyle + 1];
-      SkString  fName;
-      SkAlpha   fAlpha;
 public:
-    BlurRectGM(const char name[], U8CPU alpha)
-        : fName(name)
-        , fAlpha(SkToU8(alpha)) {
-    }
+    BlurRectGM(const char name[], U8CPU alpha) : fName(name), fAlpha(SkToU8(alpha)) {}
 
-protected:
+private:
+    sk_sp<SkMaskFilter> fMaskFilters[kLastEnum_SkBlurStyle + 1];
+    const char* fName;
+    SkAlpha fAlpha;
+
     void onOnceBeforeDraw() override {
         for (int i = 0; i <= kLastEnum_SkBlurStyle; ++i) {
             fMaskFilters[i] = SkMaskFilter::MakeBlur((SkBlurStyle)i,
@@ -115,13 +113,9 @@
         }
     }
 
-    SkString onShortName() override {
-        return fName;
-    }
+    SkString onShortName() override { return SkString(fName); }
 
-    SkISize onISize() override {
-        return SkISize::Make(860, 820);
-    }
+    SkISize onISize() override { return {860, 820}; }
 
     void onDraw(SkCanvas* canvas) override {
         canvas->translate(STROKE_WIDTH*3/2, STROKE_WIDTH*3/2);
@@ -161,7 +155,6 @@
         }
     }
 
-private:
     void drawProcs(SkCanvas* canvas, const SkRect& r, const SkPaint& paint,
                    bool doClip, const Proc procs[], size_t procsCount) {
         SkAutoCanvasRestore acr(canvas, true);
@@ -179,8 +172,6 @@
             canvas->translate(0, r.height() * 4/3);
         }
     }
-private:
-    typedef GM INHERITED;
 };
 
 DEF_SIMPLE_GM(blurrect_gallery, canvas, 1200, 1024) {
diff --git a/gm/blurroundrect.cpp b/gm/blurroundrect.cpp
index 8c99b8a..976b5ae 100644
--- a/gm/blurroundrect.cpp
+++ b/gm/blurroundrect.cpp
@@ -33,18 +33,14 @@
 // This GM mimics a blurred RR seen in the wild.
 class BlurRoundRectGM : public skiagm::GM {
 public:
-    BlurRoundRectGM(int width, int height)
-        : fName("blurroundrect"), fWidth(width), fHeight(height) {
-        fName.appendf("-WH-%ix%i-unevenCorners", width,  height);
-    }
+    BlurRoundRectGM(int w, int h) : fWidth(w), fHeight(h) {}
 
+private:
     SkString onShortName() override {
-        return fName;
+        return SkStringPrintf("blurroundrect-WH-%ix%i-unevenCorners", fWidth, fHeight);
     }
 
-    SkISize onISize() override {
-        return SkISize::Make(fWidth, fHeight);
-    }
+    SkISize onISize() override { return {fWidth, fHeight}; }
 
     void onOnceBeforeDraw() override {
         SkVector radii[4];
@@ -86,12 +82,8 @@
         canvas->drawRRect(fRRect, paint);
     }
 
-private:
-    SkString        fName;
-    SkRRect         fRRect;
-    int             fWidth, fHeight;
-
-    typedef skiagm::GM INHERITED;
+    SkRRect     fRRect;
+    int         fWidth, fHeight;
 };
 // Rounded rect with two opposite corners with large radii, the other two
 // small.
@@ -125,20 +117,9 @@
 
 // Simpler blurred RR test cases where all the radii are the same.
 class SimpleBlurRoundRectGM : public skiagm::GM {
-public:
-    SimpleBlurRoundRectGM()
-        : fName("simpleblurroundrect") {
-    }
+    SkString onShortName() override { return SkString("simpleblurroundrect"); }
 
-protected:
-
-    SkString onShortName() override {
-        return fName;
-    }
-
-    SkISize onISize() override {
-        return SkISize::Make(1000, 500);
-    }
+    SkISize onISize() override { return {1000, 500}; }
 
     void onDraw(SkCanvas* canvas) override {
         canvas->scale(1.5f, 1.5f);
@@ -171,10 +152,6 @@
             }
         }
     }
-private:
-    const SkString  fName;
-
-    typedef         skiagm::GM INHERITED;
 };
 
 // Create one with dimensions/rounded corners based on the skp
diff --git a/gm/filterbitmap.cpp b/gm/filterbitmap.cpp
index ee37789..f123b61 100644
--- a/gm/filterbitmap.cpp
+++ b/gm/filterbitmap.cpp
@@ -54,6 +54,7 @@
 
 class FilterBitmapGM : public skiagm::GM {
     void onOnceBeforeDraw() override {
+        this->setBGColor(0xFFDDDDDD);
 
         this->makeBitmap();
 
@@ -69,25 +70,11 @@
         fMatrix[2].setScale(0.7f, 1.05f);
     }
 
-public:
+protected:
     SkBitmap    fBM;
     SkMatrix    fMatrix[3];
-    SkString    fName;
 
-    FilterBitmapGM()
-    {
-        this->setBGColor(0xFFDDDDDD);
-    }
-
-protected:
-
-    SkString onShortName() override {
-        return fName;
-    }
-
-    SkISize onISize() override {
-        return SkISize::Make(1024, 768);
-    }
+    SkISize onISize() override { return SkISize::Make(1024, 768); }
 
     virtual void makeBitmap() = 0;
     virtual SkScalar getScale() = 0;
@@ -104,21 +91,17 @@
             canvas->translate(0, size.fHeight);
         }
     }
-
-private:
-    typedef skiagm::GM INHERITED;
 };
 
 class FilterBitmapTextGM: public FilterBitmapGM {
-  public:
-      FilterBitmapTextGM(float textSize)
-      : fTextSize(textSize)
-        {
-            fName.printf("filterbitmap_text_%.2fpt", fTextSize);
-        }
+public:
+      FilterBitmapTextGM(float textSize) : fTextSize(textSize) {}
 
-  protected:
-      float fTextSize;
+private:
+      SkString onShortName() override {
+          return SkStringPrintf("filterbitmap_text_%.2fpt", fTextSize);
+      }
+      const float fTextSize;
 
       SkScalar getScale() override {
           return 32.f/fTextSize;
@@ -143,20 +126,18 @@
           setTypeface(&font, "serif", SkFontStyle::BoldItalic());
           canvas.drawString("Hamburgefons", fTextSize/2, 4.8f*fTextSize, font, paint);
       }
-  private:
-      typedef FilterBitmapGM INHERITED;
 };
 
 class FilterBitmapCheckerboardGM: public FilterBitmapGM {
+    SkString onShortName() override {
+        return SkStringPrintf("filterbitmap_checkerboard_%d_%d%s",
+                              fSize, fNumChecks, fConvertToG8 ? "_g8" : "");
+    }
 public:
     FilterBitmapCheckerboardGM(int size, int num_checks, bool convertToG8 = false)
-        : fSize(size), fNumChecks(num_checks), fConvertToG8(convertToG8)
-    {
-        fName.printf("filterbitmap_checkerboard_%d_%d%s",
-                     fSize, fNumChecks, convertToG8 ? "_g8" : "");
-    }
+        : fSize(size), fNumChecks(num_checks), fConvertToG8(convertToG8) {}
 
-  protected:
+protected:
       int fSize;
       int fNumChecks;
 
@@ -190,23 +171,24 @@
 };
 
 class FilterBitmapImageGM: public FilterBitmapGM {
-public:
-    FilterBitmapImageGM(const char filename[], bool convertToG8 = false)
-        : fFilename(filename), fConvertToG8(convertToG8)
-    {
-        fName.printf("filterbitmap_image_%s%s", filename, convertToG8 ? "_g8" : "");
+    const char* fFilename;
+    int fSize;
+
+    SkString onShortName() override {
+        return SkStringPrintf("filterbitmap_image_%s%s", fFilename, fConvertToG8 ? "_g8" : "");
     }
 
-protected:
-      SkString fFilename;
-      int fSize;
+public:
+    FilterBitmapImageGM(const char filename[], bool convertToG8 = false)
+        : fFilename(filename), fConvertToG8(convertToG8) {}
 
+protected:
       SkScalar getScale() override {
           return 192.f/fSize;
       }
 
       void makeBitmap() override {
-        SkString resource = SkStringPrintf("images/%s", fFilename.c_str());
+        SkString resource = SkStringPrintf("images/%s", fFilename);
         if (!GetResourceAsBitmap(resource.c_str(), &fBM)) {
             fBM.allocN32Pixels(1, 1);
             fBM.eraseARGB(255, 255, 0 , 0); // red == bad
diff --git a/gm/filterindiabox.cpp b/gm/filterindiabox.cpp
index c22a0e7..95a9ccc 100644
--- a/gm/filterindiabox.cpp
+++ b/gm/filterindiabox.cpp
@@ -19,6 +19,7 @@
 #include "tools/Resources.h"
 #include "tools/ToolUtils.h"
 
+namespace {
 static SkSize computeSize(const SkBitmap& bm, const SkMatrix& mat) {
     SkRect bounds = SkRect::MakeWH(SkIntToScalar(bm.width()),
                                    SkIntToScalar(bm.height()));
@@ -46,8 +47,15 @@
 }
 
 class FilterIndiaBoxGM : public skiagm::GM {
+    SkBitmap    fBM;
+    SkMatrix    fMatrix[2];
+
     void onOnceBeforeDraw() override {
-        this->makeBitmap();
+        constexpr char kResource[] = "images/box.gif";
+        if (!GetResourceAsBitmap(kResource, &fBM)) {
+            fBM.allocN32Pixels(1, 1);
+            fBM.eraseARGB(255, 255, 0 , 0); // red == bad
+        }
 
         SkScalar cx = SkScalarHalf(fBM.width());
         SkScalar cy = SkScalarHalf(fBM.height());
@@ -59,25 +67,9 @@
         fMatrix[1].setRotate(30, cx, cy); fMatrix[1].postScale(horizScale, vertScale);
     }
 
-public:
-    SkBitmap    fBM;
-    SkMatrix    fMatrix[2];
-    SkString    fName;
+    SkString onShortName() override { return SkString("filterindiabox"); }
 
-    FilterIndiaBoxGM() { this->setBGColor(ToolUtils::color_to_565(0xFFDDDDDD)); }
-
-    FilterIndiaBoxGM(const char filename[]) : fFilename(filename) {
-        fName.printf("filterindiabox");
-    }
-
-protected:
-    SkString onShortName() override {
-        return fName;
-    }
-
-    SkISize onISize() override {
-        return SkISize::Make(680, 130);
-    }
+    SkISize onISize() override { return {680, 130}; }
 
     void onDraw(SkCanvas* canvas) override {
         canvas->translate(10, 10);
@@ -90,27 +82,7 @@
             canvas->translate(0, size.fHeight);
         }
     }
-
-  protected:
-      SkString fFilename;
-      int fSize;
-
-      SkScalar getScale() {
-          return 192.f/fSize;
-      }
-
-      void makeBitmap() {
-        if (!GetResourceAsBitmap(fFilename.c_str(), &fBM)) {
-            fBM.allocN32Pixels(1, 1);
-            fBM.eraseARGB(255, 255, 0 , 0); // red == bad
-        }
-        fSize = fBM.height();
-      }
-  private:
-    typedef skiagm::GM INHERITED;
 };
+}  // namespace
 
-//////////////////////////////////////////////////////////////////////////////
-
-
-DEF_GM( return new FilterIndiaBoxGM("images/box.gif"); )
+DEF_GM( return new FilterIndiaBoxGM(); )
diff --git a/gm/fontmgr.cpp b/gm/fontmgr.cpp
index 8b2b244..8eb24f1 100644
--- a/gm/fontmgr.cpp
+++ b/gm/fontmgr.cpp
@@ -69,22 +69,16 @@
 static const char* ja = "ja";
 
 class FontMgrGM : public skiagm::GM {
-public:
-    FontMgrGM() {
-        SkGraphics::SetFontCacheLimit(16 * 1024 * 1024);
+    sk_sp<SkFontMgr> fFM;
 
-        fName.set("fontmgr_iter");
+    void onOnceBeforeDraw() override {
+        SkGraphics::SetFontCacheLimit(16 * 1024 * 1024);
         fFM = SkFontMgr::RefDefault();
     }
 
-protected:
-    SkString onShortName() override {
-        return fName;
-    }
+    SkString onShortName() override { return SkString("fontmgr_iter"); }
 
-    SkISize onISize() override {
-        return SkISize::Make(1536, 768);
-    }
+    SkISize onISize() override { return {1536, 768}; }
 
     void onDraw(SkCanvas* canvas) override {
         SkScalar y = 20;
@@ -123,29 +117,19 @@
             y += 24;
         }
     }
-
-private:
-    sk_sp<SkFontMgr> fFM;
-    SkString fName;
-    typedef GM INHERITED;
 };
 
 class FontMgrMatchGM : public skiagm::GM {
     sk_sp<SkFontMgr> fFM;
 
-public:
-    FontMgrMatchGM() : fFM(SkFontMgr::RefDefault()) {
+    void onOnceBeforeDraw() override {
+        fFM = SkFontMgr::RefDefault();
         SkGraphics::SetFontCacheLimit(16 * 1024 * 1024);
     }
 
-protected:
-    SkString onShortName() override {
-        return SkString("fontmgr_match");
-    }
+    SkString onShortName() override { return SkString("fontmgr_match"); }
 
-    SkISize onISize() override {
-        return SkISize::Make(640, 1024);
-    }
+    SkISize onISize() override { return {640, 1024}; }
 
     void iterateFamily(SkCanvas* canvas, const SkFont& font, SkFontStyleSet* fset) {
         SkFont f(font);
@@ -211,23 +195,22 @@
         this->iterateFamily(canvas, font, fset.get());
         return DrawResult::kOk;
     }
-
-private:
-    typedef GM INHERITED;
 };
 
 class FontMgrBoundsGM : public skiagm::GM {
 public:
-    FontMgrBoundsGM(double scale, double skew)
-        : fFM(SkFontMgr::RefDefault())
-        , fName("fontmgr_bounds")
-        , fScaleX(SkDoubleToScalar(scale))
-        , fSkewX(SkDoubleToScalar(skew))
-        , fLabelBounds(false)
-    {
-        if (scale != 1 || skew != 0) {
-            fName.appendf("_%g_%g", scale, skew);
+    FontMgrBoundsGM(float scale, float skew) : fScaleX(scale) , fSkewX(skew) {}
+
+private:
+    SkString onShortName() override {
+        if (fScaleX != 1 || fSkewX != 0) {
+            return SkStringPrintf("fontmgr_bounds_%g_%g", fScaleX, fSkewX);
         }
+        return SkString("fontmgr_bounds");
+    }
+
+    void onOnceBeforeDraw() override {
+        fFM = SkFontMgr::RefDefault();
     }
 
     bool onGetControls(SkMetaData* controls) override {
@@ -318,17 +301,9 @@
             }
 
         }
-
     }
 
-protected:
-    SkString onShortName() override {
-        return fName;
-    }
-
-    SkISize onISize() override {
-        return SkISize::Make(1024, 850);
-    }
+    SkISize onISize() override { return {1024, 850}; }
 
     void onDraw(SkCanvas* canvas) override {
         SkFont font;
@@ -372,19 +347,16 @@
         }
     }
 
-private:
-    const sk_sp<SkFontMgr> fFM;
-    SkString fName;
+    sk_sp<SkFontMgr> fFM;
     const SkScalar fScaleX;
     const SkScalar fSkewX;
-    bool fLabelBounds;
-    typedef GM INHERITED;
+    bool fLabelBounds = false;
 };
 
 //////////////////////////////////////////////////////////////////////////////
 
 DEF_GM(return new FontMgrGM;)
 DEF_GM(return new FontMgrMatchGM;)
-DEF_GM(return new FontMgrBoundsGM(1.0, 0);)
-DEF_GM(return new FontMgrBoundsGM(0.75, 0);)
-DEF_GM(return new FontMgrBoundsGM(1.0, -0.25);)
+DEF_GM(return new FontMgrBoundsGM(1, 0);)
+DEF_GM(return new FontMgrBoundsGM(0.75f, 0);)
+DEF_GM(return new FontMgrBoundsGM(1, -0.25f);)
diff --git a/gm/runtimeshader.cpp b/gm/runtimeshader.cpp
index 4e783ec..244de61 100644
--- a/gm/runtimeshader.cpp
+++ b/gm/runtimeshader.cpp
@@ -35,21 +35,13 @@
 static sk_sp<SkShader> gShader;
 
 class RuntimeShader : public skiagm::GM {
-public:
-    RuntimeShader() {
-        fName.printf("runtime_shader");
-    }
+    sk_sp<SkData> fData;
 
-protected:
     bool runAsBench() const override { return true; }
 
-    SkString onShortName() override {
-        return fName;
-    }
+    SkString onShortName() override { return SkString("runtime_shader"); }
 
-    SkISize onISize() override {
-        return SkISize::Make(512, 256);
-    }
+    SkISize onISize() override { return {512, 256}; }
 
     void onOnceBeforeDraw() override {
         // use global to pass gl persistent cache test in dm
@@ -69,10 +61,5 @@
         p.setShader(gShader);
         canvas->drawRect({0, 0, 256, 256}, p);
     }
-private:
-    SkString fName;
-    sk_sp<SkData> fData;
-
-    typedef skiagm::GM INHERITED;
 };
 DEF_GM(return new RuntimeShader;)
diff --git a/gm/shallowgradient.cpp b/gm/shallowgradient.cpp
index 43bee6a..fc959f3 100644
--- a/gm/shallowgradient.cpp
+++ b/gm/shallowgradient.cpp
@@ -45,20 +45,18 @@
 class ShallowGradientGM : public skiagm::GM {
 public:
     ShallowGradientGM(MakeShaderProc proc, const char name[], bool dither)
-        : fProc(proc)
-        , fDither(dither) {
-        fName.printf("shallow_gradient_%s", name);
-    }
+        : fProc(proc), fName(name), fDither(dither) {}
 
-protected:
+private:
+    MakeShaderProc fProc;
+    const char* fName;
+    bool fDither;
 
     SkString onShortName() override {
-        return fName;
+        return SkStringPrintf("shallow_gradient_%s%s", fName, fDither ? "" : "_nodither");
     }
 
-    SkISize onISize() override {
-        return SkISize::Make(800, 800);
-    }
+    SkISize onISize() override { return {800, 800}; }
 
     void onDraw(SkCanvas* canvas) override {
         const SkColor colors[] = { 0xFF555555, 0xFF444444 };
@@ -72,23 +70,18 @@
         paint.setDither(fDither);
         canvas->drawRect(r, paint);
     }
-
-private:
-    MakeShaderProc fProc;
-    SkString fName;
-    bool fDither;
-
-    typedef skiagm::GM INHERITED;
 };
 
 ///////////////////////////////////////////////////////////////////////////////
 
-DEF_GM( return new ShallowGradientGM(shader_linear, "linear", true); )
-DEF_GM( return new ShallowGradientGM(shader_radial, "radial", true); )
-DEF_GM( return new ShallowGradientGM(shader_conical, "conical", true); )
-DEF_GM( return new ShallowGradientGM(shader_sweep, "sweep", true); )
+#define M(PROC, DITHER) DEF_GM( return new ShallowGradientGM(shader_ ## PROC, #PROC, DITHER); )
+M(linear,  true)
+M(radial,  true)
+M(conical, true)
+M(sweep,   true)
 
-DEF_GM( return new ShallowGradientGM(shader_linear, "linear_nodither", false); )
-DEF_GM( return new ShallowGradientGM(shader_radial, "radial_nodither", false); )
-DEF_GM( return new ShallowGradientGM(shader_conical, "conical_nodither", false); )
-DEF_GM( return new ShallowGradientGM(shader_sweep, "sweep_nodither", false); )
+M(linear,  false)
+M(radial,  false)
+M(conical, false)
+M(sweep,   false)
+#undef M
diff --git a/gm/tilemodes.cpp b/gm/tilemodes.cpp
index 6cdabef..fe39744 100644
--- a/gm/tilemodes.cpp
+++ b/gm/tilemodes.cpp
@@ -197,17 +197,13 @@
 
 class Tiling2GM : public skiagm::GM {
     ShaderProc fProc;
-    SkString   fName;
+    const char* fName;
+
 public:
-    Tiling2GM(ShaderProc proc, const char name[]) : fProc(proc) {
-        fName.printf("tilemode_%s", name);
-    }
+    Tiling2GM(ShaderProc proc, const char name[]) : fProc(proc), fName(name) {}
 
-protected:
-
-    SkString onShortName() override {
-        return fName;
-    }
+private:
+    SkString onShortName() override { return SkString(fName); }
 
     SkISize onISize() override { return SkISize::Make(650, 610); }
 
@@ -261,12 +257,10 @@
             y += r.height() * 4 / 3;
         }
     }
-
-private:
-    typedef skiagm::GM INHERITED;
 };
-DEF_GM( return new Tiling2GM(make_bm, "bitmap"); )
-DEF_GM( return new Tiling2GM(make_grad, "gradient"); )
+
+DEF_GM( return new Tiling2GM(make_bm,   "tilemode_bitmap"); )
+DEF_GM( return new Tiling2GM(make_grad, "tilemode_gradient"); )
 
 ////////////////////
 
diff --git a/gm/tilemodes_scaled.cpp b/gm/tilemodes_scaled.cpp
index 2b41a1d..88d8c8b 100644
--- a/gm/tilemodes_scaled.cpp
+++ b/gm/tilemodes_scaled.cpp
@@ -194,17 +194,12 @@
 
 class ScaledTiling2GM : public skiagm::GM {
     ShaderProc fProc;
-    SkString   fName;
+    const char* fName;
 public:
-    ScaledTiling2GM(ShaderProc proc, const char name[]) : fProc(proc) {
-        fName.printf("scaled_tilemode_%s", name);
-    }
+    ScaledTiling2GM(ShaderProc proc, const char name[]) : fProc(proc), fName(name) {}
 
-protected:
-
-    SkString onShortName() override {
-        return fName;
-    }
+private:
+    SkString onShortName() override { return SkString(fName); }
 
     SkISize onISize() override { return SkISize::Make(650, 610); }
 
@@ -257,14 +252,11 @@
             y += r.height() * 4 / 3;
         }
     }
-
-private:
-    typedef skiagm::GM INHERITED;
 };
 
 //////////////////////////////////////////////////////////////////////////////
 
 DEF_GM( return new ScaledTilingGM(true); )
 DEF_GM( return new ScaledTilingGM(false); )
-DEF_GM( return new ScaledTiling2GM(make_bm, "bitmap"); )
-DEF_GM( return new ScaledTiling2GM(make_grad, "gradient"); )
+DEF_GM( return new ScaledTiling2GM(make_bm, "scaled_tilemode_bitmap"); )
+DEF_GM( return new ScaledTiling2GM(make_grad, "scaled_tilemode_gradient"); )
diff --git a/gm/verylargebitmap.cpp b/gm/verylargebitmap.cpp
index 70cd745..c5b8e10 100644
--- a/gm/verylargebitmap.cpp
+++ b/gm/verylargebitmap.cpp
@@ -45,7 +45,7 @@
     SkPictureRecorder recorder;
     draw(recorder.beginRecording(SkRect::MakeIWH(width, height)), width, height, colors);
     return SkImage::MakeFromPicture(recorder.finishRecordingAsPicture(),
-                                    SkISize::Make(width, height), nullptr, nullptr,
+                                    {width, height}, nullptr, nullptr,
                                     SkImage::BitDepth::kU8,
                                     SkColorSpace::MakeSRGB());
 }
@@ -82,21 +82,15 @@
 
 class VeryLargeBitmapGM : public skiagm::GM {
     ImageMakerProc  fProc;
-    SkString        fName;
+    const char*     fName;
 
 public:
-    VeryLargeBitmapGM(ImageMakerProc proc, const char suffix[]) : fProc(proc) {
-        fName.printf("verylarge%s", suffix);
-    }
+    VeryLargeBitmapGM(ImageMakerProc proc, const char name[]) : fProc(proc), fName(name) {}
 
-protected:
-    SkString onShortName() override {
-        return fName;
-    }
+private:
+    SkString onShortName() override { return SkString(fName); }
 
-    SkISize onISize() override {
-        return SkISize::Make(500, 600);
-    }
+    SkISize onISize() override { return {500, 600}; }
 
     void onDraw(SkCanvas* canvas) override {
         int veryBig = 65*1024; // 64K < size
@@ -128,9 +122,7 @@
         // This used to be big enough that we didn't draw on CPU, but now we do.
         show_image(canvas, veryBig, small, colors, fProc);
     }
-
-private:
-    typedef skiagm::GM INHERITED;
 };
-DEF_GM( return new VeryLargeBitmapGM(make_raster_image, "bitmap"); )
-DEF_GM( return new VeryLargeBitmapGM(make_picture_image, "_picture_image"); )
+
+DEF_GM( return new VeryLargeBitmapGM(make_raster_image, "verylargebitmap"); )
+DEF_GM( return new VeryLargeBitmapGM(make_picture_image, "verylarge_picture_image"); )
