39 bool prepare_rtree =
false);
55 void SaveLayer(
const std::optional<DlRect>& bounds,
58 std::optional<int64_t> backdrop_id = std::nullopt)
override;
107 bool is_aa =
false)
override;
111 bool is_aa =
false)
override;
115 bool is_aa =
false)
override;
119 bool is_aa =
false)
override;
123 bool is_aa =
false)
override;
153 const DlPaint& paint)
override;
159 const DlPaint& paint)
override;
167 const DlPaint& paint)
override;
173 const DlPaint& paint)
override;
176 const DlPaint& paint)
override;
184 const DlPaint& paint)
override;
189 const DlPaint& paint)
override;
191 void DrawVertices(
const std::shared_ptr<DlVertices>& vertices,
193 const DlPaint& paint)
override;
198 const DlPaint* paint =
nullptr)
override;
201 const sk_sp<DlImage>&
image,
205 const DlPaint* paint =
nullptr,
215 const DlPaint* paint =
nullptr)
override;
217 void DrawAtlas(
const sk_sp<DlImage>& atlas,
225 const DlPaint* paint =
nullptr)
override;
228 DlScalar opacity = SK_Scalar1)
override;
233 const DlPaint& paint)
override;
239 bool transparent_occluder,
245 sk_sp<DisplayList>
Build();
248 void Init(
bool prepare_rtree);
257 DisplayListBuilder& builder);
259 DisplayListBuilder& builder);
261 DisplayListBuilder& builder);
264 void SetAttributesFromPaint(
const DlPaint& paint,
265 const DisplayListAttributeFlags flags);
268 void setAntiAlias(
bool aa)
override {
274 void setInvertColors(
bool invert)
override {
276 onSetInvertColors(invert);
288 onSetStrokeJoin(join);
294 onSetDrawStyle(style);
298 void setStrokeWidth(
float width)
override {
300 onSetStrokeWidth(
width);
304 void setStrokeMiter(
float limit)
override {
306 onSetStrokeMiter(limit);
310 void setColor(DlColor color)
override {
318 onSetBlendMode(mode);
322 void setColorSource(
const DlColorSource* source)
override {
324 onSetColorSource(source);
328 void setImageFilter(
const DlImageFilter* filter)
override {
330 onSetImageFilter(filter);
334 void setColorFilter(
const DlColorFilter* filter)
override {
336 onSetColorFilter(filter);
340 void setMaskFilter(
const DlMaskFilter* filter)
override {
342 onSetMaskFilter(filter);
346 DlPaint CurrentAttributes()
const {
return current_; }
347 int LastOpIndex()
const {
return op_index_ - 1; }
350 void save()
override {
Save(); }
355 void saveLayer(
const DlRect& bounds,
356 const SaveLayerOptions options,
357 const DlImageFilter* backdrop,
358 std::optional<int64_t> backdrop_id)
override;
360 void restore()
override {
Restore(); }
378 void transformFullPerspective(
393 void clipRect(
const DlRect& rect,
DlClipOp clip_op,
bool is_aa)
override {
397 void clipOval(
const DlRect& bounds,
DlClipOp clip_op,
bool is_aa)
override {
403 bool is_aa)
override {
409 bool is_aa)
override {
413 void clipPath(
const DlPath&
path,
DlClipOp clip_op,
bool is_aa)
override {
418 void drawPaint()
override;
420 void drawColor(DlColor color,
DlBlendMode mode)
override {
426 void drawDashedLine(
const DlPoint& p0,
431 void drawRect(
const DlRect& rect)
override;
433 void drawOval(
const DlRect& bounds)
override;
437 void drawRoundRect(
const DlRoundRect& rrect)
override;
444 void drawPath(
const DlPath&
path)
override;
446 void drawArc(
const DlRect& bounds,
449 bool useCenter)
override;
453 void drawVertices(
const std::shared_ptr<DlVertices>& vertices,
457 void drawImage(
const sk_sp<DlImage>
image,
460 bool render_with_attributes)
override;
463 const sk_sp<DlImage>
image,
467 bool render_with_attributes,
470 void drawImageNine(
const sk_sp<DlImage>
image,
474 bool render_with_attributes)
override;
476 void drawAtlas(
const sk_sp<DlImage> atlas,
479 const DlColor colors[],
484 bool render_with_attributes)
override;
487 void drawDisplayList(
const sk_sp<DisplayList> display_list,
493 void drawText(
const std::shared_ptr<DlText>&
text,
498 void drawShadow(
const DlPath&
path,
501 bool transparent_occluder,
506 void checkForDeferredSave();
508 DisplayListStorage storage_;
509 std::vector<size_t> offsets_;
510 uint32_t render_op_count_ = 0u;
511 uint32_t depth_ = 0u;
514 uint32_t render_op_depth_cost_ = 1u;
518 size_t nested_bytes_ = 0;
519 uint32_t nested_op_count_ = 0;
521 bool is_ui_thread_safe_ =
true;
523 template <
typename T,
typename... Args>
524 void* Push(
size_t extra, Args&&...
args);
527 std::vector<DlRect> rects;
528 std::vector<int> indices;
532 LayerInfo(
const std::shared_ptr<DlImageFilter>& filter,
533 size_t rtree_rects_start_index)
535 rtree_rects_start_index(rtree_rects_start_index) {}
539 const std::shared_ptr<DlImageFilter> filter;
544 const size_t rtree_rects_start_index = 0;
548 AccumulationRect global_space_accumulator;
552 AccumulationRect layer_local_accumulator;
556 bool opacity_incompatible_op_detected =
false;
557 bool affects_transparent_layer =
false;
558 bool contains_backdrop_filter =
false;
559 bool is_unbounded =
false;
561 bool is_group_opacity_compatible()
const {
562 return !opacity_incompatible_op_detected &&
563 !layer_local_accumulator.overlap_detected();
567 if (max_blend_mode < mode) {
568 max_blend_mode =
mode;
578 SaveInfo(
const SaveInfo& copy) =
default;
579 SaveInfo(SaveInfo&& copy) =
default;
582 explicit SaveInfo(
const DlRect& cull_rect)
583 : is_save_layer(true),
584 has_valid_clip(false),
585 global_state(cull_rect),
586 layer_state(cull_rect),
587 layer_info(new LayerInfo(nullptr, 0u)) {}
592 explicit SaveInfo(
const SaveInfo* parent_info)
593 : is_save_layer(false),
594 has_deferred_save_op(true),
595 has_valid_clip(parent_info->has_valid_clip),
596 global_state(parent_info->global_state),
597 layer_state(parent_info->layer_state),
598 layer_info(parent_info->layer_info) {}
601 explicit SaveInfo(
const SaveInfo* parent_info,
602 const std::shared_ptr<DlImageFilter>& filter,
603 int rtree_rect_index)
604 : is_save_layer(true),
605 has_valid_clip(false),
606 global_state(parent_info->global_state),
608 layer_info(new LayerInfo(filter, rtree_rect_index)) {}
610 const bool is_save_layer;
612 bool has_deferred_save_op =
false;
618 uint32_t save_depth = 0;
623 size_t save_offset = 0;
626 DisplayListMatrixClipState global_state;
630 DisplayListMatrixClipState layer_state;
632 std::shared_ptr<LayerInfo> layer_info;
636 bool AccumulateBoundsLocal(
const DlRect& bounds);
639 void TransferBoundsToParent(
const SaveInfo& parent);
642 const DlRect original_cull_rect_;
643 std::vector<SaveInfo> save_stack_;
644 std::optional<RTreeData> rtree_data_;
651 SaveInfo& current_info() {
return save_stack_.back(); }
652 const SaveInfo& current_info()
const {
return save_stack_.back(); }
656 SaveInfo& parent_info() {
return *std::prev(save_stack_.end(), 2); }
657 const SaveInfo& parent_info()
const {
658 return *std::prev(save_stack_.end(), 2);
664 LayerInfo& current_layer() {
return *save_stack_.back().layer_info; }
665 const LayerInfo& current_layer()
const {
666 return *save_stack_.back().layer_info;
671 LayerInfo& parent_layer() {
672 return *std::prev(save_stack_.end(), 2)->layer_info;
674 const LayerInfo& parent_layer()
const {
675 return *std::prev(save_stack_.end(), 2)->layer_info;
684 DisplayListMatrixClipState& global_state() {
685 return current_info().global_state;
687 const DisplayListMatrixClipState& global_state()
const {
688 return current_info().global_state;
698 DisplayListMatrixClipState& layer_local_state() {
699 return current_info().layer_state;
701 const DisplayListMatrixClipState& layer_local_state()
const {
702 return current_info().layer_state;
706 void TransferLayerBounds(
const DlRect& content_bounds);
707 bool AdjustRTreeRects(RTreeData&
data,
708 const DlImageFilter& filter,
715 bool current_opacity_compatibility_ =
true;
723 static bool IsOpacityCompatible(
DlBlendMode mode) {
724 return (mode == DlBlendMode::kSrcOver);
727 void UpdateCurrentOpacityCompatibility() {
728 current_opacity_compatibility_ =
729 current_.getColorFilter() ==
nullptr &&
730 !current_.isInvertColors() &&
731 !current_.usesRuntimeEffect() &&
732 IsOpacityCompatible(current_.getBlendMode());
737 void UpdateLayerOpacityCompatibility(
bool compatible) {
739 current_layer().opacity_incompatible_op_detected =
true;
748 void CheckLayerOpacityCompatibility(
bool uses_blend_attribute =
true) {
749 UpdateLayerOpacityCompatibility(!uses_blend_attribute ||
750 current_opacity_compatibility_);
753 void CheckLayerOpacityHairlineCompatibility() {
754 UpdateLayerOpacityCompatibility(
755 current_opacity_compatibility_ &&
757 current_.getStrokeWidth() > 0));
763 void CheckLayerOpacityCompatibility(
DlBlendMode mode) {
764 UpdateLayerOpacityCompatibility(IsOpacityCompatible(mode));
767 void onSetAntiAlias(
bool aa);
768 void onSetInvertColors(
bool invert);
773 void onSetStrokeMiter(
DlScalar limit);
774 void onSetColor(DlColor color);
776 void onSetColorSource(
const DlColorSource* source);
777 void onSetImageFilter(
const DlImageFilter* filter);
778 void onSetColorFilter(
const DlColorFilter* filter);
779 void onSetMaskFilter(
const DlMaskFilter* filter);
781 static DisplayListAttributeFlags FlagsForPointMode(
DlPointMode mode);
783 enum class OpResult {
785 kPreservesTransparency,
789 bool paint_nops_on_transparency();
790 OpResult PaintResult(
const DlPaint& paint,
793 void UpdateLayerResult(OpResult result,
DlBlendMode mode) {
795 case OpResult::kNoEffect:
796 case OpResult::kPreservesTransparency:
798 case OpResult::kAffectsAll:
799 current_layer().affects_transparent_layer =
true;
802 current_layer().update_blend_mode(mode);
804 void UpdateLayerResult(OpResult result,
bool uses_attributes =
true) {
805 UpdateLayerResult(result, uses_attributes ? current_.getBlendMode()
812 static_assert(!kAnyColor.isOpaque());
813 static_assert(!kAnyColor.isTransparent());
814 static DlColor GetEffectiveColor(
const DlPaint& paint,
815 DisplayListAttributeFlags flags);
819 bool AdjustBoundsForPaint(
DlRect& bounds, DisplayListAttributeFlags flags);
823 bool AccumulateUnbounded(
const SaveInfo& save);
824 bool AccumulateUnbounded() {
825 return AccumulateUnbounded(current_info());
830 bool AccumulateOpBounds(
const DlRect& bounds,
831 DisplayListAttributeFlags flags) {
832 DlRect safe_bounds = bounds;
833 return AccumulateOpBounds(safe_bounds, flags);
839 bool AccumulateOpBounds(
DlRect& bounds, DisplayListAttributeFlags flags);
843 bool AccumulateBounds(
const DlRect& bounds, SaveInfo& layer,
int id);
844 bool AccumulateBounds(
const DlRect& bounds) {
845 return AccumulateBounds(bounds, current_info(), op_index_);