OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stddef.h> | 5 #include <stddef.h> |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 1074 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1085 node->clip = viewport_rect; | 1085 node->clip = viewport_rect; |
1086 set_needs_update(true); | 1086 set_needs_update(true); |
1087 } | 1087 } |
1088 | 1088 |
1089 gfx::RectF ClipTree::ViewportClip() const { | 1089 gfx::RectF ClipTree::ViewportClip() const { |
1090 const unsigned long min_size = 1; | 1090 const unsigned long min_size = 1; |
1091 DCHECK_GT(size(), min_size); | 1091 DCHECK_GT(size(), min_size); |
1092 return Node(kViewportNodeId)->clip; | 1092 return Node(kViewportNodeId)->clip; |
1093 } | 1093 } |
1094 | 1094 |
| 1095 void ClipTree::set_needs_update(bool needs_update) { |
| 1096 if (needs_update && !needs_update_) |
| 1097 property_trees()->UpdateClipTreeUpdateNumber(); |
| 1098 needs_update_ = needs_update; |
| 1099 } |
| 1100 |
1095 bool ClipTree::operator==(const ClipTree& other) const { | 1101 bool ClipTree::operator==(const ClipTree& other) const { |
1096 return PropertyTree::operator==(other); | 1102 return PropertyTree::operator==(other); |
1097 } | 1103 } |
1098 | 1104 |
1099 EffectTree& EffectTree::operator=(const EffectTree& from) { | 1105 EffectTree& EffectTree::operator=(const EffectTree& from) { |
1100 PropertyTree::operator=(from); | 1106 PropertyTree::operator=(from); |
1101 mask_layer_ids_ = from.mask_layer_ids_; | 1107 mask_layer_ids_ = from.mask_layer_ids_; |
1102 // copy_requests_ are omitted here, since these need to be moved rather | 1108 // copy_requests_ are omitted here, since these need to be moved rather |
1103 // than copied or assigned. | 1109 // than copied or assigned. |
1104 return *this; | 1110 return *this; |
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1530 | 1536 |
1531 gfx::ScrollOffset ScrollTree::ClampScrollOffsetToLimits( | 1537 gfx::ScrollOffset ScrollTree::ClampScrollOffsetToLimits( |
1532 gfx::ScrollOffset offset, | 1538 gfx::ScrollOffset offset, |
1533 ScrollNode* scroll_node) const { | 1539 ScrollNode* scroll_node) const { |
1534 offset.SetToMin(MaxScrollOffset(scroll_node->id)); | 1540 offset.SetToMin(MaxScrollOffset(scroll_node->id)); |
1535 offset.SetToMax(gfx::ScrollOffset()); | 1541 offset.SetToMax(gfx::ScrollOffset()); |
1536 return offset; | 1542 return offset; |
1537 } | 1543 } |
1538 | 1544 |
1539 PropertyTreesCachedData::PropertyTreesCachedData() | 1545 PropertyTreesCachedData::PropertyTreesCachedData() |
1540 : transform_tree_update_number(0) { | 1546 : transform_tree_update_number(0), clip_tree_update_number(0) { |
1541 animation_scales.clear(); | 1547 animation_scales.clear(); |
1542 } | 1548 } |
1543 | 1549 |
1544 PropertyTreesCachedData::~PropertyTreesCachedData() {} | 1550 PropertyTreesCachedData::~PropertyTreesCachedData() {} |
1545 | 1551 |
1546 PropertyTrees::PropertyTrees() | 1552 PropertyTrees::PropertyTrees() |
1547 : needs_rebuild(true), | 1553 : needs_rebuild(true), |
1548 non_root_surfaces_enabled(true), | 1554 non_root_surfaces_enabled(true), |
1549 changed(false), | 1555 changed(false), |
1550 full_tree_damaged(false), | 1556 full_tree_damaged(false), |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1995 } | 2001 } |
1996 } | 2002 } |
1997 // Add an entry to the cache. | 2003 // Add an entry to the cache. |
1998 cached_data_.draw_transforms[transform_id].push_back(DrawTransformData()); | 2004 cached_data_.draw_transforms[transform_id].push_back(DrawTransformData()); |
1999 DrawTransformData& data = cached_data_.draw_transforms[transform_id].back(); | 2005 DrawTransformData& data = cached_data_.draw_transforms[transform_id].back(); |
2000 data.update_number = -1; | 2006 data.update_number = -1; |
2001 data.target_id = dest_id; | 2007 data.target_id = dest_id; |
2002 return data; | 2008 return data; |
2003 } | 2009 } |
2004 | 2010 |
| 2011 int PropertyTrees::ClipRectCacheId(int clip_id, int target_id) const { |
| 2012 auto& cached_clips = cached_data_.clip_rects[clip_id]; |
| 2013 for (size_t i = 0; i < cached_clips.size(); i++) { |
| 2014 if (cached_clips[i].target_id == target_id && |
| 2015 cached_clips[i].update_number == cached_data_.clip_tree_update_number) |
| 2016 return static_cast<int>(i); |
| 2017 } |
| 2018 return -1; |
| 2019 } |
| 2020 |
| 2021 ConditionalClip& PropertyTrees::FetchClipRectFromCache(int clip_id, |
| 2022 int target_id, |
| 2023 int cache_index) const { |
| 2024 DCHECK_GE(cache_index, 0); |
| 2025 DCHECK_NE(ClipRectCacheId(clip_id, target_id), -1); |
| 2026 DCHECK_EQ(cached_data_.clip_rects[clip_id][cache_index].update_number, |
| 2027 cached_data_.clip_tree_update_number); |
| 2028 return cached_data_.clip_rects[clip_id][cache_index].clip; |
| 2029 } |
| 2030 |
| 2031 void PropertyTrees::AddToClipRectCache(int clip_id, |
| 2032 int target_id, |
| 2033 const ConditionalClip& clip) { |
| 2034 auto& cached_clips = cached_data_.clip_rects[clip_id]; |
| 2035 |
| 2036 if (cached_clips.size() > 1 || cached_clips.back().target_id != -1) { |
| 2037 cached_clips.push_back(ClipRectData()); |
| 2038 } |
| 2039 |
| 2040 ClipRectData& data = cached_clips.back(); |
| 2041 data.update_number = cached_data_.clip_tree_update_number; |
| 2042 data.target_id = target_id; |
| 2043 data.clip = clip; |
| 2044 } |
| 2045 |
| 2046 bool PropertyTrees::IsInVisibleRectCache(int clip_id) const { |
| 2047 return cached_data_.visible_rects[clip_id].update_number == |
| 2048 cached_data_.clip_tree_update_number; |
| 2049 } |
| 2050 |
| 2051 gfx::RectF PropertyTrees::FetchVisibleRectFromCache(int clip_id) const { |
| 2052 DCHECK_EQ(cached_data_.visible_rects[clip_id].update_number, |
| 2053 cached_data_.clip_tree_update_number); |
| 2054 return cached_data_.visible_rects[clip_id].visible_rect; |
| 2055 } |
| 2056 |
| 2057 void PropertyTrees::AddToVisibleRectCache(int clip_id, const gfx::RectF& rect) { |
| 2058 auto& visible_rect_data = cached_data_.visible_rects[clip_id]; |
| 2059 visible_rect_data.update_number = cached_data_.clip_tree_update_number; |
| 2060 visible_rect_data.visible_rect = rect; |
| 2061 } |
| 2062 |
2005 DrawTransforms& PropertyTrees::GetDrawTransforms(int transform_id, | 2063 DrawTransforms& PropertyTrees::GetDrawTransforms(int transform_id, |
2006 int effect_id) const { | 2064 int effect_id) const { |
2007 const EffectNode* effect_node = effect_tree.Node(effect_id); | 2065 const EffectNode* effect_node = effect_tree.Node(effect_id); |
2008 int dest_id = effect_node->transform_id; | 2066 int dest_id = effect_node->transform_id; |
2009 | 2067 |
2010 DrawTransformData& data = | 2068 DrawTransformData& data = |
2011 FetchDrawTransformsDataFromCache(transform_id, dest_id); | 2069 FetchDrawTransformsDataFromCache(transform_id, dest_id); |
2012 | 2070 |
2013 DCHECK(data.update_number != cached_data_.transform_tree_update_number || | 2071 DCHECK(data.update_number != cached_data_.transform_tree_update_number || |
2014 data.target_id != EffectTree::kInvalidNodeId); | 2072 data.target_id != EffectTree::kInvalidNodeId); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2053 data.transforms.to_valid = true; | 2111 data.transforms.to_valid = true; |
2054 data.update_number = cached_data_.transform_tree_update_number; | 2112 data.update_number = cached_data_.transform_tree_update_number; |
2055 data.target_id = dest_id; | 2113 data.target_id = dest_id; |
2056 data.transforms.from_target = from_target; | 2114 data.transforms.from_target = from_target; |
2057 data.transforms.to_target = target_space_transform; | 2115 data.transforms.to_target = target_space_transform; |
2058 return data.transforms; | 2116 return data.transforms; |
2059 } | 2117 } |
2060 | 2118 |
2061 void PropertyTrees::ResetCachedData() { | 2119 void PropertyTrees::ResetCachedData() { |
2062 cached_data_.transform_tree_update_number = 0; | 2120 cached_data_.transform_tree_update_number = 0; |
| 2121 cached_data_.clip_tree_update_number = 0; |
2063 cached_data_.animation_scales = std::vector<AnimationScaleData>( | 2122 cached_data_.animation_scales = std::vector<AnimationScaleData>( |
2064 transform_tree.nodes().size(), AnimationScaleData()); | 2123 transform_tree.nodes().size(), AnimationScaleData()); |
2065 cached_data_.draw_transforms = std::vector<std::vector<DrawTransformData>>( | 2124 cached_data_.draw_transforms = std::vector<std::vector<DrawTransformData>>( |
2066 transform_tree.nodes().size(), std::vector<DrawTransformData>(1)); | 2125 transform_tree.nodes().size(), std::vector<DrawTransformData>(1)); |
| 2126 cached_data_.clip_rects = std::vector<std::vector<ClipRectData>>( |
| 2127 clip_tree.nodes().size(), std::vector<ClipRectData>(1)); |
| 2128 cached_data_.visible_rects = |
| 2129 std::vector<VisibleRectData>(clip_tree.nodes().size()); |
2067 } | 2130 } |
2068 | 2131 |
2069 void PropertyTrees::UpdateTransformTreeUpdateNumber() { | 2132 void PropertyTrees::UpdateTransformTreeUpdateNumber() { |
2070 cached_data_.transform_tree_update_number++; | 2133 cached_data_.transform_tree_update_number++; |
2071 } | 2134 } |
2072 | 2135 |
| 2136 void PropertyTrees::UpdateClipTreeUpdateNumber() { |
| 2137 cached_data_.clip_tree_update_number++; |
| 2138 } |
| 2139 |
2073 gfx::Transform PropertyTrees::ToScreenSpaceTransformWithoutSurfaceContentsScale( | 2140 gfx::Transform PropertyTrees::ToScreenSpaceTransformWithoutSurfaceContentsScale( |
2074 int transform_id, | 2141 int transform_id, |
2075 int effect_id) const { | 2142 int effect_id) const { |
2076 if (transform_id == TransformTree::kRootNodeId) { | 2143 if (transform_id == TransformTree::kRootNodeId) { |
2077 return gfx::Transform(); | 2144 return gfx::Transform(); |
2078 } | 2145 } |
2079 gfx::Transform screen_space_transform = transform_tree.ToScreen(transform_id); | 2146 gfx::Transform screen_space_transform = transform_tree.ToScreen(transform_id); |
2080 const EffectNode* effect_node = effect_tree.Node(effect_id); | 2147 const EffectNode* effect_node = effect_tree.Node(effect_id); |
2081 | 2148 |
2082 if (effect_node->surface_contents_scale.x() != 0.0 && | 2149 if (effect_node->surface_contents_scale.x() != 0.0 && |
(...skipping 13 matching lines...) Expand all Loading... |
2096 | 2163 |
2097 const EffectNode* effect_node = effect_tree.Node(effect_id); | 2164 const EffectNode* effect_node = effect_tree.Node(effect_id); |
2098 | 2165 |
2099 bool success = GetFromTarget(transform_id, effect_id, transform); | 2166 bool success = GetFromTarget(transform_id, effect_id, transform); |
2100 transform->Scale(effect_node->surface_contents_scale.x(), | 2167 transform->Scale(effect_node->surface_contents_scale.x(), |
2101 effect_node->surface_contents_scale.y()); | 2168 effect_node->surface_contents_scale.y()); |
2102 return success; | 2169 return success; |
2103 } | 2170 } |
2104 | 2171 |
2105 } // namespace cc | 2172 } // namespace cc |
OLD | NEW |