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