Changed to a class based method in passing around the rendering method for render_pictures.

This is based on a comment for https://codereview.appspot.com/6427061/

Review URL: https://codereview.appspot.com/6405080

git-svn-id: http://skia.googlecode.com/svn/trunk@4786 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tools/PictureRenderer.h b/tools/PictureRenderer.h
new file mode 100644
index 0000000..5fa53c1
--- /dev/null
+++ b/tools/PictureRenderer.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef PictureRenderer_DEFINED
+#define PictureRenderer_DEFINED
+#include "SkTypes.h"
+#include "SkTDArray.h"
+#include "SkRefCnt.h"
+
+class SkBitmap;
+class SkCanvas;
+class SkPicture;
+
+namespace sk_tools {
+
+class PictureRenderer : public SkRefCnt {
+public:
+    virtual void init(const SkPicture& pict){}
+    virtual void render(SkPicture* pict, SkCanvas* canvas) = 0;
+};
+
+class PipePictureRenderer : public PictureRenderer {
+    virtual void render(SkPicture* pict, SkCanvas* canvas);
+};
+
+class SimplePictureRenderer : public PictureRenderer {
+    virtual void render (SkPicture* pict, SkCanvas* canvas);
+};
+
+class TiledPictureRenderer : public PictureRenderer {
+public:
+    TiledPictureRenderer();
+
+    virtual void init(const SkPicture& pict);
+    virtual void render(SkPicture* pict, SkCanvas* canvas);
+
+    ~TiledPictureRenderer();
+
+private:
+    struct TileInfo {
+        SkBitmap* fBitmap;
+        SkCanvas* fCanvas;
+    };
+
+    int fTileWidth;
+    int fTileHeight;
+
+    SkTDArray<TileInfo> fTiles;
+
+    // Clips the tile to an area that is completely in what the SkPicture says is the
+    // drawn-to area. This is mostly important for tiles on the right and bottom edges
+    // as they may go over this area and the picture may have some commands that
+    // draw outside of this area and so should not actually be written.
+    static void clipTile(const SkPicture& picture, const TileInfo& tile);
+    void addTile(const SkPicture& picture, int tile_x_start, int tile_y_start);
+    void setupTiles(const SkPicture& picture);
+    // We manually delete the tiles instead of having a destructor on TileInfo as
+    // the destructor on TileInfo will be during a realloc. This would result in
+    // the canvases and bitmaps being prematurely deleted.
+    void deleteTiles();
+    void copyTilesToCanvas(const SkPicture& pict, SkCanvas* destination);
+};
+
+}
+
+#endif  // PictureRenderer_DEFINED