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