39 bool prepare_rtree =
false);
64 void SaveLayer(
const std::optional<DlRect>& bounds,
67 std::optional<int64_t> backdrop_id = std::nullopt)
override;
116 bool is_aa =
false)
override;
120 bool is_aa =
false)
override;
124 bool is_aa =
false)
override;
128 bool is_aa =
false)
override;
132 bool is_aa =
false)
override;
162 const DlPaint& paint)
override;
168 const DlPaint& paint)
override;
176 const DlPaint& paint)
override;
182 const DlPaint& paint)
override;
185 const DlPaint& paint)
override;
193 const DlPaint& paint)
override;
198 const DlPaint& paint)
override;
200 void DrawVertices(
const std::shared_ptr<DlVertices>& vertices,
202 const DlPaint& paint)
override;
207 const DlPaint* paint =
nullptr)
override;
210 const sk_sp<DlImage>&
image,
214 const DlPaint* paint =
nullptr,
224 const DlPaint* paint =
nullptr)
override;
226 void DrawAtlas(
const sk_sp<DlImage>& atlas,
234 const DlPaint* paint =
nullptr)
override;
237 DlScalar opacity = SK_Scalar1)
override;
242 const DlPaint& paint)
override;
248 bool transparent_occluder,
254 sk_sp<DisplayList>
Build();
257 void Init(
bool prepare_rtree);
266 DisplayListBuilder& builder);
268 DisplayListBuilder& builder);
270 DisplayListBuilder& builder);
273 void SetAttributesFromPaint(
const DlPaint& paint,
274 const DisplayListAttributeFlags flags);
277 void setAntiAlias(
bool aa)
override {
283 void setInvertColors(
bool invert)
override {
285 onSetInvertColors(invert);
297 onSetStrokeJoin(join);
303 onSetDrawStyle(style);
307 void setStrokeWidth(
float width)
override {
309 onSetStrokeWidth(
width);
313 void setStrokeMiter(
float limit)
override {
315 onSetStrokeMiter(limit);
319 void setColor(DlColor color)
override {
327 onSetBlendMode(mode);
331 void setColorSource(
const DlColorSource* source)
override {
333 onSetColorSource(source);
337 void setImageFilter(
const DlImageFilter* filter)
override {
339 onSetImageFilter(filter);
343 void setColorFilter(
const DlColorFilter* filter)
override {
345 onSetColorFilter(filter);
349 void setMaskFilter(
const DlMaskFilter* filter)
override {
351 onSetMaskFilter(filter);
355 DlPaint CurrentAttributes()
const {
return current_; }
356 int LastOpIndex()
const {
return op_index_ - 1; }
359 void save()
override {
Save(); }
364 void saveLayer(
const DlRect& bounds,
365 const SaveLayerOptions options,
366 const DlImageFilter* backdrop,
367 std::optional<int64_t> backdrop_id)
override;
369 void restore()
override {
Restore(); }
387 void transformFullPerspective(
402 void clipRect(
const DlRect& rect,
DlClipOp clip_op,
bool is_aa)
override {
406 void clipOval(
const DlRect& bounds,
DlClipOp clip_op,
bool is_aa)
override {
412 bool is_aa)
override {
418 bool is_aa)
override {
422 void clipPath(
const DlPath&
path,
DlClipOp clip_op,
bool is_aa)
override {
427 void drawPaint()
override;
429 void drawColor(DlColor color,
DlBlendMode mode)
override {
435 void drawDashedLine(
const DlPoint& p0,
440 void drawRect(
const DlRect& rect)
override;
442 void drawOval(
const DlRect& bounds)
override;
446 void drawRoundRect(
const DlRoundRect& rrect)
override;
453 void drawPath(
const DlPath&
path)
override;
455 void drawArc(
const DlRect& bounds,
458 bool useCenter)
override;
462 void drawVertices(
const std::shared_ptr<DlVertices>& vertices,
466 void drawImage(
const sk_sp<DlImage>
image,
469 bool render_with_attributes)
override;
472 const sk_sp<DlImage>
image,
476 bool render_with_attributes,
479 void drawImageNine(
const sk_sp<DlImage>
image,
483 bool render_with_attributes)
override;
485 void drawAtlas(
const sk_sp<DlImage> atlas,
488 const DlColor colors[],
493 bool render_with_attributes)
override;
496 void drawDisplayList(
const sk_sp<DisplayList> display_list,
502 void drawText(
const std::shared_ptr<DlText>&
text,
507 void drawShadow(
const DlPath&
path,
510 bool transparent_occluder,
515 void checkForDeferredSave();
517 DisplayListStorage storage_;
518 std::vector<size_t> offsets_;
519 uint32_t render_op_count_ = 0u;
520 uint32_t depth_ = 0u;
523 uint32_t render_op_depth_cost_ = 1u;
527 size_t nested_bytes_ = 0;
528 uint32_t nested_op_count_ = 0;
530 bool is_ui_thread_safe_ =
true;
532 template <
typename T,
typename... Args>
533 void* Push(
size_t extra, Args&&...
args);
536 std::vector<DlRect> rects;
537 std::vector<int> indices;
541 LayerInfo(
const std::shared_ptr<DlImageFilter>& filter,
542 size_t rtree_rects_start_index)
544 rtree_rects_start_index(rtree_rects_start_index) {}
548 const std::shared_ptr<DlImageFilter> filter;
553 const size_t rtree_rects_start_index = 0;
557 AccumulationRect global_space_accumulator;
561 AccumulationRect layer_local_accumulator;
565 bool opacity_incompatible_op_detected =
false;
566 bool affects_transparent_layer =
false;
567 bool contains_backdrop_filter =
false;
568 bool is_unbounded =
false;
570 bool is_group_opacity_compatible()
const {
571 return !opacity_incompatible_op_detected &&
572 !layer_local_accumulator.overlap_detected();
576 if (max_blend_mode < mode) {
577 max_blend_mode =
mode;
587 SaveInfo(
const SaveInfo& copy) =
default;
588 SaveInfo(SaveInfo&& copy) =
default;
591 explicit SaveInfo(
const DlRect& cull_rect)
592 : is_save_layer(true),
593 has_valid_clip(false),
594 global_state(cull_rect),
595 layer_state(cull_rect),
596 layer_info(new LayerInfo(nullptr, 0u)) {}
601 explicit SaveInfo(
const SaveInfo* parent_info)
602 : is_save_layer(false),
603 has_deferred_save_op(true),
604 has_valid_clip(parent_info->has_valid_clip),
605 global_state(parent_info->global_state),
606 layer_state(parent_info->layer_state),
607 layer_info(parent_info->layer_info) {}
610 explicit SaveInfo(
const SaveInfo* parent_info,
611 const std::shared_ptr<DlImageFilter>& filter,
612 int rtree_rect_index)
613 : is_save_layer(true),
614 has_valid_clip(false),
615 global_state(parent_info->global_state),
617 layer_info(new LayerInfo(filter, rtree_rect_index)) {}
619 const bool is_save_layer;
621 bool has_deferred_save_op =
false;
627 uint32_t save_depth = 0;
632 size_t save_offset = 0;
635 DisplayListMatrixClipState global_state;
639 DisplayListMatrixClipState layer_state;
641 std::shared_ptr<LayerInfo> layer_info;
645 bool AccumulateBoundsLocal(
const DlRect& bounds);
648 void TransferBoundsToParent(
const SaveInfo& parent);
651 const DlRect original_cull_rect_;
652 std::vector<SaveInfo> save_stack_;
653 std::optional<RTreeData> rtree_data_;
660 SaveInfo& current_info() {
return save_stack_.back(); }
661 const SaveInfo& current_info()
const {
return save_stack_.back(); }
665 SaveInfo& parent_info() {
return *std::prev(save_stack_.end(), 2); }
666 const SaveInfo& parent_info()
const {
667 return *std::prev(save_stack_.end(), 2);
673 LayerInfo& current_layer() {
return *save_stack_.back().layer_info; }
674 const LayerInfo& current_layer()
const {
675 return *save_stack_.back().layer_info;
680 LayerInfo& parent_layer() {
681 return *std::prev(save_stack_.end(), 2)->layer_info;
683 const LayerInfo& parent_layer()
const {
684 return *std::prev(save_stack_.end(), 2)->layer_info;
693 DisplayListMatrixClipState& global_state() {
694 return current_info().global_state;
696 const DisplayListMatrixClipState& global_state()
const {
697 return current_info().global_state;
707 DisplayListMatrixClipState& layer_local_state() {
708 return current_info().layer_state;
710 const DisplayListMatrixClipState& layer_local_state()
const {
711 return current_info().layer_state;
715 void TransferLayerBounds(
const DlRect& content_bounds);
716 bool AdjustRTreeRects(RTreeData&
data,
717 const DlImageFilter& filter,
724 bool current_opacity_compatibility_ =
true;
732 static bool IsOpacityCompatible(
DlBlendMode mode) {
733 return (mode == DlBlendMode::kSrcOver);
736 void UpdateCurrentOpacityCompatibility() {
737 current_opacity_compatibility_ =
738 current_.getColorFilter() ==
nullptr &&
739 !current_.isInvertColors() &&
740 !current_.usesRuntimeEffect() &&
741 IsOpacityCompatible(current_.getBlendMode());
746 void UpdateLayerOpacityCompatibility(
bool compatible) {
748 current_layer().opacity_incompatible_op_detected =
true;
757 void CheckLayerOpacityCompatibility(
bool uses_blend_attribute =
true) {
758 UpdateLayerOpacityCompatibility(!uses_blend_attribute ||
759 current_opacity_compatibility_);
762 void CheckLayerOpacityHairlineCompatibility() {
763 UpdateLayerOpacityCompatibility(
764 current_opacity_compatibility_ &&
766 current_.getStrokeWidth() > 0));
772 void CheckLayerOpacityCompatibility(
DlBlendMode mode) {
773 UpdateLayerOpacityCompatibility(IsOpacityCompatible(mode));
776 void onSetAntiAlias(
bool aa);
777 void onSetInvertColors(
bool invert);
782 void onSetStrokeMiter(
DlScalar limit);
783 void onSetColor(DlColor color);
785 void onSetColorSource(
const DlColorSource* source);
786 void onSetImageFilter(
const DlImageFilter* filter);
787 void onSetColorFilter(
const DlColorFilter* filter);
788 void onSetMaskFilter(
const DlMaskFilter* filter);
790 static DisplayListAttributeFlags FlagsForPointMode(
DlPointMode mode);
792 enum class OpResult {
794 kPreservesTransparency,
798 bool paint_nops_on_transparency();
799 OpResult PaintResult(
const DlPaint& paint,
802 void UpdateLayerResult(OpResult result,
DlBlendMode mode) {
804 case OpResult::kNoEffect:
805 case OpResult::kPreservesTransparency:
807 case OpResult::kAffectsAll:
808 current_layer().affects_transparent_layer =
true;
811 current_layer().update_blend_mode(mode);
813 void UpdateLayerResult(OpResult result,
bool uses_attributes =
true) {
814 UpdateLayerResult(result, uses_attributes ? current_.getBlendMode()
821 static_assert(!kAnyColor.isOpaque());
822 static_assert(!kAnyColor.isTransparent());
823 static DlColor GetEffectiveColor(
const DlPaint& paint,
824 DisplayListAttributeFlags flags);
828 bool AdjustBoundsForPaint(
DlRect& bounds, DisplayListAttributeFlags flags);
832 bool AccumulateUnbounded(
const SaveInfo& save);
833 bool AccumulateUnbounded() {
834 return AccumulateUnbounded(current_info());
839 bool AccumulateOpBounds(
const DlRect& bounds,
840 DisplayListAttributeFlags flags) {
841 DlRect safe_bounds = bounds;
842 return AccumulateOpBounds(safe_bounds, flags);
848 bool AccumulateOpBounds(
DlRect& bounds, DisplayListAttributeFlags flags);
852 bool AccumulateBounds(
const DlRect& bounds, SaveInfo& layer,
int id);
853 bool AccumulateBounds(
const DlRect& bounds) {
854 return AccumulateBounds(bounds, current_info(), op_index_);