OLD | NEW |
| (Empty) |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef CC_TREES_LAYER_TREE_HOST_COMMON_H_ | |
6 #define CC_TREES_LAYER_TREE_HOST_COMMON_H_ | |
7 | |
8 #include <limits> | |
9 #include <vector> | |
10 | |
11 #include "base/bind.h" | |
12 #include "base/memory/ref_counted.h" | |
13 #include "cc/base/cc_export.h" | |
14 #include "cc/base/scoped_ptr_vector.h" | |
15 #include "cc/layers/layer_lists.h" | |
16 #include "ui/gfx/geometry/rect.h" | |
17 #include "ui/gfx/geometry/vector2d.h" | |
18 #include "ui/gfx/transform.h" | |
19 | |
20 namespace cc { | |
21 | |
22 class LayerImpl; | |
23 class Layer; | |
24 class SwapPromise; | |
25 | |
26 class CC_EXPORT LayerTreeHostCommon { | |
27 public: | |
28 static gfx::Rect CalculateVisibleRect(const gfx::Rect& target_surface_rect, | |
29 const gfx::Rect& layer_bound_rect, | |
30 const gfx::Transform& transform); | |
31 | |
32 template <typename LayerType, typename RenderSurfaceLayerListType> | |
33 struct CalcDrawPropsInputs { | |
34 public: | |
35 CalcDrawPropsInputs(LayerType* root_layer, | |
36 const gfx::Size& device_viewport_size, | |
37 const gfx::Transform& device_transform, | |
38 float device_scale_factor, | |
39 float page_scale_factor, | |
40 const LayerType* page_scale_application_layer, | |
41 const gfx::Vector2dF& elastic_overscroll, | |
42 const LayerType* elastic_overscroll_application_layer, | |
43 int max_texture_size, | |
44 bool can_use_lcd_text, | |
45 bool layers_always_allowed_lcd_text, | |
46 bool can_render_to_separate_surface, | |
47 bool can_adjust_raster_scales, | |
48 bool verify_property_trees, | |
49 RenderSurfaceLayerListType* render_surface_layer_list, | |
50 int current_render_surface_layer_list_id) | |
51 : root_layer(root_layer), | |
52 device_viewport_size(device_viewport_size), | |
53 device_transform(device_transform), | |
54 device_scale_factor(device_scale_factor), | |
55 page_scale_factor(page_scale_factor), | |
56 page_scale_application_layer(page_scale_application_layer), | |
57 elastic_overscroll(elastic_overscroll), | |
58 elastic_overscroll_application_layer( | |
59 elastic_overscroll_application_layer), | |
60 max_texture_size(max_texture_size), | |
61 can_use_lcd_text(can_use_lcd_text), | |
62 layers_always_allowed_lcd_text(layers_always_allowed_lcd_text), | |
63 can_render_to_separate_surface(can_render_to_separate_surface), | |
64 can_adjust_raster_scales(can_adjust_raster_scales), | |
65 verify_property_trees(verify_property_trees), | |
66 render_surface_layer_list(render_surface_layer_list), | |
67 current_render_surface_layer_list_id( | |
68 current_render_surface_layer_list_id) {} | |
69 | |
70 LayerType* root_layer; | |
71 gfx::Size device_viewport_size; | |
72 const gfx::Transform& device_transform; | |
73 float device_scale_factor; | |
74 float page_scale_factor; | |
75 const LayerType* page_scale_application_layer; | |
76 gfx::Vector2dF elastic_overscroll; | |
77 const LayerType* elastic_overscroll_application_layer; | |
78 int max_texture_size; | |
79 bool can_use_lcd_text; | |
80 bool layers_always_allowed_lcd_text; | |
81 bool can_render_to_separate_surface; | |
82 bool can_adjust_raster_scales; | |
83 bool verify_property_trees; | |
84 RenderSurfaceLayerListType* render_surface_layer_list; | |
85 int current_render_surface_layer_list_id; | |
86 }; | |
87 | |
88 template <typename LayerType, typename RenderSurfaceLayerListType> | |
89 struct CalcDrawPropsInputsForTesting | |
90 : public CalcDrawPropsInputs<LayerType, RenderSurfaceLayerListType> { | |
91 CalcDrawPropsInputsForTesting( | |
92 LayerType* root_layer, | |
93 const gfx::Size& device_viewport_size, | |
94 const gfx::Transform& device_transform, | |
95 RenderSurfaceLayerListType* render_surface_layer_list); | |
96 CalcDrawPropsInputsForTesting( | |
97 LayerType* root_layer, | |
98 const gfx::Size& device_viewport_size, | |
99 RenderSurfaceLayerListType* render_surface_layer_list); | |
100 | |
101 private: | |
102 const gfx::Transform identity_transform_; | |
103 }; | |
104 | |
105 typedef CalcDrawPropsInputs<Layer, RenderSurfaceLayerList> | |
106 CalcDrawPropsMainInputs; | |
107 typedef CalcDrawPropsInputsForTesting<Layer, RenderSurfaceLayerList> | |
108 CalcDrawPropsMainInputsForTesting; | |
109 static void UpdateRenderSurfaces(Layer* root_layer, | |
110 bool can_render_to_separate_surface, | |
111 const gfx::Transform& transform, | |
112 bool preserves_2d_axis_alignment); | |
113 static void UpdateRenderSurface(Layer* layer, | |
114 bool can_render_to_separate_surface, | |
115 gfx::Transform* transform, | |
116 bool* animation_preserves_axis_alignment); | |
117 static void CalculateDrawProperties(CalcDrawPropsMainInputs* inputs); | |
118 | |
119 typedef CalcDrawPropsInputs<LayerImpl, LayerImplList> CalcDrawPropsImplInputs; | |
120 typedef CalcDrawPropsInputsForTesting<LayerImpl, LayerImplList> | |
121 CalcDrawPropsImplInputsForTesting; | |
122 static void CalculateDrawProperties(CalcDrawPropsImplInputs* inputs); | |
123 | |
124 template <typename LayerType> | |
125 static bool RenderSurfaceContributesToTarget(LayerType*, | |
126 int target_surface_layer_id); | |
127 | |
128 template <typename LayerType, typename Function> | |
129 static void CallFunctionForSubtree(LayerType* layer, | |
130 const Function& function); | |
131 | |
132 // Returns a layer with the given id if one exists in the subtree starting | |
133 // from the given root layer (including mask and replica layers). | |
134 template <typename LayerType> | |
135 static LayerType* FindLayerInSubtree(LayerType* root_layer, int layer_id); | |
136 | |
137 static Layer* get_layer_as_raw_ptr(const LayerList& layers, size_t index) { | |
138 return layers[index].get(); | |
139 } | |
140 | |
141 static LayerImpl* get_layer_as_raw_ptr(const OwnedLayerImplList& layers, | |
142 size_t index) { | |
143 return layers[index]; | |
144 } | |
145 | |
146 static LayerImpl* get_layer_as_raw_ptr(const LayerImplList& layers, | |
147 size_t index) { | |
148 return layers[index]; | |
149 } | |
150 | |
151 struct ScrollUpdateInfo { | |
152 int layer_id; | |
153 // TODO(miletus): Use ScrollOffset once LayerTreeHost/Blink fully supports | |
154 // franctional scroll offset. | |
155 gfx::Vector2d scroll_delta; | |
156 }; | |
157 }; | |
158 | |
159 struct CC_EXPORT ScrollAndScaleSet { | |
160 ScrollAndScaleSet(); | |
161 ~ScrollAndScaleSet(); | |
162 | |
163 std::vector<LayerTreeHostCommon::ScrollUpdateInfo> scrolls; | |
164 float page_scale_delta; | |
165 gfx::Vector2dF elastic_overscroll_delta; | |
166 float top_controls_delta; | |
167 ScopedPtrVector<SwapPromise> swap_promises; | |
168 }; | |
169 | |
170 template <typename LayerType> | |
171 bool LayerTreeHostCommon::RenderSurfaceContributesToTarget( | |
172 LayerType* layer, | |
173 int target_surface_layer_id) { | |
174 // A layer will either contribute its own content, or its render surface's | |
175 // content, to the target surface. The layer contributes its surface's content | |
176 // when both the following are true: | |
177 // (1) The layer actually has a render surface and rendering into that | |
178 // surface, and | |
179 // (2) The layer's render surface is not the same as the target surface. | |
180 // | |
181 // Otherwise, the layer just contributes itself to the target surface. | |
182 | |
183 return layer->render_target() == layer && | |
184 layer->id() != target_surface_layer_id; | |
185 } | |
186 | |
187 template <typename LayerType> | |
188 LayerType* LayerTreeHostCommon::FindLayerInSubtree(LayerType* root_layer, | |
189 int layer_id) { | |
190 if (!root_layer) | |
191 return NULL; | |
192 | |
193 if (root_layer->id() == layer_id) | |
194 return root_layer; | |
195 | |
196 if (root_layer->mask_layer() && root_layer->mask_layer()->id() == layer_id) | |
197 return root_layer->mask_layer(); | |
198 | |
199 if (root_layer->replica_layer() && | |
200 root_layer->replica_layer()->id() == layer_id) | |
201 return root_layer->replica_layer(); | |
202 | |
203 for (size_t i = 0; i < root_layer->children().size(); ++i) { | |
204 if (LayerType* found = FindLayerInSubtree( | |
205 get_layer_as_raw_ptr(root_layer->children(), i), layer_id)) | |
206 return found; | |
207 } | |
208 return NULL; | |
209 } | |
210 | |
211 template <typename LayerType, typename Function> | |
212 void LayerTreeHostCommon::CallFunctionForSubtree(LayerType* layer, | |
213 const Function& function) { | |
214 function(layer); | |
215 | |
216 if (LayerType* mask_layer = layer->mask_layer()) | |
217 function(mask_layer); | |
218 if (LayerType* replica_layer = layer->replica_layer()) { | |
219 function(replica_layer); | |
220 if (LayerType* mask_layer = replica_layer->mask_layer()) | |
221 function(mask_layer); | |
222 } | |
223 | |
224 for (size_t i = 0; i < layer->children().size(); ++i) { | |
225 CallFunctionForSubtree(get_layer_as_raw_ptr(layer->children(), i), | |
226 function); | |
227 } | |
228 } | |
229 | |
230 template <typename LayerType, typename RenderSurfaceLayerListType> | |
231 LayerTreeHostCommon::CalcDrawPropsInputsForTesting<LayerType, | |
232 RenderSurfaceLayerListType>:: | |
233 CalcDrawPropsInputsForTesting( | |
234 LayerType* root_layer, | |
235 const gfx::Size& device_viewport_size, | |
236 const gfx::Transform& device_transform, | |
237 RenderSurfaceLayerListType* render_surface_layer_list) | |
238 : CalcDrawPropsInputs<LayerType, RenderSurfaceLayerListType>( | |
239 root_layer, | |
240 device_viewport_size, | |
241 device_transform, | |
242 1.f, | |
243 1.f, | |
244 NULL, | |
245 gfx::Vector2dF(), | |
246 NULL, | |
247 std::numeric_limits<int>::max() / 2, | |
248 false, | |
249 false, | |
250 true, | |
251 false, | |
252 true, | |
253 render_surface_layer_list, | |
254 0) { | |
255 DCHECK(root_layer); | |
256 DCHECK(render_surface_layer_list); | |
257 } | |
258 | |
259 template <typename LayerType, typename RenderSurfaceLayerListType> | |
260 LayerTreeHostCommon::CalcDrawPropsInputsForTesting<LayerType, | |
261 RenderSurfaceLayerListType>:: | |
262 CalcDrawPropsInputsForTesting( | |
263 LayerType* root_layer, | |
264 const gfx::Size& device_viewport_size, | |
265 RenderSurfaceLayerListType* render_surface_layer_list) | |
266 : CalcDrawPropsInputs<LayerType, RenderSurfaceLayerListType>( | |
267 root_layer, | |
268 device_viewport_size, | |
269 identity_transform_, | |
270 1.f, | |
271 1.f, | |
272 NULL, | |
273 gfx::Vector2dF(), | |
274 NULL, | |
275 std::numeric_limits<int>::max() / 2, | |
276 false, | |
277 false, | |
278 true, | |
279 false, | |
280 true, | |
281 render_surface_layer_list, | |
282 0) { | |
283 DCHECK(root_layer); | |
284 DCHECK(render_surface_layer_list); | |
285 } | |
286 | |
287 } // namespace cc | |
288 | |
289 #endif // CC_TREES_LAYER_TREE_HOST_COMMON_H_ | |
OLD | NEW |