blob: c6abc1d2f8ddb32374afb68e7943f9f86fe02e18 [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();
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +000036
37 if (fTileWidthPercentage > 0) {
38 fTileWidth = sk_float_ceil2int(fTileWidthPercentage * pict.width() / 100);
39 }
40 if (fTileHeightPercentage > 0) {
41 fTileHeight = sk_float_ceil2int(fTileHeightPercentage * pict.height() / 100);
42 }
43
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000044 setupTiles(pict);
45}
46
47void TiledPictureRenderer::render(SkPicture* pict, SkCanvas* canvas) {
keyar@chromium.org163b5672012-08-01 17:53:29 +000048 drawTiles(pict);
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000049
50 copyTilesToCanvas(*pict, canvas);
51}
52
53TiledPictureRenderer::~TiledPictureRenderer() {
54 deleteTiles();
55}
56
57void TiledPictureRenderer::clipTile(const SkPicture& picture, const TileInfo& tile) {
58 SkRect clip = SkRect::MakeWH(SkIntToScalar(picture.width()),
59 SkIntToScalar(picture.height()));
60 tile.fCanvas->clipRect(clip);
61}
62
63void TiledPictureRenderer::addTile(const SkPicture& picture, int tile_x_start, int tile_y_start) {
64 TileInfo* tile = fTiles.push();
65
66 tile->fBitmap = SkNEW(SkBitmap);
67 sk_tools::setup_bitmap(tile->fBitmap, fTileWidth, fTileHeight);
68
69 tile->fCanvas = SkNEW_ARGS(SkCanvas, (*(tile->fBitmap)));
70 tile->fCanvas->translate(SkIntToScalar(-tile_x_start), SkIntToScalar(-tile_y_start));
71 clipTile(picture, *tile);
72}
73
74void TiledPictureRenderer::setupTiles(const SkPicture& picture) {
75 for (int tile_y_start = 0; tile_y_start < picture.height();
76 tile_y_start += fTileHeight) {
77 for (int tile_x_start = 0; tile_x_start < picture.width();
78 tile_x_start += fTileWidth) {
79 addTile(picture, tile_x_start, tile_y_start);
80 }
81 }
82}
83
84void TiledPictureRenderer::deleteTiles() {
85 for (int i = 0; i < fTiles.count(); ++i) {
86 SkDELETE(fTiles[i].fCanvas);
87 SkDELETE(fTiles[i].fBitmap);
88 }
89
90 fTiles.reset();
91}
92
keyar@chromium.org163b5672012-08-01 17:53:29 +000093void TiledPictureRenderer::drawTiles(SkPicture* pict) {
94 for (int i = 0; i < fTiles.count(); ++i) {
95 fTiles[i].fCanvas->drawPicture(*pict);
96 }
97}
98
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000099void TiledPictureRenderer::copyTilesToCanvas(const SkPicture& pict, SkCanvas* destination) {
100 int tile_index = 0;
101 for (int tile_y_start = 0; tile_y_start < pict.height();
102 tile_y_start += fTileHeight) {
103 for (int tile_x_start = 0; tile_x_start < pict.width();
104 tile_x_start += fTileWidth) {
105 SkASSERT(tile_index < fTiles.count());
106 SkBitmap source = fTiles[tile_index].fCanvas->getDevice()->accessBitmap(false);
robertphillips@google.comfc91dc72012-07-26 21:18:31 +0000107 destination->drawBitmap(source,
108 SkIntToScalar(tile_x_start),
109 SkIntToScalar(tile_y_start));
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000110 ++tile_index;
111 }
112 }
113}
114
115}