Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
SkNWayCanvas.cpp
Go to the documentation of this file.
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
9
14#include "include/core/SkRect.h"
22
23#include <algorithm>
24#include <iterator>
25#include <utility>
26
27namespace sktext {
28class GlyphRunList;
29}
30
31class SkData;
32class SkDrawable;
33class SkImage;
34class SkPaint;
35class SkPath;
36class SkPicture;
37class SkRRect;
38class SkRegion;
39class SkTextBlob;
40class SkVertices;
41enum class SkBlendMode;
42enum class SkClipOp;
43struct SkDrawShadowRec;
44
46
50
52 if (!fList.empty()) {
53 // We are using the nway canvas as a wrapper for the originally added canvas, and the device
54 // on the nway may contradict calls for the device on this canvas. So, to add a second
55 // canvas, the devices on the first canvas, and the nway base device must be different.
56 SkASSERT(fList[0]->rootDevice() != this->rootDevice());
57 }
58 if (canvas) {
59 *fList.append() = canvas;
60 }
61}
62
64 auto found = std::find(fList.begin(), fList.end(), canvas);
65 if (found != fList.end()) {
66 fList.removeShuffle(std::distance(fList.begin(), found));
67 }
68}
69
73
74///////////////////////////////////////////////////////////////////////////
75// These are forwarded to the N canvases we're referencing
76
78public:
79 Iter(const SkTDArray<SkCanvas*>& list) : fList(list) {
80 fIndex = 0;
81 }
82 bool next() {
83 if (fIndex < fList.size()) {
84 fCanvas = fList[fIndex++];
85 return true;
86 }
87 return false;
88 }
89 SkCanvas* operator->() { return fCanvas; }
90 SkCanvas* get() const { return fCanvas; }
91
92private:
93 const SkTDArray<SkCanvas*>& fList;
94 int fIndex;
95 SkCanvas* fCanvas;
96};
97
99 Iter iter(fList);
100 while (iter.next()) {
101 iter->save();
102 }
103
104 this->INHERITED::willSave();
105}
106
108 Iter iter(fList);
109 while (iter.next()) {
110 iter->saveLayer(rec);
111 }
112
114 // No need for a layer.
116}
117
119 Iter iter(fList);
120 while (iter.next()) {
121 SkCanvasPriv::SaveBehind(iter.get(), bounds);
122 }
123 this->INHERITED::onDoSaveBehind(bounds);
124 return false;
125}
126
128 Iter iter(fList);
129 while (iter.next()) {
130 iter->restore();
131 }
133}
134
136 Iter iter(fList);
137 while (iter.next()) {
138 iter->concat(m);
139 }
140}
141
142void SkNWayCanvas::didSetM44(const SkM44& matrix) {
143 Iter iter(fList);
144 while (iter.next()) {
145 iter->setMatrix(matrix);
146 }
147}
148
150 Iter iter(fList);
151 while (iter.next()) {
152 iter->translate(x, y);
153 }
154}
155
157 Iter iter(fList);
158 while (iter.next()) {
159 iter->scale(x, y);
160 }
161}
162
163void SkNWayCanvas::onClipRect(const SkRect& rect, SkClipOp op, ClipEdgeStyle edgeStyle) {
164 Iter iter(fList);
165 while (iter.next()) {
166 iter->clipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle);
167 }
168 this->INHERITED::onClipRect(rect, op, edgeStyle);
169}
170
171void SkNWayCanvas::onClipRRect(const SkRRect& rrect, SkClipOp op, ClipEdgeStyle edgeStyle) {
172 Iter iter(fList);
173 while (iter.next()) {
174 iter->clipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle);
175 }
176 this->INHERITED::onClipRRect(rrect, op, edgeStyle);
177}
178
179void SkNWayCanvas::onClipPath(const SkPath& path, SkClipOp op, ClipEdgeStyle edgeStyle) {
180 Iter iter(fList);
181 while (iter.next()) {
182 iter->clipPath(path, op, kSoft_ClipEdgeStyle == edgeStyle);
183 }
184 this->INHERITED::onClipPath(path, op, edgeStyle);
185}
186
188 Iter iter(fList);
189 while (iter.next()) {
190 iter->clipShader(sh, op);
191 }
192 this->INHERITED::onClipShader(std::move(sh), op);
193}
194
195void SkNWayCanvas::onClipRegion(const SkRegion& deviceRgn, SkClipOp op) {
196 Iter iter(fList);
197 while (iter.next()) {
198 iter->clipRegion(deviceRgn, op);
199 }
200 this->INHERITED::onClipRegion(deviceRgn, op);
201}
202
204 Iter iter(fList);
205 while (iter.next()) {
207 }
209}
210
212 Iter iter(fList);
213 while (iter.next()) {
214 iter->drawPaint(paint);
215 }
216}
217
219 Iter iter(fList);
220 while (iter.next()) {
222 }
223}
224
225void SkNWayCanvas::onDrawPoints(PointMode mode, size_t count, const SkPoint pts[],
226 const SkPaint& paint) {
227 Iter iter(fList);
228 while (iter.next()) {
229 iter->drawPoints(mode, count, pts, paint);
230 }
231}
232
233void SkNWayCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
234 Iter iter(fList);
235 while (iter.next()) {
236 iter->drawRect(rect, paint);
237 }
238}
239
241 Iter iter(fList);
242 while (iter.next()) {
243 iter->drawRegion(region, paint);
244 }
245}
246
247void SkNWayCanvas::onDrawOval(const SkRect& rect, const SkPaint& paint) {
248 Iter iter(fList);
249 while (iter.next()) {
250 iter->drawOval(rect, paint);
251 }
252}
253
254void SkNWayCanvas::onDrawArc(const SkRect& rect, SkScalar startAngle, SkScalar sweepAngle,
255 bool useCenter, const SkPaint& paint) {
256 Iter iter(fList);
257 while (iter.next()) {
258 iter->drawArc(rect, startAngle, sweepAngle, useCenter, paint);
259 }
260}
261
262void SkNWayCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) {
263 Iter iter(fList);
264 while (iter.next()) {
265 iter->drawRRect(rrect, paint);
266 }
267}
268
269void SkNWayCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) {
270 Iter iter(fList);
271 while (iter.next()) {
272 iter->drawDRRect(outer, inner, paint);
273 }
274}
275
276void SkNWayCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
277 Iter iter(fList);
278 while (iter.next()) {
279 iter->drawPath(path, paint);
280 }
281}
282
284 const SkSamplingOptions& sampling, const SkPaint* paint) {
285 Iter iter(fList);
286 while (iter.next()) {
287 iter->drawImage(image, left, top, sampling, paint);
288 }
289}
290
291void SkNWayCanvas::onDrawImageRect2(const SkImage* image, const SkRect& src, const SkRect& dst,
292 const SkSamplingOptions& sampling, const SkPaint* paint,
293 SrcRectConstraint constraint) {
294 Iter iter(fList);
295 while (iter.next()) {
296 iter->drawImageRect(image, src, dst, sampling, paint, constraint);
297 }
298}
299
301 const SkRect& dst, SkFilterMode filter,
302 const SkPaint* paint) {
303 Iter iter(fList);
304 while (iter.next()) {
305 iter->drawImageLattice(image, lattice, dst, filter, paint);
306 }
307}
308
309void SkNWayCanvas::onDrawAtlas2(const SkImage* image, const SkRSXform xform[], const SkRect tex[],
310 const SkColor colors[], int count, SkBlendMode bmode,
311 const SkSamplingOptions& sampling, const SkRect* cull,
312 const SkPaint* paint) {
313 Iter iter(fList);
314 while (iter.next()) {
315 iter->drawAtlas(image, xform, tex, colors, count, bmode, sampling, cull, paint);
316 }
317}
318
320 const SkPaint &paint) {
321 Iter iter(fList);
322 while (iter.next()) {
323 iter->onDrawGlyphRunList(list, paint);
324 }
325}
326
328 const SkPaint &paint) {
329 Iter iter(fList);
330 while (iter.next()) {
331 iter->drawTextBlob(blob, x, y, paint);
332 }
333}
334
336 Iter iter(fList);
337 while (iter.next()) {
338 iter->drawSlug(slug, paint);
339 }
340}
341
342void SkNWayCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix,
343 const SkPaint* paint) {
344 Iter iter(fList);
345 while (iter.next()) {
346 iter->drawPicture(picture, matrix, paint);
347 }
348}
349
350void SkNWayCanvas::onDrawDrawable(SkDrawable* drawable, const SkMatrix* matrix) {
351 Iter iter(fList);
352 while (iter.next()) {
353 iter->drawDrawable(drawable, matrix);
354 }
355}
356
358 SkBlendMode bmode, const SkPaint& paint) {
359 Iter iter(fList);
360 while (iter.next()) {
361 iter->drawVertices(vertices, bmode, paint);
362 }
363}
364
365void SkNWayCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
366 const SkPoint texCoords[4], SkBlendMode bmode,
367 const SkPaint& paint) {
368 Iter iter(fList);
369 while (iter.next()) {
370 iter->drawPatch(cubics, colors, texCoords, bmode, paint);
371 }
372}
373
375 Iter iter(fList);
376 while (iter.next()) {
377 iter->private_draw_shadow_rec(path, rec);
378 }
379}
380
381void SkNWayCanvas::onDrawAnnotation(const SkRect& rect, const char key[], SkData* data) {
382 Iter iter(fList);
383 while (iter.next()) {
384 iter->drawAnnotation(rect, key, data);
385 }
386}
387
389 QuadAAFlags aa, const SkColor4f& color, SkBlendMode mode) {
390 Iter iter(fList);
391 while (iter.next()) {
392 iter->experimental_DrawEdgeAAQuad(rect, clip, aa, color, mode);
393 }
394}
395
397 const SkPoint dstClips[], const SkMatrix preViewMatrices[],
398 const SkSamplingOptions& sampling, const SkPaint* paint,
399 SrcRectConstraint constraint) {
400 Iter iter(fList);
401 while (iter.next()) {
403 set, count, dstClips, preViewMatrices, sampling, paint, constraint);
404 }
405}
int count
SkColor4f color
#define SkASSERT(cond)
Definition SkAssert.h:116
SkBlendMode
Definition SkBlendMode.h:38
SkClipOp
Definition SkClipOp.h:13
uint32_t SkColor
Definition SkColor.h:37
static SkPath clip(const SkPath &path, const SkHalfPlane &plane)
Definition SkPath.cpp:3824
static bool left(const SkPoint &p0, const SkPoint &p1)
SkFilterMode
static void ResetClip(SkCanvas *canvas)
static void DrawBehind(SkCanvas *canvas, const SkPaint &paint)
static int SaveBehind(SkCanvas *canvas, const SkRect *subset)
int saveLayer(const SkRect *bounds, const SkPaint *paint)
Definition SkCanvas.cpp:500
void drawRect(const SkRect &rect, const SkPaint &paint)
void drawOval(const SkRect &oval, const SkPaint &paint)
void clipRect(const SkRect &rect, SkClipOp op, bool doAntiAlias)
void drawPoints(PointMode mode, size_t count, const SkPoint pts[], const SkPaint &paint)
void drawPatch(const SkPoint cubics[12], const SkColor colors[4], const SkPoint texCoords[4], SkBlendMode mode, const SkPaint &paint)
void restore()
Definition SkCanvas.cpp:465
void translate(SkScalar dx, SkScalar dy)
virtual void onClipShader(sk_sp< SkShader >, SkClipOp)
void drawPaint(const SkPaint &paint)
void private_draw_shadow_rec(const SkPath &, const SkDrawShadowRec &)
void drawDrawable(SkDrawable *drawable, const SkMatrix *matrix=nullptr)
void drawAnnotation(const SkRect &rect, const char key[], SkData *value)
friend class SkNWayCanvas
Definition SkCanvas.h:2492
virtual SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec &)
Definition SkCanvas.h:2270
virtual void onClipRect(const SkRect &rect, SkClipOp op, ClipEdgeStyle edgeStyle)
virtual void onResetClip()
SrcRectConstraint
Definition SkCanvas.h:1541
void clipRegion(const SkRegion &deviceRgn, SkClipOp op=SkClipOp::kIntersect)
void experimental_DrawEdgeAAQuad(const SkRect &rect, const SkPoint clip[4], QuadAAFlags aaFlags, const SkColor4f &color, SkBlendMode mode)
SaveLayerStrategy
Definition SkCanvas.h:2263
@ kNoLayer_SaveLayerStrategy
Definition SkCanvas.h:2265
virtual void willRestore()
Definition SkCanvas.h:2276
void experimental_DrawEdgeAAImageSet(const ImageSetEntry imageSet[], int cnt, const SkPoint dstClips[], const SkMatrix preViewMatrices[], const SkSamplingOptions &, const SkPaint *paint=nullptr, SrcRectConstraint constraint=kStrict_SrcRectConstraint)
void drawRRect(const SkRRect &rrect, const SkPaint &paint)
void drawArc(const SkRect &oval, SkScalar startAngle, SkScalar sweepAngle, bool useCenter, const SkPaint &paint)
void drawImageLattice(const SkImage *image, const Lattice &lattice, const SkRect &dst, SkFilterMode filter, const SkPaint *paint=nullptr)
void clipPath(const SkPath &path, SkClipOp op, bool doAntiAlias)
void drawRegion(const SkRegion &region, const SkPaint &paint)
void drawImageRect(const SkImage *, const SkRect &src, const SkRect &dst, const SkSamplingOptions &, const SkPaint *, SrcRectConstraint)
int save()
Definition SkCanvas.cpp:451
void drawPath(const SkPath &path, const SkPaint &paint)
void drawAtlas(const SkImage *atlas, const SkRSXform xform[], const SkRect tex[], const SkColor colors[], int count, SkBlendMode mode, const SkSamplingOptions &sampling, const SkRect *cullRect, const SkPaint *paint)
void setMatrix(const SkM44 &matrix)
virtual void onClipRRect(const SkRRect &rrect, SkClipOp op, ClipEdgeStyle edgeStyle)
virtual void onClipPath(const SkPath &path, SkClipOp op, ClipEdgeStyle edgeStyle)
void drawDRRect(const SkRRect &outer, const SkRRect &inner, const SkPaint &paint)
void scale(SkScalar sx, SkScalar sy)
void concat(const SkMatrix &matrix)
@ kSoft_ClipEdgeStyle
Definition SkCanvas.h:2337
virtual bool onDoSaveBehind(const SkRect *)
Definition SkCanvas.h:2275
virtual void onDrawGlyphRunList(const sktext::GlyphRunList &glyphRunList, const SkPaint &paint)
void drawPicture(const SkPicture *picture)
Definition SkCanvas.h:1961
void clipShader(sk_sp< SkShader >, SkClipOp=SkClipOp::kIntersect)
virtual void willSave()
Definition SkCanvas.h:2268
void drawVertices(const SkVertices *vertices, SkBlendMode mode, const SkPaint &paint)
void drawTextBlob(const SkTextBlob *blob, SkScalar x, SkScalar y, const SkPaint &paint)
void drawImage(const SkImage *image, SkScalar left, SkScalar top)
Definition SkCanvas.h:1528
virtual void onClipRegion(const SkRegion &deviceRgn, SkClipOp op)
void clipRRect(const SkRRect &rrect, SkClipOp op, bool doAntiAlias)
Definition SkM44.h:150
Iter(const SkTDArray< SkCanvas * > &list)
SkCanvas * operator->()
SkCanvas * get() const
void onDrawDRRect(const SkRRect &, const SkRRect &, const SkPaint &) override
void onDrawRRect(const SkRRect &, const SkPaint &) override
void onResetClip() override
virtual void addCanvas(SkCanvas *)
void onDrawRect(const SkRect &, const SkPaint &) override
void onDrawVerticesObject(const SkVertices *, SkBlendMode, const SkPaint &) override
void onDrawArc(const SkRect &, SkScalar, SkScalar, bool, const SkPaint &) override
void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], const SkPoint texCoords[4], SkBlendMode, const SkPaint &paint) override
void onDrawPath(const SkPath &, const SkPaint &) override
void onDrawPicture(const SkPicture *, const SkMatrix *, const SkPaint *) override
void didScale(SkScalar, SkScalar) override
void onDrawImageLattice2(const SkImage *, const Lattice &, const SkRect &, SkFilterMode, const SkPaint *) override
void onDrawRegion(const SkRegion &, const SkPaint &) override
void onDrawAnnotation(const SkRect &, const char[], SkData *) override
void onDrawDrawable(SkDrawable *, const SkMatrix *) override
void onDrawBehind(const SkPaint &) override
virtual void removeCanvas(SkCanvas *)
~SkNWayCanvas() override
void onDrawImage2(const SkImage *, SkScalar, SkScalar, const SkSamplingOptions &, const SkPaint *) override
void onClipRect(const SkRect &, SkClipOp, ClipEdgeStyle) override
void onDrawAtlas2(const SkImage *, const SkRSXform[], const SkRect[], const SkColor[], int, SkBlendMode, const SkSamplingOptions &, const SkRect *, const SkPaint *) override
void onClipRegion(const SkRegion &, SkClipOp) override
virtual void removeAll()
void onClipRRect(const SkRRect &, SkClipOp, ClipEdgeStyle) override
SkTDArray< SkCanvas * > fList
void onDrawPaint(const SkPaint &) override
SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec &) override
void willRestore() override
void didTranslate(SkScalar, SkScalar) override
void onDrawShadowRec(const SkPath &, const SkDrawShadowRec &) override
void willSave() override
void onDrawEdgeAAImageSet2(const ImageSetEntry[], int count, const SkPoint[], const SkMatrix[], const SkSamplingOptions &, const SkPaint *, SrcRectConstraint) override
void onDrawImageRect2(const SkImage *, const SkRect &, const SkRect &, const SkSamplingOptions &, const SkPaint *, SrcRectConstraint) override
void onDrawEdgeAAQuad(const SkRect &, const SkPoint[4], QuadAAFlags, const SkColor4f &, SkBlendMode) override
void onDrawTextBlob(const SkTextBlob *blob, SkScalar x, SkScalar y, const SkPaint &paint) override
void onClipPath(const SkPath &, SkClipOp, ClipEdgeStyle) override
void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint &) override
void onDrawGlyphRunList(const sktext::GlyphRunList &, const SkPaint &) override
void didSetM44(const SkM44 &) override
void onDrawOval(const SkRect &, const SkPaint &) override
void onDrawSlug(const sktext::gpu::Slug *slug, const SkPaint &paint) override
void onClipShader(sk_sp< SkShader >, SkClipOp) override
void didConcat44(const SkM44 &) override
bool onDoSaveBehind(const SkRect *) override
T * end()
Definition SkTDArray.h:152
int size() const
Definition SkTDArray.h:138
bool empty() const
Definition SkTDArray.h:135
void reset()
Definition SkTDArray.h:171
T * begin()
Definition SkTDArray.h:150
T * append()
Definition SkTDArray.h:191
void removeShuffle(int index)
Definition SkTDArray.h:214
const Paint & paint
sk_sp< SkImage > image
Definition examples.cpp:29
float SkScalar
Definition extension.cpp:12
double y
double x
int32_t height
int32_t width