aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/PictureRenderer.cpp
diff options
context:
space:
mode:
authorGravatar keyar@chromium.org <keyar@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-07-26 17:27:57 +0000
committerGravatar keyar@chromium.org <keyar@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-07-26 17:27:57 +0000
commit451bb9f801d668275394ca5bd57f238e13cf3d17 (patch)
treeb93890d9631f1efd18fc695819d14fb1d008ade9 /tools/PictureRenderer.cpp
parent9364511bd17d7414efc5df3ee38faa78c6f89eb1 (diff)
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
Diffstat (limited to 'tools/PictureRenderer.cpp')
-rw-r--r--tools/PictureRenderer.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/tools/PictureRenderer.cpp b/tools/PictureRenderer.cpp
new file mode 100644
index 0000000000..762b49cc5b
--- /dev/null
+++ b/tools/PictureRenderer.cpp
@@ -0,0 +1,101 @@
+#include "PictureRenderer.h"
+#include "SamplePipeControllers.h"
+#include "SkCanvas.h"
+#include "SkDevice.h"
+#include "SkGPipe.h"
+#include "SkPicture.h"
+#include "SkTDArray.h"
+#include "SkTypes.h"
+#include "picture_utils.h"
+
+namespace sk_tools {
+
+enum {
+ kDefaultTileWidth = 256,
+ kDefaultTileHeight = 256
+};
+
+void PipePictureRenderer::render(SkPicture* pict, SkCanvas* canvas) {
+ PipeController pipeController(canvas);
+ SkGPipeWriter writer;
+ SkCanvas* pipeCanvas = writer.startRecording(&pipeController);
+ pipeCanvas->drawPicture(*pict);
+ writer.endRecording();
+}
+
+void SimplePictureRenderer::render(SkPicture* pict, SkCanvas* canvas) {
+ canvas->drawPicture(*pict);
+}
+
+TiledPictureRenderer::TiledPictureRenderer()
+ : fTileWidth(kDefaultTileWidth)
+ , fTileHeight(kDefaultTileHeight) {}
+
+void TiledPictureRenderer::init(const SkPicture& pict) {
+ deleteTiles();
+ setupTiles(pict);
+}
+
+void TiledPictureRenderer::render(SkPicture* pict, SkCanvas* canvas) {
+ for (int i = 0; i < fTiles.count(); ++i) {
+ fTiles[i].fCanvas->drawPicture(*pict);
+ }
+
+ copyTilesToCanvas(*pict, canvas);
+}
+
+TiledPictureRenderer::~TiledPictureRenderer() {
+ deleteTiles();
+}
+
+void TiledPictureRenderer::clipTile(const SkPicture& picture, const TileInfo& tile) {
+ SkRect clip = SkRect::MakeWH(SkIntToScalar(picture.width()),
+ SkIntToScalar(picture.height()));
+ tile.fCanvas->clipRect(clip);
+}
+
+void TiledPictureRenderer::addTile(const SkPicture& picture, int tile_x_start, int tile_y_start) {
+ TileInfo* tile = fTiles.push();
+
+ tile->fBitmap = SkNEW(SkBitmap);
+ sk_tools::setup_bitmap(tile->fBitmap, fTileWidth, fTileHeight);
+
+ tile->fCanvas = SkNEW_ARGS(SkCanvas, (*(tile->fBitmap)));
+ tile->fCanvas->translate(SkIntToScalar(-tile_x_start), SkIntToScalar(-tile_y_start));
+ clipTile(picture, *tile);
+}
+
+void TiledPictureRenderer::setupTiles(const SkPicture& picture) {
+ for (int tile_y_start = 0; tile_y_start < picture.height();
+ tile_y_start += fTileHeight) {
+ for (int tile_x_start = 0; tile_x_start < picture.width();
+ tile_x_start += fTileWidth) {
+ addTile(picture, tile_x_start, tile_y_start);
+ }
+ }
+}
+
+void TiledPictureRenderer::deleteTiles() {
+ for (int i = 0; i < fTiles.count(); ++i) {
+ SkDELETE(fTiles[i].fCanvas);
+ SkDELETE(fTiles[i].fBitmap);
+ }
+
+ fTiles.reset();
+}
+
+void TiledPictureRenderer::copyTilesToCanvas(const SkPicture& pict, SkCanvas* destination) {
+ int tile_index = 0;
+ for (int tile_y_start = 0; tile_y_start < pict.height();
+ tile_y_start += fTileHeight) {
+ for (int tile_x_start = 0; tile_x_start < pict.width();
+ tile_x_start += fTileWidth) {
+ SkASSERT(tile_index < fTiles.count());
+ SkBitmap source = fTiles[tile_index].fCanvas->getDevice()->accessBitmap(false);
+ destination->drawBitmap(source, tile_x_start, tile_y_start);
+ ++tile_index;
+ }
+ }
+}
+
+}