SkNWayCanvas.cpp revision ad254fee73ad70a45acba69dccb9b65f88c3a92a
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::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) {
148    Iter iter(fList);
149    while (iter.next()) {
150        iter->clipRRect(rrect, op, doAA);
151    }
152    return this->INHERITED::clipRRect(rrect, op, doAA);
153}
154
155bool SkNWayCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
156    Iter iter(fList);
157    while (iter.next()) {
158        iter->clipPath(path, op, doAA);
159    }
160    return this->INHERITED::clipPath(path, op, doAA);
161}
162
163bool SkNWayCanvas::clipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
164    Iter iter(fList);
165    while (iter.next()) {
166        iter->clipRegion(deviceRgn, op);
167    }
168    return this->INHERITED::clipRegion(deviceRgn, op);
169}
170
171void SkNWayCanvas::drawPaint(const SkPaint& paint) {
172    Iter iter(fList);
173    while (iter.next()) {
174        iter->drawPaint(paint);
175    }
176}
177
178void SkNWayCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[],
179                        const SkPaint& paint) {
180    Iter iter(fList);
181    while (iter.next()) {
182        iter->drawPoints(mode, count, pts, paint);
183    }
184}
185
186void SkNWayCanvas::drawOval(const SkRect& rect, const SkPaint& paint) {
187    Iter iter(fList);
188    while (iter.next()) {
189        iter->drawOval(rect, paint);
190    }
191}
192
193void SkNWayCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
194    Iter iter(fList);
195    while (iter.next()) {
196        iter->drawRect(rect, paint);
197    }
198}
199
200void SkNWayCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
201    Iter iter(fList);
202    while (iter.next()) {
203        iter->drawRRect(rrect, paint);
204    }
205}
206
207void SkNWayCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
208    Iter iter(fList);
209    while (iter.next()) {
210        iter->drawPath(path, paint);
211    }
212}
213
214void SkNWayCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
215                              const SkPaint* paint) {
216    Iter iter(fList);
217    while (iter.next()) {
218        iter->drawBitmap(bitmap, x, y, paint);
219    }
220}
221
222void SkNWayCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
223                                  const SkRect& dst, const SkPaint* paint,
224                                  DrawBitmapRectFlags flags) {
225    Iter iter(fList);
226    while (iter.next()) {
227        iter->drawBitmapRectToRect(bitmap, src, dst, paint, flags);
228    }
229}
230
231void SkNWayCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
232                                    const SkPaint* paint) {
233    Iter iter(fList);
234    while (iter.next()) {
235        iter->drawBitmapMatrix(bitmap, m, paint);
236    }
237}
238
239void SkNWayCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
240                              const SkPaint* paint) {
241    Iter iter(fList);
242    while (iter.next()) {
243        iter->drawSprite(bitmap, x, y, paint);
244    }
245}
246
247void SkNWayCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
248                            SkScalar y, const SkPaint& paint) {
249    Iter iter(fList);
250    while (iter.next()) {
251        iter->drawText(text, byteLength, x, y, paint);
252    }
253}
254
255void SkNWayCanvas::drawPosText(const void* text, size_t byteLength,
256                               const SkPoint pos[], const SkPaint& paint) {
257    Iter iter(fList);
258    while (iter.next()) {
259        iter->drawPosText(text, byteLength, pos, paint);
260    }
261}
262
263void SkNWayCanvas::drawPosTextH(const void* text, size_t byteLength,
264                                const SkScalar xpos[], SkScalar constY,
265                                const SkPaint& paint) {
266    Iter iter(fList);
267    while (iter.next()) {
268        iter->drawPosTextH(text, byteLength, xpos, constY, paint);
269    }
270}
271
272void SkNWayCanvas::drawTextOnPath(const void* text, size_t byteLength,
273                                  const SkPath& path, const SkMatrix* matrix,
274                                  const SkPaint& paint) {
275    Iter iter(fList);
276    while (iter.next()) {
277        iter->drawTextOnPath(text, byteLength, path, matrix, paint);
278    }
279}
280
281void SkNWayCanvas::drawPicture(SkPicture& picture) {
282    Iter iter(fList);
283    while (iter.next()) {
284        iter->drawPicture(picture);
285    }
286}
287
288void SkNWayCanvas::drawVertices(VertexMode vmode, int vertexCount,
289                          const SkPoint vertices[], const SkPoint texs[],
290                          const SkColor colors[], SkXfermode* xmode,
291                          const uint16_t indices[], int indexCount,
292                          const SkPaint& paint) {
293    Iter iter(fList);
294    while (iter.next()) {
295        iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode,
296                           indices, indexCount, paint);
297    }
298}
299
300SkBounder* SkNWayCanvas::setBounder(SkBounder* bounder) {
301    Iter iter(fList);
302    while (iter.next()) {
303        iter->setBounder(bounder);
304    }
305    return this->INHERITED::setBounder(bounder);
306}
307
308SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) {
309    Iter iter(fList);
310    while (iter.next()) {
311        iter->setDrawFilter(filter);
312    }
313    return this->INHERITED::setDrawFilter(filter);
314}
315
316void SkNWayCanvas::beginCommentGroup(const char* description) {
317    Iter iter(fList);
318    while (iter.next()) {
319        iter->beginCommentGroup(description);
320    }
321}
322
323void SkNWayCanvas::addComment(const char* kywd, const char* value) {
324    Iter iter(fList);
325    while (iter.next()) {
326        iter->addComment(kywd, value);
327    }
328}
329
330void SkNWayCanvas::endCommentGroup() {
331    Iter iter(fList);
332    while (iter.next()) {
333        iter->endCommentGroup();
334    }
335}
336