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) {
383 ToDart(
"Canvas.drawPath called with non-genuine Path."));
386 if (display_list_builder_) {
387 Paint paint(paint_objects, paint_data);
390 paint.paint(dl_paint, kDrawPathFlags, DlTileMode::kDecal);
391 builder()->DrawPath(
path->path(), dl_paint);
398 Dart_Handle paint_objects,
399 Dart_Handle paint_data,
400 int filterQualityIndex) {
401 Paint paint(paint_objects, paint_data);
405 return ToDart(
"Canvas.drawImage called with non-genuine Image.");
412 auto error = dl_image->get_error();
414 return ToDart(
error.value());
417 auto sampling = ImageFilter::SamplingFromIndex(filterQualityIndex);
418 if (display_list_builder_) {
421 paint.paint(dl_paint, kDrawImageWithPaintFlags, DlTileMode::kClamp);
422 builder()->DrawImage(dl_image,
DlPoint(SafeNarrow(
x), SafeNarrow(
y)),
423 sampling, opt_paint);
437 Dart_Handle paint_objects,
438 Dart_Handle paint_data,
439 int filterQualityIndex) {
440 Paint paint(paint_objects, paint_data);
444 return ToDart(
"Canvas.drawImageRect called with non-genuine Image.");
451 auto error = dl_image->get_error();
453 return ToDart(
error.value());
457 SafeNarrow(src_right), SafeNarrow(src_bottom));
459 SafeNarrow(dst_right), SafeNarrow(dst_bottom));
460 auto sampling = ImageFilter::SamplingFromIndex(filterQualityIndex);
461 if (display_list_builder_) {
464 paint.paint(dl_paint, kDrawImageRectWithPaintFlags, DlTileMode::kClamp);
465 builder()->DrawImageRect(dl_image, src, dst, sampling, opt_paint,
466 DlSrcRectConstraint::kFast);
475 double center_bottom,
480 Dart_Handle paint_objects,
481 Dart_Handle paint_data,
482 int bitmapSamplingIndex) {
483 Paint paint(paint_objects, paint_data);
487 return ToDart(
"Canvas.drawImageNine called with non-genuine Image.");
493 auto error = dl_image->get_error();
495 return ToDart(
error.value());
500 SafeNarrow(center_right), SafeNarrow(center_bottom));
503 SafeNarrow(dst_right), SafeNarrow(dst_bottom));
504 auto filter = ImageFilter::FilterModeFromIndex(bitmapSamplingIndex);
505 if (display_list_builder_) {
508 paint.paint(dl_paint, kDrawImageNineWithPaintFlags, DlTileMode::kClamp);
509 builder()->DrawImageNine(dl_image, icenter, dst, filter, opt_paint);
517 ToDart(
"Canvas.drawPicture called with non-genuine Picture."));
521 if (display_list_builder_) {
529void Canvas::drawPoints(Dart_Handle paint_objects,
530 Dart_Handle paint_data,
532 const tonic::Float32List&
points) {
533 Paint paint(paint_objects, paint_data);
535 static_assert(
sizeof(
DlPoint) ==
sizeof(
float) * 2,
536 "DlPoint doesn't use floats.");
539 if (display_list_builder_) {
541 switch (point_mode) {
542 case DlPointMode::kPoints:
543 paint.paint(dl_paint, kDrawPointsAsPointsFlags, DlTileMode::kDecal);
545 case DlPointMode::kLines:
546 paint.paint(dl_paint, kDrawPointsAsLinesFlags, DlTileMode::kDecal);
548 case DlPointMode::kPolygon:
549 paint.paint(dl_paint, kDrawPointsAsPolygonFlags, DlTileMode::kDecal);
552 builder()->DrawPoints(point_mode,
553 points.num_elements() / 2,
561 Dart_Handle paint_objects,
562 Dart_Handle paint_data) {
563 Paint paint(paint_objects, paint_data);
567 ToDart(
"Canvas.drawVertices called with non-genuine Vertices."));
571 if (display_list_builder_) {
573 paint.paint(dl_paint, kDrawVerticesFlags, DlTileMode::kDecal);
574 builder()->DrawVertices(vertices->vertices(), blend_mode, dl_paint);
578Dart_Handle Canvas::drawAtlas(Dart_Handle paint_objects,
579 Dart_Handle paint_data,
580 int filterQualityIndex,
582 Dart_Handle transforms_handle,
583 Dart_Handle rects_handle,
584 Dart_Handle colors_handle,
586 Dart_Handle cull_rect_handle) {
587 Paint paint(paint_objects, paint_data);
591 "Canvas.drawAtlas or Canvas.drawRawAtlas called with "
592 "non-genuine Image.");
595 auto dl_image = atlas->
image();
596 auto error = dl_image->get_error();
598 return ToDart(
error.value());
602 "DlRSTransform doesn't use floats.");
603 static_assert(
sizeof(
DlRect) ==
sizeof(
float) * 4,
604 "DlRect doesn't use floats.");
606 auto sampling = ImageFilter::SamplingFromIndex(filterQualityIndex);
609 if (display_list_builder_) {
610 tonic::Float32List transforms(transforms_handle);
611 tonic::Float32List rects(rects_handle);
612 tonic::Int32List colors(colors_handle);
613 tonic::Float32List cull_rect(cull_rect_handle);
615 std::vector<DlColor> dl_color(colors.num_elements());
616 size_t count = colors.num_elements();
617 for (
size_t i = 0;
i < count;
i++) {
623 paint.paint(dl_paint, kDrawAtlasWithPaintFlags, DlTileMode::kClamp);
624 builder()->DrawAtlas(
625 dl_image,
reinterpret_cast<const DlRSTransform*
>(transforms.data()),
626 reinterpret_cast<const DlRect*
>(rects.data()), dl_color.data(),
627 rects.num_elements() / 4,
628 blend_mode, sampling,
reinterpret_cast<const DlRect*
>(cull_rect.data()),
637 bool transparentOccluder) {
640 ToDart(
"Canvas.drawShader called with non-genuine Path."));
646 UIDartState::Current()->platform_configuration()->GetMetrics(0);
650 if (metrics ==
nullptr) {
655 if (display_list_builder_) {
656 builder()->DrawShadow(
path->path(),
DlColor(color), SafeNarrow(elevation),
657 transparentOccluder, dpr);
661void Canvas::Invalidate() {
662 display_list_builder_ =
nullptr;
663 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)