blob: 762b49cc5bfcbebbe9fbc70bde16df22d2e94687 [file] [log] [blame]
keyar@chromium.org451bb9f2012-07-26 17:27:57 +00001#include "PictureRenderer.h"
2#include "SamplePipeControllers.h"
3#include "SkCanvas.h"
4#include "SkDevice.h"
5#include "SkGPipe.h"
6#include "SkPicture.h"
7#include "SkTDArray.h"
8#include "SkTypes.h"
9#include "picture_utils.h"
10
11namespace sk_tools {
12
13enum {
14 kDefaultTileWidth = 256,
15 kDefaultTileHeight = 256
16};
17
18void PipePictureRenderer::render(SkPicture* pict, SkCanvas* canvas) {
19 PipeController pipeController(canvas);
20 SkGPipeWriter writer;
21 SkCanvas* pipeCanvas = writer.startRecording(&pipeController);
22 pipeCanvas->drawPicture(*pict);
23 writer.endRecording();
24}
25
26void SimplePictureRenderer::render(SkPicture* pict, SkCanvas* canvas) {
27 canvas->drawPicture(*pict);
28}
29
30TiledPictureRenderer::TiledPictureRenderer()
31 : fTileWidth(kDefaultTileWidth)
32 , fTileHeight(kDefaultTileHeight) {}
33
34void TiledPictureRenderer::init(const SkPicture& pict) {
35 deleteTiles();
36 setupTiles(pict);
37}
38
39void TiledPictureRenderer::render(SkPicture* pict, SkCanvas* canvas) {
40 for (int i = 0; i < fTiles.count(); ++i) {
41 fTiles[i].fCanvas->drawPicture(*pict);
42 }
43
44 copyTilesToCanvas(*pict, canvas);
45}
46
47TiledPictureRenderer::~TiledPictureRenderer() {
48 deleteTiles();
49}
50
51void TiledPictureRenderer::clipTile(const SkPicture& picture, const TileInfo& tile) {
52 SkRect clip = SkRect::MakeWH(SkIntToScalar(picture.width()),
53 SkIntToScalar(picture.height()));
54 tile.fCanvas->clipRect(clip);
55}
56
57void TiledPictureRenderer::addTile(const SkPicture& picture, int tile_x_start, int tile_y_start) {
58 TileInfo* tile = fTiles.push();
59
60 tile->fBitmap = SkNEW(SkBitmap);
61 sk_tools::setup_bitmap(tile->fBitmap, fTileWidth, fTileHeight);
62
63 tile->fCanvas = SkNEW_ARGS(SkCanvas, (*(tile->fBitmap)));
64 tile->fCanvas->translate(SkIntToScalar(-tile_x_start), SkIntToScalar(-tile_y_start));
65 clipTile(picture, *tile);
66}
67
68void TiledPictureRenderer::setupTiles(const SkPicture& picture) {
69 for (int tile_y_start = 0; tile_y_start < picture.height();
70 tile_y_start += fTileHeight) {
71 for (int tile_x_start = 0; tile_x_start < picture.width();
72 tile_x_start += fTileWidth) {
73 addTile(picture, tile_x_start, tile_y_start);
74 }
75 }
76}
77
78void TiledPictureRenderer::deleteTiles() {
79 for (int i = 0; i < fTiles.count(); ++i) {
80 SkDELETE(fTiles[i].fCanvas);
81 SkDELETE(fTiles[i].fBitmap);
82 }
83
84 fTiles.reset();
85}
86
87void TiledPictureRenderer::copyTilesToCanvas(const SkPicture& pict, SkCanvas* destination) {
88 int tile_index = 0;
89 for (int tile_y_start = 0; tile_y_start < pict.height();
90 tile_y_start += fTileHeight) {
91 for (int tile_x_start = 0; tile_x_start < pict.width();
92 tile_x_start += fTileWidth) {
93 SkASSERT(tile_index < fTiles.count());
94 SkBitmap source = fTiles[tile_index].fCanvas->getDevice()->accessBitmap(false);
95 destination->drawBitmap(source, tile_x_start, tile_y_start);
96 ++tile_index;
97 }
98 }
99}
100
101}