blob: b127f21e8a9b784cd92dfac4394effbd140cc9d5 [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
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000060void SkNWayCanvas::willSave(SaveFlags flags) {
reed@android.com6c924ad2009-03-31 03:48:49 +000061 Iter iter(fList);
62 while (iter.next()) {
63 iter->save(flags);
64 }
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000065
66 this->INHERITED::willSave(flags);
reed@android.com6c924ad2009-03-31 03:48:49 +000067}
68
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000069SkCanvas::SaveLayerStrategy SkNWayCanvas::willSaveLayer(const SkRect* bounds, const SkPaint* paint,
70 SaveFlags flags) {
reed@android.com6c924ad2009-03-31 03:48:49 +000071 Iter iter(fList);
72 while (iter.next()) {
73 iter->saveLayer(bounds, paint, flags);
74 }
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000075
76 this->INHERITED::willSaveLayer(bounds, paint, flags);
77 // No need for a layer.
78 return kNoLayer_SaveLayerStrategy;
reed@android.com6c924ad2009-03-31 03:48:49 +000079}
80
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000081void SkNWayCanvas::willRestore() {
reed@android.com6c924ad2009-03-31 03:48:49 +000082 Iter iter(fList);
83 while (iter.next()) {
84 iter->restore();
85 }
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000086 this->INHERITED::willRestore();
reed@android.com6c924ad2009-03-31 03:48:49 +000087}
88
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +000089void SkNWayCanvas::didTranslate(SkScalar dx, SkScalar dy) {
reed@android.com6c924ad2009-03-31 03:48:49 +000090 Iter iter(fList);
91 while (iter.next()) {
92 iter->translate(dx, dy);
93 }
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +000094 this->INHERITED::didTranslate(dx, dy);
reed@android.com6c924ad2009-03-31 03:48:49 +000095}
96
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +000097void SkNWayCanvas::didScale(SkScalar sx, SkScalar sy) {
reed@android.com6c924ad2009-03-31 03:48:49 +000098 Iter iter(fList);
99 while (iter.next()) {
100 iter->scale(sx, sy);
101 }
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +0000102 this->INHERITED::didScale(sx, sy);
reed@android.com6c924ad2009-03-31 03:48:49 +0000103}
104
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +0000105void SkNWayCanvas::didRotate(SkScalar degrees) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000106 Iter iter(fList);
107 while (iter.next()) {
108 iter->rotate(degrees);
109 }
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +0000110 this->INHERITED::didRotate(degrees);
reed@android.com6c924ad2009-03-31 03:48:49 +0000111}
112
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +0000113void SkNWayCanvas::didSkew(SkScalar sx, SkScalar sy) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000114 Iter iter(fList);
115 while (iter.next()) {
116 iter->skew(sx, sy);
117 }
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +0000118 this->INHERITED::didSkew(sx, sy);
reed@android.com6c924ad2009-03-31 03:48:49 +0000119}
120
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +0000121void SkNWayCanvas::didConcat(const SkMatrix& matrix) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000122 Iter iter(fList);
123 while (iter.next()) {
124 iter->concat(matrix);
125 }
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +0000126 this->INHERITED::didConcat(matrix);
reed@android.com6c924ad2009-03-31 03:48:49 +0000127}
128
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +0000129void SkNWayCanvas::didSetMatrix(const SkMatrix& matrix) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000130 Iter iter(fList);
131 while (iter.next()) {
132 iter->setMatrix(matrix);
133 }
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +0000134 this->INHERITED::didSetMatrix(matrix);
reed@android.com6c924ad2009-03-31 03:48:49 +0000135}
136
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000137void SkNWayCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000138 Iter iter(fList);
139 while (iter.next()) {
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000140 iter->clipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000141 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000142 this->INHERITED::onClipRect(rect, op, edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000143}
144
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000145void SkNWayCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
reed@google.com4ed0fb72012-12-12 20:48:18 +0000146 Iter iter(fList);
147 while (iter.next()) {
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000148 iter->clipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle);
reed@google.com4ed0fb72012-12-12 20:48:18 +0000149 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000150 this->INHERITED::onClipRRect(rrect, op, edgeStyle);
reed@google.com4ed0fb72012-12-12 20:48:18 +0000151}
152
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000153void SkNWayCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000154 Iter iter(fList);
155 while (iter.next()) {
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000156 iter->clipPath(path, op, kSoft_ClipEdgeStyle == edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000157 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000158 this->INHERITED::onClipPath(path, op, edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000159}
160
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000161void SkNWayCanvas::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000162 Iter iter(fList);
163 while (iter.next()) {
164 iter->clipRegion(deviceRgn, op);
165 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000166 this->INHERITED::onClipRegion(deviceRgn, op);
reed@android.com6c924ad2009-03-31 03:48:49 +0000167}
168
commit-bot@chromium.orgbe65a4c2013-11-14 19:02:41 +0000169void SkNWayCanvas::clear(SkColor color) {
170 Iter iter(fList);
171 while (iter.next()) {
172 iter->clear(color);
173 }
174}
175
reed@android.com6c924ad2009-03-31 03:48:49 +0000176void SkNWayCanvas::drawPaint(const SkPaint& paint) {
177 Iter iter(fList);
178 while (iter.next()) {
179 iter->drawPaint(paint);
180 }
181}
182
183void SkNWayCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[],
184 const SkPaint& paint) {
185 Iter iter(fList);
186 while (iter.next()) {
187 iter->drawPoints(mode, count, pts, paint);
188 }
189}
190
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000191void SkNWayCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000192 Iter iter(fList);
193 while (iter.next()) {
194 iter->drawRect(rect, paint);
195 }
196}
197
commit-bot@chromium.orgbe65a4c2013-11-14 19:02:41 +0000198void SkNWayCanvas::drawOval(const SkRect& rect, const SkPaint& paint) {
199 Iter iter(fList);
200 while (iter.next()) {
201 iter->drawOval(rect, paint);
202 }
203}
204
reed@google.com4ed0fb72012-12-12 20:48:18 +0000205void SkNWayCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
206 Iter iter(fList);
207 while (iter.next()) {
208 iter->drawRRect(rrect, paint);
209 }
210}
211
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000212void SkNWayCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,
213 const SkPaint& paint) {
214 Iter iter(fList);
215 while (iter.next()) {
216 iter->drawDRRect(outer, inner, paint);
217 }
218}
219
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000220void SkNWayCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000221 Iter iter(fList);
222 while (iter.next()) {
223 iter->drawPath(path, paint);
224 }
225}
226
227void SkNWayCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
228 const SkPaint* paint) {
229 Iter iter(fList);
230 while (iter.next()) {
231 iter->drawBitmap(bitmap, x, y, paint);
232 }
233}
234
reed@google.com71121732012-09-18 15:14:33 +0000235void SkNWayCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000236 const SkRect& dst, const SkPaint* paint,
237 DrawBitmapRectFlags flags) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000238 Iter iter(fList);
239 while (iter.next()) {
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000240 iter->drawBitmapRectToRect(bitmap, src, dst, paint, flags);
reed@android.com6c924ad2009-03-31 03:48:49 +0000241 }
242}
243
244void SkNWayCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
245 const SkPaint* paint) {
246 Iter iter(fList);
247 while (iter.next()) {
248 iter->drawBitmapMatrix(bitmap, m, paint);
249 }
250}
251
commit-bot@chromium.orgbe65a4c2013-11-14 19:02:41 +0000252void SkNWayCanvas::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
253 const SkRect& dst, const SkPaint* paint) {
254 Iter iter(fList);
255 while (iter.next()) {
256 iter->drawBitmapNine(bitmap, center, dst, paint);
257 }
258}
259
reed@android.com6c924ad2009-03-31 03:48:49 +0000260void SkNWayCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
261 const SkPaint* paint) {
262 Iter iter(fList);
263 while (iter.next()) {
264 iter->drawSprite(bitmap, x, y, paint);
265 }
266}
267
268void SkNWayCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
269 SkScalar y, const SkPaint& paint) {
270 Iter iter(fList);
271 while (iter.next()) {
272 iter->drawText(text, byteLength, x, y, paint);
273 }
274}
275
276void SkNWayCanvas::drawPosText(const void* text, size_t byteLength,
277 const SkPoint pos[], const SkPaint& paint) {
278 Iter iter(fList);
279 while (iter.next()) {
280 iter->drawPosText(text, byteLength, pos, paint);
281 }
282}
283
284void SkNWayCanvas::drawPosTextH(const void* text, size_t byteLength,
285 const SkScalar xpos[], SkScalar constY,
286 const SkPaint& paint) {
287 Iter iter(fList);
288 while (iter.next()) {
289 iter->drawPosTextH(text, byteLength, xpos, constY, paint);
290 }
291}
292
293void SkNWayCanvas::drawTextOnPath(const void* text, size_t byteLength,
294 const SkPath& path, const SkMatrix* matrix,
295 const SkPaint& paint) {
296 Iter iter(fList);
297 while (iter.next()) {
298 iter->drawTextOnPath(text, byteLength, path, matrix, paint);
299 }
300}
301
302void SkNWayCanvas::drawPicture(SkPicture& picture) {
303 Iter iter(fList);
304 while (iter.next()) {
305 iter->drawPicture(picture);
306 }
307}
308
reed@android.com6c924ad2009-03-31 03:48:49 +0000309void SkNWayCanvas::drawVertices(VertexMode vmode, int vertexCount,
310 const SkPoint vertices[], const SkPoint texs[],
311 const SkColor colors[], SkXfermode* xmode,
312 const uint16_t indices[], int indexCount,
313 const SkPaint& paint) {
314 Iter iter(fList);
315 while (iter.next()) {
316 iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode,
317 indices, indexCount, paint);
318 }
319}
320
commit-bot@chromium.orgbe65a4c2013-11-14 19:02:41 +0000321void SkNWayCanvas::drawData(const void* data, size_t length) {
322 Iter iter(fList);
323 while (iter.next()) {
324 iter->drawData(data, length);
325 }
326}
327
reed@android.com6c924ad2009-03-31 03:48:49 +0000328SkBounder* SkNWayCanvas::setBounder(SkBounder* bounder) {
329 Iter iter(fList);
330 while (iter.next()) {
331 iter->setBounder(bounder);
332 }
333 return this->INHERITED::setBounder(bounder);
334}
335
336SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) {
337 Iter iter(fList);
338 while (iter.next()) {
339 iter->setDrawFilter(filter);
340 }
341 return this->INHERITED::setDrawFilter(filter);
342}
commit-bot@chromium.org14cec912013-07-20 15:03:26 +0000343
344void SkNWayCanvas::beginCommentGroup(const char* description) {
345 Iter iter(fList);
346 while (iter.next()) {
347 iter->beginCommentGroup(description);
348 }
349}
350
351void SkNWayCanvas::addComment(const char* kywd, const char* value) {
352 Iter iter(fList);
353 while (iter.next()) {
354 iter->addComment(kywd, value);
355 }
356}
357
358void SkNWayCanvas::endCommentGroup() {
359 Iter iter(fList);
360 while (iter.next()) {
361 iter->endCommentGroup();
362 }
363}