blob: 2ca80ce2d1549b679bdf22393361661c0c829359 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
reed@android.com6c924ad2009-03-31 03:48:49 +00008#include "SkNWayCanvas.h"
9
djsollen@google.comf0a062b2012-05-01 16:50:25 +000010SkNWayCanvas::SkNWayCanvas(int width, int height) {
11 SkBitmap bm;
12 bm.setConfig(SkBitmap::kNo_Config, width, height);
13 this->setBitmapDevice(bm);
14}
reed@android.com6c924ad2009-03-31 03:48:49 +000015
16SkNWayCanvas::~SkNWayCanvas() {
17 this->removeAll();
18}
19
20void SkNWayCanvas::addCanvas(SkCanvas* canvas) {
21 if (canvas) {
22 canvas->ref();
23 *fList.append() = canvas;
24 }
25}
26
27void SkNWayCanvas::removeCanvas(SkCanvas* canvas) {
28 int index = fList.find(canvas);
29 if (index >= 0) {
30 canvas->unref();
31 fList.removeShuffle(index);
32 }
33}
34
35void SkNWayCanvas::removeAll() {
36 fList.unrefAll();
37 fList.reset();
38}
39
40///////////////////////////////////////////////////////////////////////////
41// These are forwarded to the N canvases we're referencing
42
43class SkNWayCanvas::Iter {
44public:
45 Iter(const SkTDArray<SkCanvas*>& list) : fList(list) {
46 fIndex = 0;
47 }
48 bool next() {
49 if (fIndex < fList.count()) {
50 fCanvas = fList[fIndex++];
51 return true;
52 }
53 return false;
54 }
55 SkCanvas* operator->() { return fCanvas; }
vandebo@chromium.org74b46192012-01-28 01:45:11 +000056
reed@android.com6c924ad2009-03-31 03:48:49 +000057private:
58 const SkTDArray<SkCanvas*>& fList;
59 int fIndex;
60 SkCanvas* fCanvas;
61};
62
63int SkNWayCanvas::save(SaveFlags flags) {
64 Iter iter(fList);
65 while (iter.next()) {
66 iter->save(flags);
67 }
68 return this->INHERITED::save(flags);
69}
70
71int SkNWayCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
72 SaveFlags flags) {
73 Iter iter(fList);
74 while (iter.next()) {
75 iter->saveLayer(bounds, paint, flags);
76 }
77 return this->INHERITED::saveLayer(bounds, paint, flags);
78}
79
80void SkNWayCanvas::restore() {
81 Iter iter(fList);
82 while (iter.next()) {
83 iter->restore();
84 }
85 this->INHERITED::restore();
86}
87
88bool SkNWayCanvas::translate(SkScalar dx, SkScalar dy) {
89 Iter iter(fList);
90 while (iter.next()) {
91 iter->translate(dx, dy);
92 }
93 return this->INHERITED::translate(dx, dy);
94}
95
96bool SkNWayCanvas::scale(SkScalar sx, SkScalar sy) {
97 Iter iter(fList);
98 while (iter.next()) {
99 iter->scale(sx, sy);
100 }
101 return this->INHERITED::scale(sx, sy);
102}
103
104bool SkNWayCanvas::rotate(SkScalar degrees) {
105 Iter iter(fList);
106 while (iter.next()) {
107 iter->rotate(degrees);
108 }
109 return this->INHERITED::rotate(degrees);
110}
111
112bool SkNWayCanvas::skew(SkScalar sx, SkScalar sy) {
113 Iter iter(fList);
114 while (iter.next()) {
115 iter->skew(sx, sy);
116 }
117 return this->INHERITED::skew(sx, sy);
118}
119
120bool SkNWayCanvas::concat(const SkMatrix& matrix) {
121 Iter iter(fList);
122 while (iter.next()) {
123 iter->concat(matrix);
124 }
125 return this->INHERITED::concat(matrix);
126}
127
128void SkNWayCanvas::setMatrix(const SkMatrix& matrix) {
129 Iter iter(fList);
130 while (iter.next()) {
131 iter->setMatrix(matrix);
132 }
133 this->INHERITED::setMatrix(matrix);
134}
135
reed@google.com071eef92011-10-12 11:52:53 +0000136bool SkNWayCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000137 Iter iter(fList);
138 while (iter.next()) {
reed@google.com071eef92011-10-12 11:52:53 +0000139 iter->clipRect(rect, op, doAA);
reed@android.com6c924ad2009-03-31 03:48:49 +0000140 }
reed@google.com071eef92011-10-12 11:52:53 +0000141 return this->INHERITED::clipRect(rect, op, doAA);
reed@android.com6c924ad2009-03-31 03:48:49 +0000142}
143
reed@google.com071eef92011-10-12 11:52:53 +0000144bool SkNWayCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000145 Iter iter(fList);
146 while (iter.next()) {
reed@google.com071eef92011-10-12 11:52:53 +0000147 iter->clipPath(path, op, doAA);
reed@android.com6c924ad2009-03-31 03:48:49 +0000148 }
reed@google.com071eef92011-10-12 11:52:53 +0000149 return this->INHERITED::clipPath(path, op, doAA);
reed@android.com6c924ad2009-03-31 03:48:49 +0000150}
151
152bool SkNWayCanvas::clipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
153 Iter iter(fList);
154 while (iter.next()) {
155 iter->clipRegion(deviceRgn, op);
156 }
157 return this->INHERITED::clipRegion(deviceRgn, op);
158}
159
160void SkNWayCanvas::drawPaint(const SkPaint& paint) {
161 Iter iter(fList);
162 while (iter.next()) {
163 iter->drawPaint(paint);
164 }
165}
166
167void SkNWayCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[],
168 const SkPaint& paint) {
169 Iter iter(fList);
170 while (iter.next()) {
171 iter->drawPoints(mode, count, pts, paint);
172 }
173}
174
175void SkNWayCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
176 Iter iter(fList);
177 while (iter.next()) {
178 iter->drawRect(rect, paint);
179 }
180}
181
182void SkNWayCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
183 Iter iter(fList);
184 while (iter.next()) {
185 iter->drawPath(path, paint);
186 }
187}
188
189void SkNWayCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
190 const SkPaint* paint) {
191 Iter iter(fList);
192 while (iter.next()) {
193 iter->drawBitmap(bitmap, x, y, paint);
194 }
195}
196
reed@google.com71121732012-09-18 15:14:33 +0000197void SkNWayCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
reed@android.com6c924ad2009-03-31 03:48:49 +0000198 const SkRect& dst, const SkPaint* paint) {
199 Iter iter(fList);
200 while (iter.next()) {
reed@google.com71121732012-09-18 15:14:33 +0000201 iter->drawBitmapRectToRect(bitmap, src, dst, paint);
reed@android.com6c924ad2009-03-31 03:48:49 +0000202 }
203}
204
205void SkNWayCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
206 const SkPaint* paint) {
207 Iter iter(fList);
208 while (iter.next()) {
209 iter->drawBitmapMatrix(bitmap, m, paint);
210 }
211}
212
213void SkNWayCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
214 const SkPaint* paint) {
215 Iter iter(fList);
216 while (iter.next()) {
217 iter->drawSprite(bitmap, x, y, paint);
218 }
219}
220
221void SkNWayCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
222 SkScalar y, const SkPaint& paint) {
223 Iter iter(fList);
224 while (iter.next()) {
225 iter->drawText(text, byteLength, x, y, paint);
226 }
227}
228
229void SkNWayCanvas::drawPosText(const void* text, size_t byteLength,
230 const SkPoint pos[], const SkPaint& paint) {
231 Iter iter(fList);
232 while (iter.next()) {
233 iter->drawPosText(text, byteLength, pos, paint);
234 }
235}
236
237void SkNWayCanvas::drawPosTextH(const void* text, size_t byteLength,
238 const SkScalar xpos[], SkScalar constY,
239 const SkPaint& paint) {
240 Iter iter(fList);
241 while (iter.next()) {
242 iter->drawPosTextH(text, byteLength, xpos, constY, paint);
243 }
244}
245
246void SkNWayCanvas::drawTextOnPath(const void* text, size_t byteLength,
247 const SkPath& path, const SkMatrix* matrix,
248 const SkPaint& paint) {
249 Iter iter(fList);
250 while (iter.next()) {
251 iter->drawTextOnPath(text, byteLength, path, matrix, paint);
252 }
253}
254
255void SkNWayCanvas::drawPicture(SkPicture& picture) {
256 Iter iter(fList);
257 while (iter.next()) {
258 iter->drawPicture(picture);
259 }
260}
261
reed@android.com6c924ad2009-03-31 03:48:49 +0000262void SkNWayCanvas::drawVertices(VertexMode vmode, int vertexCount,
263 const SkPoint vertices[], const SkPoint texs[],
264 const SkColor colors[], SkXfermode* xmode,
265 const uint16_t indices[], int indexCount,
266 const SkPaint& paint) {
267 Iter iter(fList);
268 while (iter.next()) {
269 iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode,
270 indices, indexCount, paint);
271 }
272}
273
274SkBounder* SkNWayCanvas::setBounder(SkBounder* bounder) {
275 Iter iter(fList);
276 while (iter.next()) {
277 iter->setBounder(bounder);
278 }
279 return this->INHERITED::setBounder(bounder);
280}
281
282SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) {
283 Iter iter(fList);
284 while (iter.next()) {
285 iter->setDrawFilter(filter);
286 }
287 return this->INHERITED::setDrawFilter(filter);
288}
289
290