blob: 23e9b117f16840fe4569ec8f11823d9a7f548d59 [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
Florin Malita5f6102d2014-06-30 10:13:28 -040060void SkNWayCanvas::willSave() {
reed@android.com6c924ad2009-03-31 03:48:49 +000061 Iter iter(fList);
62 while (iter.next()) {
Florin Malita5f6102d2014-06-30 10:13:28 -040063 iter->save();
reed@android.com6c924ad2009-03-31 03:48:49 +000064 }
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000065
Florin Malita5f6102d2014-06-30 10:13:28 -040066 this->INHERITED::willSave();
reed@android.com6c924ad2009-03-31 03:48:49 +000067}
68
reed4960eee2015-12-18 07:09:18 -080069SkCanvas::SaveLayerStrategy SkNWayCanvas::getSaveLayerStrategy(const SaveLayerRec& rec) {
reed@android.com6c924ad2009-03-31 03:48:49 +000070 Iter iter(fList);
71 while (iter.next()) {
reed4960eee2015-12-18 07:09:18 -080072 iter->saveLayer(rec);
reed@android.com6c924ad2009-03-31 03:48:49 +000073 }
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000074
reed4960eee2015-12-18 07:09:18 -080075 this->INHERITED::getSaveLayerStrategy(rec);
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000076 // No need for a layer.
77 return kNoLayer_SaveLayerStrategy;
reed@android.com6c924ad2009-03-31 03:48:49 +000078}
79
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000080void SkNWayCanvas::willRestore() {
reed@android.com6c924ad2009-03-31 03:48:49 +000081 Iter iter(fList);
82 while (iter.next()) {
83 iter->restore();
84 }
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +000085 this->INHERITED::willRestore();
reed@android.com6c924ad2009-03-31 03:48:49 +000086}
87
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +000088void SkNWayCanvas::didConcat(const SkMatrix& matrix) {
reed@android.com6c924ad2009-03-31 03:48:49 +000089 Iter iter(fList);
90 while (iter.next()) {
91 iter->concat(matrix);
92 }
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +000093 this->INHERITED::didConcat(matrix);
reed@android.com6c924ad2009-03-31 03:48:49 +000094}
95
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +000096void SkNWayCanvas::didSetMatrix(const SkMatrix& matrix) {
reed@android.com6c924ad2009-03-31 03:48:49 +000097 Iter iter(fList);
98 while (iter.next()) {
99 iter->setMatrix(matrix);
100 }
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +0000101 this->INHERITED::didSetMatrix(matrix);
reed@android.com6c924ad2009-03-31 03:48:49 +0000102}
103
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000104void SkNWayCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000105 Iter iter(fList);
106 while (iter.next()) {
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000107 iter->clipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000108 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000109 this->INHERITED::onClipRect(rect, op, edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000110}
111
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000112void SkNWayCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
reed@google.com4ed0fb72012-12-12 20:48:18 +0000113 Iter iter(fList);
114 while (iter.next()) {
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000115 iter->clipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle);
reed@google.com4ed0fb72012-12-12 20:48:18 +0000116 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000117 this->INHERITED::onClipRRect(rrect, op, edgeStyle);
reed@google.com4ed0fb72012-12-12 20:48:18 +0000118}
119
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000120void SkNWayCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000121 Iter iter(fList);
122 while (iter.next()) {
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000123 iter->clipPath(path, op, kSoft_ClipEdgeStyle == edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000124 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000125 this->INHERITED::onClipPath(path, op, edgeStyle);
reed@android.com6c924ad2009-03-31 03:48:49 +0000126}
127
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000128void SkNWayCanvas::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000129 Iter iter(fList);
130 while (iter.next()) {
131 iter->clipRegion(deviceRgn, op);
132 }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000133 this->INHERITED::onClipRegion(deviceRgn, op);
reed@android.com6c924ad2009-03-31 03:48:49 +0000134}
135
reed41af9662015-01-05 07:49:08 -0800136void SkNWayCanvas::onDrawPaint(const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000137 Iter iter(fList);
138 while (iter.next()) {
139 iter->drawPaint(paint);
140 }
141}
142
reed41af9662015-01-05 07:49:08 -0800143void SkNWayCanvas::onDrawPoints(PointMode mode, size_t count, const SkPoint pts[],
144 const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000145 Iter iter(fList);
146 while (iter.next()) {
147 iter->drawPoints(mode, count, pts, paint);
148 }
149}
150
reed41af9662015-01-05 07:49:08 -0800151void SkNWayCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000152 Iter iter(fList);
153 while (iter.next()) {
154 iter->drawRect(rect, paint);
155 }
156}
157
reed41af9662015-01-05 07:49:08 -0800158void SkNWayCanvas::onDrawOval(const SkRect& rect, const SkPaint& paint) {
commit-bot@chromium.orgbe65a4c2013-11-14 19:02:41 +0000159 Iter iter(fList);
160 while (iter.next()) {
161 iter->drawOval(rect, paint);
162 }
163}
164
reed41af9662015-01-05 07:49:08 -0800165void SkNWayCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) {
reed@google.com4ed0fb72012-12-12 20:48:18 +0000166 Iter iter(fList);
167 while (iter.next()) {
168 iter->drawRRect(rrect, paint);
169 }
170}
171
reeda5517e22015-07-14 10:54:12 -0700172void SkNWayCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) {
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000173 Iter iter(fList);
174 while (iter.next()) {
175 iter->drawDRRect(outer, inner, paint);
176 }
177}
178
reed41af9662015-01-05 07:49:08 -0800179void SkNWayCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000180 Iter iter(fList);
181 while (iter.next()) {
182 iter->drawPath(path, paint);
183 }
184}
185
reed41af9662015-01-05 07:49:08 -0800186void SkNWayCanvas::onDrawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
187 const SkPaint* paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000188 Iter iter(fList);
189 while (iter.next()) {
190 iter->drawBitmap(bitmap, x, y, paint);
191 }
192}
193
reed41af9662015-01-05 07:49:08 -0800194void SkNWayCanvas::onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, const SkRect& dst,
reed562fe472015-07-28 07:35:14 -0700195 const SkPaint* paint, SrcRectConstraint constraint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000196 Iter iter(fList);
197 while (iter.next()) {
reede47829b2015-08-06 10:02:53 -0700198 iter->legacy_drawBitmapRect(bitmap, src, dst, paint, (SrcRectConstraint)constraint);
reed@android.com6c924ad2009-03-31 03:48:49 +0000199 }
200}
201
reed41af9662015-01-05 07:49:08 -0800202void SkNWayCanvas::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
203 const SkRect& dst, const SkPaint* paint) {
commit-bot@chromium.orgbe65a4c2013-11-14 19:02:41 +0000204 Iter iter(fList);
205 while (iter.next()) {
206 iter->drawBitmapNine(bitmap, center, dst, paint);
207 }
208}
209
reed41af9662015-01-05 07:49:08 -0800210void SkNWayCanvas::onDrawImage(const SkImage* image, SkScalar left, SkScalar top,
211 const SkPaint* paint) {
piotaixrb7bac3d2014-09-29 08:56:19 -0700212 Iter iter(fList);
213 while (iter.next()) {
214 iter->drawImage(image, left, top, paint);
215 }
216}
217
reed41af9662015-01-05 07:49:08 -0800218void SkNWayCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst,
reed562fe472015-07-28 07:35:14 -0700219 const SkPaint* paint, SrcRectConstraint constraint) {
piotaixrb7bac3d2014-09-29 08:56:19 -0700220 Iter iter(fList);
221 while (iter.next()) {
reede47829b2015-08-06 10:02:53 -0700222 iter->legacy_drawImageRect(image, src, dst, paint, constraint);
piotaixrb7bac3d2014-09-29 08:56:19 -0700223 }
224}
225
reed@google.come0d9ce82014-04-23 04:00:17 +0000226void SkNWayCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
227 const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000228 Iter iter(fList);
229 while (iter.next()) {
230 iter->drawText(text, byteLength, x, y, paint);
231 }
232}
233
reed@google.come0d9ce82014-04-23 04:00:17 +0000234void SkNWayCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
235 const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000236 Iter iter(fList);
237 while (iter.next()) {
238 iter->drawPosText(text, byteLength, pos, paint);
239 }
240}
241
reed@google.come0d9ce82014-04-23 04:00:17 +0000242void SkNWayCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
243 SkScalar constY, const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000244 Iter iter(fList);
245 while (iter.next()) {
246 iter->drawPosTextH(text, byteLength, xpos, constY, paint);
247 }
248}
249
reed@google.come0d9ce82014-04-23 04:00:17 +0000250void SkNWayCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
251 const SkMatrix* matrix, const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000252 Iter iter(fList);
253 while (iter.next()) {
254 iter->drawTextOnPath(text, byteLength, path, matrix, paint);
255 }
256}
257
fmalitab7425172014-08-26 07:56:44 -0700258void SkNWayCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
259 const SkPaint &paint) {
260 Iter iter(fList);
261 while (iter.next()) {
262 iter->drawTextBlob(blob, x, y, paint);
263 }
264}
265
reedd5fa1a42014-08-09 11:08:05 -0700266void SkNWayCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix,
267 const SkPaint* paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000268 Iter iter(fList);
269 while (iter.next()) {
reedd5fa1a42014-08-09 11:08:05 -0700270 iter->drawPicture(picture, matrix, paint);
reed@android.com6c924ad2009-03-31 03:48:49 +0000271 }
272}
273
reed41af9662015-01-05 07:49:08 -0800274void SkNWayCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
275 const SkPoint vertices[], const SkPoint texs[],
276 const SkColor colors[], SkXfermode* xmode,
277 const uint16_t indices[], int indexCount,
278 const SkPaint& paint) {
reed@android.com6c924ad2009-03-31 03:48:49 +0000279 Iter iter(fList);
280 while (iter.next()) {
281 iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode,
282 indices, indexCount, paint);
283 }
284}
285
dandovb3c9d1c2014-08-12 08:34:29 -0700286void SkNWayCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
287 const SkPoint texCoords[4], SkXfermode* xmode,
288 const SkPaint& paint) {
dandov963137b2014-08-07 07:49:53 -0700289 Iter iter(fList);
290 while (iter.next()) {
dandovb3c9d1c2014-08-12 08:34:29 -0700291 iter->drawPatch(cubics, colors, texCoords, xmode, paint);
dandov963137b2014-08-07 07:49:53 -0700292 }
293}
294
fmalita77650002016-01-21 18:47:11 -0800295#ifdef SK_SUPPORT_LEGACY_DRAWFLTER
reed@android.com6c924ad2009-03-31 03:48:49 +0000296SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) {
297 Iter iter(fList);
298 while (iter.next()) {
299 iter->setDrawFilter(filter);
300 }
301 return this->INHERITED::setDrawFilter(filter);
302}
fmalita77650002016-01-21 18:47:11 -0800303#endif