blob: c901903cfec016ae95bb50c0fa452f89ea601c54 [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
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +000010#include "SkMath.h"
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000011#include "SkTypes.h"
12#include "SkTDArray.h"
13#include "SkRefCnt.h"
14
keyar@chromium.org06125642012-08-20 15:03:33 +000015#if SK_SUPPORT_GPU
16#include "GrContextFactory.h"
17#include "GrContext.h"
18#endif
19
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000020class SkBitmap;
21class SkCanvas;
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000022class SkGLContext;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000023class SkPicture;
keyar@chromium.org9299ede2012-08-21 19:05:08 +000024class SkString;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000025
26namespace sk_tools {
27
28class PictureRenderer : public SkRefCnt {
29public:
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000030 enum SkDeviceTypes {
31 kBitmap_DeviceType,
32#if SK_SUPPORT_GPU
33 kGPU_DeviceType
34#endif
35 };
36
keyar@chromium.org9d696c02012-08-07 17:11:33 +000037 virtual void init(SkPicture* pict);
38 virtual void render() = 0;
39 virtual void end();
keyar@chromium.org28136b32012-08-20 15:04:15 +000040 void resetState();
keyar@chromium.org9d696c02012-08-07 17:11:33 +000041
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000042 void setDeviceType(SkDeviceTypes deviceType) {
43 fDeviceType = deviceType;
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000044 }
45
46 bool isUsingBitmapDevice() {
keyar@chromium.org78a35c52012-08-20 15:03:44 +000047 return kBitmap_DeviceType == fDeviceType;
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000048 }
49
50#if SK_SUPPORT_GPU
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000051 bool isUsingGpuDevice() {
keyar@chromium.org78a35c52012-08-20 15:03:44 +000052 return kGPU_DeviceType == fDeviceType;
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000053 }
keyar@chromium.org77a55222012-08-20 15:03:47 +000054
55 SkGLContext* getGLContext() {
56 if (this->isUsingGpuDevice()) {
57 return fGrContextFactory.getGLContext(GrContextFactory::kNative_GLContextType);
58 } else {
59 return NULL;
60 }
61 }
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000062#endif
63
keyar@chromium.org02dfb122012-08-20 15:03:36 +000064 PictureRenderer()
keyar@chromium.org06125642012-08-20 15:03:33 +000065 : fPicture(NULL)
66 , fDeviceType(kBitmap_DeviceType)
67#if SK_SUPPORT_GPU
68 , fGrContext(fGrContextFactory.get(GrContextFactory::kNative_GLContextType))
69#endif
70 {}
71
keyar@chromium.org9299ede2012-08-21 19:05:08 +000072 bool write(const SkString& path) const;
73
keyar@chromium.org9d696c02012-08-07 17:11:33 +000074protected:
keyar@chromium.org28136b32012-08-20 15:04:15 +000075 virtual void finishDraw();
keyar@chromium.orga474ce32012-08-20 15:03:57 +000076 SkCanvas* setupCanvas();
77 SkCanvas* setupCanvas(int width, int height);
78
keyar@chromium.org9d696c02012-08-07 17:11:33 +000079 SkAutoTUnref<SkCanvas> fCanvas;
80 SkPicture* fPicture;
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000081 SkDeviceTypes fDeviceType;
keyar@chromium.org06125642012-08-20 15:03:33 +000082
83#if SK_SUPPORT_GPU
84 GrContextFactory fGrContextFactory;
85 GrContext* fGrContext;
86#endif
keyar@chromium.org9d696c02012-08-07 17:11:33 +000087
88private:
89 typedef SkRefCnt INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000090};
91
92class PipePictureRenderer : public PictureRenderer {
keyar@chromium.org163b5672012-08-01 17:53:29 +000093public:
keyar@chromium.org9d696c02012-08-07 17:11:33 +000094 virtual void render() SK_OVERRIDE;
95
96private:
97 typedef PictureRenderer INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000098};
99
100class SimplePictureRenderer : public PictureRenderer {
keyar@chromium.org163b5672012-08-01 17:53:29 +0000101public:
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000102 virtual void render () SK_OVERRIDE;
103
104private:
105 typedef PictureRenderer INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000106};
107
108class TiledPictureRenderer : public PictureRenderer {
109public:
110 TiledPictureRenderer();
111
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000112 virtual void init(SkPicture* pict) SK_OVERRIDE;
113 virtual void render() SK_OVERRIDE;
114 virtual void end() SK_OVERRIDE;
115 void drawTiles();
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000116
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000117 void setTileWidth(int width) {
118 fTileWidth = width;
119 }
120
121 int getTileWidth() const {
122 return fTileWidth;
123 }
124
125 void setTileHeight(int height) {
126 fTileHeight = height;
127 }
128
129 int getTileHeight() const {
130 return fTileHeight;
131 }
132
133 void setTileWidthPercentage(double percentage) {
134 fTileWidthPercentage = percentage;
135 }
136
keyar@chromium.org163b5672012-08-01 17:53:29 +0000137 double getTileWidthPercentage() const {
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000138 return fTileWidthPercentage;
139 }
140
141 void setTileHeightPercentage(double percentage) {
142 fTileHeightPercentage = percentage;
143 }
144
keyar@chromium.org163b5672012-08-01 17:53:29 +0000145 double getTileHeightPercentage() const {
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000146 return fTileHeightPercentage;
147 }
148
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000149 void setTileMinPowerOf2Width(int width) {
150 SkASSERT(SkIsPow2(width) && width > 0);
151 if (!SkIsPow2(width) || width <= 0) {
152 return;
153 }
154
155 fTileMinPowerOf2Width = width;
156 }
157
158 int getTileMinPowerOf2Width() const {
159 return fTileMinPowerOf2Width;
160 }
161
keyar@chromium.org163b5672012-08-01 17:53:29 +0000162 int numTiles() const {
163 return fTiles.count();
164 }
165
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000166 void setMultiThreaded(bool multi) {
167 fMultiThreaded = multi;
168 }
169
170 bool isMultiThreaded() const {
171 return fMultiThreaded;
172 }
173
174 void setUsePipe(bool usePipe) {
175 fUsePipe = usePipe;
176 }
177
178 bool isUsePipe() const {
179 return fUsePipe;
180 }
181
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000182 ~TiledPictureRenderer();
183
keyar@chromium.org28136b32012-08-20 15:04:15 +0000184protected:
185 virtual void finishDraw();
186
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000187private:
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000188 bool fMultiThreaded;
189 bool fUsePipe;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000190 int fTileWidth;
191 int fTileHeight;
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000192 double fTileWidthPercentage;
193 double fTileHeightPercentage;
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000194 int fTileMinPowerOf2Width;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000195
keyar@chromium.orgda652c22012-08-20 22:04:07 +0000196 SkTDArray<SkCanvas*> fTiles;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000197
198 // Clips the tile to an area that is completely in what the SkPicture says is the
199 // drawn-to area. This is mostly important for tiles on the right and bottom edges
200 // as they may go over this area and the picture may have some commands that
201 // draw outside of this area and so should not actually be written.
keyar@chromium.orgda652c22012-08-20 22:04:07 +0000202 void clipTile(SkCanvas* tile);
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000203 void addTile(int tile_x_start, int tile_y_start, int width, int height);
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000204 void setupTiles();
keyar@chromium.orgf4959ab2012-08-23 20:53:25 +0000205 void setupPowerOf2Tiles();
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000206 void deleteTiles();
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000207 void copyTilesToCanvas();
208
209 typedef PictureRenderer INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000210};
211
212}
213
214#endif // PictureRenderer_DEFINED