blob: 5f8e7917a105ab80ecb6aa132445523b4f96dad1 [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();
31
32 SkCanvas* getCanvas() {
33 return fCanvas.get();
34 }
35
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000036 void setUseBitmapDevice() {
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000037 fDeviceType = kBitmap_DeviceType;
38 }
39
40 bool isUsingBitmapDevice() {
41 return fDeviceType == kBitmap_DeviceType;
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000042 }
43
44#if SK_SUPPORT_GPU
45 void setUseGpuDevice() {
46 fDeviceType = kGPU_DeviceType;
47 }
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000048
49 bool isUsingGpuDevice() {
50 return fDeviceType == kGPU_DeviceType;
51 }
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000052#endif
53
keyar@chromium.org02dfb122012-08-20 15:03:36 +000054 PictureRenderer()
keyar@chromium.org06125642012-08-20 15:03:33 +000055 : fPicture(NULL)
56 , fDeviceType(kBitmap_DeviceType)
57#if SK_SUPPORT_GPU
58 , fGrContext(fGrContextFactory.get(GrContextFactory::kNative_GLContextType))
59#endif
60 {}
61
keyar@chromium.org9d696c02012-08-07 17:11:33 +000062protected:
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000063 enum SkDeviceTypes {
64 kBitmap_DeviceType,
65#if SK_SUPPORT_GPU
66 kGPU_DeviceType
67#endif
68 };
69
keyar@chromium.org9d696c02012-08-07 17:11:33 +000070 SkAutoTUnref<SkCanvas> fCanvas;
71 SkPicture* fPicture;
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000072 SkDeviceTypes fDeviceType;
keyar@chromium.org06125642012-08-20 15:03:33 +000073
74#if SK_SUPPORT_GPU
75 GrContextFactory fGrContextFactory;
76 GrContext* fGrContext;
77#endif
keyar@chromium.org9d696c02012-08-07 17:11:33 +000078
79private:
80 typedef SkRefCnt INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000081};
82
83class PipePictureRenderer : public PictureRenderer {
keyar@chromium.org163b5672012-08-01 17:53:29 +000084public:
keyar@chromium.org9d696c02012-08-07 17:11:33 +000085 virtual void render() SK_OVERRIDE;
86
87private:
88 typedef PictureRenderer INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000089};
90
91class SimplePictureRenderer : public PictureRenderer {
keyar@chromium.org163b5672012-08-01 17:53:29 +000092public:
keyar@chromium.org9d696c02012-08-07 17:11:33 +000093 virtual void render () SK_OVERRIDE;
94
95private:
96 typedef PictureRenderer INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000097};
98
99class TiledPictureRenderer : public PictureRenderer {
100public:
101 TiledPictureRenderer();
102
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000103 virtual void init(SkPicture* pict) SK_OVERRIDE;
104 virtual void render() SK_OVERRIDE;
105 virtual void end() SK_OVERRIDE;
106 void drawTiles();
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000107
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000108 void setTileWidth(int width) {
109 fTileWidth = width;
110 }
111
112 int getTileWidth() const {
113 return fTileWidth;
114 }
115
116 void setTileHeight(int height) {
117 fTileHeight = height;
118 }
119
120 int getTileHeight() const {
121 return fTileHeight;
122 }
123
124 void setTileWidthPercentage(double percentage) {
125 fTileWidthPercentage = percentage;
126 }
127
keyar@chromium.org163b5672012-08-01 17:53:29 +0000128 double getTileWidthPercentage() const {
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000129 return fTileWidthPercentage;
130 }
131
132 void setTileHeightPercentage(double percentage) {
133 fTileHeightPercentage = percentage;
134 }
135
keyar@chromium.org163b5672012-08-01 17:53:29 +0000136 double getTileHeightPercentage() const {
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000137 return fTileHeightPercentage;
138 }
139
keyar@chromium.org163b5672012-08-01 17:53:29 +0000140 int numTiles() const {
141 return fTiles.count();
142 }
143
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000144 ~TiledPictureRenderer();
145
146private:
147 struct TileInfo {
148 SkBitmap* fBitmap;
149 SkCanvas* fCanvas;
150 };
151
152 int fTileWidth;
153 int fTileHeight;
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000154 double fTileWidthPercentage;
155 double fTileHeightPercentage;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000156
157 SkTDArray<TileInfo> fTiles;
158
159 // Clips the tile to an area that is completely in what the SkPicture says is the
160 // drawn-to area. This is mostly important for tiles on the right and bottom edges
161 // as they may go over this area and the picture may have some commands that
162 // draw outside of this area and so should not actually be written.
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000163 void clipTile(const TileInfo& tile);
164 void addTile(int tile_x_start, int tile_y_start);
165 void setupTiles();
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000166 // We manually delete the tiles instead of having a destructor on TileInfo as
167 // the destructor on TileInfo will be during a realloc. This would result in
168 // the canvases and bitmaps being prematurely deleted.
169 void deleteTiles();
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000170 void copyTilesToCanvas();
171
172 typedef PictureRenderer INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000173};
174
175}
176
177#endif // PictureRenderer_DEFINED