blob: a910284da091800b3651a6b1eb39feebc85ce720 [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) {
reed@android.com6c924ad2009-03-31 03:48:49 +000018 *fList.append() = canvas;
19 }
20}
21
22void SkNWayCanvas::removeCanvas(SkCanvas* canvas) {
23 int index = fList.find(canvas);
24 if (index >= 0) {
reed@android.com6c924ad2009-03-31 03:48:49 +000025 fList.removeShuffle(index);
26 }
27}
28
29void SkNWayCanvas::removeAll() {
reed@android.com6c924ad2009-03-31 03:48:49 +000030 fList.reset();
31}
32
33///////////////////////////////////////////////////////////////////////////
34// These are forwarded to the N canvases we're referencing
35
36class SkNWayCanvas::Iter {
37public:
38 Iter(const SkTDArray<SkCanvas*>& list) : fList(list) {
39 fIndex = 0;
40 }
41 bool next() {
42 if (fIndex < fList.count()) {
43 fCanvas = fList[fIndex++];
44 return true;
45 }
46 return false;
47 }
48 SkCanvas* operator->() { return fCanvas; }
vandebo@chromium.org74b46192012-01-28 01:45:11 +000049
reed@android.com6c924ad2009-03-31 03:48:49 +000050private:
51 const SkTDArray<SkCanvas*>& fList;
52 int fIndex;
53 SkCanvas* fCanvas;
54};
55
Florin Malita5f6102d2014-06-30 10:13:28 -040056void SkNWayCanvas::willSave() {
reed@android.com6c924ad2009-03-31 03:48:49 +000057 Iter iter(fList);
58 while (iter.next()) {
Florin Malita5f6102d2014-06-30 10:13:28 -040059 iter->save();
reed@android.com6c924ad2009-03-31 03:48:49 +000060 }
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000061
Florin Malita5f6102d2014-06-30 10:13:28 -040062 this->INHERITED::willSave();
reed@android.com6c924ad2009-03-31 03:48:49 +000063}
64
reed4960eee2015-12-18 07:09:18 -080065SkCanvas::SaveLayerStrategy SkNWayCanvas::getSaveLayerStrategy(const SaveLayerRec& rec) {
reed@android.com6c924ad2009-03-31 03:48:49 +000066 Iter iter(fList);
67 while (iter.next()) {
reed4960eee2015-12-18 07:09:18 -080068 iter->saveLayer(rec);
reed@android.com6c924ad2009-03-31 03:48:49 +000069 }
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000070
reed4960eee2015-12-18 07:09:18 -080071 this->INHERITED::getSaveLayerStrategy(rec);
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000072 // No need for a layer.
73 return kNoLayer_SaveLayerStrategy;
reed@android.com6c924ad2009-03-31 03:48:49 +000074}
75
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000076void SkNWayCanvas::willRestore() {
reed@android.com6c924ad2009-03-31 03:48:49 +000077 Iter iter(fList);
78 while (iter.next()) {
79 iter->restore();
80 }
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000081 this->INHERITED::willRestore();
reed@android.com6c924ad2009-03-31 03:48:49 +000082}
83
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +000084void SkNWayCanvas::didConcat(const SkMatrix& matrix) {
reed@android.com6c924ad2009-03-31 03:48:49 +000085 Iter iter(fList);
86 while (iter.next()) {
87 iter->concat(matrix);
88 }
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +000089 this->INHERITED::didConcat(matrix);
reed@android.com6c924ad2009-03-31 03:48:49 +000090}
91
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +000092void SkNWayCanvas::didSetMatrix(const SkMatrix& matrix) {
reed@android.com6c924ad2009-03-31 03:48:49 +000093 Iter iter(fList);
94 while (iter.next()) {
95 iter->setMatrix(matrix);
96 }
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +000097 this->INHERITED::didSetMatrix(matrix);
reed@android.com6c924ad2009-03-31 03:48:49 +000098}
99
reed73603f32016-09-20 08:42:38 -0700100void SkNWayCanvas::onClipRect(const SkRect& rect, ClipOp op, ClipEdgeStyle edgeStyle) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000101 Iter iter(fList);
102 while (iter.next()) {
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000103 iter->clipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000104 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000105 this->INHERITED::onClipRect(rect, op, edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000106}
107
reed73603f32016-09-20 08:42:38 -0700108void SkNWayCanvas::onClipRRect(const SkRRect& rrect, ClipOp op, ClipEdgeStyle edgeStyle) {
reed@google.com4ed0fb72012-12-12 20:48:18 +0000109 Iter iter(fList);
110 while (iter.next()) {
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000111 iter->clipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle);
reed@google.com4ed0fb72012-12-12 20:48:18 +0000112 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000113 this->INHERITED::onClipRRect(rrect, op, edgeStyle);
reed@google.com4ed0fb72012-12-12 20:48:18 +0000114}
115
reed73603f32016-09-20 08:42:38 -0700116void SkNWayCanvas::onClipPath(const SkPath& path, ClipOp op, ClipEdgeStyle edgeStyle) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000117 Iter iter(fList);
118 while (iter.next()) {
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000119 iter->clipPath(path, op, kSoft_ClipEdgeStyle == edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000120 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000121 this->INHERITED::onClipPath(path, op, edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000122}
123
reed73603f32016-09-20 08:42:38 -0700124void SkNWayCanvas::onClipRegion(const SkRegion& deviceRgn, ClipOp op) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000125 Iter iter(fList);
126 while (iter.next()) {
127 iter->clipRegion(deviceRgn, op);
128 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000129 this->INHERITED::onClipRegion(deviceRgn, op);
reed@android.com6c924ad2009-03-31 03:48:49 +0000130}
131
reed41af9662015-01-05 07:49:08 -0800132void SkNWayCanvas::onDrawPaint(const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000133 Iter iter(fList);
134 while (iter.next()) {
135 iter->drawPaint(paint);
136 }
137}
138
reed41af9662015-01-05 07:49:08 -0800139void SkNWayCanvas::onDrawPoints(PointMode mode, size_t count, const SkPoint pts[],
140 const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000141 Iter iter(fList);
142 while (iter.next()) {
143 iter->drawPoints(mode, count, pts, paint);
144 }
145}
146
reed41af9662015-01-05 07:49:08 -0800147void SkNWayCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000148 Iter iter(fList);
149 while (iter.next()) {
150 iter->drawRect(rect, paint);
151 }
152}
153
reed41af9662015-01-05 07:49:08 -0800154void SkNWayCanvas::onDrawOval(const SkRect& rect, const SkPaint& paint) {
commit-bot@chromium.orgbe65a4c2013-11-14 19:02:41 +0000155 Iter iter(fList);
156 while (iter.next()) {
157 iter->drawOval(rect, paint);
158 }
159}
160
bsalomonac3aa242016-08-19 11:25:19 -0700161void SkNWayCanvas::onDrawArc(const SkRect& rect, SkScalar startAngle, SkScalar sweepAngle,
162 bool useCenter, const SkPaint& paint) {
163 Iter iter(fList);
164 while (iter.next()) {
165 iter->drawArc(rect, startAngle, sweepAngle, useCenter, paint);
166 }
167}
168
reed41af9662015-01-05 07:49:08 -0800169void SkNWayCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) {
reed@google.com4ed0fb72012-12-12 20:48:18 +0000170 Iter iter(fList);
171 while (iter.next()) {
172 iter->drawRRect(rrect, paint);
173 }
174}
175
reeda5517e22015-07-14 10:54:12 -0700176void SkNWayCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) {
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000177 Iter iter(fList);
178 while (iter.next()) {
179 iter->drawDRRect(outer, inner, paint);
180 }
181}
182
reed41af9662015-01-05 07:49:08 -0800183void SkNWayCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000184 Iter iter(fList);
185 while (iter.next()) {
186 iter->drawPath(path, paint);
187 }
188}
189
reed41af9662015-01-05 07:49:08 -0800190void SkNWayCanvas::onDrawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
191 const SkPaint* paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000192 Iter iter(fList);
193 while (iter.next()) {
194 iter->drawBitmap(bitmap, x, y, paint);
195 }
196}
197
reed41af9662015-01-05 07:49:08 -0800198void SkNWayCanvas::onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, const SkRect& dst,
reed562fe472015-07-28 07:35:14 -0700199 const SkPaint* paint, SrcRectConstraint constraint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000200 Iter iter(fList);
201 while (iter.next()) {
reede47829b2015-08-06 10:02:53 -0700202 iter->legacy_drawBitmapRect(bitmap, src, dst, paint, (SrcRectConstraint)constraint);
reed@android.com6c924ad2009-03-31 03:48:49 +0000203 }
204}
205
reed41af9662015-01-05 07:49:08 -0800206void SkNWayCanvas::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
207 const SkRect& dst, const SkPaint* paint) {
commit-bot@chromium.orgbe65a4c2013-11-14 19:02:41 +0000208 Iter iter(fList);
209 while (iter.next()) {
210 iter->drawBitmapNine(bitmap, center, dst, paint);
211 }
212}
213
reed41af9662015-01-05 07:49:08 -0800214void SkNWayCanvas::onDrawImage(const SkImage* image, SkScalar left, SkScalar top,
215 const SkPaint* paint) {
piotaixrb7bac3d2014-09-29 08:56:19 -0700216 Iter iter(fList);
217 while (iter.next()) {
218 iter->drawImage(image, left, top, paint);
219 }
220}
221
reed41af9662015-01-05 07:49:08 -0800222void SkNWayCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst,
reed562fe472015-07-28 07:35:14 -0700223 const SkPaint* paint, SrcRectConstraint constraint) {
piotaixrb7bac3d2014-09-29 08:56:19 -0700224 Iter iter(fList);
225 while (iter.next()) {
reede47829b2015-08-06 10:02:53 -0700226 iter->legacy_drawImageRect(image, src, dst, paint, constraint);
piotaixrb7bac3d2014-09-29 08:56:19 -0700227 }
228}
229
reed@google.come0d9ce82014-04-23 04:00:17 +0000230void SkNWayCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
231 const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000232 Iter iter(fList);
233 while (iter.next()) {
234 iter->drawText(text, byteLength, x, y, paint);
235 }
236}
237
reed@google.come0d9ce82014-04-23 04:00:17 +0000238void SkNWayCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
239 const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000240 Iter iter(fList);
241 while (iter.next()) {
242 iter->drawPosText(text, byteLength, pos, paint);
243 }
244}
245
reed@google.come0d9ce82014-04-23 04:00:17 +0000246void SkNWayCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
247 SkScalar constY, const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000248 Iter iter(fList);
249 while (iter.next()) {
250 iter->drawPosTextH(text, byteLength, xpos, constY, paint);
251 }
252}
253
reed@google.come0d9ce82014-04-23 04:00:17 +0000254void SkNWayCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
255 const SkMatrix* matrix, const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000256 Iter iter(fList);
257 while (iter.next()) {
258 iter->drawTextOnPath(text, byteLength, path, matrix, paint);
259 }
260}
261
reed45561a02016-07-07 12:47:17 -0700262void SkNWayCanvas::onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[],
263 const SkRect* cull, const SkPaint& paint) {
264 Iter iter(fList);
265 while (iter.next()) {
266 iter->drawTextRSXform(text, byteLength, xform, cull, paint);
267 }
268}
269
fmalitab7425172014-08-26 07:56:44 -0700270void SkNWayCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
271 const SkPaint &paint) {
272 Iter iter(fList);
273 while (iter.next()) {
274 iter->drawTextBlob(blob, x, y, paint);
275 }
276}
277
reedd5fa1a42014-08-09 11:08:05 -0700278void SkNWayCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix,
279 const SkPaint* paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000280 Iter iter(fList);
281 while (iter.next()) {
reedd5fa1a42014-08-09 11:08:05 -0700282 iter->drawPicture(picture, matrix, paint);
reed@android.com6c924ad2009-03-31 03:48:49 +0000283 }
284}
285
reed41af9662015-01-05 07:49:08 -0800286void SkNWayCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
287 const SkPoint vertices[], const SkPoint texs[],
Mike Reedfaba3712016-11-03 14:45:31 -0400288 const SkColor colors[], SkBlendMode bmode,
reed41af9662015-01-05 07:49:08 -0800289 const uint16_t indices[], int indexCount,
290 const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000291 Iter iter(fList);
292 while (iter.next()) {
Mike Reedfaba3712016-11-03 14:45:31 -0400293 iter->drawVertices(vmode, vertexCount, vertices, texs, colors, bmode,
reed@android.com6c924ad2009-03-31 03:48:49 +0000294 indices, indexCount, paint);
295 }
296}
297
dandovb3c9d1c2014-08-12 08:34:29 -0700298void SkNWayCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
Mike Reedfaba3712016-11-03 14:45:31 -0400299 const SkPoint texCoords[4], SkBlendMode bmode,
dandovb3c9d1c2014-08-12 08:34:29 -0700300 const SkPaint& paint) {
dandov963137b2014-08-07 07:49:53 -0700301 Iter iter(fList);
302 while (iter.next()) {
Mike Reedfaba3712016-11-03 14:45:31 -0400303 iter->drawPatch(cubics, colors, texCoords, bmode, paint);
dandov963137b2014-08-07 07:49:53 -0700304 }
305}
306
reedf70b5312016-03-04 16:36:20 -0800307void SkNWayCanvas::onDrawAnnotation(const SkRect& rect, const char key[], SkData* data) {
308 Iter iter(fList);
309 while (iter.next()) {
310 iter->drawAnnotation(rect, key, data);
311 }
312}
313
fmalita53d9f1c2016-01-25 06:23:54 -0800314#ifdef SK_SUPPORT_LEGACY_DRAWFILTER
reed@android.com6c924ad2009-03-31 03:48:49 +0000315SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) {
316 Iter iter(fList);
317 while (iter.next()) {
318 iter->setDrawFilter(filter);
319 }
320 return this->INHERITED::setDrawFilter(filter);
321}
fmalita77650002016-01-21 18:47:11 -0800322#endif