SkNWayCanvas.cpp revision 4960eeec4a1f2a772654883d7f3615d47bcd5dc3
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
60void SkNWayCanvas::willSave() {
61    Iter iter(fList);
62    while (iter.next()) {
63        iter->save();
64    }
65
66    this->INHERITED::willSave();
67}
68
69SkCanvas::SaveLayerStrategy SkNWayCanvas::getSaveLayerStrategy(const SaveLayerRec& rec) {
70    Iter iter(fList);
71    while (iter.next()) {
72        iter->saveLayer(rec);
73    }
74
75    this->INHERITED::getSaveLayerStrategy(rec);
76    // No need for a layer.
77    return kNoLayer_SaveLayerStrategy;
78}
79
80void SkNWayCanvas::willRestore() {
81    Iter iter(fList);
82    while (iter.next()) {
83        iter->restore();
84    }
85    this->INHERITED::willRestore();
86}
87
88void SkNWayCanvas::didConcat(const SkMatrix& matrix) {
89    Iter iter(fList);
90    while (iter.next()) {
91        iter->concat(matrix);
92    }
93    this->INHERITED::didConcat(matrix);
94}
95
96void SkNWayCanvas::didSetMatrix(const SkMatrix& matrix) {
97    Iter iter(fList);
98    while (iter.next()) {
99        iter->setMatrix(matrix);
100    }
101    this->INHERITED::didSetMatrix(matrix);
102}
103
104void SkNWayCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
105    Iter iter(fList);
106    while (iter.next()) {
107        iter->clipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle);
108    }
109    this->INHERITED::onClipRect(rect, op, edgeStyle);
110}
111
112void SkNWayCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
113    Iter iter(fList);
114    while (iter.next()) {
115        iter->clipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle);
116    }
117    this->INHERITED::onClipRRect(rrect, op, edgeStyle);
118}
119
120void SkNWayCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
121    Iter iter(fList);
122    while (iter.next()) {
123        iter->clipPath(path, op, kSoft_ClipEdgeStyle == edgeStyle);
124    }
125    this->INHERITED::onClipPath(path, op, edgeStyle);
126}
127
128void SkNWayCanvas::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
129    Iter iter(fList);
130    while (iter.next()) {
131        iter->clipRegion(deviceRgn, op);
132    }
133    this->INHERITED::onClipRegion(deviceRgn, op);
134}
135
136void SkNWayCanvas::onDrawPaint(const SkPaint& paint) {
137    Iter iter(fList);
138    while (iter.next()) {
139        iter->drawPaint(paint);
140    }
141}
142
143void SkNWayCanvas::onDrawPoints(PointMode mode, size_t count, const SkPoint pts[],
144                                const SkPaint& paint) {
145    Iter iter(fList);
146    while (iter.next()) {
147        iter->drawPoints(mode, count, pts, paint);
148    }
149}
150
151void SkNWayCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
152    Iter iter(fList);
153    while (iter.next()) {
154        iter->drawRect(rect, paint);
155    }
156}
157
158void SkNWayCanvas::onDrawOval(const SkRect& rect, const SkPaint& paint) {
159    Iter iter(fList);
160    while (iter.next()) {
161        iter->drawOval(rect, paint);
162    }
163}
164
165void SkNWayCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) {
166    Iter iter(fList);
167    while (iter.next()) {
168        iter->drawRRect(rrect, paint);
169    }
170}
171
172void SkNWayCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) {
173    Iter iter(fList);
174    while (iter.next()) {
175        iter->drawDRRect(outer, inner, paint);
176    }
177}
178
179void SkNWayCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
180    Iter iter(fList);
181    while (iter.next()) {
182        iter->drawPath(path, paint);
183    }
184}
185
186void SkNWayCanvas::onDrawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
187                                const SkPaint* paint) {
188    Iter iter(fList);
189    while (iter.next()) {
190        iter->drawBitmap(bitmap, x, y, paint);
191    }
192}
193
194void SkNWayCanvas::onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, const SkRect& dst,
195                                    const SkPaint* paint, SrcRectConstraint constraint) {
196    Iter iter(fList);
197    while (iter.next()) {
198        iter->legacy_drawBitmapRect(bitmap, src, dst, paint, (SrcRectConstraint)constraint);
199    }
200}
201
202void SkNWayCanvas::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
203                                    const SkRect& dst, const SkPaint* paint) {
204    Iter iter(fList);
205    while (iter.next()) {
206        iter->drawBitmapNine(bitmap, center, dst, paint);
207    }
208}
209
210void SkNWayCanvas::onDrawImage(const SkImage* image, SkScalar left, SkScalar top,
211                               const SkPaint* paint) {
212    Iter iter(fList);
213    while (iter.next()) {
214        iter->drawImage(image, left, top, paint);
215    }
216}
217
218void SkNWayCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst,
219                                   const SkPaint* paint, SrcRectConstraint constraint) {
220    Iter iter(fList);
221    while (iter.next()) {
222        iter->legacy_drawImageRect(image, src, dst, paint, constraint);
223    }
224}
225
226void SkNWayCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
227                              const SkPaint& paint) {
228    Iter iter(fList);
229    while (iter.next()) {
230        iter->drawText(text, byteLength, x, y, paint);
231    }
232}
233
234void SkNWayCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
235                                 const SkPaint& paint) {
236    Iter iter(fList);
237    while (iter.next()) {
238        iter->drawPosText(text, byteLength, pos, paint);
239    }
240}
241
242void SkNWayCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
243                                  SkScalar constY, const SkPaint& paint) {
244    Iter iter(fList);
245    while (iter.next()) {
246        iter->drawPosTextH(text, byteLength, xpos, constY, paint);
247    }
248}
249
250void SkNWayCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
251                                    const SkMatrix* matrix, const SkPaint& paint) {
252    Iter iter(fList);
253    while (iter.next()) {
254        iter->drawTextOnPath(text, byteLength, path, matrix, paint);
255    }
256}
257
258void SkNWayCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
259                                  const SkPaint &paint) {
260    Iter iter(fList);
261    while (iter.next()) {
262        iter->drawTextBlob(blob, x, y, paint);
263    }
264}
265
266void SkNWayCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix,
267                                 const SkPaint* paint) {
268    Iter iter(fList);
269    while (iter.next()) {
270        iter->drawPicture(picture, matrix, paint);
271    }
272}
273
274void SkNWayCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
275                                  const SkPoint vertices[], const SkPoint texs[],
276                                  const SkColor colors[], SkXfermode* xmode,
277                                  const uint16_t indices[], int indexCount,
278                                  const SkPaint& paint) {
279    Iter iter(fList);
280    while (iter.next()) {
281        iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode,
282                           indices, indexCount, paint);
283    }
284}
285
286void SkNWayCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
287                               const SkPoint texCoords[4], SkXfermode* xmode,
288                               const SkPaint& paint) {
289    Iter iter(fList);
290    while (iter.next()) {
291        iter->drawPatch(cubics, colors, texCoords, xmode, paint);
292    }
293}
294
295SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) {
296    Iter iter(fList);
297    while (iter.next()) {
298        iter->setDrawFilter(filter);
299    }
300    return this->INHERITED::setDrawFilter(filter);
301}
302