Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
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 <vector>
6
15#include "third_party/skia/include/core/SkPath.h"
16#include "third_party/skia/include/core/SkPathBuilder.h"
17#include "third_party/skia/modules/skparagraph/include/Paragraph.h"
18
19namespace {
20class SkwasmParagraphPainter : public skia::textlayout::ParagraphPainter {
21 public:
22 SkwasmParagraphPainter(flutter::DisplayListBuilder& builder,
23 const std::vector<flutter::DlPaint>& paints)
24 : builder_(builder), paints_(paints) {}
25
26 virtual void drawTextBlob(const sk_sp<SkTextBlob>& blob,
27 SkScalar x,
28 SkScalar y,
29 const SkPaintOrID& paint) override {
30 if (!blob) {
31 return;
32 }
33
34 const int* paint_id = std::get_if<PaintID>(&paint);
35 auto dl_paint = paint_id ? paints_[*paint_id] : flutter::DlPaint();
36 builder_.DrawText(flutter::TextFromBlob(blob), x, y, dl_paint);
37 }
38
39 virtual void drawTextShadow(const sk_sp<SkTextBlob>& blob,
40 SkScalar x,
41 SkScalar y,
42 SkColor color,
43 SkScalar blur_sigma) override {
44 if (!blob) {
45 return;
46 }
47
48 flutter::DlPaint paint;
49 paint.setColor(flutter::DlColor(color));
50 if (blur_sigma > 0.0) {
52 blur_sigma, false);
53 paint.setMaskFilter(&filter);
54 }
55 builder_.DrawText(flutter::TextFromBlob(blob), x, y, paint);
56 }
57
58 virtual void drawRect(const SkRect& rect, const SkPaintOrID& paint) override {
59 const int* paint_id = std::get_if<PaintID>(&paint);
60 auto dl_paint = paint_id ? paints_[*paint_id] : flutter::DlPaint();
61 builder_.DrawRect(flutter::ToDlRect(rect), dl_paint);
62 }
63
64 virtual void drawFilledRect(const SkRect& rect,
65 const DecorationStyle& decor_style) override {
66 flutter::DlPaint paint =
67 ToDlPaint(decor_style, flutter::DlDrawStyle::kFill);
68 builder_.DrawRect(flutter::ToDlRect(rect), paint);
69 }
70
71 virtual void drawPath(const SkPath& path,
72 const DecorationStyle& decor_style) override {
73 builder_.DrawPath(flutter::DlPath(path), this->ToDlPaint(decor_style));
74 }
75
76 virtual void drawLine(SkScalar x0,
77 SkScalar y0,
78 SkScalar x1,
79 SkScalar y1,
80 const DecorationStyle& decor_style) override {
81 auto paint = this->ToDlPaint(decor_style);
82 auto dash_path_effect = decor_style.getDashPathEffect();
83
84 if (dash_path_effect) {
85 builder_.DrawDashedLine(
86 flutter::DlPoint(x0, y0), flutter::DlPoint(x1, y1),
87 dash_path_effect->fOnLength, dash_path_effect->fOffLength, paint);
88 } else {
89 builder_.DrawLine(flutter::DlPoint(x0, y0), flutter::DlPoint(x1, y1),
90 paint);
91 }
92 }
93
94 virtual void clipRect(const SkRect& rect) override {
95 builder_.ClipRect(flutter::ToDlRect(rect));
96 }
97
98 virtual void translate(SkScalar dx, SkScalar dy) override {
99 builder_.Translate(dx, dy);
100 }
101
102 virtual void save() override { builder_.Save(); }
103
104 virtual void restore() override { builder_.Restore(); }
105
106 private:
107 const std::vector<flutter::DlPaint>& paints_;
109
110 flutter::DlPaint ToDlPaint(
111 const DecorationStyle& decor_style,
113 flutter::DlPaint paint;
114 paint.setDrawStyle(draw_style);
115 paint.setAntiAlias(true);
116 paint.setColor(flutter::DlColor(decor_style.getColor()));
117 paint.setStrokeWidth(decor_style.getStrokeWidth());
118 return paint;
119 }
120};
121} // namespace
122
125 flutter::DlRect* rect,
126 flutter::DlPaint* paint,
128 canvas->SaveLayer(rect ? std::optional(*rect) : std::nullopt, paint,
129 backdrop ? backdrop->Raw() : nullptr);
130}
131
133 canvas->Save();
134}
135
139
141 int count) {
142 if (count > canvas->GetSaveCount()) {
143 // According to the docs:
144 // "If count is greater than the current getSaveCount then nothing happens."
145 return;
146 }
147 canvas->RestoreToCount(count);
148}
149
153
155 float dx,
156 float dy) {
157 canvas->Translate(dx, dy);
158}
159
161 float sx,
162 float sy) {
163 canvas->Scale(sx, sy);
164}
165
167 flutter::DlScalar degrees) {
168 canvas->Rotate(degrees);
169}
170
174 canvas->Skew(sx, sy);
175}
176
178 const flutter::DlMatrix* matrix_44) {
179 canvas->Transform(*matrix_44);
180}
181
183 uint32_t color) {
184 canvas->DrawColor(flutter::DlColor(color), flutter::DlBlendMode::kSrc);
185}
186
188 const flutter::DlRect* rect,
190 bool antialias) {
191 canvas->ClipRect(*rect, op);
192}
193
195 const SkScalar* rrect_values,
196 bool antialias) {
197 canvas->ClipRoundRect(Skwasm::CreateDlRRect(rrect_values),
199}
200
202 SkPathBuilder* path,
203 bool antialias) {
204 canvas->ClipPath(flutter::DlPath(path->snapshot()),
206}
207
209 uint32_t color,
210 flutter::DlBlendMode blend_mode) {
211 canvas->DrawColor(flutter::DlColor(color), blend_mode);
212}
213
223
225 flutter::DlPaint* paint) {
226 canvas->DrawPaint(paint ? *paint : flutter::DlPaint());
227}
228
230 flutter::DlRect* rect,
231 flutter::DlPaint* paint) {
232 canvas->DrawRect(*rect, paint ? *paint : flutter::DlPaint());
233}
234
236 const SkScalar* rrect_values,
237 flutter::DlPaint* paint) {
238 canvas->DrawRoundRect(Skwasm::CreateDlRRect(rrect_values),
239 paint ? *paint : flutter::DlPaint());
240}
241
243 const SkScalar* outer_rrect_values,
244 const SkScalar* inner_rrect_values,
245 flutter::DlPaint* paint) {
246 canvas->DrawDiffRoundRect(Skwasm::CreateDlRRect(outer_rrect_values),
247 Skwasm::CreateDlRRect(inner_rrect_values),
248 paint ? *paint : flutter::DlPaint());
249}
250
252 const flutter::DlRect* rect,
253 flutter::DlPaint* paint) {
254 canvas->DrawOval(*rect, paint ? *paint : flutter::DlPaint());
255}
256
260 flutter::DlScalar radius,
261 flutter::DlPaint* paint) {
262 canvas->DrawCircle(flutter::DlPoint{x, y}, radius,
263 paint ? *paint : flutter::DlPaint());
264}
265
267 const flutter::DlRect* rect,
268 flutter::DlScalar start_angle_degrees,
269 flutter::DlScalar sweep_angle_degrees,
270 bool use_center,
271 flutter::DlPaint* paint) {
272 canvas->DrawArc(*rect, start_angle_degrees, sweep_angle_degrees, use_center,
273 paint ? *paint : flutter::DlPaint());
274}
275
277 SkPathBuilder* path,
278 flutter::DlPaint* paint) {
279 canvas->DrawPath(flutter::DlPath(path->snapshot()),
280 paint ? *paint : flutter::DlPaint());
281}
282
284 SkPathBuilder* path,
285 flutter::DlScalar elevation,
286 flutter::DlScalar device_pixel_ratio,
287 uint32_t color,
288 bool transparent_occluder) {
289 canvas->DrawShadow(flutter::DlPath(path->snapshot()), flutter::DlColor(color),
290 elevation, transparent_occluder, device_pixel_ratio);
291}
292
294 Skwasm::Paragraph* paragraph,
297 auto painter = SkwasmParagraphPainter(*canvas, paragraph->paints);
298 paragraph->skia_paragraph->paint(&painter, x, y);
299}
300
302 flutter::DisplayList* picture) {
303 canvas->DrawDisplayList(sk_ref_sp(picture));
304}
305
308 flutter::DlScalar offset_x,
309 flutter::DlScalar offset_y,
310 flutter::DlPaint* paint,
311 Skwasm::FilterQuality quality) {
312 canvas->DrawImage(sk_ref_sp(image), flutter::DlPoint{offset_x, offset_y},
313 Skwasm::SamplingOptionsForQuality(quality), paint);
314}
315
318 flutter::DlRect* source_rect,
319 flutter::DlRect* dest_rect,
320 flutter::DlPaint* paint,
321 Skwasm::FilterQuality quality) {
322 canvas->DrawImageRect(sk_ref_sp(image), *source_rect, *dest_rect,
323 Skwasm::SamplingOptionsForQuality(quality), paint,
325}
326
329 flutter::DlIRect* center_rect,
330 flutter::DlRect* destination_rect,
331 flutter::DlPaint* paint,
332 Skwasm::FilterQuality quality) {
333 canvas->DrawImageNine(sk_ref_sp(image), *center_rect, *destination_rect,
334 FilterModeForQuality(quality), paint);
335}
336
341 flutter::DlPaint* paint) {
342 canvas->DrawVertices(vertices->Shared(), mode,
343 paint ? *paint : flutter::DlPaint());
344}
345
349 int point_count,
350 flutter::DlPaint* paint) {
351 canvas->DrawPoints(mode, point_count, points,
352 paint ? *paint : flutter::DlPaint());
353}
354
356 flutter::DlImage* atlas,
357 flutter::DlRSTransform* transforms,
358 flutter::DlRect* rects,
359 uint32_t* colors,
360 int sprite_count,
362 flutter::DlRect* cull_rect,
363 flutter::DlPaint* paint) {
364 std::vector<flutter::DlColor> dl_colors(sprite_count);
365 for (int i = 0; i < sprite_count; i++) {
366 dl_colors[i] = flutter::DlColor(colors[i]);
367 }
368 canvas->DrawAtlas(
369 sk_ref_sp(atlas), transforms, rects, dl_colors.data(), sprite_count, mode,
371 cull_rect, paint);
372}
373
375 flutter::DlMatrix* out_transform) {
376 *out_transform = canvas->GetMatrix();
377}
378
381 flutter::DlRect* out_rect) {
382 *out_rect = canvas->GetLocalClipCoverage();
383}
384
390
392 flutter::DlRect* rect) {
393 return canvas->QuickReject(*rect);
394}
const std::shared_ptr< T > & Shared()
Definition helpers.h:21
void DrawOval(const DlRect &bounds, const DlPaint &paint) override
void ClipRect(const DlRect &rect, DlClipOp clip_op=DlClipOp::kIntersect, bool is_aa=false) override
void DrawImageRect(const sk_sp< DlImage > &image, const DlRect &src, const DlRect &dst, DlImageSampling sampling, const DlPaint *paint=nullptr, DlSrcRectConstraint constraint=DlSrcRectConstraint::kFast) override
void DrawVertices(const std::shared_ptr< DlVertices > &vertices, DlBlendMode mode, const DlPaint &paint) override
void DrawImageNine(const sk_sp< DlImage > &image, const DlIRect &center, const DlRect &dst, DlFilterMode filter, const DlPaint *paint=nullptr) override
void DrawAtlas(const sk_sp< DlImage > &atlas, const DlRSTransform xform[], const DlRect tex[], const DlColor colors[], int count, DlBlendMode mode, DlImageSampling sampling, const DlRect *cullRect, const DlPaint *paint=nullptr) override
void DrawRoundRect(const DlRoundRect &rrect, const DlPaint &paint) override
void RestoreToCount(int restore_count) override
void DrawArc(const DlRect &bounds, DlScalar start, DlScalar sweep, bool useCenter, const DlPaint &paint) override
void DrawShadow(const DlPath &path, const DlColor color, const DlScalar elevation, bool transparent_occluder, DlScalar dpr) override
Draws the shadow of the given |path| rendered in the provided |color| (which is only consulted for it...
void DrawImage(const sk_sp< DlImage > &image, const DlPoint &point, DlImageSampling sampling, const DlPaint *paint=nullptr) override
void DrawColor(DlColor color, DlBlendMode mode) override
DlMatrix GetMatrix() const override
Definition dl_builder.h:102
void DrawCircle(const DlPoint &center, DlScalar radius, const DlPaint &paint) override
void SaveLayer(const std::optional< DlRect > &bounds, const DlPaint *paint=nullptr, const DlImageFilter *backdrop=nullptr, std::optional< int64_t > backdrop_id=std::nullopt) override
void DrawLine(const DlPoint &p0, const DlPoint &p1, const DlPaint &paint) override
void ClipRoundRect(const DlRoundRect &rrect, DlClipOp clip_op=DlClipOp::kIntersect, bool is_aa=false) override
void Rotate(DlScalar degrees) override
void Scale(DlScalar sx, DlScalar sy) override
void DrawDisplayList(const sk_sp< DisplayList > display_list, DlScalar opacity=SK_Scalar1) override
void Skew(DlScalar sx, DlScalar sy) override
void Translate(DlScalar tx, DlScalar ty) override
void DrawPaint(const DlPaint &paint) override
void DrawPath(const DlPath &path, const DlPaint &paint) override
bool QuickReject(const DlRect &bounds) const override
DlRect GetDestinationClipCoverage() const override
Definition dl_builder.h:129
void ClipPath(const DlPath &path, DlClipOp clip_op=DlClipOp::kIntersect, bool is_aa=false) override
void DrawPoints(DlPointMode mode, uint32_t count, const DlPoint pts[], const DlPaint &paint) override
DlRect GetLocalClipCoverage() const override
Definition dl_builder.h:136
int GetSaveCount() const override
Definition dl_builder.h:62
void DrawDiffRoundRect(const DlRoundRect &outer, const DlRoundRect &inner, const DlPaint &paint) override
void Transform(const DlMatrix &matrix) override
void DrawRect(const DlRect &rect, const DlPaint &paint) override
Represents an image whose allocation is (usually) resident on device memory.
Definition dl_image.h:32
DlPaint & setColor(DlColor color)
Definition dl_paint.h:70
DlPaint & setAntiAlias(bool isAntiAlias)
Definition dl_paint.h:58
DlPaint & setStrokeWidth(float width)
Definition dl_paint.h:115
DlPaint & setMaskFilter(std::nullptr_t filter)
Definition dl_paint.h:185
DlPaint & setDrawStyle(DlDrawStyle style)
Definition dl_paint.h:93
int32_t x
FlutterVulkanImage * image
double y
flutter::DlRoundRect CreateDlRRect(const float *f)
Definition helpers.h:61
flutter::DlImageSampling SamplingOptionsForQuality(FilterQuality quality)
Definition helpers.h:101
FilterQuality
Definition helpers.h:83
impeller::Scalar DlScalar
DlPointMode
Definition dl_types.h:15
DlDrawStyle
Definition dl_paint.h:19
@ kStroke
strokes boundary of shapes
@ kFill
fills interior of shapes
std::shared_ptr< DlText > TextFromBlob(const sk_sp< SkTextBlob > &blob)
@ kNormal
fuzzy inside and outside
const DlRect & ToDlRect(const SkRect &rect)
BlendMode
Definition color.h:58
SKWASM_EXPORT void canvas_drawPicture(flutter::DisplayListBuilder *canvas, flutter::DisplayList *picture)
Definition canvas.cc:301
SKWASM_EXPORT int canvas_getSaveCount(flutter::DisplayListBuilder *canvas)
Definition canvas.cc:150
SKWASM_EXPORT void canvas_drawPaint(flutter::DisplayListBuilder *canvas, flutter::DlPaint *paint)
Definition canvas.cc:224
SKWASM_EXPORT void canvas_save(flutter::DisplayListBuilder *canvas)
Definition canvas.cc:132
SKWASM_EXPORT void canvas_clear(flutter::DisplayListBuilder *canvas, uint32_t color)
Definition canvas.cc:182
SKWASM_EXPORT void canvas_drawImageRect(flutter::DisplayListBuilder *canvas, flutter::DlImage *image, flutter::DlRect *source_rect, flutter::DlRect *dest_rect, flutter::DlPaint *paint, Skwasm::FilterQuality quality)
Definition canvas.cc:316
SKWASM_EXPORT void canvas_drawCircle(flutter::DisplayListBuilder *canvas, flutter::DlScalar x, flutter::DlScalar y, flutter::DlScalar radius, flutter::DlPaint *paint)
Definition canvas.cc:257
SKWASM_EXPORT void canvas_clipRect(flutter::DisplayListBuilder *canvas, const flutter::DlRect *rect, flutter::DlClipOp op, bool antialias)
Definition canvas.cc:187
SKWASM_EXPORT void canvas_getTransform(flutter::DisplayListBuilder *canvas, flutter::DlMatrix *out_transform)
Definition canvas.cc:374
SKWASM_EXPORT void canvas_drawRRect(flutter::DisplayListBuilder *canvas, const SkScalar *rrect_values, flutter::DlPaint *paint)
Definition canvas.cc:235
SKWASM_EXPORT void canvas_drawColor(flutter::DisplayListBuilder *canvas, uint32_t color, flutter::DlBlendMode blend_mode)
Definition canvas.cc:208
SKWASM_EXPORT void canvas_drawPath(flutter::DisplayListBuilder *canvas, SkPathBuilder *path, flutter::DlPaint *paint)
Definition canvas.cc:276
SKWASM_EXPORT void canvas_drawArc(flutter::DisplayListBuilder *canvas, const flutter::DlRect *rect, flutter::DlScalar start_angle_degrees, flutter::DlScalar sweep_angle_degrees, bool use_center, flutter::DlPaint *paint)
Definition canvas.cc:266
SKWASM_EXPORT void canvas_transform(flutter::DisplayListBuilder *canvas, const flutter::DlMatrix *matrix_44)
Definition canvas.cc:177
SKWASM_EXPORT void canvas_scale(flutter::DisplayListBuilder *canvas, float sx, float sy)
Definition canvas.cc:160
SKWASM_EXPORT void canvas_skew(flutter::DisplayListBuilder *canvas, flutter::DlScalar sx, flutter::DlScalar sy)
Definition canvas.cc:171
SKWASM_EXPORT void canvas_drawRect(flutter::DisplayListBuilder *canvas, flutter::DlRect *rect, flutter::DlPaint *paint)
Definition canvas.cc:229
SKWASM_EXPORT void canvas_rotate(flutter::DisplayListBuilder *canvas, flutter::DlScalar degrees)
Definition canvas.cc:166
SKWASM_EXPORT void canvas_restore(flutter::DisplayListBuilder *canvas)
Definition canvas.cc:136
SKWASM_EXPORT void canvas_getDeviceClipBounds(flutter::DisplayListBuilder *canvas, flutter::DlIRect *out_rect)
Definition canvas.cc:385
SKWASM_EXPORT void canvas_restoreToCount(flutter::DisplayListBuilder *canvas, int count)
Definition canvas.cc:140
SKWASM_EXPORT void canvas_drawAtlas(flutter::DisplayListBuilder *canvas, flutter::DlImage *atlas, flutter::DlRSTransform *transforms, flutter::DlRect *rects, uint32_t *colors, int sprite_count, flutter::DlBlendMode mode, flutter::DlRect *cull_rect, flutter::DlPaint *paint)
Definition canvas.cc:355
SKWASM_EXPORT void canvas_drawShadow(flutter::DisplayListBuilder *canvas, SkPathBuilder *path, flutter::DlScalar elevation, flutter::DlScalar device_pixel_ratio, uint32_t color, bool transparent_occluder)
Definition canvas.cc:283
SKWASM_EXPORT void canvas_drawVertices(flutter::DisplayListBuilder *canvas, Skwasm::sp_wrapper< flutter::DlVertices > *vertices, flutter::DlBlendMode mode, flutter::DlPaint *paint)
Definition canvas.cc:337
SKWASM_EXPORT void canvas_drawImage(flutter::DisplayListBuilder *canvas, flutter::DlImage *image, flutter::DlScalar offset_x, flutter::DlScalar offset_y, flutter::DlPaint *paint, Skwasm::FilterQuality quality)
Definition canvas.cc:306
SKWASM_EXPORT void canvas_drawImageNine(flutter::DisplayListBuilder *canvas, flutter::DlImage *image, flutter::DlIRect *center_rect, flutter::DlRect *destination_rect, flutter::DlPaint *paint, Skwasm::FilterQuality quality)
Definition canvas.cc:327
SKWASM_EXPORT void canvas_drawLine(flutter::DisplayListBuilder *canvas, flutter::DlScalar x1, flutter::DlScalar y1, flutter::DlScalar x2, flutter::DlScalar y2, flutter::DlPaint *paint)
Definition canvas.cc:214
SKWASM_EXPORT void canvas_drawOval(flutter::DisplayListBuilder *canvas, const flutter::DlRect *rect, flutter::DlPaint *paint)
Definition canvas.cc:251
SKWASM_EXPORT void canvas_translate(flutter::DisplayListBuilder *canvas, float dx, float dy)
Definition canvas.cc:154
SKWASM_EXPORT void canvas_getLocalClipBounds(flutter::DisplayListBuilder *canvas, flutter::DlRect *out_rect)
Definition canvas.cc:379
SKWASM_EXPORT void canvas_clipRRect(flutter::DisplayListBuilder *canvas, const SkScalar *rrect_values, bool antialias)
Definition canvas.cc:194
SKWASM_EXPORT void canvas_drawParagraph(flutter::DisplayListBuilder *canvas, Skwasm::Paragraph *paragraph, flutter::DlScalar x, flutter::DlScalar y)
Definition canvas.cc:293
SKWASM_EXPORT void canvas_saveLayer(flutter::DisplayListBuilder *canvas, flutter::DlRect *rect, flutter::DlPaint *paint, Skwasm::sp_wrapper< flutter::DlImageFilter > *backdrop)
Definition canvas.cc:123
SKWASM_EXPORT void canvas_drawDRRect(flutter::DisplayListBuilder *canvas, const SkScalar *outer_rrect_values, const SkScalar *inner_rrect_values, flutter::DlPaint *paint)
Definition canvas.cc:242
SKWASM_EXPORT bool canvas_quickReject(flutter::DisplayListBuilder *canvas, flutter::DlRect *rect)
Definition canvas.cc:391
SKWASM_EXPORT void canvas_drawPoints(flutter::DisplayListBuilder *canvas, flutter::DlPointMode mode, flutter::DlPoint *points, int point_count, flutter::DlPaint *paint)
Definition canvas.cc:346
SKWASM_EXPORT void canvas_clipPath(flutter::DisplayListBuilder *canvas, SkPathBuilder *path, bool antialias)
Definition canvas.cc:201
#define SKWASM_EXPORT
Definition export.h:10
std::unique_ptr< skia::textlayout::Paragraph > skia_paragraph
Definition text_types.h:49
std::vector< flutter::DlPaint > paints
Definition text_types.h:50
A 4x4 matrix using column-major storage.
Definition matrix.h:37
RoundOut(const TRect< U > &r)
Definition rect.h:679
std::vector< Point > points