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
8 #include "include/core/SkShader.h"
9 #include "include/utils/SkNWayCanvas.h"
10 #include "src/core/SkCanvasPriv.h"
11
SkNWayCanvas(int width,int height)12 SkNWayCanvas::SkNWayCanvas(int width, int height) : INHERITED(width, height) {}
13
~SkNWayCanvas()14 SkNWayCanvas::~SkNWayCanvas() {
15 this->removeAll();
16 }
17
addCanvas(SkCanvas * canvas)18 void SkNWayCanvas::addCanvas(SkCanvas* canvas) {
19 if (canvas) {
20 *fList.append() = canvas;
21 }
22 }
23
removeCanvas(SkCanvas * canvas)24 void SkNWayCanvas::removeCanvas(SkCanvas* canvas) {
25 int index = fList.find(canvas);
26 if (index >= 0) {
27 fList.removeShuffle(index);
28 }
29 }
30
removeAll()31 void SkNWayCanvas::removeAll() {
32 fList.reset();
33 }
34
35 ///////////////////////////////////////////////////////////////////////////
36 // These are forwarded to the N canvases we're referencing
37
38 class SkNWayCanvas::Iter {
39 public:
Iter(const SkTDArray<SkCanvas * > & list)40 Iter(const SkTDArray<SkCanvas*>& list) : fList(list) {
41 fIndex = 0;
42 }
next()43 bool next() {
44 if (fIndex < fList.count()) {
45 fCanvas = fList[fIndex++];
46 return true;
47 }
48 return false;
49 }
operator ->()50 SkCanvas* operator->() { return fCanvas; }
get() const51 SkCanvas* get() const { return fCanvas; }
52
53 private:
54 const SkTDArray<SkCanvas*>& fList;
55 int fIndex;
56 SkCanvas* fCanvas;
57 };
58
willSave()59 void SkNWayCanvas::willSave() {
60 Iter iter(fList);
61 while (iter.next()) {
62 iter->save();
63 }
64
65 this->INHERITED::willSave();
66 }
67
getSaveLayerStrategy(const SaveLayerRec & rec)68 SkCanvas::SaveLayerStrategy SkNWayCanvas::getSaveLayerStrategy(const SaveLayerRec& rec) {
69 Iter iter(fList);
70 while (iter.next()) {
71 iter->saveLayer(rec);
72 }
73
74 this->INHERITED::getSaveLayerStrategy(rec);
75 // No need for a layer.
76 return kNoLayer_SaveLayerStrategy;
77 }
78
onDoSaveBehind(const SkRect * bounds)79 bool SkNWayCanvas::onDoSaveBehind(const SkRect* bounds) {
80 Iter iter(fList);
81 while (iter.next()) {
82 SkCanvasPriv::SaveBehind(iter.get(), bounds);
83 }
84 this->INHERITED::onDoSaveBehind(bounds);
85 return false;
86 }
87
willRestore()88 void SkNWayCanvas::willRestore() {
89 Iter iter(fList);
90 while (iter.next()) {
91 iter->restore();
92 }
93 this->INHERITED::willRestore();
94 }
95
didConcat44(const SkM44 & m)96 void SkNWayCanvas::didConcat44(const SkM44& m) {
97 Iter iter(fList);
98 while (iter.next()) {
99 iter->concat(m);
100 }
101 }
102
didSetM44(const SkM44 & matrix)103 void SkNWayCanvas::didSetM44(const SkM44& matrix) {
104 Iter iter(fList);
105 while (iter.next()) {
106 iter->setMatrix(matrix);
107 }
108 }
109
didTranslate(SkScalar x,SkScalar y)110 void SkNWayCanvas::didTranslate(SkScalar x, SkScalar y) {
111 Iter iter(fList);
112 while (iter.next()) {
113 iter->translate(x, y);
114 }
115 }
116
didScale(SkScalar x,SkScalar y)117 void SkNWayCanvas::didScale(SkScalar x, SkScalar y) {
118 Iter iter(fList);
119 while (iter.next()) {
120 iter->scale(x, y);
121 }
122 }
123
onClipRect(const SkRect & rect,SkClipOp op,ClipEdgeStyle edgeStyle)124 void SkNWayCanvas::onClipRect(const SkRect& rect, SkClipOp op, ClipEdgeStyle edgeStyle) {
125 Iter iter(fList);
126 while (iter.next()) {
127 iter->clipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle);
128 }
129 this->INHERITED::onClipRect(rect, op, edgeStyle);
130 }
131
onClipRRect(const SkRRect & rrect,SkClipOp op,ClipEdgeStyle edgeStyle)132 void SkNWayCanvas::onClipRRect(const SkRRect& rrect, SkClipOp op, ClipEdgeStyle edgeStyle) {
133 Iter iter(fList);
134 while (iter.next()) {
135 iter->clipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle);
136 }
137 this->INHERITED::onClipRRect(rrect, op, edgeStyle);
138 }
139
onClipPath(const SkPath & path,SkClipOp op,ClipEdgeStyle edgeStyle)140 void SkNWayCanvas::onClipPath(const SkPath& path, SkClipOp op, ClipEdgeStyle edgeStyle) {
141 Iter iter(fList);
142 while (iter.next()) {
143 iter->clipPath(path, op, kSoft_ClipEdgeStyle == edgeStyle);
144 }
145 this->INHERITED::onClipPath(path, op, edgeStyle);
146 }
147
onClipShader(sk_sp<SkShader> sh,SkClipOp op)148 void SkNWayCanvas::onClipShader(sk_sp<SkShader> sh, SkClipOp op) {
149 Iter iter(fList);
150 while (iter.next()) {
151 iter->clipShader(sh, op);
152 }
153 this->INHERITED::onClipShader(std::move(sh), op);
154 }
155
onClipRegion(const SkRegion & deviceRgn,SkClipOp op)156 void SkNWayCanvas::onClipRegion(const SkRegion& deviceRgn, SkClipOp op) {
157 Iter iter(fList);
158 while (iter.next()) {
159 iter->clipRegion(deviceRgn, op);
160 }
161 this->INHERITED::onClipRegion(deviceRgn, op);
162 }
163
onResetClip()164 void SkNWayCanvas::onResetClip() {
165 Iter iter(fList);
166 while (iter.next()) {
167 SkCanvasPriv::ResetClip(iter.get());
168 }
169 this->INHERITED::onResetClip();
170 }
171
onDrawPaint(const SkPaint & paint)172 void SkNWayCanvas::onDrawPaint(const SkPaint& paint) {
173 Iter iter(fList);
174 while (iter.next()) {
175 iter->drawPaint(paint);
176 }
177 }
178
onDrawBehind(const SkPaint & paint)179 void SkNWayCanvas::onDrawBehind(const SkPaint& paint) {
180 Iter iter(fList);
181 while (iter.next()) {
182 SkCanvasPriv::DrawBehind(iter.get(), paint);
183 }
184 }
185
onDrawPoints(PointMode mode,size_t count,const SkPoint pts[],const SkPaint & paint)186 void SkNWayCanvas::onDrawPoints(PointMode mode, size_t count, const SkPoint pts[],
187 const SkPaint& paint) {
188 Iter iter(fList);
189 while (iter.next()) {
190 iter->drawPoints(mode, count, pts, paint);
191 }
192 }
193
onDrawRect(const SkRect & rect,const SkPaint & paint)194 void SkNWayCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
195 Iter iter(fList);
196 while (iter.next()) {
197 iter->drawRect(rect, paint);
198 }
199 }
200
onDrawRegion(const SkRegion & region,const SkPaint & paint)201 void SkNWayCanvas::onDrawRegion(const SkRegion& region, const SkPaint& paint) {
202 Iter iter(fList);
203 while (iter.next()) {
204 iter->drawRegion(region, paint);
205 }
206 }
207
onDrawOval(const SkRect & rect,const SkPaint & paint)208 void SkNWayCanvas::onDrawOval(const SkRect& rect, const SkPaint& paint) {
209 Iter iter(fList);
210 while (iter.next()) {
211 iter->drawOval(rect, paint);
212 }
213 }
214
onDrawArc(const SkRect & rect,SkScalar startAngle,SkScalar sweepAngle,bool useCenter,const SkPaint & paint)215 void SkNWayCanvas::onDrawArc(const SkRect& rect, SkScalar startAngle, SkScalar sweepAngle,
216 bool useCenter, const SkPaint& paint) {
217 Iter iter(fList);
218 while (iter.next()) {
219 iter->drawArc(rect, startAngle, sweepAngle, useCenter, paint);
220 }
221 }
222
onDrawRRect(const SkRRect & rrect,const SkPaint & paint)223 void SkNWayCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) {
224 Iter iter(fList);
225 while (iter.next()) {
226 iter->drawRRect(rrect, paint);
227 }
228 }
229
onDrawDRRect(const SkRRect & outer,const SkRRect & inner,const SkPaint & paint)230 void SkNWayCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) {
231 Iter iter(fList);
232 while (iter.next()) {
233 iter->drawDRRect(outer, inner, paint);
234 }
235 }
236
onDrawPath(const SkPath & path,const SkPaint & paint)237 void SkNWayCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
238 Iter iter(fList);
239 while (iter.next()) {
240 iter->drawPath(path, paint);
241 }
242 }
243
onDrawImage2(const SkImage * image,SkScalar left,SkScalar top,const SkSamplingOptions & sampling,const SkPaint * paint)244 void SkNWayCanvas::onDrawImage2(const SkImage* image, SkScalar left, SkScalar top,
245 const SkSamplingOptions& sampling, const SkPaint* paint) {
246 Iter iter(fList);
247 while (iter.next()) {
248 iter->drawImage(image, left, top, sampling, paint);
249 }
250 }
251
onDrawImageRect2(const SkImage * image,const SkRect & src,const SkRect & dst,const SkSamplingOptions & sampling,const SkPaint * paint,SrcRectConstraint constraint)252 void SkNWayCanvas::onDrawImageRect2(const SkImage* image, const SkRect& src, const SkRect& dst,
253 const SkSamplingOptions& sampling, const SkPaint* paint,
254 SrcRectConstraint constraint) {
255 Iter iter(fList);
256 while (iter.next()) {
257 iter->drawImageRect(image, src, dst, sampling, paint, constraint);
258 }
259 }
260
onDrawImageLattice2(const SkImage * image,const Lattice & lattice,const SkRect & dst,SkFilterMode filter,const SkPaint * paint)261 void SkNWayCanvas::onDrawImageLattice2(const SkImage* image, const Lattice& lattice,
262 const SkRect& dst, SkFilterMode filter,
263 const SkPaint* paint) {
264 Iter iter(fList);
265 while (iter.next()) {
266 iter->drawImageLattice(image, lattice, dst, filter, paint);
267 }
268 }
269
onDrawAtlas2(const SkImage * image,const SkRSXform xform[],const SkRect tex[],const SkColor colors[],int count,SkBlendMode bmode,const SkSamplingOptions & sampling,const SkRect * cull,const SkPaint * paint)270 void SkNWayCanvas::onDrawAtlas2(const SkImage* image, const SkRSXform xform[], const SkRect tex[],
271 const SkColor colors[], int count, SkBlendMode bmode,
272 const SkSamplingOptions& sampling, const SkRect* cull,
273 const SkPaint* paint) {
274 Iter iter(fList);
275 while (iter.next()) {
276 iter->drawAtlas(image, xform, tex, colors, count, bmode, sampling, cull, paint);
277 }
278 }
279
onDrawGlyphRunList(const SkGlyphRunList & list,const SkPaint & paint)280 void SkNWayCanvas::onDrawGlyphRunList(const SkGlyphRunList& list, const SkPaint &paint) {
281 Iter iter(fList);
282 while (iter.next()) {
283 iter->onDrawGlyphRunList(list, paint);
284 }
285 }
286
onDrawTextBlob(const SkTextBlob * blob,SkScalar x,SkScalar y,const SkPaint & paint)287 void SkNWayCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
288 const SkPaint &paint) {
289 Iter iter(fList);
290 while (iter.next()) {
291 iter->drawTextBlob(blob, x, y, paint);
292 }
293 }
294
onDrawPicture(const SkPicture * picture,const SkMatrix * matrix,const SkPaint * paint)295 void SkNWayCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix,
296 const SkPaint* paint) {
297 Iter iter(fList);
298 while (iter.next()) {
299 iter->drawPicture(picture, matrix, paint);
300 }
301 }
302
onDrawDrawable(SkDrawable * drawable,const SkMatrix * matrix)303 void SkNWayCanvas::onDrawDrawable(SkDrawable* drawable, const SkMatrix* matrix) {
304 Iter iter(fList);
305 while (iter.next()) {
306 iter->drawDrawable(drawable, matrix);
307 }
308 }
309
onDrawVerticesObject(const SkVertices * vertices,SkBlendMode bmode,const SkPaint & paint)310 void SkNWayCanvas::onDrawVerticesObject(const SkVertices* vertices,
311 SkBlendMode bmode, const SkPaint& paint) {
312 Iter iter(fList);
313 while (iter.next()) {
314 iter->drawVertices(vertices, bmode, paint);
315 }
316 }
317
onDrawPatch(const SkPoint cubics[12],const SkColor colors[4],const SkPoint texCoords[4],SkBlendMode bmode,const SkPaint & paint)318 void SkNWayCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
319 const SkPoint texCoords[4], SkBlendMode bmode,
320 const SkPaint& paint) {
321 Iter iter(fList);
322 while (iter.next()) {
323 iter->drawPatch(cubics, colors, texCoords, bmode, paint);
324 }
325 }
326
onDrawShadowRec(const SkPath & path,const SkDrawShadowRec & rec)327 void SkNWayCanvas::onDrawShadowRec(const SkPath& path, const SkDrawShadowRec& rec) {
328 Iter iter(fList);
329 while (iter.next()) {
330 iter->private_draw_shadow_rec(path, rec);
331 }
332 }
333
onDrawAnnotation(const SkRect & rect,const char key[],SkData * data)334 void SkNWayCanvas::onDrawAnnotation(const SkRect& rect, const char key[], SkData* data) {
335 Iter iter(fList);
336 while (iter.next()) {
337 iter->drawAnnotation(rect, key, data);
338 }
339 }
340
onDrawEdgeAAQuad(const SkRect & rect,const SkPoint clip[4],QuadAAFlags aa,const SkColor4f & color,SkBlendMode mode)341 void SkNWayCanvas::onDrawEdgeAAQuad(const SkRect& rect, const SkPoint clip[4],
342 QuadAAFlags aa, const SkColor4f& color, SkBlendMode mode) {
343 Iter iter(fList);
344 while (iter.next()) {
345 iter->experimental_DrawEdgeAAQuad(rect, clip, aa, color, mode);
346 }
347 }
348
onDrawEdgeAAImageSet2(const ImageSetEntry set[],int count,const SkPoint dstClips[],const SkMatrix preViewMatrices[],const SkSamplingOptions & sampling,const SkPaint * paint,SrcRectConstraint constraint)349 void SkNWayCanvas::onDrawEdgeAAImageSet2(const ImageSetEntry set[], int count,
350 const SkPoint dstClips[], const SkMatrix preViewMatrices[],
351 const SkSamplingOptions& sampling, const SkPaint* paint,
352 SrcRectConstraint constraint) {
353 Iter iter(fList);
354 while (iter.next()) {
355 iter->experimental_DrawEdgeAAImageSet(
356 set, count, dstClips, preViewMatrices, sampling, paint, constraint);
357 }
358 }
359
onFlush()360 void SkNWayCanvas::onFlush() {
361 Iter iter(fList);
362 while (iter.next()) {
363 iter->flush();
364 }
365 }
366