blob: d59d5593285230207b9aab2a04bf93c82eea7102 [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
reed@google.com6ae24e02012-09-26 13:44:13 +000010static SkBitmap make_noconfig_bm(int width, int height) {
djsollen@google.comf0a062b2012-05-01 16:50:25 +000011 SkBitmap bm;
12 bm.setConfig(SkBitmap::kNo_Config, width, height);
reed@google.com6ae24e02012-09-26 13:44:13 +000013 return bm;
djsollen@google.comf0a062b2012-05-01 16:50:25 +000014}
reed@android.com6c924ad2009-03-31 03:48:49 +000015
reed@google.com6ae24e02012-09-26 13:44:13 +000016SkNWayCanvas::SkNWayCanvas(int width, int height)
17 : INHERITED(make_noconfig_bm(width, height)) {}
18
reed@android.com6c924ad2009-03-31 03:48:49 +000019SkNWayCanvas::~SkNWayCanvas() {
20 this->removeAll();
21}
22
23void SkNWayCanvas::addCanvas(SkCanvas* canvas) {
24 if (canvas) {
25 canvas->ref();
26 *fList.append() = canvas;
27 }
28}
29
30void SkNWayCanvas::removeCanvas(SkCanvas* canvas) {
31 int index = fList.find(canvas);
32 if (index >= 0) {
33 canvas->unref();
34 fList.removeShuffle(index);
35 }
36}
37
38void SkNWayCanvas::removeAll() {
39 fList.unrefAll();
40 fList.reset();
41}
42
43///////////////////////////////////////////////////////////////////////////
44// These are forwarded to the N canvases we're referencing
45
46class SkNWayCanvas::Iter {
47public:
48 Iter(const SkTDArray<SkCanvas*>& list) : fList(list) {
49 fIndex = 0;
50 }
51 bool next() {
52 if (fIndex < fList.count()) {
53 fCanvas = fList[fIndex++];
54 return true;
55 }
56 return false;
57 }
58 SkCanvas* operator->() { return fCanvas; }
vandebo@chromium.org74b46192012-01-28 01:45:11 +000059
reed@android.com6c924ad2009-03-31 03:48:49 +000060private:
61 const SkTDArray<SkCanvas*>& fList;
62 int fIndex;
63 SkCanvas* fCanvas;
64};
65
66int SkNWayCanvas::save(SaveFlags flags) {
67 Iter iter(fList);
68 while (iter.next()) {
69 iter->save(flags);
70 }
71 return this->INHERITED::save(flags);
72}
73
74int SkNWayCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
75 SaveFlags flags) {
76 Iter iter(fList);
77 while (iter.next()) {
78 iter->saveLayer(bounds, paint, flags);
79 }
80 return this->INHERITED::saveLayer(bounds, paint, flags);
81}
82
83void SkNWayCanvas::restore() {
84 Iter iter(fList);
85 while (iter.next()) {
86 iter->restore();
87 }
88 this->INHERITED::restore();
89}
90
91bool SkNWayCanvas::translate(SkScalar dx, SkScalar dy) {
92 Iter iter(fList);
93 while (iter.next()) {
94 iter->translate(dx, dy);
95 }
96 return this->INHERITED::translate(dx, dy);
97}
98
99bool SkNWayCanvas::scale(SkScalar sx, SkScalar sy) {
100 Iter iter(fList);
101 while (iter.next()) {
102 iter->scale(sx, sy);
103 }
104 return this->INHERITED::scale(sx, sy);
105}
106
107bool SkNWayCanvas::rotate(SkScalar degrees) {
108 Iter iter(fList);
109 while (iter.next()) {
110 iter->rotate(degrees);
111 }
112 return this->INHERITED::rotate(degrees);
113}
114
115bool SkNWayCanvas::skew(SkScalar sx, SkScalar sy) {
116 Iter iter(fList);
117 while (iter.next()) {
118 iter->skew(sx, sy);
119 }
120 return this->INHERITED::skew(sx, sy);
121}
122
123bool SkNWayCanvas::concat(const SkMatrix& matrix) {
124 Iter iter(fList);
125 while (iter.next()) {
126 iter->concat(matrix);
127 }
128 return this->INHERITED::concat(matrix);
129}
130
131void SkNWayCanvas::setMatrix(const SkMatrix& matrix) {
132 Iter iter(fList);
133 while (iter.next()) {
134 iter->setMatrix(matrix);
135 }
136 this->INHERITED::setMatrix(matrix);
137}
138
reed@google.com071eef92011-10-12 11:52:53 +0000139bool SkNWayCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000140 Iter iter(fList);
141 while (iter.next()) {
reed@google.com071eef92011-10-12 11:52:53 +0000142 iter->clipRect(rect, op, doAA);
reed@android.com6c924ad2009-03-31 03:48:49 +0000143 }
reed@google.com071eef92011-10-12 11:52:53 +0000144 return this->INHERITED::clipRect(rect, op, doAA);
reed@android.com6c924ad2009-03-31 03:48:49 +0000145}
146
reed@google.com4ed0fb72012-12-12 20:48:18 +0000147bool SkNWayCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) {
148 Iter iter(fList);
149 while (iter.next()) {
150 iter->clipRRect(rrect, op, doAA);
151 }
152 return this->INHERITED::clipRRect(rrect, op, doAA);
153}
154
reed@google.com071eef92011-10-12 11:52:53 +0000155bool SkNWayCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000156 Iter iter(fList);
157 while (iter.next()) {
reed@google.com071eef92011-10-12 11:52:53 +0000158 iter->clipPath(path, op, doAA);
reed@android.com6c924ad2009-03-31 03:48:49 +0000159 }
reed@google.com071eef92011-10-12 11:52:53 +0000160 return this->INHERITED::clipPath(path, op, doAA);
reed@android.com6c924ad2009-03-31 03:48:49 +0000161}
162
163bool SkNWayCanvas::clipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
164 Iter iter(fList);
165 while (iter.next()) {
166 iter->clipRegion(deviceRgn, op);
167 }
168 return this->INHERITED::clipRegion(deviceRgn, op);
169}
170
171void SkNWayCanvas::drawPaint(const SkPaint& paint) {
172 Iter iter(fList);
173 while (iter.next()) {
174 iter->drawPaint(paint);
175 }
176}
177
178void SkNWayCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[],
179 const SkPaint& paint) {
180 Iter iter(fList);
181 while (iter.next()) {
182 iter->drawPoints(mode, count, pts, paint);
183 }
184}
185
reed@google.com4ed0fb72012-12-12 20:48:18 +0000186void SkNWayCanvas::drawOval(const SkRect& rect, const SkPaint& paint) {
187 Iter iter(fList);
188 while (iter.next()) {
189 iter->drawOval(rect, paint);
190 }
191}
192
reed@android.com6c924ad2009-03-31 03:48:49 +0000193void SkNWayCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
194 Iter iter(fList);
195 while (iter.next()) {
196 iter->drawRect(rect, paint);
197 }
198}
199
reed@google.com4ed0fb72012-12-12 20:48:18 +0000200void SkNWayCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
201 Iter iter(fList);
202 while (iter.next()) {
203 iter->drawRRect(rrect, paint);
204 }
205}
206
reed@android.com6c924ad2009-03-31 03:48:49 +0000207void SkNWayCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
208 Iter iter(fList);
209 while (iter.next()) {
210 iter->drawPath(path, paint);
211 }
212}
213
214void SkNWayCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
215 const SkPaint* paint) {
216 Iter iter(fList);
217 while (iter.next()) {
218 iter->drawBitmap(bitmap, x, y, paint);
219 }
220}
221
reed@google.com71121732012-09-18 15:14:33 +0000222void SkNWayCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
reed@android.com6c924ad2009-03-31 03:48:49 +0000223 const SkRect& dst, const SkPaint* paint) {
224 Iter iter(fList);
225 while (iter.next()) {
reed@google.com71121732012-09-18 15:14:33 +0000226 iter->drawBitmapRectToRect(bitmap, src, dst, paint);
reed@android.com6c924ad2009-03-31 03:48:49 +0000227 }
228}
229
230void SkNWayCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
231 const SkPaint* paint) {
232 Iter iter(fList);
233 while (iter.next()) {
234 iter->drawBitmapMatrix(bitmap, m, paint);
235 }
236}
237
238void SkNWayCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
239 const SkPaint* paint) {
240 Iter iter(fList);
241 while (iter.next()) {
242 iter->drawSprite(bitmap, x, y, paint);
243 }
244}
245
246void SkNWayCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
247 SkScalar y, const SkPaint& paint) {
248 Iter iter(fList);
249 while (iter.next()) {
250 iter->drawText(text, byteLength, x, y, paint);
251 }
252}
253
254void SkNWayCanvas::drawPosText(const void* text, size_t byteLength,
255 const SkPoint pos[], const SkPaint& paint) {
256 Iter iter(fList);
257 while (iter.next()) {
258 iter->drawPosText(text, byteLength, pos, paint);
259 }
260}
261
262void SkNWayCanvas::drawPosTextH(const void* text, size_t byteLength,
263 const SkScalar xpos[], SkScalar constY,
264 const SkPaint& paint) {
265 Iter iter(fList);
266 while (iter.next()) {
267 iter->drawPosTextH(text, byteLength, xpos, constY, paint);
268 }
269}
270
271void SkNWayCanvas::drawTextOnPath(const void* text, size_t byteLength,
272 const SkPath& path, const SkMatrix* matrix,
273 const SkPaint& paint) {
274 Iter iter(fList);
275 while (iter.next()) {
276 iter->drawTextOnPath(text, byteLength, path, matrix, paint);
277 }
278}
279
280void SkNWayCanvas::drawPicture(SkPicture& picture) {
281 Iter iter(fList);
282 while (iter.next()) {
283 iter->drawPicture(picture);
284 }
285}
286
reed@android.com6c924ad2009-03-31 03:48:49 +0000287void SkNWayCanvas::drawVertices(VertexMode vmode, int vertexCount,
288 const SkPoint vertices[], const SkPoint texs[],
289 const SkColor colors[], SkXfermode* xmode,
290 const uint16_t indices[], int indexCount,
291 const SkPaint& paint) {
292 Iter iter(fList);
293 while (iter.next()) {
294 iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode,
295 indices, indexCount, paint);
296 }
297}
298
299SkBounder* SkNWayCanvas::setBounder(SkBounder* bounder) {
300 Iter iter(fList);
301 while (iter.next()) {
302 iter->setBounder(bounder);
303 }
304 return this->INHERITED::setBounder(bounder);
305}
306
307SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) {
308 Iter iter(fList);
309 while (iter.next()) {
310 iter->setDrawFilter(filter);
311 }
312 return this->INHERITED::setDrawFilter(filter);
313}
314
315