blob: 69923737acdd47da12f32e5831afa3ea14493356 [file] [log] [blame]
keyar@chromium.org451bb9f2012-07-26 17:27:57 +00001/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef PictureRenderer_DEFINED
9#define PictureRenderer_DEFINED
10#include "SkTypes.h"
11#include "SkTDArray.h"
12#include "SkRefCnt.h"
13
14class SkBitmap;
15class SkCanvas;
16class SkPicture;
17
18namespace sk_tools {
19
20class PictureRenderer : public SkRefCnt {
21public:
22 virtual void init(const SkPicture& pict){}
23 virtual void render(SkPicture* pict, SkCanvas* canvas) = 0;
24};
25
26class PipePictureRenderer : public PictureRenderer {
keyar@chromium.org163b5672012-08-01 17:53:29 +000027public:
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000028 virtual void render(SkPicture* pict, SkCanvas* canvas);
29};
30
31class SimplePictureRenderer : public PictureRenderer {
keyar@chromium.org163b5672012-08-01 17:53:29 +000032public:
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000033 virtual void render (SkPicture* pict, SkCanvas* canvas);
34};
35
36class TiledPictureRenderer : public PictureRenderer {
37public:
38 TiledPictureRenderer();
39
40 virtual void init(const SkPicture& pict);
41 virtual void render(SkPicture* pict, SkCanvas* canvas);
keyar@chromium.org163b5672012-08-01 17:53:29 +000042 void drawTiles(SkPicture* pict);
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000043
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +000044 void setTileWidth(int width) {
45 fTileWidth = width;
46 }
47
48 int getTileWidth() const {
49 return fTileWidth;
50 }
51
52 void setTileHeight(int height) {
53 fTileHeight = height;
54 }
55
56 int getTileHeight() const {
57 return fTileHeight;
58 }
59
60 void setTileWidthPercentage(double percentage) {
61 fTileWidthPercentage = percentage;
62 }
63
keyar@chromium.org163b5672012-08-01 17:53:29 +000064 double getTileWidthPercentage() const {
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +000065 return fTileWidthPercentage;
66 }
67
68 void setTileHeightPercentage(double percentage) {
69 fTileHeightPercentage = percentage;
70 }
71
keyar@chromium.org163b5672012-08-01 17:53:29 +000072 double getTileHeightPercentage() const {
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +000073 return fTileHeightPercentage;
74 }
75
keyar@chromium.org163b5672012-08-01 17:53:29 +000076 int numTiles() const {
77 return fTiles.count();
78 }
79
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000080 ~TiledPictureRenderer();
81
82private:
83 struct TileInfo {
84 SkBitmap* fBitmap;
85 SkCanvas* fCanvas;
86 };
87
88 int fTileWidth;
89 int fTileHeight;
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +000090 double fTileWidthPercentage;
91 double fTileHeightPercentage;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000092
93 SkTDArray<TileInfo> fTiles;
94
95 // Clips the tile to an area that is completely in what the SkPicture says is the
96 // drawn-to area. This is mostly important for tiles on the right and bottom edges
97 // as they may go over this area and the picture may have some commands that
98 // draw outside of this area and so should not actually be written.
99 static void clipTile(const SkPicture& picture, const TileInfo& tile);
100 void addTile(const SkPicture& picture, int tile_x_start, int tile_y_start);
101 void setupTiles(const SkPicture& picture);
102 // We manually delete the tiles instead of having a destructor on TileInfo as
103 // the destructor on TileInfo will be during a realloc. This would result in
104 // the canvases and bitmaps being prematurely deleted.
105 void deleteTiles();
106 void copyTilesToCanvas(const SkPicture& pict, SkCanvas* destination);
107};
108
109}
110
111#endif // PictureRenderer_DEFINED