Chromium Code Reviews| Index: cc/layer_impl.h |
| diff --git a/cc/layer_impl.h b/cc/layer_impl.h |
| index 3e72d20a70220a488d3b675637e3892bbd49d503..96c8025c896b702ebafbe65b191cd4763928146d 100644 |
| --- a/cc/layer_impl.h |
| +++ b/cc/layer_impl.h |
| @@ -36,6 +36,58 @@ class Layer; |
| struct AppendQuadsData; |
| +// Container for properties that layers need to compute before they can be drawn. |
| +struct DrawProperties { |
|
danakj
2012/12/01 03:51:40
If the struct has all the same things on both thre
|
| + DrawProperties() |
| + : drawOpacity(0) |
| + , drawOpacityIsAnimating(false) |
| + , drawTransformIsAnimating(false) |
| + , screenSpaceTransformIsAnimating(false) |
| + , isClipped(false) |
| + , renderTarget(0) |
| + { |
| + } |
| + |
| + // Transforms objects from content space to target surface space, where |
| + // this layer would be drawn. |
| + gfx::Transform drawTransform; |
| + |
| + // Transforms objects from content space to screen space (viewport space). |
| + gfx::Transform screenSpaceTransform; |
| + |
| + // drawOpacity may be different than layer's opacity, particularly in the |
| + // case where a renderSurface re-parents the layer's opacity. |
| + float drawOpacity; |
| + |
| + // XXXIsAnimating flags are used to indicate whether the drawProperties |
| + // are actually meaningful on the main thread. When the properties are |
| + // animating, the main thread may not have the same values that are used |
| + // to draw. |
| + bool drawOpacityIsAnimating; |
| + bool drawTransformIsAnimating; |
| + bool screenSpaceTransformIsAnimating; |
| + |
| + // True if the layer needs to be clipped by clipRect. |
| + bool isClipped; |
| + |
| + // The layer whose coordinate space this layer draws into. This can be |
| + // either the same layer (m_drawProperties.renderTarget == this) or an |
| + // ancestor of this layer. |
| + LayerImpl* renderTarget; |
| + |
| + // Uses layer's content space. |
| + gfx::Rect visibleContentRect; |
| + |
| + // In target surface space, the rect that encloses the clipped, drawable |
| + // content of the layer. |
| + gfx::Rect drawableContentRect; |
| + |
| + // In target surface space, the original rect that clipped this |
| + // layer. This value is used to avoid unnecessarily changing GL scissor |
| + // state. |
| + gfx::Rect clipRect; |
| +}; |
| + |
| class CC_EXPORT LayerImpl : public LayerAnimationControllerClient { |
| public: |
| typedef ScopedPtrVector<LayerImpl> LayerList; |
| @@ -162,15 +214,15 @@ public: |
| void createRenderSurface(); |
| void clearRenderSurface() { m_renderSurface.reset(); } |
| - float drawOpacity() const { return m_drawOpacity; } |
| - void setDrawOpacity(float opacity) { m_drawOpacity = opacity; } |
| + float drawOpacity() const { return m_drawProperties.drawOpacity; } |
|
danakj
2012/12/01 03:51:40
I guess the plan is for these accessors to go away
|
| + void setDrawOpacity(float opacity) { m_drawProperties.drawOpacity = opacity; } |
| - bool drawOpacityIsAnimating() const { return m_drawOpacityIsAnimating; } |
| - void setDrawOpacityIsAnimating(bool drawOpacityIsAnimating) { m_drawOpacityIsAnimating = drawOpacityIsAnimating; } |
| + bool drawOpacityIsAnimating() const { return m_drawProperties.drawOpacityIsAnimating; } |
| + void setDrawOpacityIsAnimating(bool drawOpacityIsAnimating) { m_drawProperties.drawOpacityIsAnimating = drawOpacityIsAnimating; } |
| - void setRenderTarget(LayerImpl* target) { m_renderTarget = target; } |
| - LayerImpl* renderTarget() { DCHECK(!m_renderTarget || m_renderTarget->renderSurface()); return m_renderTarget; } |
| - const LayerImpl* renderTarget() const { DCHECK(!m_renderTarget || m_renderTarget->renderSurface()); return m_renderTarget; } |
| + void setRenderTarget(LayerImpl* target) { m_drawProperties.renderTarget = target; } |
| + LayerImpl* renderTarget() { DCHECK(!m_drawProperties.renderTarget || m_drawProperties.renderTarget->renderSurface()); return m_drawProperties.renderTarget; } |
| + const LayerImpl* renderTarget() const { DCHECK(!m_drawProperties.renderTarget || m_drawProperties.renderTarget->renderSurface()); return m_drawProperties.renderTarget; } |
| // The client should be responsible for setting bounds, contentBounds and |
| // contentsScale to appropriate values. LayerImpl doesn't calculate any of |
| @@ -226,8 +278,8 @@ public: |
| InputHandlerClient::ScrollStatus tryScroll(const gfx::PointF& screenSpacePoint, InputHandlerClient::ScrollInputType) const; |
| - const gfx::Rect& visibleContentRect() const { return m_visibleContentRect; } |
| - void setVisibleContentRect(const gfx::Rect& visibleContentRect) { m_visibleContentRect = visibleContentRect; } |
| + const gfx::Rect& visibleContentRect() const { return m_drawProperties.visibleContentRect; } |
| + void setVisibleContentRect(const gfx::Rect& visibleContentRect) { m_drawProperties.visibleContentRect = visibleContentRect; } |
| bool doubleSided() const { return m_doubleSided; } |
| void setDoubleSided(bool); |
| @@ -235,24 +287,24 @@ public: |
| void setTransform(const gfx::Transform&); |
| bool transformIsAnimating() const; |
| - const gfx::Transform& drawTransform() const { return m_drawTransform; } |
| - void setDrawTransform(const gfx::Transform& matrix) { m_drawTransform = matrix; } |
| - const gfx::Transform& screenSpaceTransform() const { return m_screenSpaceTransform; } |
| - void setScreenSpaceTransform(const gfx::Transform& matrix) { m_screenSpaceTransform = matrix; } |
| + const gfx::Transform& drawTransform() const { return m_drawProperties.drawTransform; } |
| + void setDrawTransform(const gfx::Transform& matrix) { m_drawProperties.drawTransform = matrix; } |
| + const gfx::Transform& screenSpaceTransform() const { return m_drawProperties.screenSpaceTransform; } |
| + void setScreenSpaceTransform(const gfx::Transform& matrix) { m_drawProperties.screenSpaceTransform = matrix; } |
| - bool drawTransformIsAnimating() const { return m_drawTransformIsAnimating; } |
| - void setDrawTransformIsAnimating(bool animating) { m_drawTransformIsAnimating = animating; } |
| - bool screenSpaceTransformIsAnimating() const { return m_screenSpaceTransformIsAnimating; } |
| - void setScreenSpaceTransformIsAnimating(bool animating) { m_screenSpaceTransformIsAnimating = animating; } |
| + bool drawTransformIsAnimating() const { return m_drawProperties.drawTransformIsAnimating; } |
| + void setDrawTransformIsAnimating(bool animating) { m_drawProperties.drawTransformIsAnimating = animating; } |
| + bool screenSpaceTransformIsAnimating() const { return m_drawProperties.screenSpaceTransformIsAnimating; } |
| + void setScreenSpaceTransformIsAnimating(bool animating) { m_drawProperties.screenSpaceTransformIsAnimating = animating; } |
| - bool isClipped() const { return m_isClipped; } |
| - void setIsClipped(bool isClipped) { m_isClipped = isClipped; } |
| + bool isClipped() const { return m_drawProperties.isClipped; } |
| + void setIsClipped(bool isClipped) { m_drawProperties.isClipped = isClipped; } |
| - const gfx::Rect& clipRect() const { return m_clipRect; } |
| - void setClipRect(const gfx::Rect& clipRect) { m_clipRect = clipRect; } |
| + const gfx::Rect& clipRect() const { return m_drawProperties.clipRect; } |
| + void setClipRect(const gfx::Rect& clipRect) { m_drawProperties.clipRect = clipRect; } |
| - const gfx::Rect& drawableContentRect() const { return m_drawableContentRect; } |
| - void setDrawableContentRect(const gfx::Rect& rect) { m_drawableContentRect = rect; } |
| + const gfx::Rect& drawableContentRect() const { return m_drawProperties.drawableContentRect; } |
| + void setDrawableContentRect(const gfx::Rect& rect) { m_drawProperties.drawableContentRect = rect; } |
| const gfx::RectF& updateRect() const { return m_updateRect; } |
| void setUpdateRect(const gfx::RectF& updateRect) { m_updateRect = updateRect; } |
| @@ -354,8 +406,6 @@ private: |
| // For layers that do not own a surface this flag acts as m_layerPropertyChanged. |
| bool m_layerSurfacePropertyChanged; |
| - // Uses layer's content space. |
| - gfx::Rect m_visibleContentRect; |
| bool m_masksToBounds; |
| bool m_contentsOpaque; |
| float m_opacity; |
| @@ -380,16 +430,9 @@ private: |
| gfx::Vector2d m_maxScrollOffset; |
| gfx::Transform m_implTransform; |
| - // The layer whose coordinate space this layer draws into. This can be |
| - // either the same layer (m_renderTarget == this) or an ancestor of this |
| - // layer. |
| - LayerImpl* m_renderTarget; |
| - |
| // The global depth value of the center of the layer. This value is used |
| // to sort layers from back to front. |
| float m_drawDepth; |
| - float m_drawOpacity; |
| - bool m_drawOpacityIsAnimating; |
| // Debug layer name. |
| std::string m_debugName; |
| @@ -398,11 +441,6 @@ private: |
| WebKit::WebFilterOperations m_backgroundFilters; |
| SkImageFilter* m_filter; |
| - gfx::Transform m_drawTransform; |
| - gfx::Transform m_screenSpaceTransform; |
| - bool m_drawTransformIsAnimating; |
| - bool m_screenSpaceTransformIsAnimating; |
| - |
| #ifndef NDEBUG |
| bool m_betweenWillDrawAndDidDraw; |
| #endif |
| @@ -411,13 +449,6 @@ private: |
| // will render to this surface. |
| scoped_ptr<RenderSurfaceImpl> m_renderSurface; |
| - // Uses target surface's space. |
| - gfx::Rect m_drawableContentRect; |
| - gfx::Rect m_clipRect; |
| - |
| - // True if the layer is clipped by m_clipRect. |
| - bool m_isClipped; |
| - |
| // Rect indicating what was repainted/updated during update. |
| // Note that plugin layers bypass this and leave it empty. |
| // Uses layer's content space. |
| @@ -429,6 +460,10 @@ private: |
| // Manages scrollbars for this layer |
| scoped_ptr<ScrollbarAnimationController> m_scrollbarAnimationController; |
| + // Group of properties that need to be computed based on the layer tree |
| + // hierarchy before layers can be drawn. |
| + DrawProperties m_drawProperties; |
| + |
| DISALLOW_COPY_AND_ASSIGN(LayerImpl); |
| }; |