SkNWayCanvas.cpp revision 8e7432b7f98dd592e529a0c8bb038d73ebfb0478
1/*
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 */
7#include "SkNWayCanvas.h"
8
9SkNWayCanvas::SkNWayCanvas(int width, int height) : INHERITED(width, height) {}
10
11SkNWayCanvas::~SkNWayCanvas() {
12    this->removeAll();
13}
14
15void SkNWayCanvas::addCanvas(SkCanvas* canvas) {
16    if (canvas) {
17        *fList.append() = canvas;
18    }
19}
20
21void SkNWayCanvas::removeCanvas(SkCanvas* canvas) {
22    int index = fList.find(canvas);
23    if (index >= 0) {
24        fList.removeShuffle(index);
25    }
26}
27
28void SkNWayCanvas::removeAll() {
29    fList.reset();
30}
31
32///////////////////////////////////////////////////////////////////////////
33// These are forwarded to the N canvases we're referencing
34
35class SkNWayCanvas::Iter {
36public:
37    Iter(const SkTDArray<SkCanvas*>& list) : fList(list) {
38        fIndex = 0;
39    }
40    bool next() {
41        if (fIndex < fList.count()) {
42            fCanvas = fList[fIndex++];
43            return true;
44        }
45        return false;
46    }
47    SkCanvas* operator->() { return fCanvas; }
48
49private:
50    const SkTDArray<SkCanvas*>& fList;
51    int fIndex;
52    SkCanvas* fCanvas;
53};
54
55void SkNWayCanvas::willSave() {
56    Iter iter(fList);
57    while (iter.next()) {
58        iter->save();
59    }
60
61    this->INHERITED::willSave();
62}
63
64SkCanvas::SaveLayerStrategy SkNWayCanvas::getSaveLayerStrategy(const SaveLayerRec& rec) {
65    Iter iter(fList);
66    while (iter.next()) {
67        iter->saveLayer(rec);
68    }
69
70    this->INHERITED::getSaveLayerStrategy(rec);
71    // No need for a layer.
72    return kNoLayer_SaveLayerStrategy;
73}
74
75void SkNWayCanvas::willRestore() {
76    Iter iter(fList);
77    while (iter.next()) {
78        iter->restore();
79    }
80    this->INHERITED::willRestore();
81}
82
83void SkNWayCanvas::didConcat(const SkMatrix& matrix) {
84    Iter iter(fList);
85    while (iter.next()) {
86        iter->concat(matrix);
87    }
88    this->INHERITED::didConcat(matrix);
89}
90
91void SkNWayCanvas::didSetMatrix(const SkMatrix& matrix) {
92    Iter iter(fList);
93    while (iter.next()) {
94        iter->setMatrix(matrix);
95    }
96    this->INHERITED::didSetMatrix(matrix);
97}
98
99void SkNWayCanvas::onClipRect(const SkRect& rect, SkClipOp op, ClipEdgeStyle edgeStyle) {
100    Iter iter(fList);
101    while (iter.next()) {
102        iter->clipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle);
103    }
104    this->INHERITED::onClipRect(rect, op, edgeStyle);
105}
106
107void SkNWayCanvas::onClipRRect(const SkRRect& rrect, SkClipOp op, ClipEdgeStyle edgeStyle) {
108    Iter iter(fList);
109    while (iter.next()) {
110        iter->clipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle);
111    }
112    this->INHERITED::onClipRRect(rrect, op, edgeStyle);
113}
114
115void SkNWayCanvas::onClipPath(const SkPath& path, SkClipOp op, ClipEdgeStyle edgeStyle) {
116    Iter iter(fList);
117    while (iter.next()) {
118        iter->clipPath(path, op, kSoft_ClipEdgeStyle == edgeStyle);
119    }
120    this->INHERITED::onClipPath(path, op, edgeStyle);
121}
122
123void SkNWayCanvas::onClipRegion(const SkRegion& deviceRgn, SkClipOp op) {
124    Iter iter(fList);
125    while (iter.next()) {
126        iter->clipRegion(deviceRgn, op);
127    }
128    this->INHERITED::onClipRegion(deviceRgn, op);
129}
130
131void SkNWayCanvas::onDrawPaint(const SkPaint& paint) {
132    Iter iter(fList);
133    while (iter.next()) {
134        iter->drawPaint(paint);
135    }
136}
137
138void SkNWayCanvas::onDrawPoints(PointMode mode, size_t count, const SkPoint pts[],
139                                const SkPaint& paint) {
140    Iter iter(fList);
141    while (iter.next()) {
142        iter->drawPoints(mode, count, pts, paint);
143    }
144}
145
146void SkNWayCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
147    Iter iter(fList);
148    while (iter.next()) {
149        iter->drawRect(rect, paint);
150    }
151}
152
153void SkNWayCanvas::onDrawOval(const SkRect& rect, const SkPaint& paint) {
154    Iter iter(fList);
155    while (iter.next()) {
156        iter->drawOval(rect, paint);
157    }
158}
159
160void SkNWayCanvas::onDrawArc(const SkRect& rect, SkScalar startAngle, SkScalar sweepAngle,
161                             bool useCenter, const SkPaint& paint) {
162    Iter iter(fList);
163    while (iter.next()) {
164        iter->drawArc(rect, startAngle, sweepAngle, useCenter, paint);
165    }
166}
167
168void SkNWayCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) {
169    Iter iter(fList);
170    while (iter.next()) {
171        iter->drawRRect(rrect, paint);
172    }
173}
174
175void SkNWayCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) {
176    Iter iter(fList);
177    while (iter.next()) {
178        iter->drawDRRect(outer, inner, paint);
179    }
180}
181
182void SkNWayCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
183    Iter iter(fList);
184    while (iter.next()) {
185        iter->drawPath(path, paint);
186    }
187}
188
189void SkNWayCanvas::onDrawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
190                                const SkPaint* paint) {
191    Iter iter(fList);
192    while (iter.next()) {
193        iter->drawBitmap(bitmap, x, y, paint);
194    }
195}
196
197void SkNWayCanvas::onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, const SkRect& dst,
198                                    const SkPaint* paint, SrcRectConstraint constraint) {
199    Iter iter(fList);
200    while (iter.next()) {
201        iter->legacy_drawBitmapRect(bitmap, src, dst, paint, (SrcRectConstraint)constraint);
202    }
203}
204
205void SkNWayCanvas::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
206                                    const SkRect& dst, const SkPaint* paint) {
207    Iter iter(fList);
208    while (iter.next()) {
209        iter->drawBitmapNine(bitmap, center, dst, paint);
210    }
211}
212
213void SkNWayCanvas::onDrawImage(const SkImage* image, SkScalar left, SkScalar top,
214                               const SkPaint* paint) {
215    Iter iter(fList);
216    while (iter.next()) {
217        iter->drawImage(image, left, top, paint);
218    }
219}
220
221void SkNWayCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst,
222                                   const SkPaint* paint, SrcRectConstraint constraint) {
223    Iter iter(fList);
224    while (iter.next()) {
225        iter->legacy_drawImageRect(image, src, dst, paint, constraint);
226    }
227}
228
229void SkNWayCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
230                              const SkPaint& paint) {
231    Iter iter(fList);
232    while (iter.next()) {
233        iter->drawText(text, byteLength, x, y, paint);
234    }
235}
236
237void SkNWayCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
238                                 const SkPaint& paint) {
239    Iter iter(fList);
240    while (iter.next()) {
241        iter->drawPosText(text, byteLength, pos, paint);
242    }
243}
244
245void SkNWayCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
246                                  SkScalar constY, const SkPaint& paint) {
247    Iter iter(fList);
248    while (iter.next()) {
249        iter->drawPosTextH(text, byteLength, xpos, constY, paint);
250    }
251}
252
253void SkNWayCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
254                                    const SkMatrix* matrix, const SkPaint& paint) {
255    Iter iter(fList);
256    while (iter.next()) {
257        iter->drawTextOnPath(text, byteLength, path, matrix, paint);
258    }
259}
260
261void SkNWayCanvas::onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[],
262                                     const SkRect* cull, const SkPaint& paint) {
263    Iter iter(fList);
264    while (iter.next()) {
265        iter->drawTextRSXform(text, byteLength, xform, cull, paint);
266    }
267}
268
269void SkNWayCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
270                                  const SkPaint &paint) {
271    Iter iter(fList);
272    while (iter.next()) {
273        iter->drawTextBlob(blob, x, y, paint);
274    }
275}
276
277void SkNWayCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix,
278                                 const SkPaint* paint) {
279    Iter iter(fList);
280    while (iter.next()) {
281        iter->drawPicture(picture, matrix, paint);
282    }
283}
284
285void SkNWayCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
286                                  const SkPoint vertices[], const SkPoint texs[],
287                                  const SkColor colors[], SkBlendMode bmode,
288                                  const uint16_t indices[], int indexCount,
289                                  const SkPaint& paint) {
290    Iter iter(fList);
291    while (iter.next()) {
292        iter->drawVertices(vmode, vertexCount, vertices, texs, colors, bmode,
293                           indices, indexCount, paint);
294    }
295}
296
297void SkNWayCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
298                               const SkPoint texCoords[4], SkBlendMode bmode,
299                               const SkPaint& paint) {
300    Iter iter(fList);
301    while (iter.next()) {
302        iter->drawPatch(cubics, colors, texCoords, bmode, paint);
303    }
304}
305
306void SkNWayCanvas::onDrawAnnotation(const SkRect& rect, const char key[], SkData* data) {
307    Iter iter(fList);
308    while (iter.next()) {
309        iter->drawAnnotation(rect, key, data);
310    }
311}
312
313#ifdef SK_SUPPORT_LEGACY_DRAWFILTER
314SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) {
315    Iter iter(fList);
316    while (iter.next()) {
317        iter->setDrawFilter(filter);
318    }
319    return this->INHERITED::setDrawFilter(filter);
320}
321#endif
322