From 451bb9f801d668275394ca5bd57f238e13cf3d17 Mon Sep 17 00:00:00 2001 From: "keyar@chromium.org" Date: Thu, 26 Jul 2012 17:27:57 +0000 Subject: 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 --- tools/PictureRenderer.cpp | 101 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 tools/PictureRenderer.cpp (limited to 'tools/PictureRenderer.cpp') 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; + } + } +} + +} -- cgit v1.2.3