| 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 {
|
|
|