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