• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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