OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #ifndef UI_GFX_COMPOSITOR_LAYER_H_ | 5 #ifndef UI_GFX_COMPOSITOR_LAYER_H_ |
6 #define UI_GFX_COMPOSITOR_LAYER_H_ | 6 #define UI_GFX_COMPOSITOR_LAYER_H_ |
7 #pragma once | 7 #pragma once |
8 | 8 |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 // |target|. Necessarily, |source| and |target| must inhabit the same Layer | 145 // |target|. Necessarily, |source| and |target| must inhabit the same Layer |
146 // tree. | 146 // tree. |
147 static void ConvertPointToLayer(const Layer* source, | 147 static void ConvertPointToLayer(const Layer* source, |
148 const Layer* target, | 148 const Layer* target, |
149 gfx::Point* point); | 149 gfx::Point* point); |
150 | 150 |
151 // See description in View for details | 151 // See description in View for details |
152 void SetFillsBoundsOpaquely(bool fills_bounds_opaquely); | 152 void SetFillsBoundsOpaquely(bool fills_bounds_opaquely); |
153 bool fills_bounds_opaquely() const { return fills_bounds_opaquely_; } | 153 bool fills_bounds_opaquely() const { return fills_bounds_opaquely_; } |
154 | 154 |
155 // Returns the invalid rectangle. That is, the region of the layer that needs | |
156 // to be repainted. This is exposed for testing and isn't generally useful. | |
157 const gfx::Rect& invalid_rect() const { return invalid_rect_; } | |
158 | |
159 const gfx::Rect& hole_rect() const { return hole_rect_; } | |
160 | |
161 const std::string& name() const { return name_; } | 155 const std::string& name() const { return name_; } |
162 void set_name(const std::string& name) { name_ = name; } | 156 void set_name(const std::string& name) { name_ = name; } |
163 | 157 |
164 const ui::Texture* texture() const { return texture_.get(); } | 158 const ui::Texture* texture() const { return texture_.get(); } |
165 | 159 |
166 // Assigns a new external texture. |texture| can be NULL to disable external | 160 // Assigns a new external texture. |texture| can be NULL to disable external |
167 // updates. | 161 // updates. |
168 // TODO(beng): This can be removed from the API when we are in a | 162 // TODO(beng): This can be removed from the API when we are in a |
169 // single-compositor world. | 163 // single-compositor world. |
170 void SetExternalTexture(ui::Texture* texture); | 164 void SetExternalTexture(ui::Texture* texture); |
171 | 165 |
172 // Resets the canvas of the texture. | 166 // Resets the canvas of the texture. |
173 void SetCanvas(const SkCanvas& canvas, const gfx::Point& origin); | 167 void SetCanvas(const SkCanvas& canvas, const gfx::Point& origin); |
174 | 168 |
175 // Adds |invalid_rect| to the Layer's pending invalid rect and calls | 169 // Adds |invalid_rect| to the Layer's pending invalid rect and calls |
176 // ScheduleDraw(). | 170 // ScheduleDraw(). |
177 void SchedulePaint(const gfx::Rect& invalid_rect); | 171 void SchedulePaint(const gfx::Rect& invalid_rect); |
178 | 172 |
179 // Schedules a redraw of the layer tree at the compositor. | 173 // Schedules a redraw of the layer tree at the compositor. |
180 void ScheduleDraw(); | 174 void ScheduleDraw(); |
181 | 175 |
182 // Does drawing for the layer. | |
183 void Draw(); | |
184 | |
185 // Draws a tree of Layers, by calling Draw() on each in the hierarchy starting | |
186 // with the receiver. | |
187 void DrawTree(); | |
188 | |
189 // Sometimes the Layer is being updated by something other than SetCanvas | 176 // Sometimes the Layer is being updated by something other than SetCanvas |
190 // (e.g. the GPU process on UI_COMPOSITOR_IMAGE_TRANSPORT). | 177 // (e.g. the GPU process on UI_COMPOSITOR_IMAGE_TRANSPORT). |
191 bool layer_updated_externally() const { return layer_updated_externally_; } | 178 bool layer_updated_externally() const { return layer_updated_externally_; } |
192 | 179 |
193 // WebContentLayerClient | 180 // WebContentLayerClient |
194 virtual void paintContents(WebKit::WebCanvas*, const WebKit::WebRect& clip); | 181 virtual void paintContents(WebKit::WebCanvas*, const WebKit::WebRect& clip); |
195 | 182 |
196 #if defined(USE_WEBKIT_COMPOSITOR) | |
197 WebKit::WebLayer web_layer() { return web_layer_; } | 183 WebKit::WebLayer web_layer() { return web_layer_; } |
198 #endif | |
199 | 184 |
200 private: | 185 private: |
201 struct LayerProperties { | 186 struct LayerProperties { |
202 public: | 187 public: |
203 ui::Layer* layer; | 188 ui::Layer* layer; |
204 ui::Transform transform_relative_to_root; | 189 ui::Transform transform_relative_to_root; |
205 }; | 190 }; |
206 | 191 |
207 // TODO(vollick): Eventually, if a non-leaf node has an opacity of less than | 192 // TODO(vollick): Eventually, if a non-leaf node has an opacity of less than |
208 // 1.0, we'll render to a separate texture, and then apply the alpha. | 193 // 1.0, we'll render to a separate texture, and then apply the alpha. |
209 // Currently, we multiply our opacity by all our ancestor's opacities and | 194 // Currently, we multiply our opacity by all our ancestor's opacities and |
210 // use the combined result, but this is only temporary. | 195 // use the combined result, but this is only temporary. |
211 float GetCombinedOpacity() const; | 196 float GetCombinedOpacity() const; |
212 | 197 |
213 // Called during the Draw() pass to freshen the Layer's contents from the | |
214 // delegate. | |
215 void UpdateLayerCanvas(); | |
216 | |
217 // Stacks |child| above or below |other|. Helper method for StackAbove() and | 198 // Stacks |child| above or below |other|. Helper method for StackAbove() and |
218 // StackBelow(). | 199 // StackBelow(). |
219 void StackRelativeTo(Layer* child, Layer* other, bool above); | 200 void StackRelativeTo(Layer* child, Layer* other, bool above); |
220 | 201 |
221 // Called to indicate that a layer's properties have changed and that the | |
222 // holes for the layers must be recomputed. | |
223 void SetNeedsToRecomputeHole(); | |
224 | |
225 // Resets |hole_rect_| to the empty rect for all layers below and | |
226 // including this one. | |
227 void ClearHoleRects(); | |
228 | |
229 // Does a preorder traversal of layers starting with this layer. Omits layers | 202 // Does a preorder traversal of layers starting with this layer. Omits layers |
230 // which cannot punch a hole in another layer such as non visible layers | 203 // which cannot punch a hole in another layer such as non visible layers |
231 // and layers which don't fill their bounds opaquely. | 204 // and layers which don't fill their bounds opaquely. |
232 void GetLayerProperties(const ui::Transform& current_transform, | 205 void GetLayerProperties(const ui::Transform& current_transform, |
233 std::vector<LayerProperties>* traverasal); | 206 std::vector<LayerProperties>* traverasal); |
234 | 207 |
235 // A hole in a layer is an area in the layer that does not get drawn | |
236 // because this area is covered up with another layer which is known to be | |
237 // opaque. | |
238 // This method computes the dimension of the hole (if there is one) | |
239 // based on whether one of its child nodes is always opaque. | |
240 // Note: This method should only be called from the root. | |
241 void RecomputeHole(); | |
242 | |
243 void set_hole_rect(const gfx::Rect& hole_rect) { | |
244 hole_rect_ = hole_rect; | |
245 } | |
246 | |
247 // Determines the regions that don't intersect |rect| and places the | |
248 // result in |sides|. | |
249 // | |
250 // rect_____________________________ | |
251 // |xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| | |
252 // |xxxxxxxxxxxxx top xxxxxxxxxxxxxx| | |
253 // |________________________________| | |
254 // |xxxxx| |xxxxx| | |
255 // |xxxxx|region_to_punch_out |xxxxx| | |
256 // |left | |right| | |
257 // |_____|____________________|_____| | |
258 // |xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| | |
259 // |xxxxxxxxxx bottom xxxxxxxxxxxxxx| | |
260 // |________________________________| | |
261 static void PunchHole(const gfx::Rect& rect, | |
262 const gfx::Rect& region_to_punch_out, | |
263 std::vector<gfx::Rect>* sides); | |
264 | |
265 // Drops texture just for this layer. | |
266 void DropTexture(); | |
267 | |
268 // Drop all textures for layers below and including this one. Called when | |
269 // the layer is removed from a hierarchy. Textures will be re-generated if | |
270 // the layer is subsequently re-attached and needs to be drawn. | |
271 void DropTextures(); | |
272 | |
273 bool ConvertPointForAncestor(const Layer* ancestor, gfx::Point* point) const; | 208 bool ConvertPointForAncestor(const Layer* ancestor, gfx::Point* point) const; |
274 bool ConvertPointFromAncestor(const Layer* ancestor, gfx::Point* point) const; | 209 bool ConvertPointFromAncestor(const Layer* ancestor, gfx::Point* point) const; |
275 | 210 |
276 bool GetTransformRelativeTo(const Layer* ancestor, | 211 bool GetTransformRelativeTo(const Layer* ancestor, |
277 Transform* transform) const; | 212 Transform* transform) const; |
278 | 213 |
279 // The only externally updated layers are ones that get their pixels from | 214 // The only externally updated layers are ones that get their pixels from |
280 // WebKit and WebKit does not produce valid alpha values. All other layers | 215 // WebKit and WebKit does not produce valid alpha values. All other layers |
281 // should have valid alpha. | 216 // should have valid alpha. |
282 bool has_valid_alpha_channel() const { return !layer_updated_externally_; } | 217 bool has_valid_alpha_channel() const { return !layer_updated_externally_; } |
283 | 218 |
284 // Following are invoked from the animation or if no animation exists to | 219 // Following are invoked from the animation or if no animation exists to |
285 // update the values immediately. | 220 // update the values immediately. |
286 void SetBoundsImmediately(const gfx::Rect& bounds); | 221 void SetBoundsImmediately(const gfx::Rect& bounds); |
287 void SetTransformImmediately(const ui::Transform& transform); | 222 void SetTransformImmediately(const ui::Transform& transform); |
288 void SetOpacityImmediately(float opacity); | 223 void SetOpacityImmediately(float opacity); |
289 | 224 |
290 // Implementation of LayerAnimatorDelegate | 225 // Implementation of LayerAnimatorDelegate |
291 virtual void SetBoundsFromAnimation(const gfx::Rect& bounds) OVERRIDE; | 226 virtual void SetBoundsFromAnimation(const gfx::Rect& bounds) OVERRIDE; |
292 virtual void SetTransformFromAnimation(const Transform& transform) OVERRIDE; | 227 virtual void SetTransformFromAnimation(const Transform& transform) OVERRIDE; |
293 virtual void SetOpacityFromAnimation(float opacity) OVERRIDE; | 228 virtual void SetOpacityFromAnimation(float opacity) OVERRIDE; |
294 virtual void ScheduleDrawForAnimation() OVERRIDE; | 229 virtual void ScheduleDrawForAnimation() OVERRIDE; |
295 virtual const gfx::Rect& GetBoundsForAnimation() const OVERRIDE; | 230 virtual const gfx::Rect& GetBoundsForAnimation() const OVERRIDE; |
296 virtual const Transform& GetTransformForAnimation() const OVERRIDE; | 231 virtual const Transform& GetTransformForAnimation() const OVERRIDE; |
297 virtual float GetOpacityForAnimation() const OVERRIDE; | 232 virtual float GetOpacityForAnimation() const OVERRIDE; |
298 | 233 |
299 #if defined(USE_WEBKIT_COMPOSITOR) | |
300 void CreateWebLayer(); | 234 void CreateWebLayer(); |
301 void RecomputeTransform(); | 235 void RecomputeTransform(); |
302 void RecomputeDrawsContentAndUVRect(); | 236 void RecomputeDrawsContentAndUVRect(); |
303 void RecomputeDebugBorderColor(); | 237 void RecomputeDebugBorderColor(); |
304 #endif | |
305 | 238 |
306 const LayerType type_; | 239 const LayerType type_; |
307 | 240 |
308 Compositor* compositor_; | 241 Compositor* compositor_; |
309 | 242 |
310 scoped_refptr<ui::Texture> texture_; | 243 scoped_refptr<ui::Texture> texture_; |
311 | 244 |
312 Layer* parent_; | 245 Layer* parent_; |
313 | 246 |
314 // This layer's children, in bottom-to-top stacking order. | 247 // This layer's children, in bottom-to-top stacking order. |
315 std::vector<Layer*> children_; | 248 std::vector<Layer*> children_; |
316 | 249 |
317 ui::Transform transform_; | 250 ui::Transform transform_; |
318 | 251 |
319 gfx::Rect bounds_; | 252 gfx::Rect bounds_; |
320 | 253 |
321 // Visibility of this layer. See SetVisible/IsDrawn for more details. | 254 // Visibility of this layer. See SetVisible/IsDrawn for more details. |
322 bool visible_; | 255 bool visible_; |
323 | 256 |
324 bool fills_bounds_opaquely_; | 257 bool fills_bounds_opaquely_; |
325 | 258 |
326 gfx::Rect hole_rect_; | |
327 | |
328 bool recompute_hole_; | |
329 | |
330 gfx::Rect invalid_rect_; | |
331 | |
332 // If true the layer is always up to date. | 259 // If true the layer is always up to date. |
333 bool layer_updated_externally_; | 260 bool layer_updated_externally_; |
334 | 261 |
335 float opacity_; | 262 float opacity_; |
336 | 263 |
337 std::string name_; | 264 std::string name_; |
338 | 265 |
339 LayerDelegate* delegate_; | 266 LayerDelegate* delegate_; |
340 | 267 |
341 scoped_ptr<LayerAnimator> animator_; | 268 scoped_ptr<LayerAnimator> animator_; |
342 | 269 |
343 #if defined(USE_WEBKIT_COMPOSITOR) | |
344 WebKit::WebLayer web_layer_; | 270 WebKit::WebLayer web_layer_; |
345 bool web_layer_is_accelerated_; | 271 bool web_layer_is_accelerated_; |
346 bool show_debug_borders_; | 272 bool show_debug_borders_; |
347 #endif | |
348 | 273 |
349 DISALLOW_COPY_AND_ASSIGN(Layer); | 274 DISALLOW_COPY_AND_ASSIGN(Layer); |
350 }; | 275 }; |
351 | 276 |
352 } // namespace ui | 277 } // namespace ui |
353 | 278 |
354 #endif // UI_GFX_COMPOSITOR_LAYER_H_ | 279 #endif // UI_GFX_COMPOSITOR_LAYER_H_ |
OLD | NEW |