1 /*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7 #include "SkNWayCanvas.h"
8
SkNWayCanvas(int width,int height)9 SkNWayCanvas::SkNWayCanvas(int width, int height) : INHERITED(width, height) {}
10
~SkNWayCanvas()11 SkNWayCanvas::~SkNWayCanvas() {
12 this->removeAll();
13 }
14
addCanvas(SkCanvas * canvas)15 void SkNWayCanvas::addCanvas(SkCanvas* canvas) {
16 if (canvas) {
17 *fList.append() = canvas;
18 }
19 }
20
removeCanvas(SkCanvas * canvas)21 void SkNWayCanvas::removeCanvas(SkCanvas* canvas) {
22 int index = fList.find(canvas);
23 if (index >= 0) {
24 fList.removeShuffle(index);
25 }
26 }
27
removeAll()28 void SkNWayCanvas::removeAll() {
29 fList.reset();
30 }
31
32 ///////////////////////////////////////////////////////////////////////////
33 // These are forwarded to the N canvases we're referencing
34
35 class SkNWayCanvas::Iter {
36 public:
Iter(const SkTDArray<SkCanvas * > & list)37 Iter(const SkTDArray<SkCanvas*>& list) : fList(list) {
38 fIndex = 0;
39 }
next()40 bool next() {
41 if (fIndex < fList.count()) {
42 fCanvas = fList[fIndex++];
43 return true;
44 }
45 return false;
46 }
operator ->()47 SkCanvas* operator->() { return fCanvas; }
48
49 private:
50 const SkTDArray<SkCanvas*>& fList;
51 int fIndex;
52 SkCanvas* fCanvas;
53 };
54
willSave()55 void SkNWayCanvas::willSave() {
56 Iter iter(fList);
57 while (iter.next()) {
58 iter->save();
59 }
60
61 this->INHERITED::willSave();
62 }
63
getSaveLayerStrategy(const SaveLayerRec & rec)64 SkCanvas::SaveLayerStrategy SkNWayCanvas::getSaveLayerStrategy(const SaveLayerRec& rec) {
65 Iter iter(fList);
66 while (iter.next()) {
67 iter->saveLayer(rec);
68 }
69
70 this->INHERITED::getSaveLayerStrategy(rec);
71 // No need for a layer.
72 return kNoLayer_SaveLayerStrategy;
73 }
74
willRestore()75 void SkNWayCanvas::willRestore() {
76 Iter iter(fList);
77 while (iter.next()) {
78 iter->restore();
79 }
80 this->INHERITED::willRestore();
81 }
82
didConcat(const SkMatrix & matrix)83 void SkNWayCanvas::didConcat(const SkMatrix& matrix) {
84 Iter iter(fList);
85 while (iter.next()) {
86 iter->concat(matrix);
87 }
88 this->INHERITED::didConcat(matrix);
89 }
90
didSetMatrix(const SkMatrix & matrix)91 void SkNWayCanvas::didSetMatrix(const SkMatrix& matrix) {
92 Iter iter(fList);
93 while (iter.next()) {
94 iter->setMatrix(matrix);
95 }
96 this->INHERITED::didSetMatrix(matrix);
97 }
98
onClipRect(const SkRect & rect,SkClipOp op,ClipEdgeStyle edgeStyle)99 void SkNWayCanvas::onClipRect(const SkRect& rect, SkClipOp op, ClipEdgeStyle edgeStyle) {
100 Iter iter(fList);
101 while (iter.next()) {
102 iter->clipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle);
103 }
104 this->INHERITED::onClipRect(rect, op, edgeStyle);
105 }
106
onClipRRect(const SkRRect & rrect,SkClipOp op,ClipEdgeStyle edgeStyle)107 void SkNWayCanvas::onClipRRect(const SkRRect& rrect, SkClipOp op, ClipEdgeStyle edgeStyle) {
108 Iter iter(fList);
109 while (iter.next()) {
110 iter->clipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle);
111 }
112 this->INHERITED::onClipRRect(rrect, op, edgeStyle);
113 }
114
onClipPath(const SkPath & path,SkClipOp op,ClipEdgeStyle edgeStyle)115 void SkNWayCanvas::onClipPath(const SkPath& path, SkClipOp op, ClipEdgeStyle edgeStyle) {
116 Iter iter(fList);
117 while (iter.next()) {
118 iter->clipPath(path, op, kSoft_ClipEdgeStyle == edgeStyle);
119 }
120 this->INHERITED::onClipPath(path, op, edgeStyle);
121 }
122
onClipRegion(const SkRegion & deviceRgn,SkClipOp op)123 void SkNWayCanvas::onClipRegion(const SkRegion& deviceRgn, SkClipOp op) {
124 Iter iter(fList);
125 while (iter.next()) {
126 iter->clipRegion(deviceRgn, op);
127 }
128 this->INHERITED::onClipRegion(deviceRgn, op);
129 }
130
onDrawPaint(const SkPaint & paint)131 void SkNWayCanvas::onDrawPaint(const SkPaint& paint) {
132 Iter iter(fList);
133 while (iter.next()) {
134 iter->drawPaint(paint);
135 }
136 }
137
onDrawPoints(PointMode mode,size_t count,const SkPoint pts[],const SkPaint & paint)138 void SkNWayCanvas::onDrawPoints(PointMode mode, size_t count, const SkPoint pts[],
139 const SkPaint& paint) {
140 Iter iter(fList);
141 while (iter.next()) {
142 iter->drawPoints(mode, count, pts, paint);
143 }
144 }
145
onDrawRect(const SkRect & rect,const SkPaint & paint)146 void SkNWayCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
147 Iter iter(fList);
148 while (iter.next()) {
149 iter->drawRect(rect, paint);
150 }
151 }
152
onDrawOval(const SkRect & rect,const SkPaint & paint)153 void SkNWayCanvas::onDrawOval(const SkRect& rect, const SkPaint& paint) {
154 Iter iter(fList);
155 while (iter.next()) {
156 iter->drawOval(rect, paint);
157 }
158 }
159
onDrawArc(const SkRect & rect,SkScalar startAngle,SkScalar sweepAngle,bool useCenter,const SkPaint & paint)160 void SkNWayCanvas::onDrawArc(const SkRect& rect, SkScalar startAngle, SkScalar sweepAngle,
161 bool useCenter, const SkPaint& paint) {
162 Iter iter(fList);
163 while (iter.next()) {
164 iter->drawArc(rect, startAngle, sweepAngle, useCenter, paint);
165 }
166 }
167
onDrawRRect(const SkRRect & rrect,const SkPaint & paint)168 void SkNWayCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) {
169 Iter iter(fList);
170 while (iter.next()) {
171 iter->drawRRect(rrect, paint);
172 }
173 }
174
onDrawDRRect(const SkRRect & outer,const SkRRect & inner,const SkPaint & paint)175 void SkNWayCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) {
176 Iter iter(fList);
177 while (iter.next()) {
178 iter->drawDRRect(outer, inner, paint);
179 }
180 }
181
onDrawPath(const SkPath & path,const SkPaint & paint)182 void SkNWayCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
183 Iter iter(fList);
184 while (iter.next()) {
185 iter->drawPath(path, paint);
186 }
187 }
188
onDrawBitmap(const SkBitmap & bitmap,SkScalar x,SkScalar y,const SkPaint * paint)189 void SkNWayCanvas::onDrawBitmap(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
onDrawBitmapRect(const SkBitmap & bitmap,const SkRect * src,const SkRect & dst,const SkPaint * paint,SrcRectConstraint constraint)197 void SkNWayCanvas::onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, const SkRect& dst,
198 const SkPaint* paint, SrcRectConstraint constraint) {
199 Iter iter(fList);
200 while (iter.next()) {
201 iter->legacy_drawBitmapRect(bitmap, src, dst, paint, (SrcRectConstraint)constraint);
202 }
203 }
204
onDrawBitmapNine(const SkBitmap & bitmap,const SkIRect & center,const SkRect & dst,const SkPaint * paint)205 void SkNWayCanvas::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
206 const SkRect& dst, const SkPaint* paint) {
207 Iter iter(fList);
208 while (iter.next()) {
209 iter->drawBitmapNine(bitmap, center, dst, paint);
210 }
211 }
212
onDrawImage(const SkImage * image,SkScalar left,SkScalar top,const SkPaint * paint)213 void SkNWayCanvas::onDrawImage(const SkImage* image, SkScalar left, SkScalar top,
214 const SkPaint* paint) {
215 Iter iter(fList);
216 while (iter.next()) {
217 iter->drawImage(image, left, top, paint);
218 }
219 }
220
onDrawImageRect(const SkImage * image,const SkRect * src,const SkRect & dst,const SkPaint * paint,SrcRectConstraint constraint)221 void SkNWayCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst,
222 const SkPaint* paint, SrcRectConstraint constraint) {
223 Iter iter(fList);
224 while (iter.next()) {
225 iter->legacy_drawImageRect(image, src, dst, paint, constraint);
226 }
227 }
228
onDrawText(const void * text,size_t byteLength,SkScalar x,SkScalar y,const SkPaint & paint)229 void SkNWayCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
230 const SkPaint& paint) {
231 Iter iter(fList);
232 while (iter.next()) {
233 iter->drawText(text, byteLength, x, y, paint);
234 }
235 }
236
onDrawPosText(const void * text,size_t byteLength,const SkPoint pos[],const SkPaint & paint)237 void SkNWayCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
238 const SkPaint& paint) {
239 Iter iter(fList);
240 while (iter.next()) {
241 iter->drawPosText(text, byteLength, pos, paint);
242 }
243 }
244
onDrawPosTextH(const void * text,size_t byteLength,const SkScalar xpos[],SkScalar constY,const SkPaint & paint)245 void SkNWayCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
246 SkScalar constY, const SkPaint& paint) {
247 Iter iter(fList);
248 while (iter.next()) {
249 iter->drawPosTextH(text, byteLength, xpos, constY, paint);
250 }
251 }
252
onDrawTextOnPath(const void * text,size_t byteLength,const SkPath & path,const SkMatrix * matrix,const SkPaint & paint)253 void SkNWayCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
254 const SkMatrix* matrix, const SkPaint& paint) {
255 Iter iter(fList);
256 while (iter.next()) {
257 iter->drawTextOnPath(text, byteLength, path, matrix, paint);
258 }
259 }
260
onDrawTextRSXform(const void * text,size_t byteLength,const SkRSXform xform[],const SkRect * cull,const SkPaint & paint)261 void SkNWayCanvas::onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[],
262 const SkRect* cull, const SkPaint& paint) {
263 Iter iter(fList);
264 while (iter.next()) {
265 iter->drawTextRSXform(text, byteLength, xform, cull, paint);
266 }
267 }
268
onDrawTextBlob(const SkTextBlob * blob,SkScalar x,SkScalar y,const SkPaint & paint)269 void SkNWayCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
270 const SkPaint &paint) {
271 Iter iter(fList);
272 while (iter.next()) {
273 iter->drawTextBlob(blob, x, y, paint);
274 }
275 }
276
onDrawPicture(const SkPicture * picture,const SkMatrix * matrix,const SkPaint * paint)277 void SkNWayCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix,
278 const SkPaint* paint) {
279 Iter iter(fList);
280 while (iter.next()) {
281 iter->drawPicture(picture, matrix, paint);
282 }
283 }
284
onDrawVerticesObject(const SkVertices * vertices,SkBlendMode bmode,const SkPaint & paint)285 void SkNWayCanvas::onDrawVerticesObject(const SkVertices* vertices, SkBlendMode bmode,
286 const SkPaint& paint) {
287 Iter iter(fList);
288 while (iter.next()) {
289 iter->drawVertices(vertices, bmode, paint);
290 }
291 }
292
onDrawPatch(const SkPoint cubics[12],const SkColor colors[4],const SkPoint texCoords[4],SkBlendMode bmode,const SkPaint & paint)293 void SkNWayCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
294 const SkPoint texCoords[4], SkBlendMode bmode,
295 const SkPaint& paint) {
296 Iter iter(fList);
297 while (iter.next()) {
298 iter->drawPatch(cubics, colors, texCoords, bmode, paint);
299 }
300 }
301
onDrawAnnotation(const SkRect & rect,const char key[],SkData * data)302 void SkNWayCanvas::onDrawAnnotation(const SkRect& rect, const char key[], SkData* data) {
303 Iter iter(fList);
304 while (iter.next()) {
305 iter->drawAnnotation(rect, key, data);
306 }
307 }
308
309 #ifdef SK_SUPPORT_LEGACY_DRAWFILTER
setDrawFilter(SkDrawFilter * filter)310 SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) {
311 Iter iter(fList);
312 while (iter.next()) {
313 iter->setDrawFilter(filter);
314 }
315 return this->INHERITED::setDrawFilter(filter);
316 }
317 #endif
318