Index: cc/trees/property_tree.cc |
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc |
index 9850577ff4ed778e9f6fd3ce8eb87e7cd57ef092..6df4f353ea72db1fcc7ca328c44732de3d5101cd 100644 |
--- a/cc/trees/property_tree.cc |
+++ b/cc/trees/property_tree.cc |
@@ -1092,6 +1092,12 @@ gfx::RectF ClipTree::ViewportClip() const { |
return Node(kViewportNodeId)->clip; |
} |
+void ClipTree::set_needs_update(bool needs_update) { |
+ if (needs_update && !needs_update_) |
+ property_trees()->UpdateClipTreeUpdateNumber(); |
+ needs_update_ = needs_update; |
+} |
+ |
bool ClipTree::operator==(const ClipTree& other) const { |
return PropertyTree::operator==(other); |
} |
@@ -1537,7 +1543,7 @@ gfx::ScrollOffset ScrollTree::ClampScrollOffsetToLimits( |
} |
PropertyTreesCachedData::PropertyTreesCachedData() |
- : transform_tree_update_number(0) { |
+ : transform_tree_update_number(0), clip_tree_update_number(0) { |
animation_scales.clear(); |
} |
@@ -2002,6 +2008,58 @@ DrawTransformData& PropertyTrees::FetchDrawTransformsDataFromCache( |
return data; |
} |
+int PropertyTrees::ClipRectCacheId(int clip_id, int target_id) const { |
+ auto& cached_clips = cached_data_.clip_rects[clip_id]; |
+ for (size_t i = 0; i < cached_clips.size(); i++) { |
+ if (cached_clips[i].target_id == target_id && |
+ cached_clips[i].update_number == cached_data_.clip_tree_update_number) |
+ return static_cast<int>(i); |
+ } |
+ return -1; |
+} |
+ |
+ConditionalClip& PropertyTrees::FetchClipRectFromCache(int clip_id, |
+ int target_id, |
+ int cache_index) const { |
+ DCHECK_GE(cache_index, 0); |
+ DCHECK_NE(ClipRectCacheId(clip_id, target_id), -1); |
+ DCHECK_EQ(cached_data_.clip_rects[clip_id][cache_index].update_number, |
+ cached_data_.clip_tree_update_number); |
+ return cached_data_.clip_rects[clip_id][cache_index].clip; |
+} |
+ |
+void PropertyTrees::AddToClipRectCache(int clip_id, |
+ int target_id, |
+ const ConditionalClip& clip) { |
+ auto& cached_clips = cached_data_.clip_rects[clip_id]; |
+ |
+ if (cached_clips.size() > 1 || cached_clips.back().target_id != -1) { |
+ cached_clips.push_back(ClipRectData()); |
+ } |
+ |
+ ClipRectData& data = cached_clips.back(); |
+ data.update_number = cached_data_.clip_tree_update_number; |
+ data.target_id = target_id; |
+ data.clip = clip; |
+} |
+ |
+bool PropertyTrees::IsInVisibleRectCache(int clip_id) const { |
+ return cached_data_.visible_rects[clip_id].update_number == |
+ cached_data_.clip_tree_update_number; |
+} |
+ |
+gfx::RectF PropertyTrees::FetchVisibleRectFromCache(int clip_id) const { |
+ DCHECK_EQ(cached_data_.visible_rects[clip_id].update_number, |
+ cached_data_.clip_tree_update_number); |
+ return cached_data_.visible_rects[clip_id].visible_rect; |
+} |
+ |
+void PropertyTrees::AddToVisibleRectCache(int clip_id, const gfx::RectF& rect) { |
+ auto& visible_rect_data = cached_data_.visible_rects[clip_id]; |
+ visible_rect_data.update_number = cached_data_.clip_tree_update_number; |
+ visible_rect_data.visible_rect = rect; |
+} |
+ |
DrawTransforms& PropertyTrees::GetDrawTransforms(int transform_id, |
int effect_id) const { |
const EffectNode* effect_node = effect_tree.Node(effect_id); |
@@ -2060,16 +2118,25 @@ DrawTransforms& PropertyTrees::GetDrawTransforms(int transform_id, |
void PropertyTrees::ResetCachedData() { |
cached_data_.transform_tree_update_number = 0; |
+ cached_data_.clip_tree_update_number = 0; |
cached_data_.animation_scales = std::vector<AnimationScaleData>( |
transform_tree.nodes().size(), AnimationScaleData()); |
cached_data_.draw_transforms = std::vector<std::vector<DrawTransformData>>( |
transform_tree.nodes().size(), std::vector<DrawTransformData>(1)); |
+ cached_data_.clip_rects = std::vector<std::vector<ClipRectData>>( |
+ clip_tree.nodes().size(), std::vector<ClipRectData>(1)); |
+ cached_data_.visible_rects = |
+ std::vector<VisibleRectData>(clip_tree.nodes().size()); |
} |
void PropertyTrees::UpdateTransformTreeUpdateNumber() { |
cached_data_.transform_tree_update_number++; |
} |
+void PropertyTrees::UpdateClipTreeUpdateNumber() { |
+ cached_data_.clip_tree_update_number++; |
+} |
+ |
gfx::Transform PropertyTrees::ToScreenSpaceTransformWithoutSurfaceContentsScale( |
int transform_id, |
int effect_id) const { |