1 /* 2 * Copyright (C) 2010 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 are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 32 #ifndef LayerChromium_h 33 #define LayerChromium_h 34 35 #if USE(ACCELERATED_COMPOSITING) 36 37 #include "FloatPoint.h" 38 #include "GraphicsContext.h" 39 #include "GraphicsLayerChromium.h" 40 #include "PlatformString.h" 41 #include "ProgramBinding.h" 42 #include "RenderSurfaceChromium.h" 43 #include "ShaderChromium.h" 44 #include "TransformationMatrix.h" 45 46 #include <wtf/OwnPtr.h> 47 #include <wtf/PassRefPtr.h> 48 #include <wtf/RefCounted.h> 49 #include <wtf/Vector.h> 50 #include <wtf/text/StringHash.h> 51 #include <wtf/text/WTFString.h> 52 53 namespace WebCore { 54 55 class CCLayerImpl; 56 class GraphicsContext3D; 57 class LayerRendererChromium; 58 59 // Base class for composited layers. Special layer types are derived from 60 // this class. 61 class LayerChromium : public RefCounted<LayerChromium> { 62 friend class LayerTilerChromium; 63 public: 64 static PassRefPtr<LayerChromium> create(GraphicsLayerChromium* owner = 0); 65 66 virtual ~LayerChromium(); 67 68 const LayerChromium* rootLayer() const; 69 LayerChromium* superlayer() const; 70 void addSublayer(PassRefPtr<LayerChromium>); 71 void insertSublayer(PassRefPtr<LayerChromium>, size_t index); 72 void replaceSublayer(LayerChromium* reference, PassRefPtr<LayerChromium> newLayer); 73 void removeFromSuperlayer(); 74 void removeAllSublayers(); 75 void setSublayers(const Vector<RefPtr<LayerChromium> >&); 76 const Vector<RefPtr<LayerChromium> >& getSublayers() const { return m_sublayers; } 77 78 void setAnchorPoint(const FloatPoint& anchorPoint) { m_anchorPoint = anchorPoint; setNeedsCommit(); } 79 FloatPoint anchorPoint() const { return m_anchorPoint; } 80 81 void setAnchorPointZ(float anchorPointZ) { m_anchorPointZ = anchorPointZ; setNeedsCommit(); } 82 float anchorPointZ() const { return m_anchorPointZ; } 83 84 void setBackgroundColor(const Color& color) { m_backgroundColor = color; setNeedsCommit(); } 85 Color backgroundColor() const { return m_backgroundColor; } 86 87 void setBounds(const IntSize&); 88 const IntSize& bounds() const { return m_bounds; } 89 90 void setClearsContext(bool clears) { m_clearsContext = clears; setNeedsCommit(); } 91 bool clearsContext() const { return m_clearsContext; } 92 93 void setFrame(const FloatRect&); 94 FloatRect frame() const { return m_frame; } 95 96 void setHidden(bool hidden) { m_hidden = hidden; setNeedsCommit(); } 97 bool isHidden() const { return m_hidden; } 98 99 void setMasksToBounds(bool masksToBounds) { m_masksToBounds = masksToBounds; } 100 bool masksToBounds() const { return m_masksToBounds; } 101 102 void setName(const String&); 103 const String& name() const { return m_name; } 104 105 void setMaskLayer(LayerChromium* maskLayer) { m_maskLayer = maskLayer; } 106 CCLayerImpl* maskDrawLayer() const { return m_maskLayer ? m_maskLayer->ccLayerImpl() : 0; } 107 LayerChromium* maskLayer() const { return m_maskLayer.get(); } 108 109 void setNeedsDisplay(const FloatRect& dirtyRect); 110 void setNeedsDisplay(); 111 virtual void invalidateRect(const FloatRect& dirtyRect) {} 112 const FloatRect& dirtyRect() const { return m_dirtyRect; } 113 void resetNeedsDisplay(); 114 115 void setNeedsDisplayOnBoundsChange(bool needsDisplay) { m_needsDisplayOnBoundsChange = needsDisplay; } 116 117 void setOpacity(float opacity) { m_opacity = opacity; setNeedsCommit(); } 118 float opacity() const { return m_opacity; } 119 120 void setOpaque(bool opaque) { m_opaque = opaque; setNeedsCommit(); } 121 bool opaque() const { return m_opaque; } 122 123 void setPosition(const FloatPoint& position) { m_position = position; setNeedsCommit(); } 124 FloatPoint position() const { return m_position; } 125 126 void setZPosition(float zPosition) { m_zPosition = zPosition; setNeedsCommit(); } 127 float zPosition() const { return m_zPosition; } 128 129 void setSublayerTransform(const TransformationMatrix& transform) { m_sublayerTransform = transform; setNeedsCommit(); } 130 const TransformationMatrix& sublayerTransform() const { return m_sublayerTransform; } 131 132 void setTransform(const TransformationMatrix& transform) { m_transform = transform; setNeedsCommit(); } 133 const TransformationMatrix& transform() const { return m_transform; } 134 135 bool doubleSided() const { return m_doubleSided; } 136 void setDoubleSided(bool doubleSided) { m_doubleSided = doubleSided; setNeedsCommit(); } 137 138 // FIXME: This setting is currently ignored. 139 void setGeometryFlipped(bool flipped) { m_geometryFlipped = flipped; setNeedsCommit(); } 140 bool geometryFlipped() const { return m_geometryFlipped; } 141 142 bool preserves3D() { return m_owner && m_owner->preserves3D(); } 143 144 // Derived types must override this method if they need to react to a change 145 // in the LayerRendererChromium. 146 virtual void setLayerRenderer(LayerRendererChromium*); 147 148 void setOwner(GraphicsLayerChromium* owner) { m_owner = owner; } 149 150 void setReplicaLayer(LayerChromium* layer) { m_replicaLayer = layer; } 151 LayerChromium* replicaLayer() { return m_replicaLayer; } 152 153 // These methods typically need to be overwritten by derived classes. 154 virtual bool drawsContent() const { return false; } 155 virtual void paintContentsIfDirty(const IntRect&) { } 156 virtual void paintContentsIfDirty() { } 157 virtual void updateCompositorResources() { } 158 virtual void setIsMask(bool) {} 159 virtual void unreserveContentsTexture() { } 160 virtual void bindContentsTexture() { } 161 virtual void draw(const IntRect&) { } 162 163 // These exists just for debugging (via drawDebugBorder()). 164 void setBorderColor(const Color&); 165 166 #ifndef NDEBUG 167 int debugID() const { return m_debugID; } 168 #endif 169 170 void drawDebugBorder(); 171 String layerTreeAsText() const; 172 173 void setBorderWidth(float); 174 175 // Everything from here down in the public section will move to CCLayerImpl. 176 CCLayerImpl* ccLayerImpl(); 177 void createCCLayerImplIfNeeded(); 178 179 static void drawTexturedQuad(GraphicsContext3D*, const TransformationMatrix& projectionMatrix, const TransformationMatrix& layerMatrix, 180 float width, float height, float opacity, 181 int matrixLocation, int alphaLocation); 182 183 virtual void pushPropertiesTo(CCLayerImpl*); 184 185 // Begin calls that forward to the CCLayerImpl. 186 LayerRendererChromium* layerRenderer() const; 187 // End calls that forward to the CCLayerImpl. 188 189 typedef ProgramBinding<VertexShaderPos, FragmentShaderColor> BorderProgram; 190 protected: 191 GraphicsLayerChromium* m_owner; 192 explicit LayerChromium(GraphicsLayerChromium* owner); 193 194 // This is called to clean up resources being held in the same context as 195 // layerRendererContext(). Subclasses should override this method if they 196 // hold context-dependent resources such as textures. 197 virtual void cleanupResources(); 198 199 GraphicsContext3D* layerRendererContext() const; 200 201 static void toGLMatrix(float*, const TransformationMatrix&); 202 203 void dumpLayer(TextStream&, int indent) const; 204 205 virtual const char* layerTypeAsString() const { return "LayerChromium"; } 206 virtual void dumpLayerProperties(TextStream&, int indent) const; 207 208 FloatRect m_dirtyRect; 209 bool m_contentsDirty; 210 211 RefPtr<LayerChromium> m_maskLayer; 212 213 // All layer shaders share the same attribute locations for the vertex positions 214 // and texture coordinates. This allows switching shaders without rebinding attribute 215 // arrays. 216 static const unsigned s_positionAttribLocation; 217 static const unsigned s_texCoordAttribLocation; 218 219 // Constructs a CCLayerImpl of the correct runtime type for this LayerChromium type. 220 virtual PassRefPtr<CCLayerImpl> createCCLayerImpl(); 221 222 // For now, the LayerChromium directly owns its CCLayerImpl. 223 RefPtr<CCLayerImpl> m_ccLayerImpl; 224 private: 225 void setNeedsCommit(); 226 227 void setSuperlayer(LayerChromium* superlayer) { m_superlayer = superlayer; } 228 229 size_t numSublayers() const 230 { 231 return m_sublayers.size(); 232 } 233 234 // Returns the index of the sublayer or -1 if not found. 235 int indexOfSublayer(const LayerChromium*); 236 237 // This should only be called from removeFromSuperlayer. 238 void removeSublayer(LayerChromium*); 239 240 Vector<RefPtr<LayerChromium> > m_sublayers; 241 LayerChromium* m_superlayer; 242 243 RefPtr<LayerRendererChromium> m_layerRenderer; 244 245 #ifndef NDEBUG 246 int m_debugID; 247 #endif 248 249 // Layer properties. 250 IntSize m_bounds; 251 FloatPoint m_position; 252 FloatPoint m_anchorPoint; 253 Color m_backgroundColor; 254 Color m_debugBorderColor; 255 float m_debugBorderWidth; 256 float m_opacity; 257 float m_zPosition; 258 float m_anchorPointZ; 259 bool m_clearsContext; 260 bool m_hidden; 261 bool m_masksToBounds; 262 bool m_opaque; 263 bool m_geometryFlipped; 264 bool m_needsDisplayOnBoundsChange; 265 bool m_doubleSided; 266 267 TransformationMatrix m_transform; 268 TransformationMatrix m_sublayerTransform; 269 270 FloatRect m_frame; 271 272 // Replica layer used for reflections. 273 LayerChromium* m_replicaLayer; 274 275 String m_name; 276 }; 277 278 } 279 #endif // USE(ACCELERATED_COMPOSITING) 280 281 #endif 282