blob: f0aba9fc6aa24f60c748f6c38cb68509cb4fee5b [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
keyar@chromium.org9d696c02012-08-07 17:11:33 +000018void PictureRenderer::init(SkPicture* pict) {
19 SkASSERT(fPicture == NULL);
20 SkASSERT(fCanvas.get() == NULL);
21 if (fPicture != NULL || fCanvas.get() != NULL) {
22 return;
23 }
24
25 SkASSERT(pict != NULL);
26 if (pict == NULL) {
27 return;
28 }
29
30 fPicture = pict;
31 SkBitmap bitmap;
32 sk_tools::setup_bitmap(&bitmap, fPicture->width(), fPicture->height());
33 fCanvas.reset(SkNEW_ARGS(SkCanvas, (bitmap)));
34}
35
36void PictureRenderer::end() {
37 fPicture = NULL;
38 fCanvas.reset(NULL);
39}
40
41void PipePictureRenderer::render() {
42 SkASSERT(fCanvas.get() != NULL);
43 SkASSERT(fPicture != NULL);
44 if (fCanvas.get() == NULL || fPicture == NULL) {
45 return;
46 }
47
48 PipeController pipeController(fCanvas.get());
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000049 SkGPipeWriter writer;
50 SkCanvas* pipeCanvas = writer.startRecording(&pipeController);
keyar@chromium.org9d696c02012-08-07 17:11:33 +000051 pipeCanvas->drawPicture(*fPicture);
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000052 writer.endRecording();
53}
54
keyar@chromium.org9d696c02012-08-07 17:11:33 +000055void SimplePictureRenderer::render() {
56 SkASSERT(fCanvas.get() != NULL);
57 SkASSERT(fPicture != NULL);
58 if (fCanvas.get() == NULL || fPicture == NULL) {
59 return;
60 }
61
62 fCanvas->drawPicture(*fPicture);
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000063}
64
65TiledPictureRenderer::TiledPictureRenderer()
66 : fTileWidth(kDefaultTileWidth)
67 , fTileHeight(kDefaultTileHeight) {}
68
keyar@chromium.org9d696c02012-08-07 17:11:33 +000069void TiledPictureRenderer::init(SkPicture* pict) {
70 SkASSERT(pict != NULL);
71 SkASSERT(fTiles.count() == 0);
72 if (pict == NULL || fTiles.count() != 0) {
73 return;
74 }
75
76 this->INHERITED::init(pict);
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +000077
78 if (fTileWidthPercentage > 0) {
robertphillips@google.com5d8d1862012-08-15 14:36:41 +000079 fTileWidth = sk_float_ceil2int(float(fTileWidthPercentage * fPicture->width() / 100));
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +000080 }
81 if (fTileHeightPercentage > 0) {
robertphillips@google.com5d8d1862012-08-15 14:36:41 +000082 fTileHeight = sk_float_ceil2int(float(fTileHeightPercentage * fPicture->height() / 100));
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +000083 }
84
keyar@chromium.org9d696c02012-08-07 17:11:33 +000085 this->setupTiles();
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000086}
87
keyar@chromium.org9d696c02012-08-07 17:11:33 +000088void TiledPictureRenderer::render() {
89 SkASSERT(fCanvas.get() != NULL);
90 SkASSERT(fPicture != NULL);
91 if (fCanvas.get() == NULL || fPicture == NULL) {
92 return;
93 }
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000094
keyar@chromium.org9d696c02012-08-07 17:11:33 +000095 this->drawTiles();
96 this->copyTilesToCanvas();
97}
98
99void TiledPictureRenderer::end() {
100 this->deleteTiles();
101 this->INHERITED::end();
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000102}
103
104TiledPictureRenderer::~TiledPictureRenderer() {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000105 this->deleteTiles();
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000106}
107
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000108void TiledPictureRenderer::clipTile(const TileInfo& tile) {
109 SkRect clip = SkRect::MakeWH(SkIntToScalar(fPicture->width()),
110 SkIntToScalar(fPicture->height()));
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000111 tile.fCanvas->clipRect(clip);
112}
113
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000114void TiledPictureRenderer::addTile(int tile_x_start, int tile_y_start) {
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000115 TileInfo* tile = fTiles.push();
116
117 tile->fBitmap = SkNEW(SkBitmap);
118 sk_tools::setup_bitmap(tile->fBitmap, fTileWidth, fTileHeight);
119
120 tile->fCanvas = SkNEW_ARGS(SkCanvas, (*(tile->fBitmap)));
121 tile->fCanvas->translate(SkIntToScalar(-tile_x_start), SkIntToScalar(-tile_y_start));
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000122 this->clipTile(*tile);
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000123}
124
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000125void TiledPictureRenderer::setupTiles() {
126 for (int tile_y_start = 0; tile_y_start < fPicture->height();
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000127 tile_y_start += fTileHeight) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000128 for (int tile_x_start = 0; tile_x_start < fPicture->width();
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000129 tile_x_start += fTileWidth) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000130 this->addTile(tile_x_start, tile_y_start);
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000131 }
132 }
133}
134
135void TiledPictureRenderer::deleteTiles() {
136 for (int i = 0; i < fTiles.count(); ++i) {
137 SkDELETE(fTiles[i].fCanvas);
138 SkDELETE(fTiles[i].fBitmap);
139 }
140
141 fTiles.reset();
142}
143
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000144void TiledPictureRenderer::drawTiles() {
keyar@chromium.org163b5672012-08-01 17:53:29 +0000145 for (int i = 0; i < fTiles.count(); ++i) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000146 fTiles[i].fCanvas->drawPicture(*(fPicture));
keyar@chromium.org163b5672012-08-01 17:53:29 +0000147 }
148}
149
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000150void TiledPictureRenderer::copyTilesToCanvas() {
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000151 int tile_index = 0;
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000152 for (int tile_y_start = 0; tile_y_start < fPicture->height();
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000153 tile_y_start += fTileHeight) {
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000154 for (int tile_x_start = 0; tile_x_start < fPicture->width();
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000155 tile_x_start += fTileWidth) {
156 SkASSERT(tile_index < fTiles.count());
157 SkBitmap source = fTiles[tile_index].fCanvas->getDevice()->accessBitmap(false);
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000158 fCanvas->drawBitmap(source,
159 SkIntToScalar(tile_x_start),
160 SkIntToScalar(tile_y_start));
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000161 ++tile_index;
162 }
163 }
164}
165
166}