blob: a9543f9c02f4d4ad04c769d0a1e7fa6f1cab602c [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 +000010SkNWayCanvas::SkNWayCanvas(int width, int height)
commit-bot@chromium.orge2543102014-01-31 19:42:58 +000011 : INHERITED(width, height) {}
reed@google.com6ae24e02012-09-26 13:44:13 +000012
reed@android.com6c924ad2009-03-31 03:48:49 +000013SkNWayCanvas::~SkNWayCanvas() {
14 this->removeAll();
15}
16
17void SkNWayCanvas::addCanvas(SkCanvas* canvas) {
18 if (canvas) {
19 canvas->ref();
20 *fList.append() = canvas;
21 }
22}
23
24void SkNWayCanvas::removeCanvas(SkCanvas* canvas) {
25 int index = fList.find(canvas);
26 if (index >= 0) {
27 canvas->unref();
28 fList.removeShuffle(index);
29 }
30}
31
32void SkNWayCanvas::removeAll() {
33 fList.unrefAll();
34 fList.reset();
35}
36
37///////////////////////////////////////////////////////////////////////////
38// These are forwarded to the N canvases we're referencing
39
40class SkNWayCanvas::Iter {
41public:
42 Iter(const SkTDArray<SkCanvas*>& list) : fList(list) {
43 fIndex = 0;
44 }
45 bool next() {
46 if (fIndex < fList.count()) {
47 fCanvas = fList[fIndex++];
48 return true;
49 }
50 return false;
51 }
52 SkCanvas* operator->() { return fCanvas; }
vandebo@chromium.org74b46192012-01-28 01:45:11 +000053
reed@android.com6c924ad2009-03-31 03:48:49 +000054private:
55 const SkTDArray<SkCanvas*>& fList;
56 int fIndex;
57 SkCanvas* fCanvas;
58};
59
60int SkNWayCanvas::save(SaveFlags flags) {
61 Iter iter(fList);
62 while (iter.next()) {
63 iter->save(flags);
64 }
65 return this->INHERITED::save(flags);
66}
67
68int SkNWayCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
69 SaveFlags flags) {
70 Iter iter(fList);
71 while (iter.next()) {
72 iter->saveLayer(bounds, paint, flags);
73 }
74 return this->INHERITED::saveLayer(bounds, paint, flags);
75}
76
77void SkNWayCanvas::restore() {
78 Iter iter(fList);
79 while (iter.next()) {
80 iter->restore();
81 }
82 this->INHERITED::restore();
83}
84
85bool SkNWayCanvas::translate(SkScalar dx, SkScalar dy) {
86 Iter iter(fList);
87 while (iter.next()) {
88 iter->translate(dx, dy);
89 }
90 return this->INHERITED::translate(dx, dy);
91}
92
93bool SkNWayCanvas::scale(SkScalar sx, SkScalar sy) {
94 Iter iter(fList);
95 while (iter.next()) {
96 iter->scale(sx, sy);
97 }
98 return this->INHERITED::scale(sx, sy);
99}
100
101bool SkNWayCanvas::rotate(SkScalar degrees) {
102 Iter iter(fList);
103 while (iter.next()) {
104 iter->rotate(degrees);
105 }
106 return this->INHERITED::rotate(degrees);
107}
108
109bool SkNWayCanvas::skew(SkScalar sx, SkScalar sy) {
110 Iter iter(fList);
111 while (iter.next()) {
112 iter->skew(sx, sy);
113 }
114 return this->INHERITED::skew(sx, sy);
115}
116
117bool SkNWayCanvas::concat(const SkMatrix& matrix) {
118 Iter iter(fList);
119 while (iter.next()) {
120 iter->concat(matrix);
121 }
122 return this->INHERITED::concat(matrix);
123}
124
125void SkNWayCanvas::setMatrix(const SkMatrix& matrix) {
126 Iter iter(fList);
127 while (iter.next()) {
128 iter->setMatrix(matrix);
129 }
130 this->INHERITED::setMatrix(matrix);
131}
132
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000133void SkNWayCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000134 Iter iter(fList);
135 while (iter.next()) {
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000136 iter->clipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000137 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000138 this->INHERITED::onClipRect(rect, op, edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000139}
140
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000141void SkNWayCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
reed@google.com4ed0fb72012-12-12 20:48:18 +0000142 Iter iter(fList);
143 while (iter.next()) {
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000144 iter->clipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle);
reed@google.com4ed0fb72012-12-12 20:48:18 +0000145 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000146 this->INHERITED::onClipRRect(rrect, op, edgeStyle);
reed@google.com4ed0fb72012-12-12 20:48:18 +0000147}
148
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000149void SkNWayCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000150 Iter iter(fList);
151 while (iter.next()) {
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000152 iter->clipPath(path, op, kSoft_ClipEdgeStyle == edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000153 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000154 this->INHERITED::onClipPath(path, op, edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000155}
156
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000157void SkNWayCanvas::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000158 Iter iter(fList);
159 while (iter.next()) {
160 iter->clipRegion(deviceRgn, op);
161 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000162 this->INHERITED::onClipRegion(deviceRgn, op);
reed@android.com6c924ad2009-03-31 03:48:49 +0000163}
164
commit-bot@chromium.orgbe65a4c2013-11-14 19:02:41 +0000165void SkNWayCanvas::clear(SkColor color) {
166 Iter iter(fList);
167 while (iter.next()) {
168 iter->clear(color);
169 }
170}
171
reed@android.com6c924ad2009-03-31 03:48:49 +0000172void SkNWayCanvas::drawPaint(const SkPaint& paint) {
173 Iter iter(fList);
174 while (iter.next()) {
175 iter->drawPaint(paint);
176 }
177}
178
179void SkNWayCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[],
180 const SkPaint& paint) {
181 Iter iter(fList);
182 while (iter.next()) {
183 iter->drawPoints(mode, count, pts, paint);
184 }
185}
186
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000187void SkNWayCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000188 Iter iter(fList);
189 while (iter.next()) {
190 iter->drawRect(rect, paint);
191 }
192}
193
commit-bot@chromium.orgbe65a4c2013-11-14 19:02:41 +0000194void SkNWayCanvas::drawOval(const SkRect& rect, const SkPaint& paint) {
195 Iter iter(fList);
196 while (iter.next()) {
197 iter->drawOval(rect, paint);
198 }
199}
200
reed@google.com4ed0fb72012-12-12 20:48:18 +0000201void SkNWayCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
202 Iter iter(fList);
203 while (iter.next()) {
204 iter->drawRRect(rrect, paint);
205 }
206}
207
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000208void SkNWayCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,
209 const SkPaint& paint) {
210 Iter iter(fList);
211 while (iter.next()) {
212 iter->drawDRRect(outer, inner, paint);
213 }
214}
215
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000216void SkNWayCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000217 Iter iter(fList);
218 while (iter.next()) {
219 iter->drawPath(path, paint);
220 }
221}
222
223void SkNWayCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
224 const SkPaint* paint) {
225 Iter iter(fList);
226 while (iter.next()) {
227 iter->drawBitmap(bitmap, x, y, paint);
228 }
229}
230
reed@google.com71121732012-09-18 15:14:33 +0000231void SkNWayCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000232 const SkRect& dst, const SkPaint* paint,
233 DrawBitmapRectFlags flags) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000234 Iter iter(fList);
235 while (iter.next()) {
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000236 iter->drawBitmapRectToRect(bitmap, src, dst, paint, flags);
reed@android.com6c924ad2009-03-31 03:48:49 +0000237 }
238}
239
240void SkNWayCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
241 const SkPaint* paint) {
242 Iter iter(fList);
243 while (iter.next()) {
244 iter->drawBitmapMatrix(bitmap, m, paint);
245 }
246}
247
commit-bot@chromium.orgbe65a4c2013-11-14 19:02:41 +0000248void SkNWayCanvas::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
249 const SkRect& dst, const SkPaint* paint) {
250 Iter iter(fList);
251 while (iter.next()) {
252 iter->drawBitmapNine(bitmap, center, dst, paint);
253 }
254}
255
reed@android.com6c924ad2009-03-31 03:48:49 +0000256void SkNWayCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
257 const SkPaint* paint) {
258 Iter iter(fList);
259 while (iter.next()) {
260 iter->drawSprite(bitmap, x, y, paint);
261 }
262}
263
264void SkNWayCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
265 SkScalar y, const SkPaint& paint) {
266 Iter iter(fList);
267 while (iter.next()) {
268 iter->drawText(text, byteLength, x, y, paint);
269 }
270}
271
272void SkNWayCanvas::drawPosText(const void* text, size_t byteLength,
273 const SkPoint pos[], const SkPaint& paint) {
274 Iter iter(fList);
275 while (iter.next()) {
276 iter->drawPosText(text, byteLength, pos, paint);
277 }
278}
279
280void SkNWayCanvas::drawPosTextH(const void* text, size_t byteLength,
281 const SkScalar xpos[], SkScalar constY,
282 const SkPaint& paint) {
283 Iter iter(fList);
284 while (iter.next()) {
285 iter->drawPosTextH(text, byteLength, xpos, constY, paint);
286 }
287}
288
289void SkNWayCanvas::drawTextOnPath(const void* text, size_t byteLength,
290 const SkPath& path, const SkMatrix* matrix,
291 const SkPaint& paint) {
292 Iter iter(fList);
293 while (iter.next()) {
294 iter->drawTextOnPath(text, byteLength, path, matrix, paint);
295 }
296}
297
298void SkNWayCanvas::drawPicture(SkPicture& picture) {
299 Iter iter(fList);
300 while (iter.next()) {
301 iter->drawPicture(picture);
302 }
303}
304
reed@android.com6c924ad2009-03-31 03:48:49 +0000305void SkNWayCanvas::drawVertices(VertexMode vmode, int vertexCount,
306 const SkPoint vertices[], const SkPoint texs[],
307 const SkColor colors[], SkXfermode* xmode,
308 const uint16_t indices[], int indexCount,
309 const SkPaint& paint) {
310 Iter iter(fList);
311 while (iter.next()) {
312 iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode,
313 indices, indexCount, paint);
314 }
315}
316
commit-bot@chromium.orgbe65a4c2013-11-14 19:02:41 +0000317void SkNWayCanvas::drawData(const void* data, size_t length) {
318 Iter iter(fList);
319 while (iter.next()) {
320 iter->drawData(data, length);
321 }
322}
323
reed@android.com6c924ad2009-03-31 03:48:49 +0000324SkBounder* SkNWayCanvas::setBounder(SkBounder* bounder) {
325 Iter iter(fList);
326 while (iter.next()) {
327 iter->setBounder(bounder);
328 }
329 return this->INHERITED::setBounder(bounder);
330}
331
332SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) {
333 Iter iter(fList);
334 while (iter.next()) {
335 iter->setDrawFilter(filter);
336 }
337 return this->INHERITED::setDrawFilter(filter);
338}
commit-bot@chromium.org14cec912013-07-20 15:03:26 +0000339
340void SkNWayCanvas::beginCommentGroup(const char* description) {
341 Iter iter(fList);
342 while (iter.next()) {
343 iter->beginCommentGroup(description);
344 }
345}
346
347void SkNWayCanvas::addComment(const char* kywd, const char* value) {
348 Iter iter(fList);
349 while (iter.next()) {
350 iter->addComment(kywd, value);
351 }
352}
353
354void SkNWayCanvas::endCommentGroup() {
355 Iter iter(fList);
356 while (iter.next()) {
357 iter->endCommentGroup();
358 }
359}