blob: e19e7a8e5513d87547aa2b56f9fbb1c3911064dd [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
2 * Copyright 2011 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 */
reed@android.com6c924ad2009-03-31 03:48:49 +00007#include "SkNWayCanvas.h"
8
reed@google.com6ae24e02012-09-26 13:44:13 +00009SkNWayCanvas::SkNWayCanvas(int width, int height)
commit-bot@chromium.orge2543102014-01-31 19:42:58 +000010 : INHERITED(width, height) {}
reed@google.com6ae24e02012-09-26 13:44:13 +000011
reed@android.com6c924ad2009-03-31 03:48:49 +000012SkNWayCanvas::~SkNWayCanvas() {
13 this->removeAll();
14}
15
16void SkNWayCanvas::addCanvas(SkCanvas* canvas) {
17 if (canvas) {
18 canvas->ref();
19 *fList.append() = canvas;
20 }
21}
22
23void SkNWayCanvas::removeCanvas(SkCanvas* canvas) {
24 int index = fList.find(canvas);
25 if (index >= 0) {
26 canvas->unref();
27 fList.removeShuffle(index);
28 }
29}
30
31void SkNWayCanvas::removeAll() {
32 fList.unrefAll();
33 fList.reset();
34}
35
36///////////////////////////////////////////////////////////////////////////
37// These are forwarded to the N canvases we're referencing
38
39class SkNWayCanvas::Iter {
40public:
41 Iter(const SkTDArray<SkCanvas*>& list) : fList(list) {
42 fIndex = 0;
43 }
44 bool next() {
45 if (fIndex < fList.count()) {
46 fCanvas = fList[fIndex++];
47 return true;
48 }
49 return false;
50 }
51 SkCanvas* operator->() { return fCanvas; }
vandebo@chromium.org74b46192012-01-28 01:45:11 +000052
reed@android.com6c924ad2009-03-31 03:48:49 +000053private:
54 const SkTDArray<SkCanvas*>& fList;
55 int fIndex;
56 SkCanvas* fCanvas;
57};
58
Florin Malita5f6102d2014-06-30 10:13:28 -040059void SkNWayCanvas::willSave() {
reed@android.com6c924ad2009-03-31 03:48:49 +000060 Iter iter(fList);
61 while (iter.next()) {
Florin Malita5f6102d2014-06-30 10:13:28 -040062 iter->save();
reed@android.com6c924ad2009-03-31 03:48:49 +000063 }
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000064
Florin Malita5f6102d2014-06-30 10:13:28 -040065 this->INHERITED::willSave();
reed@android.com6c924ad2009-03-31 03:48:49 +000066}
67
reed4960eee2015-12-18 07:09:18 -080068SkCanvas::SaveLayerStrategy SkNWayCanvas::getSaveLayerStrategy(const SaveLayerRec& rec) {
reed@android.com6c924ad2009-03-31 03:48:49 +000069 Iter iter(fList);
70 while (iter.next()) {
reed4960eee2015-12-18 07:09:18 -080071 iter->saveLayer(rec);
reed@android.com6c924ad2009-03-31 03:48:49 +000072 }
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000073
reed4960eee2015-12-18 07:09:18 -080074 this->INHERITED::getSaveLayerStrategy(rec);
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000075 // No need for a layer.
76 return kNoLayer_SaveLayerStrategy;
reed@android.com6c924ad2009-03-31 03:48:49 +000077}
78
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000079void SkNWayCanvas::willRestore() {
reed@android.com6c924ad2009-03-31 03:48:49 +000080 Iter iter(fList);
81 while (iter.next()) {
82 iter->restore();
83 }
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000084 this->INHERITED::willRestore();
reed@android.com6c924ad2009-03-31 03:48:49 +000085}
86
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +000087void SkNWayCanvas::didConcat(const SkMatrix& matrix) {
reed@android.com6c924ad2009-03-31 03:48:49 +000088 Iter iter(fList);
89 while (iter.next()) {
90 iter->concat(matrix);
91 }
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +000092 this->INHERITED::didConcat(matrix);
reed@android.com6c924ad2009-03-31 03:48:49 +000093}
94
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +000095void SkNWayCanvas::didSetMatrix(const SkMatrix& matrix) {
reed@android.com6c924ad2009-03-31 03:48:49 +000096 Iter iter(fList);
97 while (iter.next()) {
98 iter->setMatrix(matrix);
99 }
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +0000100 this->INHERITED::didSetMatrix(matrix);
reed@android.com6c924ad2009-03-31 03:48:49 +0000101}
102
reed73603f32016-09-20 08:42:38 -0700103void SkNWayCanvas::onClipRect(const SkRect& rect, ClipOp op, ClipEdgeStyle edgeStyle) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000104 Iter iter(fList);
105 while (iter.next()) {
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000106 iter->clipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000107 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000108 this->INHERITED::onClipRect(rect, op, edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000109}
110
reed73603f32016-09-20 08:42:38 -0700111void SkNWayCanvas::onClipRRect(const SkRRect& rrect, ClipOp op, ClipEdgeStyle edgeStyle) {
reed@google.com4ed0fb72012-12-12 20:48:18 +0000112 Iter iter(fList);
113 while (iter.next()) {
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000114 iter->clipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle);
reed@google.com4ed0fb72012-12-12 20:48:18 +0000115 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000116 this->INHERITED::onClipRRect(rrect, op, edgeStyle);
reed@google.com4ed0fb72012-12-12 20:48:18 +0000117}
118
reed73603f32016-09-20 08:42:38 -0700119void SkNWayCanvas::onClipPath(const SkPath& path, ClipOp op, ClipEdgeStyle edgeStyle) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000120 Iter iter(fList);
121 while (iter.next()) {
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000122 iter->clipPath(path, op, kSoft_ClipEdgeStyle == edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000123 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000124 this->INHERITED::onClipPath(path, op, edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000125}
126
reed73603f32016-09-20 08:42:38 -0700127void SkNWayCanvas::onClipRegion(const SkRegion& deviceRgn, ClipOp op) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000128 Iter iter(fList);
129 while (iter.next()) {
130 iter->clipRegion(deviceRgn, op);
131 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000132 this->INHERITED::onClipRegion(deviceRgn, op);
reed@android.com6c924ad2009-03-31 03:48:49 +0000133}
134
reed41af9662015-01-05 07:49:08 -0800135void SkNWayCanvas::onDrawPaint(const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000136 Iter iter(fList);
137 while (iter.next()) {
138 iter->drawPaint(paint);
139 }
140}
141
reed41af9662015-01-05 07:49:08 -0800142void SkNWayCanvas::onDrawPoints(PointMode mode, size_t count, const SkPoint pts[],
143 const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000144 Iter iter(fList);
145 while (iter.next()) {
146 iter->drawPoints(mode, count, pts, paint);
147 }
148}
149
reed41af9662015-01-05 07:49:08 -0800150void SkNWayCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000151 Iter iter(fList);
152 while (iter.next()) {
153 iter->drawRect(rect, paint);
154 }
155}
156
reed41af9662015-01-05 07:49:08 -0800157void SkNWayCanvas::onDrawOval(const SkRect& rect, const SkPaint& paint) {
commit-bot@chromium.orgbe65a4c2013-11-14 19:02:41 +0000158 Iter iter(fList);
159 while (iter.next()) {
160 iter->drawOval(rect, paint);
161 }
162}
163
bsalomonac3aa242016-08-19 11:25:19 -0700164void SkNWayCanvas::onDrawArc(const SkRect& rect, SkScalar startAngle, SkScalar sweepAngle,
165 bool useCenter, const SkPaint& paint) {
166 Iter iter(fList);
167 while (iter.next()) {
168 iter->drawArc(rect, startAngle, sweepAngle, useCenter, paint);
169 }
170}
171
reed41af9662015-01-05 07:49:08 -0800172void SkNWayCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) {
reed@google.com4ed0fb72012-12-12 20:48:18 +0000173 Iter iter(fList);
174 while (iter.next()) {
175 iter->drawRRect(rrect, paint);
176 }
177}
178
reeda5517e22015-07-14 10:54:12 -0700179void SkNWayCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) {
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000180 Iter iter(fList);
181 while (iter.next()) {
182 iter->drawDRRect(outer, inner, paint);
183 }
184}
185
reed41af9662015-01-05 07:49:08 -0800186void SkNWayCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000187 Iter iter(fList);
188 while (iter.next()) {
189 iter->drawPath(path, paint);
190 }
191}
192
reed41af9662015-01-05 07:49:08 -0800193void SkNWayCanvas::onDrawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
194 const SkPaint* paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000195 Iter iter(fList);
196 while (iter.next()) {
197 iter->drawBitmap(bitmap, x, y, paint);
198 }
199}
200
reed41af9662015-01-05 07:49:08 -0800201void SkNWayCanvas::onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, const SkRect& dst,
reed562fe472015-07-28 07:35:14 -0700202 const SkPaint* paint, SrcRectConstraint constraint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000203 Iter iter(fList);
204 while (iter.next()) {
reede47829b2015-08-06 10:02:53 -0700205 iter->legacy_drawBitmapRect(bitmap, src, dst, paint, (SrcRectConstraint)constraint);
reed@android.com6c924ad2009-03-31 03:48:49 +0000206 }
207}
208
reed41af9662015-01-05 07:49:08 -0800209void SkNWayCanvas::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
210 const SkRect& dst, const SkPaint* paint) {
commit-bot@chromium.orgbe65a4c2013-11-14 19:02:41 +0000211 Iter iter(fList);
212 while (iter.next()) {
213 iter->drawBitmapNine(bitmap, center, dst, paint);
214 }
215}
216
reed41af9662015-01-05 07:49:08 -0800217void SkNWayCanvas::onDrawImage(const SkImage* image, SkScalar left, SkScalar top,
218 const SkPaint* paint) {
piotaixrb7bac3d2014-09-29 08:56:19 -0700219 Iter iter(fList);
220 while (iter.next()) {
221 iter->drawImage(image, left, top, paint);
222 }
223}
224
reed41af9662015-01-05 07:49:08 -0800225void SkNWayCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst,
reed562fe472015-07-28 07:35:14 -0700226 const SkPaint* paint, SrcRectConstraint constraint) {
piotaixrb7bac3d2014-09-29 08:56:19 -0700227 Iter iter(fList);
228 while (iter.next()) {
reede47829b2015-08-06 10:02:53 -0700229 iter->legacy_drawImageRect(image, src, dst, paint, constraint);
piotaixrb7bac3d2014-09-29 08:56:19 -0700230 }
231}
232
reed@google.come0d9ce82014-04-23 04:00:17 +0000233void SkNWayCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
234 const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000235 Iter iter(fList);
236 while (iter.next()) {
237 iter->drawText(text, byteLength, x, y, paint);
238 }
239}
240
reed@google.come0d9ce82014-04-23 04:00:17 +0000241void SkNWayCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
242 const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000243 Iter iter(fList);
244 while (iter.next()) {
245 iter->drawPosText(text, byteLength, pos, paint);
246 }
247}
248
reed@google.come0d9ce82014-04-23 04:00:17 +0000249void SkNWayCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
250 SkScalar constY, const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000251 Iter iter(fList);
252 while (iter.next()) {
253 iter->drawPosTextH(text, byteLength, xpos, constY, paint);
254 }
255}
256
reed@google.come0d9ce82014-04-23 04:00:17 +0000257void SkNWayCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
258 const SkMatrix* matrix, const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000259 Iter iter(fList);
260 while (iter.next()) {
261 iter->drawTextOnPath(text, byteLength, path, matrix, paint);
262 }
263}
264
reed45561a02016-07-07 12:47:17 -0700265void SkNWayCanvas::onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[],
266 const SkRect* cull, const SkPaint& paint) {
267 Iter iter(fList);
268 while (iter.next()) {
269 iter->drawTextRSXform(text, byteLength, xform, cull, paint);
270 }
271}
272
fmalitab7425172014-08-26 07:56:44 -0700273void SkNWayCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
274 const SkPaint &paint) {
275 Iter iter(fList);
276 while (iter.next()) {
277 iter->drawTextBlob(blob, x, y, paint);
278 }
279}
280
reedd5fa1a42014-08-09 11:08:05 -0700281void SkNWayCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix,
282 const SkPaint* paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000283 Iter iter(fList);
284 while (iter.next()) {
reedd5fa1a42014-08-09 11:08:05 -0700285 iter->drawPicture(picture, matrix, paint);
reed@android.com6c924ad2009-03-31 03:48:49 +0000286 }
287}
288
reed41af9662015-01-05 07:49:08 -0800289void SkNWayCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
290 const SkPoint vertices[], const SkPoint texs[],
291 const SkColor colors[], SkXfermode* xmode,
292 const uint16_t indices[], int indexCount,
293 const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000294 Iter iter(fList);
295 while (iter.next()) {
296 iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode,
297 indices, indexCount, paint);
298 }
299}
300
dandovb3c9d1c2014-08-12 08:34:29 -0700301void SkNWayCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
302 const SkPoint texCoords[4], SkXfermode* xmode,
303 const SkPaint& paint) {
dandov963137b2014-08-07 07:49:53 -0700304 Iter iter(fList);
305 while (iter.next()) {
dandovb3c9d1c2014-08-12 08:34:29 -0700306 iter->drawPatch(cubics, colors, texCoords, xmode, paint);
dandov963137b2014-08-07 07:49:53 -0700307 }
308}
309
reedf70b5312016-03-04 16:36:20 -0800310void SkNWayCanvas::onDrawAnnotation(const SkRect& rect, const char key[], SkData* data) {
311 Iter iter(fList);
312 while (iter.next()) {
313 iter->drawAnnotation(rect, key, data);
314 }
315}
316
fmalita53d9f1c2016-01-25 06:23:54 -0800317#ifdef SK_SUPPORT_LEGACY_DRAWFILTER
reed@android.com6c924ad2009-03-31 03:48:49 +0000318SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) {
319 Iter iter(fList);
320 while (iter.next()) {
321 iter->setDrawFilter(filter);
322 }
323 return this->INHERITED::setDrawFilter(filter);
324}
fmalita77650002016-01-21 18:47:11 -0800325#endif