blob: cd6e18e37375fca9dd9391067b7d76d24ad48d4c [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;
keyar@chromium.org9299ede2012-08-21 19:05:08 +000023class SkString;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000024
25namespace sk_tools {
26
27class PictureRenderer : public SkRefCnt {
28public:
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000029 enum SkDeviceTypes {
30 kBitmap_DeviceType,
31#if SK_SUPPORT_GPU
32 kGPU_DeviceType
33#endif
34 };
35
keyar@chromium.org9d696c02012-08-07 17:11:33 +000036 virtual void init(SkPicture* pict);
37 virtual void render() = 0;
38 virtual void end();
keyar@chromium.org28136b32012-08-20 15:04:15 +000039 void resetState();
keyar@chromium.org9d696c02012-08-07 17:11:33 +000040
keyar@chromium.orgc81686c2012-08-20 15:04:04 +000041 void setDeviceType(SkDeviceTypes deviceType) {
42 fDeviceType = deviceType;
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000043 }
44
45 bool isUsingBitmapDevice() {
keyar@chromium.org78a35c52012-08-20 15:03:44 +000046 return kBitmap_DeviceType == fDeviceType;
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000047 }
48
49#if SK_SUPPORT_GPU
keyar@chromium.orgfe6391a2012-08-20 15:03:41 +000050 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.org9299ede2012-08-21 19:05:08 +000071 bool write(const SkString& path) const;
72
keyar@chromium.org9d696c02012-08-07 17:11:33 +000073protected:
keyar@chromium.org28136b32012-08-20 15:04:15 +000074 virtual void finishDraw();
keyar@chromium.orga474ce32012-08-20 15:03:57 +000075 SkCanvas* setupCanvas();
76 SkCanvas* setupCanvas(int width, int height);
77
keyar@chromium.org9d696c02012-08-07 17:11:33 +000078 SkAutoTUnref<SkCanvas> fCanvas;
79 SkPicture* fPicture;
keyar@chromium.org4ea96c52012-08-20 15:03:29 +000080 SkDeviceTypes fDeviceType;
keyar@chromium.org06125642012-08-20 15:03:33 +000081
82#if SK_SUPPORT_GPU
83 GrContextFactory fGrContextFactory;
84 GrContext* fGrContext;
85#endif
keyar@chromium.org9d696c02012-08-07 17:11:33 +000086
87private:
88 typedef SkRefCnt INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +000089};
90
91class PipePictureRenderer : 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 SimplePictureRenderer : public PictureRenderer {
keyar@chromium.org163b5672012-08-01 17:53:29 +0000100public:
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000101 virtual void render () SK_OVERRIDE;
102
103private:
104 typedef PictureRenderer INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000105};
106
107class TiledPictureRenderer : public PictureRenderer {
108public:
109 TiledPictureRenderer();
110
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000111 virtual void init(SkPicture* pict) SK_OVERRIDE;
112 virtual void render() SK_OVERRIDE;
113 virtual void end() SK_OVERRIDE;
114 void drawTiles();
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000115
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000116 void setTileWidth(int width) {
117 fTileWidth = width;
118 }
119
120 int getTileWidth() const {
121 return fTileWidth;
122 }
123
124 void setTileHeight(int height) {
125 fTileHeight = height;
126 }
127
128 int getTileHeight() const {
129 return fTileHeight;
130 }
131
132 void setTileWidthPercentage(double percentage) {
133 fTileWidthPercentage = percentage;
134 }
135
keyar@chromium.org163b5672012-08-01 17:53:29 +0000136 double getTileWidthPercentage() const {
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000137 return fTileWidthPercentage;
138 }
139
140 void setTileHeightPercentage(double percentage) {
141 fTileHeightPercentage = percentage;
142 }
143
keyar@chromium.org163b5672012-08-01 17:53:29 +0000144 double getTileHeightPercentage() const {
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000145 return fTileHeightPercentage;
146 }
147
keyar@chromium.org163b5672012-08-01 17:53:29 +0000148 int numTiles() const {
149 return fTiles.count();
150 }
151
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000152 ~TiledPictureRenderer();
153
keyar@chromium.org28136b32012-08-20 15:04:15 +0000154protected:
155 virtual void finishDraw();
156
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000157private:
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000158 int fTileWidth;
159 int fTileHeight;
keyar@chromium.orgcc6e5ef2012-07-27 20:09:26 +0000160 double fTileWidthPercentage;
161 double fTileHeightPercentage;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000162
keyar@chromium.orgda652c22012-08-20 22:04:07 +0000163 SkTDArray<SkCanvas*> fTiles;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000164
165 // Clips the tile to an area that is completely in what the SkPicture says is the
166 // drawn-to area. This is mostly important for tiles on the right and bottom edges
167 // as they may go over this area and the picture may have some commands that
168 // draw outside of this area and so should not actually be written.
keyar@chromium.orgda652c22012-08-20 22:04:07 +0000169 void clipTile(SkCanvas* tile);
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000170 void addTile(int tile_x_start, int tile_y_start);
171 void setupTiles();
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000172 void deleteTiles();
keyar@chromium.org9d696c02012-08-07 17:11:33 +0000173 void copyTilesToCanvas();
174
175 typedef PictureRenderer INHERITED;
keyar@chromium.org451bb9f2012-07-26 17:27:57 +0000176};
177
178}
179
180#endif // PictureRenderer_DEFINED