[chromium] Cleanup scissor rect computation/use with damage
[WebKit-https.git] / Source / WebCore / platform / graphics / chromium / cc / CCRenderSurface.h
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
27 #ifndef CCRenderSurface_h
28 #define CCRenderSurface_h
29
30 #if USE(ACCELERATED_COMPOSITING)
31
32 #include "FloatRect.h"
33 #include "IntRect.h"
34 #include "TextureManager.h"
35 #include "cc/CCLayerQuad.h"
36 #include <public/WebFilterOperations.h>
37 #include <public/WebTransformationMatrix.h>
38 #include <wtf/Noncopyable.h>
39
40 namespace WebCore {
41
42 class CCDamageTracker;
43 class CCQuadCuller;
44 class CCSharedQuadState;
45 class CCLayerImpl;
46 class LayerRendererChromium;
47 class ManagedTexture;
48
49 class CCRenderSurface {
50     WTF_MAKE_NONCOPYABLE(CCRenderSurface);
51 public:
52     explicit CCRenderSurface(CCLayerImpl*);
53     ~CCRenderSurface();
54
55     bool prepareContentsTexture(LayerRendererChromium*);
56     void releaseContentsTexture();
57     bool hasValidContentsTexture() const;
58
59     bool prepareBackgroundTexture(LayerRendererChromium*);
60     void releaseBackgroundTexture();
61     bool hasValidBackgroundTexture() const;
62
63     String name() const;
64     void dumpSurface(TextStream&, int indent) const;
65
66     FloatPoint contentRectCenter() const { return FloatRect(m_contentRect).center(); }
67
68     // Returns the rect that encloses the RenderSurface including any reflection.
69     FloatRect drawableContentRect() const;
70
71     float drawOpacity() const { return m_drawOpacity; }
72     void setDrawOpacity(float opacity) { m_drawOpacity = opacity; }
73
74     void setFilters(const WebKit::WebFilterOperations& filters) { m_filters = filters; }
75     const WebKit::WebFilterOperations& filters() const { return m_filters; }
76
77     void setBackgroundFilters(const WebKit::WebFilterOperations& filters) { m_backgroundFilters = filters; }
78     const WebKit::WebFilterOperations& backgroundFilters() const { return m_backgroundFilters; }
79
80     void setNearestAncestorThatMovesPixels(CCRenderSurface* surface) { m_nearestAncestorThatMovesPixels = surface; }
81     const CCRenderSurface* nearestAncestorThatMovesPixels() const { return m_nearestAncestorThatMovesPixels; }
82
83     bool drawOpacityIsAnimating() const { return m_drawOpacityIsAnimating; }
84     void setDrawOpacityIsAnimating(bool drawOpacityIsAnimating) { m_drawOpacityIsAnimating = drawOpacityIsAnimating; }
85
86     void setDrawTransform(const WebKit::WebTransformationMatrix& drawTransform) { m_drawTransform = drawTransform; }
87     const WebKit::WebTransformationMatrix& drawTransform() const { return m_drawTransform; }
88
89     void setOriginTransform(const WebKit::WebTransformationMatrix& originTransform) { m_originTransform = originTransform; }
90     const WebKit::WebTransformationMatrix& originTransform() const { return m_originTransform; }
91
92     void setScreenSpaceTransform(const WebKit::WebTransformationMatrix& screenSpaceTransform) { m_screenSpaceTransform = screenSpaceTransform; }
93     const WebKit::WebTransformationMatrix& screenSpaceTransform() const { return m_screenSpaceTransform; }
94
95     void setReplicaDrawTransform(const WebKit::WebTransformationMatrix& replicaDrawTransform) { m_replicaDrawTransform = replicaDrawTransform; }
96     const WebKit::WebTransformationMatrix& replicaDrawTransform() const { return m_replicaDrawTransform; }
97
98     void setReplicaOriginTransform(const WebKit::WebTransformationMatrix& replicaOriginTransform) { m_replicaOriginTransform = replicaOriginTransform; }
99     const WebKit::WebTransformationMatrix& replicaOriginTransform() const { return m_replicaOriginTransform; }
100
101     void setReplicaScreenSpaceTransform(const WebKit::WebTransformationMatrix& replicaScreenSpaceTransform) { m_replicaScreenSpaceTransform = replicaScreenSpaceTransform; }
102     const WebKit::WebTransformationMatrix& replicaScreenSpaceTransform() const { return m_replicaScreenSpaceTransform; }
103
104     bool targetSurfaceTransformsAreAnimating() const { return m_targetSurfaceTransformsAreAnimating; }
105     void setTargetSurfaceTransformsAreAnimating(bool animating) { m_targetSurfaceTransformsAreAnimating = animating; }
106     bool screenSpaceTransformsAreAnimating() const { return m_screenSpaceTransformsAreAnimating; }
107     void setScreenSpaceTransformsAreAnimating(bool animating) { m_screenSpaceTransformsAreAnimating = animating; }
108
109     // Usage: this clipRect should not be used if one of the two conditions is true: (a) clipRect() is empty, or (b) owningLayer->parent()->usesLayerClipping() is false.
110     void setClipRect(const IntRect&);
111     const IntRect& clipRect() const { return m_clipRect; }
112
113     void setScissorRect(const IntRect& scissorRect) { m_scissorRect = scissorRect; }
114     const IntRect& scissorRect() const { return m_scissorRect; }
115
116     void setContentRect(const IntRect&);
117     const IntRect& contentRect() const { return m_contentRect; }
118
119     void clearLayerList() { m_layerList.clear(); }
120     Vector<CCLayerImpl*>& layerList() { return m_layerList; }
121
122     ManagedTexture* contentsTexture() const { return m_contentsTexture.get(); }
123     ManagedTexture* backgroundTexture() const { return m_backgroundTexture.get(); }
124
125     int owningLayerId() const;
126     CCRenderSurface* targetRenderSurface() const;
127
128     bool hasReplica() const;
129
130     bool hasMask() const;
131     bool replicaHasMask() const;
132
133     void resetPropertyChangedFlag() { m_surfacePropertyChanged = false; }
134     bool surfacePropertyChanged() const;
135     bool surfacePropertyChangedOnlyFromDescendant() const;
136
137     CCDamageTracker* damageTracker() const { return m_damageTracker.get(); }
138
139     PassOwnPtr<CCSharedQuadState> createSharedQuadState() const;
140     PassOwnPtr<CCSharedQuadState> createReplicaSharedQuadState() const;
141
142     void appendQuads(CCQuadCuller&, CCSharedQuadState*, bool forReplica);
143     FloatRect computeRootScissorRectInCurrentSurface(const FloatRect& rootScissorRect) const;
144
145 private:
146     CCLayerImpl* m_owningLayer;
147
148     // Uses this surface's space.
149     IntRect m_contentRect;
150     bool m_surfacePropertyChanged;
151
152     OwnPtr<ManagedTexture> m_contentsTexture;
153     OwnPtr<ManagedTexture> m_backgroundTexture;
154
155     float m_drawOpacity;
156     bool m_drawOpacityIsAnimating;
157     WebKit::WebTransformationMatrix m_drawTransform;
158     WebKit::WebTransformationMatrix m_originTransform;
159     WebKit::WebTransformationMatrix m_screenSpaceTransform;
160     WebKit::WebTransformationMatrix m_replicaDrawTransform;
161     WebKit::WebTransformationMatrix m_replicaOriginTransform;
162     WebKit::WebTransformationMatrix m_replicaScreenSpaceTransform;
163     bool m_targetSurfaceTransformsAreAnimating;
164     bool m_screenSpaceTransformsAreAnimating;
165     WebKit::WebFilterOperations m_filters;
166     WebKit::WebFilterOperations m_backgroundFilters;
167
168     // Uses the space of the surface's target surface.
169     IntRect m_clipRect;
170
171     // During drawing, identifies the region outside of which nothing should be drawn.
172     // Uses the space of the surface's target surface.
173     IntRect m_scissorRect;
174
175     Vector<CCLayerImpl*> m_layerList;
176
177     // The nearest ancestor target surface that will contain the contents of this surface, and that is going
178     // to move pixels within the surface (such as with a blur). This can point to itself.
179     CCRenderSurface* m_nearestAncestorThatMovesPixels;
180
181     OwnPtr<CCDamageTracker> m_damageTracker;
182
183     // For CCLayerIteratorActions
184     int m_targetRenderSurfaceLayerIndexHistory;
185     int m_currentLayerIndexHistory;
186     friend struct CCLayerIteratorActions;
187 };
188
189 }
190 #endif // USE(ACCELERATED_COMPOSITING)
191
192 #endif