add onOnceBeforeDraw() virtual, so gm's can easily perform lazy initialization



git-svn-id: http://skia.googlecode.com/svn/trunk@6559 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gm/gm.cpp b/gm/gm.cpp
index 1ccec9f..c1e75e9 100644
--- a/gm/gm.cpp
+++ b/gm/gm.cpp
@@ -13,6 +13,7 @@
 GM::GM() {
     fBGColor = SK_ColorWHITE;
     fCanvasIsDeferred = false;
+    fHaveCalledOnceBeforeDraw = false;
 }
 GM::~GM() {}
 
@@ -22,10 +23,18 @@
 }
 
 void GM::drawContent(SkCanvas* canvas) {
+    if (!fHaveCalledOnceBeforeDraw) {
+        fHaveCalledOnceBeforeDraw = true;
+        this->onOnceBeforeDraw();
+    }
     this->onDraw(canvas);
 }
 
 void GM::drawBackground(SkCanvas* canvas) {
+    if (!fHaveCalledOnceBeforeDraw) {
+        fHaveCalledOnceBeforeDraw = true;
+        this->onOnceBeforeDraw();
+    }
     this->onDrawBackground(canvas);
 }
 
diff --git a/gm/gm.h b/gm/gm.h
index 057325e..9460ec0 100644
--- a/gm/gm.h
+++ b/gm/gm.h
@@ -79,6 +79,7 @@
     protected:
         static SkString gResourcePath;
 
+        virtual void onOnceBeforeDraw() {}
         virtual void onDraw(SkCanvas*) = 0;
         virtual void onDrawBackground(SkCanvas*);
         virtual SkISize onISize() = 0;
@@ -90,6 +91,7 @@
         SkString fShortName;
         SkColor  fBGColor;
         bool     fCanvasIsDeferred; // work-around problem in srcmode.cpp
+        bool     fHaveCalledOnceBeforeDraw;
     };
 
     typedef SkTRegistry<GM*, void*> GMRegistry;
diff --git a/gm/hairmodes.cpp b/gm/hairmodes.cpp
index 67f1fa3..6fd72fc 100644
--- a/gm/hairmodes.cpp
+++ b/gm/hairmodes.cpp
@@ -79,20 +79,20 @@
 
     class HairModesGM : public GM {
         SkPaint fBGPaint;
-    public:
-        HairModesGM() {
-            fBGPaint.setShader(make_bg_shader())->unref();
-        }
 
     protected:
 
-        virtual SkString onShortName() {
+        virtual SkString onShortName() SK_OVERRIDE {
             return SkString("hairmodes");
         }
 
         virtual SkISize onISize() { return make_isize(640, 480); }
 
-        virtual void onDraw(SkCanvas* canvas) {
+        virtual void onOnceBeforeDraw() SK_OVERRIDE {
+            fBGPaint.setShader(make_bg_shader())->unref();
+        }
+
+        virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
             const SkRect bounds = SkRect::MakeWH(W, H);
             static const SkAlpha gAlphaValue[] = { 0xFF, 0x88, 0x88 };
 
diff --git a/gm/tilemodes.cpp b/gm/tilemodes.cpp
index 6745769..f2fbe77 100644
--- a/gm/tilemodes.cpp
+++ b/gm/tilemodes.cpp
@@ -64,9 +64,6 @@
     TilingGM()
             : fLooper(SkIntToScalar(1), SkIntToScalar(2), SkIntToScalar(2),
                       0x88000000) {
-        for (size_t i = 0; i < SK_ARRAY_COUNT(gConfigs); i++) {
-            makebm(&fTexture[i], gConfigs[i], gWidth, gHeight);
-        }
     }
 
     SkBitmap    fTexture[SK_ARRAY_COUNT(gConfigs)];
@@ -78,7 +75,13 @@
 
     SkISize onISize() { return SkISize::Make(880, 560); }
 
-    virtual void onDraw(SkCanvas* canvas) {
+    virtual void onOnceBeforeDraw() SK_OVERRIDE {
+        for (size_t i = 0; i < SK_ARRAY_COUNT(gConfigs); i++) {
+            makebm(&fTexture[i], gConfigs[i], gWidth, gHeight);
+        }
+    }
+
+    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
 
         SkRect r = { 0, 0, SkIntToScalar(gWidth*2), SkIntToScalar(gHeight*2) };
 
diff --git a/gm/tinybitmap.cpp b/gm/tinybitmap.cpp
index 3b1006c..26bf25e 100644
--- a/gm/tinybitmap.cpp
+++ b/gm/tinybitmap.cpp
@@ -32,11 +32,9 @@
 }
 
 class TinyBitmapGM : public GM {
-    SkBitmap    fBM;
 public:
     TinyBitmapGM() {
         this->setBGColor(0xFFDDDDDD);
-        fBM = make_bitmap();
     }
 
 protected:
@@ -47,8 +45,9 @@
     virtual SkISize onISize() { return make_isize(100, 100); }
 
     virtual void onDraw(SkCanvas* canvas) {
+        SkBitmap bm = make_bitmap();
         SkShader* s =
-            SkShader::CreateBitmapShader(fBM, SkShader::kRepeat_TileMode,
+            SkShader::CreateBitmapShader(bm, SkShader::kRepeat_TileMode,
                                          SkShader::kMirror_TileMode);
         SkPaint paint;
         paint.setAlpha(0x80);