• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #ifndef CCLayerImpl_h
27 #define CCLayerImpl_h
28 
29 #include "Color.h"
30 #include "FloatRect.h"
31 #include "IntRect.h"
32 #include "TextStream.h"
33 #include "TransformationMatrix.h"
34 #include <wtf/OwnPtr.h>
35 #include <wtf/PassRefPtr.h>
36 #include <wtf/RefCounted.h>
37 #include <wtf/text/WTFString.h>
38 
39 namespace WebCore {
40 
41 class LayerChromium;
42 class LayerRendererChromium;
43 class RenderSurfaceChromium;
44 
45 class CCLayerImpl : public RefCounted<CCLayerImpl> {
46 public:
create(LayerChromium * owner)47     static PassRefPtr<CCLayerImpl> create(LayerChromium* owner)
48     {
49         return adoptRef(new CCLayerImpl(owner));
50     }
51     // When this class gets subclasses, remember to add 'virtual' here.
52     virtual ~CCLayerImpl();
resetOwner()53     void resetOwner() { m_owner = 0; }
owner()54     LayerChromium* owner() const { return m_owner; }
55 
56 #ifndef NDEBUG
debugID()57     int debugID() const { return m_debugID; }
58 #endif
59 
60     CCLayerImpl* superlayer() const;
61     CCLayerImpl* maskLayer() const;
62     CCLayerImpl* replicaLayer() const;
63 
64     virtual void draw(const IntRect& contentRect);
65     virtual void updateCompositorResources();
66     void unreserveContentsTexture();
67     void bindContentsTexture();
68 
69     // Returns true if this layer has content to draw.
70     virtual bool drawsContent() const;
71 
72     // Returns true if any of the layer's descendants has content to draw.
73     bool descendantsDrawsContent();
74 
75     void cleanupResources();
76 
setAnchorPoint(const FloatPoint & anchorPoint)77     void setAnchorPoint(const FloatPoint& anchorPoint) { m_anchorPoint = anchorPoint; }
anchorPoint()78     const FloatPoint& anchorPoint() const { return m_anchorPoint; }
79 
setAnchorPointZ(float anchorPointZ)80     void setAnchorPointZ(float anchorPointZ) { m_anchorPointZ = anchorPointZ; }
anchorPointZ()81     float anchorPointZ() const { return m_anchorPointZ; }
82 
setMasksToBounds(bool masksToBounds)83     void setMasksToBounds(bool masksToBounds) { m_masksToBounds = masksToBounds; }
masksToBounds()84     bool masksToBounds() const { return m_masksToBounds; }
85 
setOpacity(float opacity)86     void setOpacity(float opacity) { m_opacity = opacity; }
opacity()87     float opacity() const { return m_opacity; }
88 
setPosition(const FloatPoint & position)89     void setPosition(const FloatPoint& position) { m_position = position; }
position()90     const FloatPoint& position() const { return m_position; }
91 
setPreserves3D(bool preserves3D)92     void setPreserves3D(bool preserves3D) { m_preserves3D = preserves3D; }
preserves3D()93     bool preserves3D() const { return m_preserves3D; }
94 
setSublayerTransform(const TransformationMatrix & sublayerTransform)95     void setSublayerTransform(const TransformationMatrix& sublayerTransform) { m_sublayerTransform = sublayerTransform; }
sublayerTransform()96     const TransformationMatrix& sublayerTransform() const { return m_sublayerTransform; }
97 
setTransform(const TransformationMatrix & transform)98     void setTransform(const TransformationMatrix& transform) { m_transform = transform; }
transform()99     const TransformationMatrix& transform() const { return m_transform; }
100 
setName(const String & name)101     void setName(const String& name) { m_name = name; }
name()102     const String& name() const { return m_name; }
103 
104     // Debug layer border - visual effect only, do not change geometry/clipping/etc.
setDebugBorderColor(Color c)105     void setDebugBorderColor(Color c) { m_debugBorderColor = c; }
debugBorderColor()106     Color debugBorderColor() const { return m_debugBorderColor; }
setDebugBorderWidth(float width)107     void setDebugBorderWidth(float width) { m_debugBorderWidth = width; }
debugBorderWidth()108     float debugBorderWidth() const { return m_debugBorderWidth; }
109 
110     void drawDebugBorder();
111 
112     void setLayerRenderer(LayerRendererChromium*);
layerRenderer()113     LayerRendererChromium* layerRenderer() const { return m_layerRenderer.get(); }
114 
115     RenderSurfaceChromium* createRenderSurface();
116 
renderSurface()117     RenderSurfaceChromium* renderSurface() const { return m_renderSurface.get(); }
clearRenderSurface()118     void clearRenderSurface() { m_renderSurface.clear(); }
drawDepth()119     float drawDepth() const { return m_drawDepth; }
setDrawDepth(float depth)120     void setDrawDepth(float depth) { m_drawDepth = depth; }
drawOpacity()121     float drawOpacity() const { return m_drawOpacity; }
setDrawOpacity(float opacity)122     void setDrawOpacity(float opacity) { m_drawOpacity = opacity; }
scissorRect()123     const IntRect& scissorRect() const { return m_scissorRect; }
setScissorRect(const IntRect & rect)124     void setScissorRect(const IntRect& rect) { m_scissorRect = rect; }
targetRenderSurface()125     RenderSurfaceChromium* targetRenderSurface() const { return m_targetRenderSurface; }
setTargetRenderSurface(RenderSurfaceChromium * surface)126     void setTargetRenderSurface(RenderSurfaceChromium* surface) { m_targetRenderSurface = surface; }
127 
doubleSided()128     bool doubleSided() const { return m_doubleSided; }
setDoubleSided(bool doubleSided)129     void setDoubleSided(bool doubleSided) { m_doubleSided = doubleSided; }
bounds()130     const IntSize& bounds() const { return m_bounds; }
setBounds(const IntSize & bounds)131     void setBounds(const IntSize& bounds) { m_bounds = bounds; }
132 
133     // Returns the rect containtaining this layer in the current view's coordinate system.
134     const IntRect getDrawRect() const;
135 
drawTransform()136     const TransformationMatrix& drawTransform() const { return m_drawTransform; }
setDrawTransform(const TransformationMatrix & matrix)137     void setDrawTransform(const TransformationMatrix& matrix) { m_drawTransform = matrix; }
drawableContentRect()138     const IntRect& drawableContentRect() const { return m_drawableContentRect; }
setDrawableContentRect(const IntRect & rect)139     void setDrawableContentRect(const IntRect& rect) { m_drawableContentRect = rect; }
140 
141     virtual void dumpLayerProperties(TextStream&, int indent) const;
142 
143 protected:
144     // For now, CCLayers are owned directly by a LayerChromium.
145     LayerChromium* m_owner;
146     explicit CCLayerImpl(LayerChromium*);
147 
148     static void writeIndent(TextStream&, int indent);
149 
150 private:
151     // Properties synchronized from the associated LayerChromium.
152     FloatPoint m_anchorPoint;
153     float m_anchorPointZ;
154     IntSize m_bounds;
155 
156     // Whether the "back" of this layer should draw.
157     bool m_doubleSided;
158 
159     bool m_masksToBounds;
160     float m_opacity;
161     FloatPoint m_position;
162     bool m_preserves3D;
163     TransformationMatrix m_sublayerTransform;
164     TransformationMatrix m_transform;
165 
166     // Properties owned exclusively by this CCLayerImpl.
167     // Debugging.
168 #ifndef NDEBUG
169     int m_debugID;
170 #endif
171 
172     String m_name;
173 
174     // Render surface this layer draws into. This is a surface that can belong
175     // either to this layer (if m_targetRenderSurface == m_renderSurface) or
176     // to an ancestor of this layer. The target render surface determines the
177     // coordinate system the layer's transforms are relative to.
178     RenderSurfaceChromium* m_targetRenderSurface;
179 
180     // The global depth value of the center of the layer. This value is used
181     // to sort layers from back to front.
182     float m_drawDepth;
183     float m_drawOpacity;
184 
185     // Debug borders.
186     Color m_debugBorderColor;
187     float m_debugBorderWidth;
188 
189     TransformationMatrix m_drawTransform;
190 
191     // The scissor rectangle that should be used when this layer is drawn.
192     // Inherited by the parent layer and further restricted if this layer masks
193     // to bounds.
194     IntRect m_scissorRect;
195 
196     // Render surface associated with this layer. The layer and its descendants
197     // will render to this surface.
198     OwnPtr<RenderSurfaceChromium> m_renderSurface;
199 
200     // Hierarchical bounding rect containing the layer and its descendants.
201     IntRect m_drawableContentRect;
202 
203     // Points to the layer renderer that updates and draws this layer.
204     RefPtr<LayerRendererChromium> m_layerRenderer;
205 };
206 
207 }
208 
209 #endif // CCLayerImpl_h
210