// Copyright 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CC_RENDER_SURFACE_H_ #define CC_RENDER_SURFACE_H_ #include "base/basictypes.h" #include "base/memory/ref_counted.h" #include "ui/gfx/rect.h" #include "ui/gfx/rect_f.h" #include #include #include "cc/cc_export.h" namespace cc { class Layer; class CC_EXPORT RenderSurface { public: explicit RenderSurface(Layer*); ~RenderSurface(); // Returns the rect that encloses the RenderSurfaceImpl including any reflection. gfx::RectF drawableContentRect() const; const gfx::Rect& contentRect() const { return m_contentRect; } void setContentRect(const gfx::Rect& contentRect) { m_contentRect = contentRect; } float drawOpacity() const { return m_drawOpacity; } void setDrawOpacity(float drawOpacity) { m_drawOpacity = drawOpacity; } bool drawOpacityIsAnimating() const { return m_drawOpacityIsAnimating; } void setDrawOpacityIsAnimating(bool drawOpacityIsAnimating) { m_drawOpacityIsAnimating = drawOpacityIsAnimating; } // This goes from content space with the origin in the center of the rect being transformed to the target space with the origin in the top left of the // rect being transformed. Position the rect so that the origin is in the center of it before applying this transform. const WebKit::WebTransformationMatrix& drawTransform() const { return m_drawTransform; } void setDrawTransform(const WebKit::WebTransformationMatrix& drawTransform) { m_drawTransform = drawTransform; } const WebKit::WebTransformationMatrix& screenSpaceTransform() const { return m_screenSpaceTransform; } void setScreenSpaceTransform(const WebKit::WebTransformationMatrix& screenSpaceTransform) { m_screenSpaceTransform = screenSpaceTransform; } const WebKit::WebTransformationMatrix& replicaDrawTransform() const { return m_replicaDrawTransform; } void setReplicaDrawTransform(const WebKit::WebTransformationMatrix& replicaDrawTransform) { m_replicaDrawTransform = replicaDrawTransform; } const WebKit::WebTransformationMatrix& replicaScreenSpaceTransform() const { return m_replicaScreenSpaceTransform; } void setReplicaScreenSpaceTransform(const WebKit::WebTransformationMatrix& replicaScreenSpaceTransform) { m_replicaScreenSpaceTransform = replicaScreenSpaceTransform; } bool targetSurfaceTransformsAreAnimating() const { return m_targetSurfaceTransformsAreAnimating; } void setTargetSurfaceTransformsAreAnimating(bool animating) { m_targetSurfaceTransformsAreAnimating = animating; } bool screenSpaceTransformsAreAnimating() const { return m_screenSpaceTransformsAreAnimating; } void setScreenSpaceTransformsAreAnimating(bool animating) { m_screenSpaceTransformsAreAnimating = animating; } const gfx::Rect& clipRect() const { return m_clipRect; } void setClipRect(const gfx::Rect& clipRect) { m_clipRect = clipRect; } typedef std::vector > LayerList; LayerList& layerList() { return m_layerList; } // A no-op since DelegatedRendererLayers on the main thread don't have any // RenderPasses so they can't contribute to a surface. void addContributingDelegatedRenderPassLayer(Layer*) { } void clearLayerLists() { m_layerList.clear(); } void setNearestAncestorThatMovesPixels(RenderSurface* surface) { m_nearestAncestorThatMovesPixels = surface; } const RenderSurface* nearestAncestorThatMovesPixels() const { return m_nearestAncestorThatMovesPixels; } private: friend struct LayerIteratorActions; Layer* m_owningLayer; // Uses this surface's space. gfx::Rect m_contentRect; float m_drawOpacity; bool m_drawOpacityIsAnimating; WebKit::WebTransformationMatrix m_drawTransform; WebKit::WebTransformationMatrix m_screenSpaceTransform; WebKit::WebTransformationMatrix m_replicaDrawTransform; WebKit::WebTransformationMatrix m_replicaScreenSpaceTransform; bool m_targetSurfaceTransformsAreAnimating; bool m_screenSpaceTransformsAreAnimating; // Uses the space of the surface's target surface. gfx::Rect m_clipRect; LayerList m_layerList; // The nearest ancestor target surface that will contain the contents of this surface, and that is going // to move pixels within the surface (such as with a blur). This can point to itself. RenderSurface* m_nearestAncestorThatMovesPixels; // For LayerIteratorActions int m_targetRenderSurfaceLayerIndexHistory; int m_currentLayerIndexHistory; DISALLOW_COPY_AND_ASSIGN(RenderSurface); }; } #endif // CC_RENDER_SURFACE_H_