blob: b7e48506069704f74cba302e7d56414541ef33ff [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
keyar@chromium.org06125642012-08-20 15:03:33 +000014#if SK_SUPPORT_GPU
15#include "GrContextFactory.h"
16#include "GrContext.h"
17#endif
18
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000019class SkBitmap;
20class SkCanvas;
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000021class SkGLContext;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000022class SkPicture;
23
24namespace sk_tools {
25
26class PictureRenderer : public SkRefCnt {
27public:
keyar@chromium.org9d696c02012-08-07 17:11:33 +000028 virtual void init(SkPicture* pict);
29 virtual void render() = 0;
30 virtual void end();
keyar@chromium.org77a55222012-08-20 15:03:47 +000031 virtual void resetState();
keyar@chromium.org9d696c02012-08-07 17:11:33 +000032
33 SkCanvas* getCanvas() {
34 return fCanvas.get();
35 }
36
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000037 void setUseBitmapDevice() {
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000038 fDeviceType = kBitmap_DeviceType;
39 }
40
41 bool isUsingBitmapDevice() {
keyar@chromium.org78a35c52012-08-20 15:03:44 +000042 return kBitmap_DeviceType == fDeviceType;
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000043 }
44
45#if SK_SUPPORT_GPU
46 void setUseGpuDevice() {
47 fDeviceType = kGPU_DeviceType;
48 }
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000049
50 bool isUsingGpuDevice() {
keyar@chromium.org78a35c52012-08-20 15:03:44 +000051 return kGPU_DeviceType == fDeviceType;
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000052 }
keyar@chromium.org77a55222012-08-20 15:03:47 +000053
54 SkGLContext* getGLContext() {
55 if (this->isUsingGpuDevice()) {
56 return fGrContextFactory.getGLContext(GrContextFactory::kNative_GLContextType);
57 } else {
58 return NULL;
59 }
60 }
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000061#endif
62
keyar@chromium.org02dfb122012-08-20 15:03:36 +000063 PictureRenderer()
keyar@chromium.org06125642012-08-20 15:03:33 +000064 : fPicture(NULL)
65 , fDeviceType(kBitmap_DeviceType)
66#if SK_SUPPORT_GPU
67 , fGrContext(fGrContextFactory.get(GrContextFactory::kNative_GLContextType))
68#endif
69 {}
70
keyar@chromium.org9d696c02012-08-07 17:11:33 +000071protected:
keyar@chromium.orga474ce32012-08-20 15:03:57 +000072 SkCanvas* setupCanvas();
73 SkCanvas* setupCanvas(int width, int height);
74
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000075 enum SkDeviceTypes {
76 kBitmap_DeviceType,
77#if SK_SUPPORT_GPU
78 kGPU_DeviceType
79#endif
80 };
81
keyar@chromium.org9d696c02012-08-07 17:11:33 +000082 SkAutoTUnref<SkCanvas> fCanvas;
83 SkPicture* fPicture;
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000084 SkDeviceTypes fDeviceType;
keyar@chromium.org06125642012-08-20 15:03:33 +000085
86#if SK_SUPPORT_GPU
87 GrContextFactory fGrContextFactory;
88 GrContext* fGrContext;
89#endif
keyar@chromium.org9d696c02012-08-07 17:11:33 +000090
91private:
92 typedef SkRefCnt INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000093};
94
95class PipePictureRenderer : public PictureRenderer {
keyar@chromium.org163b5672012-08-01 17:53:29 +000096public:
keyar@chromium.org9d696c02012-08-07 17:11:33 +000097 virtual void render() SK_OVERRIDE;
98
99private:
100 typedef PictureRenderer INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000101};
102
103class SimplePictureRenderer : public PictureRenderer {
keyar@chromium.org163b5672012-08-01 17:53:29 +0000104public:
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000105 virtual void render () SK_OVERRIDE;
106
107private:
108 typedef PictureRenderer INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000109};
110
111class TiledPictureRenderer : public PictureRenderer {
112public:
113 TiledPictureRenderer();
114
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000115 virtual void init(SkPicture* pict) SK_OVERRIDE;
116 virtual void render() SK_OVERRIDE;
117 virtual void end() SK_OVERRIDE;
keyar@chromium.org275be532012-08-20 15:04:00 +0000118 virtual void resetState() SK_OVERRIDE;
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000119 void drawTiles();
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000120
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000121 void setTileWidth(int width) {
122 fTileWidth = width;
123 }
124
125 int getTileWidth() const {
126 return fTileWidth;
127 }
128
129 void setTileHeight(int height) {
130 fTileHeight = height;
131 }
132
133 int getTileHeight() const {
134 return fTileHeight;
135 }
136
137 void setTileWidthPercentage(double percentage) {
138 fTileWidthPercentage = percentage;
139 }
140
keyar@chromium.org163b5672012-08-01 17:53:29 +0000141 double getTileWidthPercentage() const {
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000142 return fTileWidthPercentage;
143 }
144
145 void setTileHeightPercentage(double percentage) {
146 fTileHeightPercentage = percentage;
147 }
148
keyar@chromium.org163b5672012-08-01 17:53:29 +0000149 double getTileHeightPercentage() const {
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000150 return fTileHeightPercentage;
151 }
152
keyar@chromium.org163b5672012-08-01 17:53:29 +0000153 int numTiles() const {
154 return fTiles.count();
155 }
156
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000157 ~TiledPictureRenderer();
158
159private:
160 struct TileInfo {
161 SkBitmap* fBitmap;
162 SkCanvas* fCanvas;
163 };
164
165 int fTileWidth;
166 int fTileHeight;
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000167 double fTileWidthPercentage;
168 double fTileHeightPercentage;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000169
170 SkTDArray<TileInfo> fTiles;
171
172 // Clips the tile to an area that is completely in what the SkPicture says is the
173 // drawn-to area. This is mostly important for tiles on the right and bottom edges
174 // as they may go over this area and the picture may have some commands that
175 // draw outside of this area and so should not actually be written.
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000176 void clipTile(const TileInfo& tile);
177 void addTile(int tile_x_start, int tile_y_start);
178 void setupTiles();
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000179 // We manually delete the tiles instead of having a destructor on TileInfo as
180 // the destructor on TileInfo will be during a realloc. This would result in
181 // the canvases and bitmaps being prematurely deleted.
182 void deleteTiles();
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000183 void copyTilesToCanvas();
184
185 typedef PictureRenderer INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000186};
187
188}
189
190#endif // PictureRenderer_DEFINED