blob: a8975bffa6020d2f6b43c2c6a445ab01f7f1adbe [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;
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000016class SkGLContext;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000017class SkPicture;
18
19namespace sk_tools {
20
21class PictureRenderer : public SkRefCnt {
22public:
keyar@chromium.org9d696c02012-08-07 17:11:33 +000023 virtual void init(SkPicture* pict);
24 virtual void render() = 0;
25 virtual void end();
26
27 SkCanvas* getCanvas() {
28 return fCanvas.get();
29 }
30
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000031 void setUseBitmapDevice() {
32 fDeviceType=kBitmap_DeviceType;
33 }
34
35#if SK_SUPPORT_GPU
36 void setUseGpuDevice() {
37 fDeviceType = kGPU_DeviceType;
38 }
39#endif
40
41 PictureRenderer() : fPicture(NULL), fDeviceType(kBitmap_DeviceType){}
keyar@chromium.org9d696c02012-08-07 17:11:33 +000042protected:
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000043 enum SkDeviceTypes {
44 kBitmap_DeviceType,
45#if SK_SUPPORT_GPU
46 kGPU_DeviceType
47#endif
48 };
49
keyar@chromium.org9d696c02012-08-07 17:11:33 +000050 SkAutoTUnref<SkCanvas> fCanvas;
51 SkPicture* fPicture;
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000052 SkDeviceTypes fDeviceType;
53 SkGLContext* fGLContext;
keyar@chromium.org9d696c02012-08-07 17:11:33 +000054
55private:
56 typedef SkRefCnt INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000057};
58
59class PipePictureRenderer : public PictureRenderer {
keyar@chromium.org163b5672012-08-01 17:53:29 +000060public:
keyar@chromium.org9d696c02012-08-07 17:11:33 +000061 virtual void render() SK_OVERRIDE;
62
63private:
64 typedef PictureRenderer INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000065};
66
67class SimplePictureRenderer : public PictureRenderer {
keyar@chromium.org163b5672012-08-01 17:53:29 +000068public:
keyar@chromium.org9d696c02012-08-07 17:11:33 +000069 virtual void render () SK_OVERRIDE;
70
71private:
72 typedef PictureRenderer INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000073};
74
75class TiledPictureRenderer : public PictureRenderer {
76public:
77 TiledPictureRenderer();
78
keyar@chromium.org9d696c02012-08-07 17:11:33 +000079 virtual void init(SkPicture* pict) SK_OVERRIDE;
80 virtual void render() SK_OVERRIDE;
81 virtual void end() SK_OVERRIDE;
82 void drawTiles();
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000083
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +000084 void setTileWidth(int width) {
85 fTileWidth = width;
86 }
87
88 int getTileWidth() const {
89 return fTileWidth;
90 }
91
92 void setTileHeight(int height) {
93 fTileHeight = height;
94 }
95
96 int getTileHeight() const {
97 return fTileHeight;
98 }
99
100 void setTileWidthPercentage(double percentage) {
101 fTileWidthPercentage = percentage;
102 }
103
keyar@chromium.org163b5672012-08-01 17:53:29 +0000104 double getTileWidthPercentage() const {
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000105 return fTileWidthPercentage;
106 }
107
108 void setTileHeightPercentage(double percentage) {
109 fTileHeightPercentage = percentage;
110 }
111
keyar@chromium.org163b5672012-08-01 17:53:29 +0000112 double getTileHeightPercentage() const {
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000113 return fTileHeightPercentage;
114 }
115
keyar@chromium.org163b5672012-08-01 17:53:29 +0000116 int numTiles() const {
117 return fTiles.count();
118 }
119
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000120 ~TiledPictureRenderer();
121
122private:
123 struct TileInfo {
124 SkBitmap* fBitmap;
125 SkCanvas* fCanvas;
126 };
127
128 int fTileWidth;
129 int fTileHeight;
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000130 double fTileWidthPercentage;
131 double fTileHeightPercentage;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000132
133 SkTDArray<TileInfo> fTiles;
134
135 // Clips the tile to an area that is completely in what the SkPicture says is the
136 // drawn-to area. This is mostly important for tiles on the right and bottom edges
137 // as they may go over this area and the picture may have some commands that
138 // draw outside of this area and so should not actually be written.
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000139 void clipTile(const TileInfo& tile);
140 void addTile(int tile_x_start, int tile_y_start);
141 void setupTiles();
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000142 // We manually delete the tiles instead of having a destructor on TileInfo as
143 // the destructor on TileInfo will be during a realloc. This would result in
144 // the canvases and bitmaps being prematurely deleted.
145 void deleteTiles();
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000146 void copyTilesToCanvas();
147
148 typedef PictureRenderer INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000149};
150
151}
152
153#endif // PictureRenderer_DEFINED