29 UIDartState::ThrowIfUIOperationsProhibited();
33 ToDart(
"Canvas constructor called with non-genuine PictureRecorder."));
40 SafeNarrow(bottom))));
42 canvas->AssociateWithDartWrapper(wrapper);
46 : display_list_builder_(
std::move(builder)) {}
51 if (display_list_builder_) {
56void Canvas::saveLayerWithoutBounds(Dart_Handle paint_objects,
57 Dart_Handle paint_data) {
58 Paint paint(paint_objects, paint_data);
61 if (display_list_builder_) {
64 paint.paint(dl_paint, kSaveLayerWithPaintFlags, DlTileMode::kDecal);
66 TRACE_EVENT0(
"flutter",
"ui.Canvas::saveLayer (Recorded)");
67 builder()->SaveLayer(std::nullopt, save_paint);
71void Canvas::saveLayer(
double left,
75 Dart_Handle paint_objects,
76 Dart_Handle paint_data) {
77 Paint paint(paint_objects, paint_data);
81 SafeNarrow(right), SafeNarrow(bottom));
82 if (display_list_builder_) {
85 paint.paint(dl_paint, kSaveLayerWithPaintFlags, DlTileMode::kDecal);
87 TRACE_EVENT0(
"flutter",
"ui.Canvas::saveLayer (Recorded)");
88 builder()->SaveLayer(bounds, save_paint);
92void Canvas::restore() {
93 if (display_list_builder_) {
98int Canvas::getSaveCount() {
99 if (display_list_builder_) {
100 return builder()->GetSaveCount();
106void Canvas::restoreToCount(
int count) {
107 if (display_list_builder_ && count < getSaveCount()) {
108 builder()->RestoreToCount(count);
112void Canvas::translate(
double dx,
double dy) {
113 if (display_list_builder_) {
114 builder()->Translate(SafeNarrow(dx), SafeNarrow(dy));
118void Canvas::scale(
double sx,
double sy) {
119 if (display_list_builder_) {
120 builder()->Scale(SafeNarrow(sx), SafeNarrow(sy));
124void Canvas::rotate(
double radians) {
125 if (display_list_builder_) {
126 builder()->Rotate(SafeNarrow(radians) * 180.0f /
static_cast<float>(M_PI));
130void Canvas::skew(
double sx,
double sy) {
131 if (display_list_builder_) {
132 builder()->Skew(SafeNarrow(sx), SafeNarrow(sy));
136void Canvas::transform(
const tonic::Float64List& matrix4) {
139 if (display_list_builder_) {
141 builder()->TransformFullPerspective(
142 SafeNarrow(matrix4[ 0]), SafeNarrow(matrix4[ 4]), SafeNarrow(matrix4[ 8]), SafeNarrow(matrix4[12]),
143 SafeNarrow(matrix4[ 1]), SafeNarrow(matrix4[ 5]), SafeNarrow(matrix4[ 9]), SafeNarrow(matrix4[13]),
144 SafeNarrow(matrix4[ 2]), SafeNarrow(matrix4[ 6]), SafeNarrow(matrix4[10]), SafeNarrow(matrix4[14]),
145 SafeNarrow(matrix4[ 3]), SafeNarrow(matrix4[ 7]), SafeNarrow(matrix4[11]), SafeNarrow(matrix4[15]));
150void Canvas::getTransform(Dart_Handle matrix4_handle) {
151 if (display_list_builder_) {
153 DlMatrix matrix = builder()->GetMatrix();
154 auto matrix4 = tonic::Float64List(matrix4_handle);
155 for (
int i = 0;
i < 16;
i++) {
156 matrix4[
i] = matrix.
m[
i];
161void Canvas::clipRect(
double left,
167 if (display_list_builder_) {
169 SafeNarrow(right), SafeNarrow(bottom)),
170 clipOp, doAntiAlias);
174void Canvas::clipRRect(
const RRect& rrect,
bool doAntiAlias) {
175 if (display_list_builder_) {
176 builder()->ClipRoundRect(rrect.
rrect, DlClipOp::kIntersect, doAntiAlias);
181 if (display_list_builder_) {
182 builder()->ClipRoundSuperellipse(rse->
rsuperellipse(), DlClipOp::kIntersect,
187void Canvas::clipPath(
const CanvasPath* path,
bool doAntiAlias) {
190 ToDart(
"Canvas.clipPath called with non-genuine Path."));
193 if (display_list_builder_) {
194 builder()->ClipPath(
path->path(), DlClipOp::kIntersect, doAntiAlias);
198void Canvas::getDestinationClipBounds(Dart_Handle rect_handle) {
199 if (display_list_builder_) {
200 auto rect = tonic::Float64List(rect_handle);
201 DlRect bounds = builder()->GetDestinationClipCoverage();
203 rect[1] = bounds.
GetTop();
209void Canvas::getLocalClipBounds(Dart_Handle rect_handle) {
210 if (display_list_builder_) {
211 auto rect = tonic::Float64List(rect_handle);
212 DlRect bounds = builder()->GetLocalClipCoverage();
214 rect[1] = bounds.
GetTop();
221 if (display_list_builder_) {
222 builder()->DrawColor(
DlColor(color), blend_mode);
226void Canvas::drawLine(
double x1,
230 Dart_Handle paint_objects,
231 Dart_Handle paint_data) {
232 Paint paint(paint_objects, paint_data);
235 if (display_list_builder_) {
237 paint.paint(dl_paint, kDrawLineFlags, DlTileMode::kDecal);
238 builder()->DrawLine(
DlPoint(SafeNarrow(x1), SafeNarrow(y1)),
239 DlPoint(SafeNarrow(x2), SafeNarrow(y2)), dl_paint);
243void Canvas::drawPaint(Dart_Handle paint_objects, Dart_Handle paint_data) {
244 Paint paint(paint_objects, paint_data);
247 if (display_list_builder_) {
249 paint.paint(dl_paint, kDrawPaintFlags, DlTileMode::kClamp);
250 std::shared_ptr<DlImageFilter> filter = dl_paint.
getImageFilter();
251 if (filter && !filter->asColorFilter()) {
254 TRACE_EVENT0(
"flutter",
"ui.Canvas::saveLayer (Recorded)");
256 builder()->DrawPaint(dl_paint);
260void Canvas::drawRect(
double left,
264 Dart_Handle paint_objects,
265 Dart_Handle paint_data) {
266 Paint paint(paint_objects, paint_data);
269 if (display_list_builder_) {
271 paint.paint(dl_paint, kDrawRectFlags, DlTileMode::kDecal);
273 SafeNarrow(right), SafeNarrow(bottom)),
278void Canvas::drawRRect(
const RRect& rrect,
279 Dart_Handle paint_objects,
280 Dart_Handle paint_data) {
281 Paint paint(paint_objects, paint_data);
284 if (display_list_builder_) {
286 paint.paint(dl_paint, kDrawRRectFlags, DlTileMode::kDecal);
287 builder()->DrawRoundRect(rrect.
rrect, dl_paint);
291void Canvas::drawDRRect(
const RRect& outer,
293 Dart_Handle paint_objects,
294 Dart_Handle paint_data) {
295 Paint paint(paint_objects, paint_data);
298 if (display_list_builder_) {
300 paint.paint(dl_paint, kDrawDRRectFlags, DlTileMode::kDecal);
301 builder()->DrawDiffRoundRect(outer.
rrect, inner.
rrect, dl_paint);
306 Dart_Handle paint_objects,
307 Dart_Handle paint_data) {
308 Paint paint(paint_objects, paint_data);
311 if (display_list_builder_) {
313 paint.paint(dl_paint, kDrawDRRectFlags, DlTileMode::kDecal);
314 builder()->DrawRoundSuperellipse(rse->
rsuperellipse(), dl_paint);
318void Canvas::drawOval(
double left,
322 Dart_Handle paint_objects,
323 Dart_Handle paint_data) {
324 Paint paint(paint_objects, paint_data);
327 if (display_list_builder_) {
329 paint.paint(dl_paint, kDrawOvalFlags, DlTileMode::kDecal);
331 SafeNarrow(right), SafeNarrow(bottom)),
336void Canvas::drawCircle(
double x,
339 Dart_Handle paint_objects,
340 Dart_Handle paint_data) {
341 Paint paint(paint_objects, paint_data);
344 if (display_list_builder_) {
346 paint.paint(dl_paint, kDrawCircleFlags, DlTileMode::kDecal);
347 builder()->DrawCircle(
DlPoint(SafeNarrow(
x), SafeNarrow(
y)),
348 SafeNarrow(radius), dl_paint);
352void Canvas::drawArc(
double left,
359 Dart_Handle paint_objects,
360 Dart_Handle paint_data) {
361 Paint paint(paint_objects, paint_data);
364 if (display_list_builder_) {
366 paint.paint(dl_paint,
367 useCenter ? kDrawArcWithCenterFlags : kDrawArcNoCenterFlags,
372 SafeNarrow(startAngle) * 180.0f /
static_cast<float>(M_PI),
373 SafeNarrow(sweepAngle) * 180.0f /
static_cast<float>(M_PI), useCenter,
379 Dart_Handle paint_objects,
380 Dart_Handle paint_data) {
381 Paint paint(paint_objects, paint_data);
386 ToDart(
"Canvas.drawPath called with non-genuine Path."));
389 if (display_list_builder_) {
391 paint.paint(dl_paint, kDrawPathFlags, DlTileMode::kDecal);
392 builder()->DrawPath(
path->path(), dl_paint);
399 Dart_Handle paint_objects,
400 Dart_Handle paint_data,
401 int filterQualityIndex) {
402 Paint paint(paint_objects, paint_data);
406 return ToDart(
"Canvas.drawImage called with non-genuine Image.");
413 auto error = dl_image->get_error();
415 return ToDart(
error.value());
418 auto sampling = ImageFilter::SamplingFromIndex(filterQualityIndex);
419 if (display_list_builder_) {
422 paint.paint(dl_paint, kDrawImageWithPaintFlags, DlTileMode::kClamp);
423 builder()->DrawImage(dl_image,
DlPoint(SafeNarrow(
x), SafeNarrow(
y)),
424 sampling, opt_paint);
438 Dart_Handle paint_objects,
439 Dart_Handle paint_data,
440 int filterQualityIndex) {
441 Paint paint(paint_objects, paint_data);
445 return ToDart(
"Canvas.drawImageRect called with non-genuine Image.");
452 auto error = dl_image->get_error();
454 return ToDart(
error.value());
458 SafeNarrow(src_right), SafeNarrow(src_bottom));
460 SafeNarrow(dst_right), SafeNarrow(dst_bottom));
461 auto sampling = ImageFilter::SamplingFromIndex(filterQualityIndex);
462 if (display_list_builder_) {
465 paint.paint(dl_paint, kDrawImageRectWithPaintFlags, DlTileMode::kClamp);
466 builder()->DrawImageRect(dl_image, src, dst, sampling, opt_paint,
467 DlSrcRectConstraint::kFast);
476 double center_bottom,
481 Dart_Handle paint_objects,
482 Dart_Handle paint_data,
483 int bitmapSamplingIndex) {
484 Paint paint(paint_objects, paint_data);
488 return ToDart(
"Canvas.drawImageNine called with non-genuine Image.");
494 auto error = dl_image->get_error();
496 return ToDart(
error.value());
501 SafeNarrow(center_right), SafeNarrow(center_bottom));
504 SafeNarrow(dst_right), SafeNarrow(dst_bottom));
505 auto filter = ImageFilter::FilterModeFromIndex(bitmapSamplingIndex);
506 if (display_list_builder_) {
509 paint.paint(dl_paint, kDrawImageNineWithPaintFlags, DlTileMode::kClamp);
510 builder()->DrawImageNine(dl_image, icenter, dst, filter, opt_paint);
518 ToDart(
"Canvas.drawPicture called with non-genuine Picture."));
522 if (display_list_builder_) {
530void Canvas::drawPoints(Dart_Handle paint_objects,
531 Dart_Handle paint_data,
533 const tonic::Float32List&
points) {
534 Paint paint(paint_objects, paint_data);
536 static_assert(
sizeof(
DlPoint) ==
sizeof(
float) * 2,
537 "DlPoint doesn't use floats.");
540 if (display_list_builder_) {
542 switch (point_mode) {
543 case DlPointMode::kPoints:
544 paint.paint(dl_paint, kDrawPointsAsPointsFlags, DlTileMode::kDecal);
546 case DlPointMode::kLines:
547 paint.paint(dl_paint, kDrawPointsAsLinesFlags, DlTileMode::kDecal);
549 case DlPointMode::kPolygon:
550 paint.paint(dl_paint, kDrawPointsAsPolygonFlags, DlTileMode::kDecal);
553 builder()->DrawPoints(point_mode,
554 points.num_elements() / 2,
562 Dart_Handle paint_objects,
563 Dart_Handle paint_data) {
564 Paint paint(paint_objects, paint_data);
568 ToDart(
"Canvas.drawVertices called with non-genuine Vertices."));
572 if (display_list_builder_) {
574 paint.paint(dl_paint, kDrawVerticesFlags, DlTileMode::kDecal);
575 builder()->DrawVertices(vertices->vertices(), blend_mode, dl_paint);
579Dart_Handle Canvas::drawAtlas(Dart_Handle paint_objects,
580 Dart_Handle paint_data,
581 int filterQualityIndex,
583 Dart_Handle transforms_handle,
584 Dart_Handle rects_handle,
585 Dart_Handle colors_handle,
587 Dart_Handle cull_rect_handle) {
588 Paint paint(paint_objects, paint_data);
592 "Canvas.drawAtlas or Canvas.drawRawAtlas called with "
593 "non-genuine Image.");
596 auto dl_image = atlas->
image();
597 auto error = dl_image->get_error();
599 return ToDart(
error.value());
603 "DlRSTransform doesn't use floats.");
604 static_assert(
sizeof(
DlRect) ==
sizeof(
float) * 4,
605 "DlRect doesn't use floats.");
607 auto sampling = ImageFilter::SamplingFromIndex(filterQualityIndex);
610 if (display_list_builder_) {
611 tonic::Float32List transforms(transforms_handle);
612 tonic::Float32List rects(rects_handle);
613 tonic::Int32List colors(colors_handle);
614 tonic::Float32List cull_rect(cull_rect_handle);
616 std::vector<DlColor> dl_color(colors.num_elements());
617 size_t count = colors.num_elements();
618 for (
size_t i = 0;
i < count;
i++) {
624 paint.paint(dl_paint, kDrawAtlasWithPaintFlags, DlTileMode::kClamp);
625 builder()->DrawAtlas(
626 dl_image,
reinterpret_cast<const DlRSTransform*
>(transforms.data()),
627 reinterpret_cast<const DlRect*
>(rects.data()), dl_color.data(),
628 rects.num_elements() / 4,
629 blend_mode, sampling,
reinterpret_cast<const DlRect*
>(cull_rect.data()),
638 bool transparentOccluder) {
641 ToDart(
"Canvas.drawShader called with non-genuine Path."));
647 UIDartState::Current()->platform_configuration()->GetMetrics(0);
651 if (metrics ==
nullptr) {
656 if (display_list_builder_) {
657 builder()->DrawShadow(
path->path(),
DlColor(color), SafeNarrow(elevation),
658 transparentOccluder, dpr);
662void Canvas::Invalidate() {
663 display_list_builder_ =
nullptr;
664 if (dart_wrapper()) {
static void Create(Dart_Handle wrapper, PictureRecorder *recorder, double left, double top, double right, double bottom)
sk_sp< DlImage > image() const
const std::shared_ptr< DlImageFilter > & getImageFilter() const
sk_sp< DisplayList > display_list() const
sk_sp< DisplayListBuilder > BeginRecording(DlRect bounds)
void set_canvas(fml::RefPtr< Canvas > canvas)
flutter::DlRoundSuperellipse rsuperellipse() const
Canvas(ContentContext &renderer, const RenderTarget &render_target, bool is_onscreen, bool requires_readback)
#define IMPLEMENT_WRAPPERTYPEINFO(LibraryName, ClassName)
FlutterVulkanImage * image
const uint8_t uint32_t uint32_t GError ** error
#define FML_DCHECK(condition)
impeller::Scalar DlScalar
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
Dart_Handle ToDart(const T &object)
FlutterVulkanImageHandle image
double device_pixel_ratio
A 4x4 matrix using column-major storage.
constexpr auto GetBottom() const
constexpr auto GetTop() const
constexpr auto GetLeft() const
Round(const TRect< U > &r)
constexpr auto GetRight() const
static constexpr TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
std::vector< Point > points
#define TRACE_EVENT0(category_group, name)