SkNWayCanvas.cpp revision 29348cb0612e19030d979156860946241e2ff4bd
1#include "SkNWayCanvas.h"
2
3SkNWayCanvas::SkNWayCanvas() {}
4
5SkNWayCanvas::~SkNWayCanvas() {
6    this->removeAll();
7}
8
9void SkNWayCanvas::addCanvas(SkCanvas* canvas) {
10    if (canvas) {
11        canvas->ref();
12        *fList.append() = canvas;
13    }
14}
15
16void SkNWayCanvas::removeCanvas(SkCanvas* canvas) {
17    int index = fList.find(canvas);
18    if (index >= 0) {
19        canvas->unref();
20        fList.removeShuffle(index);
21    }
22}
23
24void SkNWayCanvas::removeAll() {
25    fList.unrefAll();
26    fList.reset();
27}
28
29///////////////////////////////////////////////////////////////////////////
30// These are forwarded to the N canvases we're referencing
31
32class SkNWayCanvas::Iter {
33public:
34    Iter(const SkTDArray<SkCanvas*>& list) : fList(list) {
35        fIndex = 0;
36    }
37    bool next() {
38        if (fIndex < fList.count()) {
39            fCanvas = fList[fIndex++];
40            return true;
41        }
42        return false;
43    }
44    SkCanvas* operator->() { return fCanvas; }
45
46private:
47    const SkTDArray<SkCanvas*>& fList;
48    int fIndex;
49    SkCanvas* fCanvas;
50};
51
52int SkNWayCanvas::save(SaveFlags flags) {
53    Iter iter(fList);
54    while (iter.next()) {
55        iter->save(flags);
56    }
57    return this->INHERITED::save(flags);
58}
59
60int SkNWayCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
61                                    SaveFlags flags) {
62    Iter iter(fList);
63    while (iter.next()) {
64        iter->saveLayer(bounds, paint, flags);
65    }
66    return this->INHERITED::saveLayer(bounds, paint, flags);
67}
68
69void SkNWayCanvas::restore() {
70    Iter iter(fList);
71    while (iter.next()) {
72        iter->restore();
73    }
74    this->INHERITED::restore();
75}
76
77bool SkNWayCanvas::translate(SkScalar dx, SkScalar dy) {
78    Iter iter(fList);
79    while (iter.next()) {
80        iter->translate(dx, dy);
81    }
82    return this->INHERITED::translate(dx, dy);
83}
84
85bool SkNWayCanvas::scale(SkScalar sx, SkScalar sy) {
86    Iter iter(fList);
87    while (iter.next()) {
88        iter->scale(sx, sy);
89    }
90    return this->INHERITED::scale(sx, sy);
91}
92
93bool SkNWayCanvas::rotate(SkScalar degrees) {
94    Iter iter(fList);
95    while (iter.next()) {
96        iter->rotate(degrees);
97    }
98    return this->INHERITED::rotate(degrees);
99}
100
101bool SkNWayCanvas::skew(SkScalar sx, SkScalar sy) {
102    Iter iter(fList);
103    while (iter.next()) {
104        iter->skew(sx, sy);
105    }
106    return this->INHERITED::skew(sx, sy);
107}
108
109bool SkNWayCanvas::concat(const SkMatrix& matrix) {
110    Iter iter(fList);
111    while (iter.next()) {
112        iter->concat(matrix);
113    }
114    return this->INHERITED::concat(matrix);
115}
116
117void SkNWayCanvas::setMatrix(const SkMatrix& matrix) {
118    Iter iter(fList);
119    while (iter.next()) {
120        iter->setMatrix(matrix);
121    }
122    this->INHERITED::setMatrix(matrix);
123}
124
125bool SkNWayCanvas::clipRect(const SkRect& rect, SkRegion::Op op) {
126    Iter iter(fList);
127    while (iter.next()) {
128        iter->clipRect(rect, op);
129    }
130    return this->INHERITED::clipRect(rect, op);
131}
132
133bool SkNWayCanvas::clipPath(const SkPath& path, SkRegion::Op op) {
134    Iter iter(fList);
135    while (iter.next()) {
136        iter->clipPath(path, op);
137    }
138    return this->INHERITED::clipPath(path, op);
139}
140
141bool SkNWayCanvas::clipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
142    Iter iter(fList);
143    while (iter.next()) {
144        iter->clipRegion(deviceRgn, op);
145    }
146    return this->INHERITED::clipRegion(deviceRgn, op);
147}
148
149void SkNWayCanvas::drawPaint(const SkPaint& paint) {
150    Iter iter(fList);
151    while (iter.next()) {
152        iter->drawPaint(paint);
153    }
154}
155
156void SkNWayCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[],
157                        const SkPaint& paint) {
158    Iter iter(fList);
159    while (iter.next()) {
160        iter->drawPoints(mode, count, pts, paint);
161    }
162}
163
164void SkNWayCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
165    Iter iter(fList);
166    while (iter.next()) {
167        iter->drawRect(rect, paint);
168    }
169}
170
171void SkNWayCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
172    Iter iter(fList);
173    while (iter.next()) {
174        iter->drawPath(path, paint);
175    }
176}
177
178void SkNWayCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
179                              const SkPaint* paint) {
180    Iter iter(fList);
181    while (iter.next()) {
182        iter->drawBitmap(bitmap, x, y, paint);
183    }
184}
185
186void SkNWayCanvas::drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
187                                  const SkRect& dst, const SkPaint* paint) {
188    Iter iter(fList);
189    while (iter.next()) {
190        iter->drawBitmapRect(bitmap, src, dst, paint);
191    }
192}
193
194void SkNWayCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
195                                    const SkPaint* paint) {
196    Iter iter(fList);
197    while (iter.next()) {
198        iter->drawBitmapMatrix(bitmap, m, paint);
199    }
200}
201
202void SkNWayCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
203                              const SkPaint* paint) {
204    Iter iter(fList);
205    while (iter.next()) {
206        iter->drawSprite(bitmap, x, y, paint);
207    }
208}
209
210void SkNWayCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
211                            SkScalar y, const SkPaint& paint) {
212    Iter iter(fList);
213    while (iter.next()) {
214        iter->drawText(text, byteLength, x, y, paint);
215    }
216}
217
218void SkNWayCanvas::drawPosText(const void* text, size_t byteLength,
219                               const SkPoint pos[], const SkPaint& paint) {
220    Iter iter(fList);
221    while (iter.next()) {
222        iter->drawPosText(text, byteLength, pos, paint);
223    }
224}
225
226void SkNWayCanvas::drawPosTextH(const void* text, size_t byteLength,
227                                const SkScalar xpos[], SkScalar constY,
228                                const SkPaint& paint) {
229    Iter iter(fList);
230    while (iter.next()) {
231        iter->drawPosTextH(text, byteLength, xpos, constY, paint);
232    }
233}
234
235void SkNWayCanvas::drawTextOnPath(const void* text, size_t byteLength,
236                                  const SkPath& path, const SkMatrix* matrix,
237                                  const SkPaint& paint) {
238    Iter iter(fList);
239    while (iter.next()) {
240        iter->drawTextOnPath(text, byteLength, path, matrix, paint);
241    }
242}
243
244void SkNWayCanvas::drawPicture(SkPicture& picture) {
245    Iter iter(fList);
246    while (iter.next()) {
247        iter->drawPicture(picture);
248    }
249}
250
251void SkNWayCanvas::drawShape(SkShape* shape) {
252    Iter iter(fList);
253    while (iter.next()) {
254        iter->drawShape(shape);
255    }
256}
257
258void SkNWayCanvas::drawVertices(VertexMode vmode, int vertexCount,
259                          const SkPoint vertices[], const SkPoint texs[],
260                          const SkColor colors[], SkXfermode* xmode,
261                          const uint16_t indices[], int indexCount,
262                          const SkPaint& paint) {
263    Iter iter(fList);
264    while (iter.next()) {
265        iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode,
266                           indices, indexCount, paint);
267    }
268}
269
270SkBounder* SkNWayCanvas::setBounder(SkBounder* bounder) {
271    Iter iter(fList);
272    while (iter.next()) {
273        iter->setBounder(bounder);
274    }
275    return this->INHERITED::setBounder(bounder);
276}
277
278SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) {
279    Iter iter(fList);
280    while (iter.next()) {
281        iter->setDrawFilter(filter);
282    }
283    return this->INHERITED::setDrawFilter(filter);
284}
285
286
287