18#include "third_party/skia/include/effects/SkDashPathEffect.h"
19#include "third_party/skia/include/utils/SkShadowUtils.h"
32 temp_paint_.setAlphaf(
opacity());
56 std::optional<int64_t> backdrop_id) {
58 backdrop ==
nullptr) {
77 const sk_sp<SkImageFilter> sk_backdrop =
ToSk(backdrop);
78 const SkRect* sl_bounds =
80 SkCanvas::SaveLayerRec
params(sl_bounds,
paint, sk_backdrop.get(), 0);
81 if (sk_backdrop && backdrop->
asBlur()) {
84 canvas_->saveLayer(
params);
92 canvas_->translate(tx, ty);
95 canvas_->scale(sx, sy);
98 canvas_->rotate(degrees);
101 canvas_->skew(sx, sy);
110 canvas_->concat(SkM44(mxx, mxy, 0, mxt,
121 canvas_->concat(SkM44(mxx, mxy, mxz, mxt,
124 mwx, mwy, mwz, mwt));
128 canvas_->setMatrix(original_transform_);
134 canvas_->clipRect(
ToSkRect(rect),
ToSk(clip_op), is_aa);
139 canvas_->clipRRect(SkRRect::MakeOval(
ToSkRect(bounds)),
ToSk(clip_op), is_aa);
155 path.WillRenderSkPath();
156 canvas_->clipPath(
path.GetSkPath(),
ToSk(clip_op), is_aa);
160 const SkPaint& sk_paint =
paint();
161 SkImageFilter* filter = sk_paint.getImageFilter();
162 if (filter && !filter->asColorFilter(
nullptr)) {
167 canvas_->drawPaint(sk_paint);
174 canvas_->drawColor(color4f,
ToSk(
mode));
183 SkPaint dash_paint =
paint();
184 SkScalar intervals[] = {on_length, off_length};
185 dash_paint.setPathEffect(SkDashPathEffect::Make({intervals, 2}, 0.0f));
210 path.WillRenderSkPath();
211 canvas_->drawPath(
path.GetSkPath(),
paint());
225 const std::shared_ptr<DlVertices>& vertices,
232 bool render_with_attributes) {
234 auto skia_image =
image->asSkiaImage();
236 canvas_->drawImage(skia_image->skia_image().get(), point.
x, point.
y,
243 bool render_with_attributes,
246 auto skia_image =
image->asSkiaImage();
248 canvas_->drawImageRect(skia_image->skia_image().get(),
ToSkRect(src),
256 bool render_with_attributes) {
258 auto skia_image =
image->asSkiaImage();
260 canvas_->drawImageNine(skia_image->skia_image().get(),
ToSkIRect(center),
272 bool render_with_attributes) {
274 auto skia_atlas = atlas->asSkiaImage();
276 std::vector<SkColor> sk_colors;
277 if (colors !=
nullptr) {
278 sk_colors.reserve(count);
279 for (
int i = 0;
i < count; ++
i) {
280 sk_colors.push_back(colors[
i].argb());
283 SkSpan<const SkColor> colorSpan;
285 colorSpan = {
nullptr, 0};
287 colorSpan = {sk_colors.data(), count};
289 canvas_->drawAtlas(skia_atlas->skia_image().get(), {ToSk(xform), count},
290 {ToSkRects(tex), count}, colorSpan,
ToSk(
mode),
295 const sk_sp<DisplayList> display_list,
297 const int restore_count = canvas_->getSaveCount();
302 if (combined_opacity < SK_Scalar1 &&
303 !display_list->can_apply_group_opacity()) {
305 canvas_->saveLayerAlphaf(
ToSkRect(&display_list->GetBounds()),
315 if (display_list->rtree()) {
316 display_list->Dispatch(dispatcher,
ToDlRect(canvas_->getLocalClipBounds()));
318 display_list->Dispatch(dispatcher);
322 canvas_->restoreToCount(restore_count);
327 auto blob =
text->GetTextBlob();
328 FML_CHECK(blob) <<
"Impeller DlText cannot be drawn to a Skia canvas.";
329 canvas_->drawTextBlob(blob,
x,
y,
paint());
336 bool transparentOccluder,
338 const SkScalar kAmbientAlpha = 0.039f;
339 const SkScalar kSpotAlpha = 0.25f;
341 uint32_t flags = transparentOccluder
342 ? SkShadowFlags::kTransparentOccluder_ShadowFlag
343 : SkShadowFlags::kNone_ShadowFlag;
344 flags |= SkShadowFlags::kDirectionalLight_ShadowFlag;
349 SkColor ambient_color, spot_color;
350 SkShadowUtils::ComputeTonalColors(in_ambient, in_spot, &ambient_color,
352 SkShadowUtils::DrawShadow(
353 canvas,
path, SkPoint3::Make(0, 0, dpr * elevation),
354 SkPoint3::Make(0, -1, 1),
356 ambient_color, spot_color, flags);
362 bool transparent_occluder,
364 path.WillRenderSkPath();
365 DrawShadow(canvas_,
path.GetSkPath(), color, elevation, transparent_occluder,
DlTileMode tile_mode() const
static constexpr DlScalar kShadowLightHeight
static constexpr DlScalar kShadowLightRadius
virtual const DlBlurImageFilter * asBlur() const
Backend implementation of |DlOpReceiver| for |SkCanvas|.
void drawPaint() override
void transform2DAffine(DlScalar mxx, DlScalar mxy, DlScalar mxt, DlScalar myx, DlScalar myy, DlScalar myt) override
void drawImage(const sk_sp< DlImage > image, const DlPoint &point, DlImageSampling sampling, bool render_with_attributes) override
void transformFullPerspective(DlScalar mxx, DlScalar mxy, DlScalar mxz, DlScalar mxt, DlScalar myx, DlScalar myy, DlScalar myz, DlScalar myt, DlScalar mzx, DlScalar mzy, DlScalar mzz, DlScalar mzt, DlScalar mwx, DlScalar mwy, DlScalar mwz, DlScalar mwt) override
void drawArc(const DlRect &bounds, DlScalar start, DlScalar sweep, bool useCenter) override
void drawImageRect(const sk_sp< DlImage > image, const DlRect &src, const DlRect &dst, DlImageSampling sampling, bool render_with_attributes, DlSrcRectConstraint constraint) override
void drawDashedLine(const DlPoint &p0, const DlPoint &p1, DlScalar on_length, DlScalar off_length) override
void drawVertices(const std::shared_ptr< DlVertices > &vertices, DlBlendMode mode) override
void transformReset() override
const SkPaint * safe_paint(bool use_attributes)
void saveLayer(const DlRect &bounds, const SaveLayerOptions options, const DlImageFilter *backdrop, std::optional< int64_t > backdrop_id) override
void drawRect(const DlRect &rect) override
void clipRect(const DlRect &rect, DlClipOp clip_op, bool is_aa) override
void rotate(DlScalar degrees) override
void drawText(const std::shared_ptr< DlText > &text, DlScalar x, DlScalar y) override
void drawCircle(const DlPoint ¢er, DlScalar radius) 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, bool render_with_attributes) override
void drawLine(const DlPoint &p0, const DlPoint &p1) override
void drawImageNine(const sk_sp< DlImage > image, const DlIRect ¢er, const DlRect &dst, DlFilterMode filter, bool render_with_attributes) override
void drawColor(DlColor color, DlBlendMode mode) override
void drawPoints(DlPointMode mode, uint32_t count, const DlPoint pts[]) override
void skew(DlScalar sx, DlScalar sy) override
void drawShadow(const DlPath &path, const DlColor color, const DlScalar elevation, bool transparent_occluder, DlScalar dpr) override
static void DrawShadow(SkCanvas *canvas, const SkPath &path, DlColor color, float elevation, bool transparentOccluder, DlScalar dpr)
void drawRoundSuperellipse(const DlRoundSuperellipse &rse) override
void clipOval(const DlRect &bounds, DlClipOp clip_op, bool is_aa) override
void drawRoundRect(const DlRoundRect &rrect) override
void drawPath(const DlPath &path) override
void drawOval(const DlRect &bounds) override
void drawDisplayList(const sk_sp< DisplayList > display_list, DlScalar opacity) override
void clipRoundRect(const DlRoundRect &rrect, DlClipOp clip_op, bool is_aa) override
void scale(DlScalar sx, DlScalar sy) override
void clipPath(const DlPath &path, DlClipOp clip_op, bool is_aa) override
void clipRoundSuperellipse(const DlRoundSuperellipse &rse, DlClipOp clip_op, bool is_aa) override
void translate(DlScalar tx, DlScalar ty) override
void drawDiffRoundRect(const DlRoundRect &outer, const DlRoundRect &inner) override
const SkPaint & paint(bool uses_shader=true)
void save_opacity(SkScalar opacity_for_children)
SkScalar combined_opacity()
bool content_is_clipped() const
bool renders_with_attributes() const
bool bounds_from_caller() const
bool can_distribute_opacity() const
const EmbeddedViewParams * params
FlutterVulkanImage * image
#define FML_CHECK(condition)
#define FML_DCHECK(condition)
impeller::Scalar DlScalar
SkPaint ToSk(const DlPaint &paint)
const SkPoint & ToSkPoint(const DlPoint &point)
const SkIRect & ToSkIRect(const DlIRect &rect)
SkColor ToSkColor(DlColor color)
const SkRRect ToApproximateSkRRect(const DlRoundSuperellipse &rse)
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
SkColor4f ToSkColor4f(DlColor color)
const SkPoint * ToSkPoints(const DlPoint *points)
it will be possible to load the file into Perfetto s trace viewer use test Running tests that layout and measure text will not yield consistent results across various platforms Enabling this option will make font resolution default to the Ahem test font on all 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
const SkRRect ToSkRRect(const DlRoundRect &round_rect)
const DlRect & ToDlRect(const SkRect &rect)
const SkRect & ToSkRect(const DlRect &rect)
#define TRACE_EVENT0(category_group, name)