17#include "third_party/skia/include/effects/SkDashPathEffect.h"
18#include "third_party/skia/include/utils/SkShadowUtils.h"
31 temp_paint_.setAlphaf(
opacity());
55 std::optional<int64_t> backdrop_id) {
57 backdrop ==
nullptr) {
76 const sk_sp<SkImageFilter> sk_backdrop =
ToSk(backdrop);
77 const SkRect* sl_bounds =
79 SkCanvas::SaveLayerRec
params(sl_bounds,
paint, sk_backdrop.get(), 0);
80 if (sk_backdrop && backdrop->
asBlur()) {
83 canvas_->saveLayer(
params);
91 canvas_->translate(tx, ty);
94 canvas_->scale(sx, sy);
97 canvas_->rotate(degrees);
100 canvas_->skew(sx, sy);
109 canvas_->concat(SkM44(mxx, mxy, 0, mxt,
120 canvas_->concat(SkM44(mxx, mxy, mxz, mxt,
123 mwx, mwy, mwz, mwt));
127 canvas_->setMatrix(original_transform_);
133 canvas_->clipRect(
ToSkRect(rect),
ToSk(clip_op), is_aa);
138 canvas_->clipRRect(SkRRect::MakeOval(
ToSkRect(bounds)),
ToSk(clip_op), is_aa);
154 path.WillRenderSkPath();
155 canvas_->clipPath(
path.GetSkPath(),
ToSk(clip_op), is_aa);
159 const SkPaint& sk_paint =
paint();
160 SkImageFilter* filter = sk_paint.getImageFilter();
161 if (filter && !filter->asColorFilter(
nullptr)) {
166 canvas_->drawPaint(sk_paint);
173 canvas_->drawColor(color4f,
ToSk(
mode));
182 SkPaint dash_paint =
paint();
183 SkScalar intervals[] = {on_length, off_length};
184 dash_paint.setPathEffect(SkDashPathEffect::Make({intervals, 2}, 0.0f));
209 path.WillRenderSkPath();
210 canvas_->drawPath(
path.GetSkPath(),
paint());
224 const std::shared_ptr<DlVertices>& vertices,
231 bool render_with_attributes) {
232 canvas_->drawImage(
image ?
image->skia_image() :
nullptr, point.
x, point.
y,
239 bool render_with_attributes,
249 bool render_with_attributes) {
253 auto skia_image =
image->skia_image();
268 bool render_with_attributes) {
272 auto skia_atlas = atlas->skia_image();
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.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)
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)