SkNWayCanvas.cpp revision 74b461961607fa57a150a9282c410ef0cab38764
1
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 */
8#include "SkNWayCanvas.h"
9
10SkNWayCanvas::SkNWayCanvas() {}
11
12SkNWayCanvas::~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; }
52
53private:
54    const SkTDArray<SkCanvas*>& fList;
55    int fIndex;
56    SkCanvas* fCanvas;
57};
58
59int SkNWayCanvas::save(SaveFlags flags) {
60    Iter iter(fList);
61    while (iter.next()) {
62        iter->save(flags);
63    }
64    return this->INHERITED::save(flags);
65}
66
67int SkNWayCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
68                                    SaveFlags flags) {
69    Iter iter(fList);
70    while (iter.next()) {
71        iter->saveLayer(bounds, paint, flags);
72    }
73    return this->INHERITED::saveLayer(bounds, paint, flags);
74}
75
76void SkNWayCanvas::restore() {
77    Iter iter(fList);
78    while (iter.next()) {
79        iter->restore();
80    }
81    this->INHERITED::restore();
82}
83
84bool SkNWayCanvas::translate(SkScalar dx, SkScalar dy) {
85    Iter iter(fList);
86    while (iter.next()) {
87        iter->translate(dx, dy);
88    }
89    return this->INHERITED::translate(dx, dy);
90}
91
92bool SkNWayCanvas::scale(SkScalar sx, SkScalar sy) {
93    Iter iter(fList);
94    while (iter.next()) {
95        iter->scale(sx, sy);
96    }
97    return this->INHERITED::scale(sx, sy);
98}
99
100bool SkNWayCanvas::rotate(SkScalar degrees) {
101    Iter iter(fList);
102    while (iter.next()) {
103        iter->rotate(degrees);
104    }
105    return this->INHERITED::rotate(degrees);
106}
107
108bool SkNWayCanvas::skew(SkScalar sx, SkScalar sy) {
109    Iter iter(fList);
110    while (iter.next()) {
111        iter->skew(sx, sy);
112    }
113    return this->INHERITED::skew(sx, sy);
114}
115
116bool SkNWayCanvas::concat(const SkMatrix& matrix) {
117    Iter iter(fList);
118    while (iter.next()) {
119        iter->concat(matrix);
120    }
121    return this->INHERITED::concat(matrix);
122}
123
124void SkNWayCanvas::setMatrix(const SkMatrix& matrix) {
125    Iter iter(fList);
126    while (iter.next()) {
127        iter->setMatrix(matrix);
128    }
129    this->INHERITED::setMatrix(matrix);
130}
131
132bool SkNWayCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
133    Iter iter(fList);
134    while (iter.next()) {
135        iter->clipRect(rect, op, doAA);
136    }
137    return this->INHERITED::clipRect(rect, op, doAA);
138}
139
140bool SkNWayCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
141    Iter iter(fList);
142    while (iter.next()) {
143        iter->clipPath(path, op, doAA);
144    }
145    return this->INHERITED::clipPath(path, op, doAA);
146}
147
148bool SkNWayCanvas::clipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
149    Iter iter(fList);
150    while (iter.next()) {
151        iter->clipRegion(deviceRgn, op);
152    }
153    return this->INHERITED::clipRegion(deviceRgn, op);
154}
155
156void SkNWayCanvas::drawPaint(const SkPaint& paint) {
157    Iter iter(fList);
158    while (iter.next()) {
159        iter->drawPaint(paint);
160    }
161}
162
163void SkNWayCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[],
164                        const SkPaint& paint) {
165    Iter iter(fList);
166    while (iter.next()) {
167        iter->drawPoints(mode, count, pts, paint);
168    }
169}
170
171void SkNWayCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
172    Iter iter(fList);
173    while (iter.next()) {
174        iter->drawRect(rect, paint);
175    }
176}
177
178void SkNWayCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
179    Iter iter(fList);
180    while (iter.next()) {
181        iter->drawPath(path, paint);
182    }
183}
184
185void SkNWayCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
186                              const SkPaint* paint) {
187    Iter iter(fList);
188    while (iter.next()) {
189        iter->drawBitmap(bitmap, x, y, paint);
190    }
191}
192
193void SkNWayCanvas::drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
194                                  const SkRect& dst, const SkPaint* paint) {
195    Iter iter(fList);
196    while (iter.next()) {
197        iter->drawBitmapRect(bitmap, src, dst, paint);
198    }
199}
200
201void SkNWayCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
202                                    const SkPaint* paint) {
203    Iter iter(fList);
204    while (iter.next()) {
205        iter->drawBitmapMatrix(bitmap, m, paint);
206    }
207}
208
209void SkNWayCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
210                              const SkPaint* paint) {
211    Iter iter(fList);
212    while (iter.next()) {
213        iter->drawSprite(bitmap, x, y, paint);
214    }
215}
216
217void SkNWayCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
218                            SkScalar y, const SkPaint& paint) {
219    Iter iter(fList);
220    while (iter.next()) {
221        iter->drawText(text, byteLength, x, y, paint);
222    }
223}
224
225void SkNWayCanvas::drawPosText(const void* text, size_t byteLength,
226                               const SkPoint pos[], const SkPaint& paint) {
227    Iter iter(fList);
228    while (iter.next()) {
229        iter->drawPosText(text, byteLength, pos, paint);
230    }
231}
232
233void SkNWayCanvas::drawPosTextH(const void* text, size_t byteLength,
234                                const SkScalar xpos[], SkScalar constY,
235                                const SkPaint& paint) {
236    Iter iter(fList);
237    while (iter.next()) {
238        iter->drawPosTextH(text, byteLength, xpos, constY, paint);
239    }
240}
241
242void SkNWayCanvas::drawTextOnPath(const void* text, size_t byteLength,
243                                  const SkPath& path, const SkMatrix* matrix,
244                                  const SkPaint& paint) {
245    Iter iter(fList);
246    while (iter.next()) {
247        iter->drawTextOnPath(text, byteLength, path, matrix, paint);
248    }
249}
250
251void SkNWayCanvas::drawPicture(SkPicture& picture) {
252    Iter iter(fList);
253    while (iter.next()) {
254        iter->drawPicture(picture);
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