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"
20class SkwasmParagraphPainter :
public skia::textlayout::ParagraphPainter {
23 const std::vector<flutter::DlPaint>& paints)
24 : builder_(builder), paints_(paints) {}
26 virtual void drawTextBlob(
const sk_sp<SkTextBlob>& blob,
29 const SkPaintOrID& paint)
override {
34 const int* paint_id = std::get_if<PaintID>(&paint);
39 virtual void drawTextShadow(
const sk_sp<SkTextBlob>& blob,
43 SkScalar blur_sigma)
override {
50 if (blur_sigma > 0.0) {
58 virtual void drawRect(
const SkRect& rect,
const SkPaintOrID& paint)
override {
59 const int* paint_id = std::get_if<PaintID>(&paint);
64 virtual void drawFilledRect(
const SkRect& rect,
65 const DecorationStyle& decor_style)
override {
71 virtual void drawPath(
const SkPath& path,
72 const DecorationStyle& decor_style)
override {
76 virtual void drawLine(SkScalar x0,
80 const DecorationStyle& decor_style)
override {
81 auto paint = this->ToDlPaint(decor_style);
82 auto dash_path_effect = decor_style.getDashPathEffect();
84 if (dash_path_effect) {
85 builder_.DrawDashedLine(
87 dash_path_effect->fOnLength, dash_path_effect->fOffLength, paint);
94 virtual void clipRect(
const SkRect& rect)
override {
98 virtual void translate(SkScalar dx, SkScalar dy)
override {
99 builder_.Translate(dx, dy);
102 virtual void save()
override { builder_.Save(); }
104 virtual void restore()
override { builder_.Restore(); }
107 const std::vector<flutter::DlPaint>& paints_;
111 const DecorationStyle& decor_style,
128 canvas->
SaveLayer(rect ? std::optional(*rect) : std::nullopt, paint,
129 backdrop ? backdrop->
Raw() :
nullptr);
163 canvas->
Scale(sx, sy);
174 canvas->
Skew(sx, sy);
195 const SkScalar* rrect_values,
236 const SkScalar* rrect_values,
243 const SkScalar* outer_rrect_values,
244 const SkScalar* inner_rrect_values,
288 bool transparent_occluder) {
290 elevation, transparent_occluder, device_pixel_ratio);
297 auto painter = SkwasmParagraphPainter(*canvas, paragraph->
paints);
334 FilterModeForQuality(quality), paint);
364 std::vector<flutter::DlColor> dl_colors(sprite_count);
365 for (
int i = 0;
i < sprite_count;
i++) {
369 sk_ref_sp(atlas), transforms, rects, dl_colors.data(), sprite_count, mode,
const std::shared_ptr< T > & Shared()
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 ¢er, 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
void DrawCircle(const DlPoint ¢er, 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
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
int GetSaveCount() const override
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.
DlPaint & setColor(DlColor color)
DlPaint & setAntiAlias(bool isAntiAlias)
DlPaint & setStrokeWidth(float width)
DlPaint & setMaskFilter(std::nullptr_t filter)
DlPaint & setDrawStyle(DlDrawStyle style)
FlutterVulkanImage * image
flutter::DlRoundRect CreateDlRRect(const float *f)
flutter::DlImageSampling SamplingOptionsForQuality(FilterQuality quality)
impeller::Scalar DlScalar
@ 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)
SKWASM_EXPORT void canvas_drawPicture(flutter::DisplayListBuilder *canvas, flutter::DisplayList *picture)
SKWASM_EXPORT int canvas_getSaveCount(flutter::DisplayListBuilder *canvas)
SKWASM_EXPORT void canvas_drawPaint(flutter::DisplayListBuilder *canvas, flutter::DlPaint *paint)
SKWASM_EXPORT void canvas_save(flutter::DisplayListBuilder *canvas)
SKWASM_EXPORT void canvas_clear(flutter::DisplayListBuilder *canvas, uint32_t color)
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)
SKWASM_EXPORT void canvas_drawCircle(flutter::DisplayListBuilder *canvas, flutter::DlScalar x, flutter::DlScalar y, flutter::DlScalar radius, flutter::DlPaint *paint)
SKWASM_EXPORT void canvas_clipRect(flutter::DisplayListBuilder *canvas, const flutter::DlRect *rect, flutter::DlClipOp op, bool antialias)
SKWASM_EXPORT void canvas_getTransform(flutter::DisplayListBuilder *canvas, flutter::DlMatrix *out_transform)
SKWASM_EXPORT void canvas_drawRRect(flutter::DisplayListBuilder *canvas, const SkScalar *rrect_values, flutter::DlPaint *paint)
SKWASM_EXPORT void canvas_drawColor(flutter::DisplayListBuilder *canvas, uint32_t color, flutter::DlBlendMode blend_mode)
SKWASM_EXPORT void canvas_drawPath(flutter::DisplayListBuilder *canvas, SkPathBuilder *path, flutter::DlPaint *paint)
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)
SKWASM_EXPORT void canvas_transform(flutter::DisplayListBuilder *canvas, const flutter::DlMatrix *matrix_44)
SKWASM_EXPORT void canvas_scale(flutter::DisplayListBuilder *canvas, float sx, float sy)
SKWASM_EXPORT void canvas_skew(flutter::DisplayListBuilder *canvas, flutter::DlScalar sx, flutter::DlScalar sy)
SKWASM_EXPORT void canvas_drawRect(flutter::DisplayListBuilder *canvas, flutter::DlRect *rect, flutter::DlPaint *paint)
SKWASM_EXPORT void canvas_rotate(flutter::DisplayListBuilder *canvas, flutter::DlScalar degrees)
SKWASM_EXPORT void canvas_restore(flutter::DisplayListBuilder *canvas)
SKWASM_EXPORT void canvas_getDeviceClipBounds(flutter::DisplayListBuilder *canvas, flutter::DlIRect *out_rect)
SKWASM_EXPORT void canvas_restoreToCount(flutter::DisplayListBuilder *canvas, int count)
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)
SKWASM_EXPORT void canvas_drawShadow(flutter::DisplayListBuilder *canvas, SkPathBuilder *path, flutter::DlScalar elevation, flutter::DlScalar device_pixel_ratio, uint32_t color, bool transparent_occluder)
SKWASM_EXPORT void canvas_drawVertices(flutter::DisplayListBuilder *canvas, Skwasm::sp_wrapper< flutter::DlVertices > *vertices, flutter::DlBlendMode mode, flutter::DlPaint *paint)
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)
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)
SKWASM_EXPORT void canvas_drawLine(flutter::DisplayListBuilder *canvas, flutter::DlScalar x1, flutter::DlScalar y1, flutter::DlScalar x2, flutter::DlScalar y2, flutter::DlPaint *paint)
SKWASM_EXPORT void canvas_drawOval(flutter::DisplayListBuilder *canvas, const flutter::DlRect *rect, flutter::DlPaint *paint)
SKWASM_EXPORT void canvas_translate(flutter::DisplayListBuilder *canvas, float dx, float dy)
SKWASM_EXPORT void canvas_getLocalClipBounds(flutter::DisplayListBuilder *canvas, flutter::DlRect *out_rect)
SKWASM_EXPORT void canvas_clipRRect(flutter::DisplayListBuilder *canvas, const SkScalar *rrect_values, bool antialias)
SKWASM_EXPORT void canvas_drawParagraph(flutter::DisplayListBuilder *canvas, Skwasm::Paragraph *paragraph, flutter::DlScalar x, flutter::DlScalar y)
SKWASM_EXPORT void canvas_saveLayer(flutter::DisplayListBuilder *canvas, flutter::DlRect *rect, flutter::DlPaint *paint, Skwasm::sp_wrapper< flutter::DlImageFilter > *backdrop)
SKWASM_EXPORT void canvas_drawDRRect(flutter::DisplayListBuilder *canvas, const SkScalar *outer_rrect_values, const SkScalar *inner_rrect_values, flutter::DlPaint *paint)
SKWASM_EXPORT bool canvas_quickReject(flutter::DisplayListBuilder *canvas, flutter::DlRect *rect)
SKWASM_EXPORT void canvas_drawPoints(flutter::DisplayListBuilder *canvas, flutter::DlPointMode mode, flutter::DlPoint *points, int point_count, flutter::DlPaint *paint)
SKWASM_EXPORT void canvas_clipPath(flutter::DisplayListBuilder *canvas, SkPathBuilder *path, bool antialias)
std::unique_ptr< skia::textlayout::Paragraph > skia_paragraph
std::vector< flutter::DlPaint > paints
A 4x4 matrix using column-major storage.
RoundOut(const TRect< U > &r)
std::vector< Point > points