Index: cc/playback/display_item_list.h |
diff --git a/cc/playback/display_item_list.h b/cc/playback/display_item_list.h |
index 402e73f421f99678de974f9b5680d71c9afc2e44..2f19bb77f4eba89e0c7971e96129818bde790e92 100644 |
--- a/cc/playback/display_item_list.h |
+++ b/cc/playback/display_item_list.h |
@@ -70,18 +70,63 @@ class CC_EXPORT DisplayItemList |
// approximate_op_count_. |
void RasterIntoCanvas(const DisplayItem& display_item); |
- // Because processing happens in this function, all the set up for |
- // this item should be done via the args, which is why the return |
- // type needs to be const, to prevent set-after-processing mistakes. |
+ // Because processing happens in these CreateAndAppend functions, all the set |
+ // up for the item should be done via the args, which is why the return type |
+ // needs to be const, to prevent set-after-processing mistakes. |
template <typename DisplayItemType, typename... Args> |
- const DisplayItemType& CreateAndAppendItem(const gfx::Rect& visual_rect, |
- Args&&... args) { |
+ const DisplayItemType& CreateAndAppendPairedBeginItem(Args&&... args) { |
+ size_t item_index = inputs_.visual_rects.size(); |
+ inputs_.visual_rects.push_back(gfx::Rect()); |
+ inputs_.begin_item_indices.push_back(item_index); |
+ |
+ return AllocateAndConstruct<DisplayItemType>(std::forward<Args>(args)...); |
+ } |
+ |
+ template <typename DisplayItemType, typename... Args> |
+ const DisplayItemType& CreateAndAppendPairedEndItem(Args&&... args) { |
+ DCHECK(!inputs_.begin_item_indices.empty()); |
+ size_t last_begin_index = inputs_.begin_item_indices.back(); |
+ inputs_.begin_item_indices.pop_back(); |
+ |
+ // Note that we are doing two separate things below: |
+ // |
+ // 1. Appending a new rect to the |visual_rects| list associated with |
+ // the newly-being-added paired end item, with that visual rect |
+ // having same bounds as its paired begin item, referenced via |
+ // |last_begin_index|. The paired begin item may or may not be the |
+ // current last visual rect in |visual_rects|, and its bounds has |
+ // potentially been grown via calls to CreateAndAppendDrawingItem(). |
+ // |
+ // 2. If there is still a containing paired begin item after closing the |
+ // pair ended in this method call, growing that item's visual rect to |
+ // incorporate the bounds of the now-finished pair. |
+ // |
+ // Thus we're carefully pushing and growing by the visual rect of the |
+ // paired begin item we're closing in this method call, which is not |
+ // necessarily the same as |visual_rects.back()|, and given that the |
+ // |visual_rects| list is mutated in step 1 before step 2, we also can't |
+ // shorten the reference via a |const auto| reference. We could make a |
+ // copy of the rect before list mutation, but that would incur copy |
+ // overhead. |
+ |
+ // Ending bounds match the starting bounds. |
+ inputs_.visual_rects.push_back(inputs_.visual_rects[last_begin_index]); |
+ |
+ // The block that ended needs to be included in the bounds of the enclosing |
+ // block. |
+ GrowCurrentBeginItemVisualRect(inputs_.visual_rects[last_begin_index]); |
+ |
+ return AllocateAndConstruct<DisplayItemType>(std::forward<Args>(args)...); |
+ } |
+ |
+ template <typename DisplayItemType, typename... Args> |
+ const DisplayItemType& CreateAndAppendDrawingItem( |
+ const gfx::Rect& visual_rect, |
+ Args&&... args) { |
inputs_.visual_rects.push_back(visual_rect); |
- auto* item = &inputs_.items.AllocateAndConstruct<DisplayItemType>( |
- std::forward<Args>(args)...); |
- approximate_op_count_ += item->ApproximateOpCount(); |
- ProcessAppendedItem(item); |
- return *item; |
+ GrowCurrentBeginItemVisualRect(visual_rect); |
+ |
+ return AllocateAndConstruct<DisplayItemType>(std::forward<Args>(args)...); |
} |
// Called after all items are appended, to process the items and, if |
@@ -108,6 +153,8 @@ class CC_EXPORT DisplayItemList |
float raster_scale, |
std::vector<DrawImage>* images); |
+ size_t size() const { return inputs_.items.size(); } |
+ |
gfx::Rect VisualRectForTesting(int index) { |
return inputs_.visual_rects[index]; |
} |
@@ -126,8 +173,20 @@ class CC_EXPORT DisplayItemList |
bool retain_individual_display_items); |
~DisplayItemList(); |
+ // If we're currently within a paired display item block, unions the |
+ // given visual rect with the begin display item's visual rect. |
+ void GrowCurrentBeginItemVisualRect(const gfx::Rect& visual_rect); |
void ProcessAppendedItem(const DisplayItem* item); |
+ template <typename DisplayItemType, typename... Args> |
+ const DisplayItemType& AllocateAndConstruct(Args&&... args) { |
+ auto* item = &inputs_.items.AllocateAndConstruct<DisplayItemType>( |
+ std::forward<Args>(args)...); |
+ approximate_op_count_ += item->ApproximateOpCount(); |
+ ProcessAppendedItem(item); |
+ return *item; |
+ } |
+ |
sk_sp<SkPicture> picture_; |
std::unique_ptr<SkPictureRecorder> recorder_; |
@@ -151,7 +210,7 @@ class CC_EXPORT DisplayItemList |
// |items| . These rects are intentionally kept separate |
// because they are not needed while walking the |items| for raster. |
std::vector<gfx::Rect> visual_rects; |
- |
+ std::vector<size_t> begin_item_indices; |
const DisplayItemListSettings settings; |
gfx::Rect layer_rect; |
bool is_suitable_for_gpu_rasterization; |