5#ifndef FLUTTER_DISPLAY_LIST_DL_BUILDER_H_
6#define FLUTTER_DISPLAY_LIST_DL_BUILDER_H_
8#include "flutter/display_list/display_list.h"
9#include "flutter/display_list/dl_blend_mode.h"
10#include "flutter/display_list/dl_canvas.h"
11#include "flutter/display_list/dl_op_flags.h"
12#include "flutter/display_list/dl_op_receiver.h"
13#include "flutter/display_list/dl_paint.h"
14#include "flutter/display_list/dl_sampling_options.h"
15#include "flutter/display_list/effects/dl_path_effect.h"
16#include "flutter/display_list/image/dl_image.h"
17#include "flutter/display_list/utils/dl_bounds_accumulator.h"
18#include "flutter/display_list/utils/dl_comparable.h"
19#include "flutter/display_list/utils/dl_matrix_clip_tracker.h"
20#include "flutter/fml/macros.h"
39 bool prepare_rtree =
false);
117 ClipOp clip_op = ClipOp::kIntersect,
118 bool is_aa =
false)
override;
121 ClipOp clip_op = ClipOp::kIntersect,
122 bool is_aa =
false)
override;
125 ClipOp clip_op = ClipOp::kIntersect,
126 bool is_aa =
false)
override;
228 void drawTextFrame(
const std::shared_ptr<impeller::TextFrame>& text_frame,
232 void DrawTextFrame(
const std::shared_ptr<impeller::TextFrame>& text_frame,
241 bool transparent_occluder,
257 DisplayListBuilder& builder);
259 DisplayListBuilder& builder);
261 DisplayListBuilder& builder);
263 void SetAttributesFromPaint(
const DlPaint&
paint,
264 const DisplayListAttributeFlags
flags);
275 onSetInvertColors(
invert);
287 onSetStrokeJoin(join);
293 onSetDrawStyle(style);
299 onSetStrokeWidth(
width);
305 onSetStrokeMiter(limit);
317 onSetBlendMode(
mode);
329 onSetImageFilter(filter);
335 onSetColorFilter(filter);
341 onSetPathEffect(effect);
347 onSetMaskFilter(filter);
351 DlPaint CurrentAttributes()
const {
return current_; }
432 bool useCenter)
override;
442 bool render_with_attributes)
override;
449 bool render_with_attributes,
456 bool render_with_attributes)
override;
466 bool render_with_attributes)
override;
481 bool transparent_occluder,
486 void checkForDeferredSave();
490 size_t allocated_ = 0u;
491 uint32_t render_op_count_ = 0u;
492 uint32_t depth_ = 0u;
495 uint32_t render_op_depth_cost_ = 1u;
499 size_t nested_bytes_ = 0;
500 uint32_t nested_op_count_ = 0;
502 bool is_ui_thread_safe_ =
true;
504 template <
typename T,
typename... Args>
505 void* Push(
size_t extra, Args&&...
args);
507 void intersect(
const SkRect& rect);
510 static constexpr SkScalar kInvalidSigma = 0.0;
511 static bool mask_sigma_valid(
SkScalar sigma) {
512 return std::isfinite(sigma) && sigma > 0.0;
517 explicit SaveInfo(
size_t save_offset = 0, uint32_t start_depth = 0)
518 : save_offset_(save_offset), start_depth_(start_depth) {}
526 size_t save_offset()
const {
return save_offset_; }
528 bool is_save_layer()
const {
return is_save_layer_; }
529 bool cannot_inherit_opacity()
const {
return cannot_inherit_opacity_; }
530 bool has_compatible_op()
const {
return has_compatible_op_; }
531 bool affects_transparent_layer()
const {
532 return affects_transparent_layer_;
535 bool is_group_opacity_compatible()
const {
536 return !cannot_inherit_opacity_;
539 void mark_incompatible() { cannot_inherit_opacity_ =
true; }
546 void add_compatible_op() {
547 if (!cannot_inherit_opacity_) {
548 if (has_compatible_op_) {
549 cannot_inherit_opacity_ =
true;
551 has_compatible_op_ =
true;
558 void add_visible_op() {
559 affects_transparent_layer_ =
true;
563 std::shared_ptr<const DlImageFilter> filter() {
return filter_; }
586 void set_unbounded() { is_unbounded_ =
true; }
591 bool is_unbounded()
const {
return is_unbounded_; }
595 uint32_t start_depth_;
596 bool is_save_layer_ =
false;
597 bool cannot_inherit_opacity_ =
false;
598 bool has_compatible_op_ =
false;
599 std::shared_ptr<const DlImageFilter> filter_;
600 bool is_unbounded_ =
false;
601 bool has_deferred_save_op_ =
false;
602 bool is_nop_ =
false;
603 bool affects_transparent_layer_ =
false;
604 std::shared_ptr<BoundsAccumulator> layer_accumulator_;
606 friend class DisplayListBuilder;
609 std::vector<SaveInfo> layer_stack_;
610 SaveInfo* current_layer_;
611 DisplayListMatrixClipTracker tracker_;
612 std::unique_ptr<DisplayListMatrixClipTracker> layer_tracker_;
613 std::unique_ptr<BoundsAccumulator> accumulator_;
614 BoundsAccumulator* accumulator() {
return accumulator_.get(); }
618 bool current_opacity_compatibility_ =
true;
630 void UpdateCurrentOpacityCompatibility() {
631 current_opacity_compatibility_ =
639 void UpdateLayerOpacityCompatibility(
bool compatible) {
641 current_layer_->add_compatible_op();
643 current_layer_->mark_incompatible();
652 void CheckLayerOpacityCompatibility(
bool uses_blend_attribute =
true) {
653 UpdateLayerOpacityCompatibility(!uses_blend_attribute ||
654 current_opacity_compatibility_);
657 void CheckLayerOpacityHairlineCompatibility() {
658 UpdateLayerOpacityCompatibility(
659 current_opacity_compatibility_ &&
668 UpdateLayerOpacityCompatibility(IsOpacityCompatible(
mode));
671 void onSetAntiAlias(
bool aa);
672 void onSetInvertColors(
bool invert);
677 void onSetStrokeMiter(
SkScalar limit);
678 void onSetColor(DlColor
color);
680 void onSetColorSource(
const DlColorSource*
source);
681 void onSetImageFilter(
const DlImageFilter* filter);
682 void onSetColorFilter(
const DlColorFilter* filter);
683 void onSetPathEffect(
const DlPathEffect* effect);
684 void onSetMaskFilter(
const DlMaskFilter* filter);
695 bool is_unbounded()
const {
697 return layer_stack_.front().is_unbounded();
702 if (is_unbounded()) {
703 FML_LOG(INFO) <<
"returning partial bounds for unbounded DisplayList";
706 return accumulator_->bounds();
711 if (is_unbounded()) {
712 FML_LOG(INFO) <<
"returning partial rtree for unbounded DisplayList";
715 return accumulator_->rtree();
718 static DisplayListAttributeFlags FlagsForPointMode(
PointMode mode);
720 enum class OpResult {
722 kPreservesTransparency,
726 bool paint_nops_on_transparency();
727 OpResult PaintResult(
const DlPaint&
paint,
730 void UpdateLayerResult(OpResult
result) {
732 case OpResult::kNoEffect:
733 case OpResult::kPreservesTransparency:
735 case OpResult::kAffectsAll:
736 current_layer_->add_visible_op();
744 static_assert(!kAnyColor.isOpaque());
745 static_assert(!kAnyColor.isTransparent());
746 static DlColor GetEffectiveColor(
const DlPaint&
paint,
747 DisplayListAttributeFlags
flags);
751 bool AdjustBoundsForPaint(
SkRect& bounds, DisplayListAttributeFlags
flags);
755 bool AccumulateUnbounded();
759 bool AccumulateOpBounds(
const SkRect& bounds,
760 DisplayListAttributeFlags
flags) {
762 return AccumulateOpBounds(safe_bounds,
flags);
768 bool AccumulateOpBounds(
SkRect& bounds, DisplayListAttributeFlags
flags);
772 bool AccumulateBounds(
SkRect& bounds);
static bool compatible(const MTLRenderPassAttachmentDescriptor *first, const MTLRenderPassAttachmentDescriptor *second, const GrMtlPipelineState *pipelineState)
static SkScalar center(float pos0, float pos1)
static constexpr SkRect kMaxCullRect
void setBlendMode(DlBlendMode mode) override
void Skew(SkScalar sx, SkScalar sy) override
SkISize GetBaseLayerSize() const override
friend DlOpReceiver & DisplayListBuilderBenchmarkAccessor(DisplayListBuilder &builder)
void DrawLine(const SkPoint &p0, const SkPoint &p1, const DlPaint &paint) override
void drawRect(const SkRect &rect) override
void RestoreToCount(int restore_count) override
void clipRRect(const SkRRect &rrect, ClipOp clip_op, bool is_aa) override
void DrawDRRect(const SkRRect &outer, const SkRRect &inner, const DlPaint &paint) override
void DrawVertices(const DlVertices *vertices, DlBlendMode mode, const DlPaint &paint) override
void setColorSource(const DlColorSource *source) override
void TransformFullPerspective(SkScalar mxx, SkScalar mxy, SkScalar mxz, SkScalar mxt, SkScalar myx, SkScalar myy, SkScalar myz, SkScalar myt, SkScalar mzx, SkScalar mzy, SkScalar mzz, SkScalar mzt, SkScalar mwx, SkScalar mwy, SkScalar mwz, SkScalar mwt) override
void drawPath(const SkPath &path) override
SkRect GetLocalClipBounds() const override
void DrawRect(const SkRect &rect, const DlPaint &paint) override
void transformFullPerspective(SkScalar mxx, SkScalar mxy, SkScalar mxz, SkScalar mxt, SkScalar myx, SkScalar myy, SkScalar myz, SkScalar myt, SkScalar mzx, SkScalar mzy, SkScalar mzz, SkScalar mzt, SkScalar mwx, SkScalar mwy, SkScalar mwz, SkScalar mwt) override
void setDrawStyle(DlDrawStyle style) override
void SetTransform(const SkM44 *matrix44) override
void Transform(const SkMatrix *matrix) override
void setStrokeCap(DlStrokeCap cap) override
void setMaskFilter(const DlMaskFilter *filter) override
void transformReset() override
void drawShadow(const SkPath &path, const DlColor color, const SkScalar elevation, bool transparent_occluder, SkScalar dpr) override
void DrawColor(DlColor color, DlBlendMode mode) override
void DrawOval(const SkRect &bounds, const DlPaint &paint) override
void clipRect(const SkRect &rect, ClipOp clip_op, bool is_aa) override
void setImageFilter(const DlImageFilter *filter) override
void TransformReset() override
void clipPath(const SkPath &path, ClipOp clip_op, bool is_aa) override
void ClipRRect(const SkRRect &rrect, ClipOp clip_op=ClipOp::kIntersect, bool is_aa=false) override
void setStrokeMiter(float limit) override
friend DlOpReceiver & DisplayListBuilderTestingAccessor(DisplayListBuilder &builder)
void saveLayer(const SkRect &bounds, const SaveLayerOptions options, const DlImageFilter *backdrop) override
bool QuickReject(const SkRect &bounds) const override
void Translate(SkScalar tx, SkScalar ty) override
void DrawTextFrame(const std::shared_ptr< impeller::TextFrame > &text_frame, SkScalar x, SkScalar y, const DlPaint &paint) override
void DrawRRect(const SkRRect &rrect, const DlPaint &paint) override
void DrawPath(const SkPath &path, const DlPaint &paint) override
SkMatrix GetTransform() const override
void drawAtlas(const sk_sp< DlImage > atlas, const SkRSXform xform[], const SkRect tex[], const DlColor colors[], int count, DlBlendMode mode, DlImageSampling sampling, const SkRect *cullRect, bool render_with_attributes) override
void skew(SkScalar sx, SkScalar sy) override
void Rotate(SkScalar degrees) override
void setStrokeJoin(DlStrokeJoin join) override
void DrawCircle(const SkPoint ¢er, SkScalar radius, const DlPaint &paint) override
void DrawPoints(PointMode mode, uint32_t count, const SkPoint pts[], const DlPaint &paint) override
void Transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt, SkScalar myx, SkScalar myy, SkScalar myt) override
void setStrokeWidth(float width) override
DisplayListBuilder(bool prepare_rtree)
void drawImageNine(const sk_sp< DlImage > image, const SkIRect ¢er, const SkRect &dst, DlFilterMode filter, bool render_with_attributes) override
void drawArc(const SkRect &bounds, SkScalar start, SkScalar sweep, bool useCenter) override
void drawTextFrame(const std::shared_ptr< impeller::TextFrame > &text_frame, SkScalar x, SkScalar y) override
void rotate(SkScalar degrees) override
SkImageInfo GetImageInfo() const override
void SetTransform(const SkMatrix *matrix) override
void drawRRect(const SkRRect &rrect) override
void transform2DAffine(SkScalar mxx, SkScalar mxy, SkScalar mxt, SkScalar myx, SkScalar myy, SkScalar myt) override
void drawDRRect(const SkRRect &outer, const SkRRect &inner) override
void drawImageRect(const sk_sp< DlImage > image, const SkRect &src, const SkRect &dst, DlImageSampling sampling, bool render_with_attributes, SrcRectConstraint constraint=SrcRectConstraint::kFast) override
void DrawTextBlob(const sk_sp< SkTextBlob > &blob, SkScalar x, SkScalar y, const DlPaint &paint) override
void DrawImage(const sk_sp< DlImage > &image, const SkPoint point, DlImageSampling sampling, const DlPaint *paint=nullptr) override
void drawVertices(const DlVertices *vertices, DlBlendMode mode) override
void translate(SkScalar tx, SkScalar ty) override
void DrawShadow(const SkPath &path, const DlColor color, const SkScalar elevation, bool transparent_occluder, SkScalar dpr) override
void drawPaint() override
void setAntiAlias(bool aa) override
void DrawPaint(const DlPaint &paint) override
void SaveLayer(const SkRect *bounds, const DlPaint *paint=nullptr, const DlImageFilter *backdrop=nullptr) override
void drawDisplayList(const sk_sp< DisplayList > display_list, SkScalar opacity) override
void setPathEffect(const DlPathEffect *effect) override
sk_sp< DisplayList > Build()
void setInvertColors(bool invert) override
SkM44 GetTransformFullPerspective() const override
void DrawImageRect(const sk_sp< DlImage > &image, const SkRect &src, const SkRect &dst, DlImageSampling sampling, const DlPaint *paint=nullptr, SrcRectConstraint constraint=SrcRectConstraint::kFast) override
void setColorFilter(const DlColorFilter *filter) override
void DrawDisplayList(const sk_sp< DisplayList > display_list, SkScalar opacity=SK_Scalar1) override
SkRect GetDestinationClipBounds() const override
friend DlPaint DisplayListBuilderTestingAttributes(DisplayListBuilder &builder)
void drawPoints(PointMode mode, uint32_t count, const SkPoint pts[]) override
void ClipPath(const SkPath &path, ClipOp clip_op=ClipOp::kIntersect, bool is_aa=false) override
void DrawImageNine(const sk_sp< DlImage > &image, const SkIRect ¢er, const SkRect &dst, DlFilterMode filter, const DlPaint *paint=nullptr) override
void drawCircle(const SkPoint ¢er, SkScalar radius) override
void drawOval(const SkRect &bounds) override
void drawTextBlob(const sk_sp< SkTextBlob > blob, SkScalar x, SkScalar y) override
int GetSaveCount() const override
void drawLine(const SkPoint &p0, const SkPoint &p1) override
void drawColor(DlColor color, DlBlendMode mode) override
void scale(SkScalar sx, SkScalar sy) override
void DrawArc(const SkRect &bounds, SkScalar start, SkScalar sweep, bool useCenter, const DlPaint &paint) override
void DrawAtlas(const sk_sp< DlImage > &atlas, const SkRSXform xform[], const SkRect tex[], const DlColor colors[], int count, DlBlendMode mode, DlImageSampling sampling, const SkRect *cullRect, const DlPaint *paint=nullptr) override
void setColor(DlColor color) override
void drawImage(const sk_sp< DlImage > image, const SkPoint point, DlImageSampling sampling, bool render_with_attributes) override
SkRect local_cull_rect() const
SkRect device_cull_rect() const
SkMatrix matrix_3x3() const
static constexpr DisplayListAttributeFlags kDrawPaintFlags
Developer-facing API for rendering anything within the engine.
virtual void Transform(const SkMatrix *matrix)=0
virtual void DrawVertices(const DlVertices *vertices, DlBlendMode mode, const DlPaint &paint)=0
virtual void DrawImageRect(const sk_sp< DlImage > &image, const SkRect &src, const SkRect &dst, DlImageSampling sampling, const DlPaint *paint=nullptr, SrcRectConstraint constraint=SrcRectConstraint::kFast)=0
Internal API for rendering recorded display lists to backends.
DlStrokeCap getStrokeCap() const
DlBlendMode getBlendMode() const
float getStrokeMiter() const
std::shared_ptr< const DlPathEffect > getPathEffect() const
std::shared_ptr< const DlColorSource > getColorSource() const
DlStrokeJoin getStrokeJoin() const
DlDrawStyle getDrawStyle() const
std::shared_ptr< const DlMaskFilter > getMaskFilter() const
std::shared_ptr< const DlColorFilter > getColorFilter() const
float getStrokeWidth() const
std::shared_ptr< const DlImageFilter > getImageFilter() const
bool isInvertColors() const
Holds all of the data (both required and optional) for a DisplayList drawVertices call.
FlutterSemanticsFlag flags
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
#define FML_LOG(severity)
#define FML_DCHECK(condition)
Optional< SkRect > bounds
bool NotEquals(const T *a, const T *b)
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
@ kFill
fills interior of shapes
it will be possible to load the file into Perfetto s trace viewer 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
@ kSrcOver
r = s + (1-sa)*d
static constexpr SkRect MakeLTRB(float l, float t, float r, float b)
constexpr DlColor withAlpha(uint8_t alpha) const
static constexpr DlColor kMidGrey()