Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
dl_sk_canvas.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "flutter/display_list/skia/dl_sk_canvas.h"
6
7#include "flutter/display_list/skia/dl_sk_conversions.h"
8#include "flutter/display_list/skia/dl_sk_dispatcher.h"
9#include "flutter/fml/trace_event.h"
10
14
15namespace flutter {
16
18 public:
19 // SkOptionalPaint is only valid for ops that do not use the ColorSource
20 explicit SkOptionalPaint(const DlPaint* dl_paint) {
21 if (dl_paint && !dl_paint->isDefault()) {
22 sk_paint_ = ToNonShaderSk(*dl_paint);
23 ptr_ = &sk_paint_;
24 } else {
25 ptr_ = nullptr;
26 }
27 }
28
29 SkPaint* operator()() { return ptr_; }
30
31 private:
32 SkPaint sk_paint_;
33 SkPaint* ptr_;
34};
35
37 delegate_ = canvas;
38}
39
41 return delegate_->getBaseLayerSize();
42}
43
45 return delegate_->imageInfo();
46}
47
49 delegate_->save();
50}
51
53 const DlPaint* paint,
54 const DlImageFilter* backdrop) {
55 sk_sp<SkImageFilter> sk_backdrop = ToSk(backdrop);
56 SkOptionalPaint sk_paint(paint);
57 TRACE_EVENT0("flutter", "Canvas::saveLayer");
58 delegate_->saveLayer(
59 SkCanvas::SaveLayerRec{bounds, sk_paint(), sk_backdrop.get(), 0});
60}
61
63 delegate_->restore();
64}
65
67 return delegate_->getSaveCount();
68}
69
70void DlSkCanvasAdapter::RestoreToCount(int restore_count) {
71 delegate_->restoreToCount(restore_count);
72}
73
75 delegate_->translate(tx, ty);
76}
77
79 delegate_->scale(sx, sy);
80}
81
83 delegate_->rotate(degrees);
84}
85
87 delegate_->skew(sx, sy);
88}
89
90// clang-format off
91
92// 2x3 2D affine subset of a 4x4 transform in row major order
94 SkScalar mxx, SkScalar mxy, SkScalar mxt,
95 SkScalar myx, SkScalar myy, SkScalar myt) {
96 delegate_->concat(SkMatrix::MakeAll(mxx, mxy, mxt, myx, myy, myt, 0, 0, 1));
97}
98
99// full 4x4 transform in row major order
101 SkScalar mxx, SkScalar mxy, SkScalar mxz, SkScalar mxt,
102 SkScalar myx, SkScalar myy, SkScalar myz, SkScalar myt,
103 SkScalar mzx, SkScalar mzy, SkScalar mzz, SkScalar mzt,
104 SkScalar mwx, SkScalar mwy, SkScalar mwz, SkScalar mwt) {
105 delegate_->concat(SkM44(mxx, mxy, mxz, mxt,
106 myx, myy, myz, myt,
107 mzx, mzy, mzz, mzt,
108 mwx, mwy, mwz, mwt));
109}
110
111// clang-format on
112
114 delegate_->resetMatrix();
115}
116
118 delegate_->concat(*matrix);
119}
120
121void DlSkCanvasAdapter::Transform(const SkM44* matrix44) {
122 delegate_->concat(*matrix44);
123}
124
126 delegate_->setMatrix(*matrix);
127}
128
130 delegate_->setMatrix(*matrix44);
131}
132
133/// Returns the 4x4 full perspective transform representing all transform
134/// operations executed so far in this DisplayList within the enclosing
135/// save stack.
139
140/// Returns the 3x3 partial perspective transform representing all transform
141/// operations executed so far in this DisplayList within the enclosing
142/// save stack.
144 return delegate_->getTotalMatrix();
145}
146
148 ClipOp clip_op,
149 bool is_aa) {
150 delegate_->clipRect(rect, ToSk(clip_op), is_aa);
151}
152
154 ClipOp clip_op,
155 bool is_aa) {
156 delegate_->clipRRect(rrect, ToSk(clip_op), is_aa);
157}
158
160 ClipOp clip_op,
161 bool is_aa) {
162 delegate_->clipPath(path, ToSk(clip_op), is_aa);
163}
164
165/// Conservative estimate of the bounds of all outstanding clip operations
166/// measured in the coordinate space within which this DisplayList will
167/// be rendered.
171
172/// Conservative estimate of the bounds of all outstanding clip operations
173/// transformed into the local coordinate space in which currently
174/// recorded rendering operations are interpreted.
178
179/// Return true iff the supplied bounds are easily shown to be outside
180/// of the current clip bounds. This method may conservatively return
181/// false if it cannot make the determination.
182bool DlSkCanvasAdapter::QuickReject(const SkRect& bounds) const {
183 return delegate_->quickReject(bounds);
184}
185
187 delegate_->drawPaint(ToSk(paint));
188}
189
193
195 const SkPoint& p1,
196 const DlPaint& paint) {
197 delegate_->drawLine(p0, p1, ToStrokedSk(paint));
198}
199
201 delegate_->drawRect(rect, ToSk(paint));
202}
203
204void DlSkCanvasAdapter::DrawOval(const SkRect& bounds, const DlPaint& paint) {
205 delegate_->drawOval(bounds, ToSk(paint));
206}
207
209 SkScalar radius,
210 const DlPaint& paint) {
211 delegate_->drawCircle(center, radius, ToSk(paint));
212}
213
215 delegate_->drawRRect(rrect, ToSk(paint));
216}
217
219 const SkRRect& inner,
220 const DlPaint& paint) {
221 delegate_->drawDRRect(outer, inner, ToSk(paint));
222}
223
225 delegate_->drawPath(path, ToSk(paint));
226}
227
230 SkScalar sweep,
231 bool useCenter,
232 const DlPaint& paint) {
233 delegate_->drawArc(bounds, start, sweep, useCenter, ToSk(paint));
234}
235
237 uint32_t count,
238 const SkPoint pts[],
239 const DlPaint& paint) {
240 delegate_->drawPoints(ToSk(mode), count, pts, ToStrokedSk(paint));
241}
242
245 const DlPaint& paint) {
246 delegate_->drawVertices(ToSk(vertices), ToSk(mode), ToSk(paint));
247}
248
250 const SkPoint point,
251 DlImageSampling sampling,
252 const DlPaint* paint) {
253 SkOptionalPaint sk_paint(paint);
254 sk_sp<SkImage> sk_image = image->skia_image();
255 delegate_->drawImage(sk_image.get(), point.fX, point.fY, ToSk(sampling),
256 sk_paint());
257}
258
260 const SkRect& src,
261 const SkRect& dst,
262 DlImageSampling sampling,
263 const DlPaint* paint,
264 SrcRectConstraint constraint) {
265 SkOptionalPaint sk_paint(paint);
266 sk_sp<SkImage> sk_image = image->skia_image();
267 delegate_->drawImageRect(sk_image.get(), src, dst, ToSk(sampling), sk_paint(),
268 ToSk(constraint));
269}
270
272 const SkIRect& center,
273 const SkRect& dst,
274 DlFilterMode filter,
275 const DlPaint* paint) {
276 SkOptionalPaint sk_paint(paint);
277 sk_sp<SkImage> sk_image = image->skia_image();
278 delegate_->drawImageNine(sk_image.get(), center, dst, ToSk(filter),
279 sk_paint());
280}
281
283 const SkRSXform xform[],
284 const SkRect tex[],
285 const DlColor colors[],
286 int count,
288 DlImageSampling sampling,
289 const SkRect* cullRect,
290 const DlPaint* paint) {
291 SkOptionalPaint sk_paint(paint);
292 sk_sp<SkImage> sk_image = atlas->skia_image();
293 const SkColor* sk_colors = reinterpret_cast<const SkColor*>(colors);
294 delegate_->drawAtlas(sk_image.get(), xform, tex, sk_colors, count, ToSk(mode),
295 ToSk(sampling), cullRect, sk_paint());
296}
297
299 SkScalar opacity) {
300 const int restore_count = delegate_->getSaveCount();
301
302 // Figure out whether we can apply the opacity during dispatch or
303 // if we need a saveLayer.
304 if (opacity < SK_Scalar1 && !display_list->can_apply_group_opacity()) {
305 TRACE_EVENT0("flutter", "Canvas::saveLayer");
306 delegate_->saveLayerAlphaf(&display_list->bounds(), opacity);
307 opacity = SK_Scalar1;
308 } else {
309 delegate_->save();
310 }
311
312 DlSkCanvasDispatcher dispatcher(delegate_, opacity);
313 if (display_list->has_rtree()) {
314 display_list->Dispatch(dispatcher, delegate_->getLocalClipBounds());
315 } else {
316 display_list->Dispatch(dispatcher);
317 }
318
319 delegate_->restoreToCount(restore_count);
320}
321
323 SkScalar x,
324 SkScalar y,
325 const DlPaint& paint) {
326 delegate_->drawTextBlob(blob, x, y, ToSk(paint));
327}
328
330 const std::shared_ptr<impeller::TextFrame>& text_frame,
331 SkScalar x,
332 SkScalar y,
333 const DlPaint& paint) {
334 FML_CHECK(false);
335}
336
338 const DlColor color,
339 const SkScalar elevation,
340 bool transparent_occluder,
341 SkScalar dpr) {
342 DlSkCanvasDispatcher::DrawShadow(delegate_, path, color, elevation,
343 transparent_occluder, dpr);
344}
345
347 auto dContext = GrAsDirectContext(delegate_->recordingContext());
348
349 if (dContext) {
350 dContext->flushAndSubmit();
351 }
352}
353
354} // namespace flutter
int count
static GrDirectContext * GrAsDirectContext(GrContext_Base *base)
SkColor4f color
uint32_t SkColor
Definition SkColor.h:37
#define SK_Scalar1
Definition SkScalar.h:18
static SkScalar center(float pos0, float pos1)
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 restore()
Definition SkCanvas.cpp:465
void translate(SkScalar dx, SkScalar dy)
void drawImageNine(const SkImage *image, const SkIRect &center, const SkRect &dst, SkFilterMode filter, const SkPaint *paint=nullptr)
void drawColor(SkColor color, SkBlendMode mode=SkBlendMode::kSrcOver)
Definition SkCanvas.h:1182
SkRect getLocalClipBounds() const
virtual GrRecordingContext * recordingContext() const
void drawPaint(const SkPaint &paint)
void drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1, const SkPaint &paint)
virtual SkISize getBaseLayerSize() const
Definition SkCanvas.cpp:373
SkM44 getLocalToDevice() const
int getSaveCount() const
Definition SkCanvas.cpp:435
void rotate(SkScalar degrees)
void restoreToCount(int saveCount)
Definition SkCanvas.cpp:482
void drawRRect(const SkRRect &rrect, const SkPaint &paint)
SkMatrix getTotalMatrix() const
void drawArc(const SkRect &oval, SkScalar startAngle, SkScalar sweepAngle, bool useCenter, const SkPaint &paint)
void resetMatrix()
void clipPath(const SkPath &path, SkClipOp op, bool doAntiAlias)
SkIRect getDeviceClipBounds() const
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)
void drawDRRect(const SkRRect &outer, const SkRRect &inner, const SkPaint &paint)
void scale(SkScalar sx, SkScalar sy)
void concat(const SkMatrix &matrix)
void drawVertices(const SkVertices *vertices, SkBlendMode mode, const SkPaint &paint)
SkImageInfo imageInfo() const
void skew(SkScalar sx, SkScalar sy)
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
bool quickReject(const SkRect &rect) const
void clipRRect(const SkRRect &rrect, SkClipOp op, bool doAntiAlias)
int saveLayerAlphaf(const SkRect *bounds, float alpha)
void drawCircle(SkScalar cx, SkScalar cy, SkScalar radius, const SkPaint &paint)
Definition SkM44.h:150
static SkMatrix MakeAll(SkScalar scaleX, SkScalar skewX, SkScalar transX, SkScalar skewY, SkScalar scaleY, SkScalar transY, SkScalar pers0, SkScalar pers1, SkScalar pers2)
Definition SkMatrix.h:179
bool isDefault() const
Definition dl_paint.h:193
void DrawPoints(PointMode mode, uint32_t count, const SkPoint pts[], const DlPaint &paint) override
void Skew(SkScalar sx, SkScalar sy) override
SkRect GetDestinationClipBounds() const override
int GetSaveCount() const override
void TransformReset() override
void DrawArc(const SkRect &bounds, SkScalar start, SkScalar sweep, bool useCenter, const DlPaint &paint) override
SkRect GetLocalClipBounds() const override
void DrawCircle(const SkPoint &center, SkScalar radius, const DlPaint &paint) override
void DrawColor(DlColor color, DlBlendMode mode) override
void DrawTextBlob(const sk_sp< SkTextBlob > &blob, SkScalar x, SkScalar y, const DlPaint &paint) override
void SetTransform(const SkMatrix *matrix) override
void ClipPath(const SkPath &path, ClipOp clip_op, bool is_aa) override
void Transform(const SkMatrix *matrix) override
void DrawRRect(const SkRRect &rrect, const DlPaint &paint) override
void DrawAtlas(const sk_sp< DlImage > &atlas, const SkRSXform xform[], const SkRect tex[], const DlColor colors[], int count, DlBlendMode mode, DlImageSampling sampling, const SkRect *cullRect, const DlPaint *paint=nullptr) override
void ClipRect(const SkRect &rect, ClipOp clip_op, bool is_aa) override
void Translate(SkScalar tx, SkScalar ty) override
void ClipRRect(const SkRRect &rrect, ClipOp clip_op, bool is_aa) override
void DrawLine(const SkPoint &p0, const SkPoint &p1, const DlPaint &paint) override
void Rotate(SkScalar degrees) override
void TransformFullPerspective(SkScalar mxx, SkScalar mxy, SkScalar mxz, SkScalar mxt, SkScalar myx, SkScalar myy, SkScalar myz, SkScalar myt, SkScalar mzx, SkScalar mzy, SkScalar mzz, SkScalar mzt, SkScalar mwx, SkScalar mwy, SkScalar mwz, SkScalar mwt) override
void DrawVertices(const DlVertices *vertices, DlBlendMode mode, const DlPaint &paint) override
void DrawImageNine(const sk_sp< DlImage > &image, const SkIRect &center, const SkRect &dst, DlFilterMode filter, const DlPaint *paint=nullptr) override
SkMatrix GetTransform() const override
void DrawRect(const SkRect &rect, const DlPaint &paint) override
void DrawShadow(const SkPath &path, const DlColor color, const SkScalar elevation, bool transparent_occluder, SkScalar dpr) override
void Transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt, SkScalar myx, SkScalar myy, SkScalar myt) override
void DrawOval(const SkRect &bounds, const DlPaint &paint) override
void DrawImageRect(const sk_sp< DlImage > &image, const SkRect &src, const SkRect &dst, DlImageSampling sampling, const DlPaint *paint=nullptr, SrcRectConstraint constraint=SrcRectConstraint::kFast) override
SkISize GetBaseLayerSize() const override
void DrawImage(const sk_sp< DlImage > &image, const SkPoint point, DlImageSampling sampling, const DlPaint *paint=nullptr) override
void DrawTextFrame(const std::shared_ptr< impeller::TextFrame > &text_frame, SkScalar x, SkScalar y, const DlPaint &paint) override
void Scale(SkScalar sx, SkScalar sy) override
SkM44 GetTransformFullPerspective() const override
void set_canvas(SkCanvas *canvas)
void DrawDisplayList(const sk_sp< DisplayList > display_list, SkScalar opacity=SK_Scalar1) override
void DrawDRRect(const SkRRect &outer, const SkRRect &inner, const DlPaint &paint) override
void SaveLayer(const SkRect *bounds, const DlPaint *paint=nullptr, const DlImageFilter *backdrop=nullptr) override
void RestoreToCount(int restore_count) override
SkImageInfo GetImageInfo() const override
bool QuickReject(const SkRect &bounds) const override
void DrawPaint(const DlPaint &paint) override
void DrawPath(const SkPath &path, const DlPaint &paint) override
Backend implementation of |DlOpReceiver| for |SkCanvas|.
static void DrawShadow(SkCanvas *canvas, const SkPath &path, DlColor color, float elevation, bool transparentOccluder, SkScalar dpr)
Holds all of the data (both required and optional) for a DisplayList drawVertices call.
Definition dl_vertices.h:71
SkOptionalPaint(const DlPaint *dl_paint)
T * get() const
Definition SkRefCnt.h:303
const Paint & paint
sk_sp< SkImage > image
Definition examples.cpp:29
float SkScalar
Definition extension.cpp:12
#define FML_CHECK(condition)
Definition logging.h:85
double y
double x
SkPaint ToSk(const DlPaint &paint)
SkPaint ToStrokedSk(const DlPaint &paint)
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
Definition switches.h:57
SkPaint ToNonShaderSk(const DlPaint &paint)
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive mode
Definition switches.h:228
float fX
x-axis value
float fY
y-axis value
static SkRect Make(const SkISize &size)
Definition SkRect.h:669
#define TRACE_EVENT0(category_group, name)