summaryrefslogtreecommitdiffstats
path: root/WebCore/rendering/RenderLayerCompositor.h
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/rendering/RenderLayerCompositor.h')
-rw-r--r--WebCore/rendering/RenderLayerCompositor.h64
1 files changed, 52 insertions, 12 deletions
diff --git a/WebCore/rendering/RenderLayerCompositor.h b/WebCore/rendering/RenderLayerCompositor.h
index 76cb35f..02929dc 100644
--- a/WebCore/rendering/RenderLayerCompositor.h
+++ b/WebCore/rendering/RenderLayerCompositor.h
@@ -27,12 +27,16 @@
#define RenderLayerCompositor_h
#include "RenderLayer.h"
+#include "RenderLayerBacking.h"
namespace WebCore {
#define PROFILE_LAYER_REBUILD 0
class GraphicsLayer;
+#if ENABLE(VIDEO)
+class RenderVideo;
+#endif
// RenderLayerCompositor manages the hierarchy of
// composited RenderLayers. It determines which RenderLayers
@@ -53,11 +57,24 @@ public:
// This will make a compositing layer at the root automatically, and hook up to
// the native view/window system.
void enableCompositingMode(bool enable = true);
-
- void setCompositingLayersNeedUpdate(bool needUpdate = true);
- bool compositingLayersNeedUpdate() const { return m_compositingLayersNeedUpdate; }
-
- void scheduleViewUpdate();
+
+ // Returns true if the accelerated compositing is enabled
+ bool hasAcceleratedCompositing() const { return m_hasAcceleratedCompositing; }
+
+ // Copy the acceleratedCompositingEnabledFlag from Settings
+ void cacheAcceleratedCompositingEnabledFlag();
+
+ // Called when the layer hierarchy needs to be updated (compositing layers have been
+ // created, destroyed or re-parented).
+ void setCompositingLayersNeedRebuild(bool needRebuild = true);
+ bool compositingLayersNeedRebuild() const { return m_compositingLayersNeedRebuild; }
+
+ // Controls whether or not to consult geometry when deciding which layers need
+ // to be composited. Defaults to true.
+ void setCompositingConsultsOverlap(bool b) { m_compositingConsultsOverlap = b; }
+ bool compositingConsultsOverlap() const { return m_compositingConsultsOverlap; }
+
+ void scheduleSync();
// Rebuild the tree of compositing layers
void updateCompositingLayers(RenderLayer* updateRoot = 0);
@@ -66,6 +83,9 @@ public:
enum CompositingChangeRepaint { CompositingChangeRepaintNow, CompositingChangeWillRepaintLater };
bool updateLayerCompositingState(RenderLayer*, CompositingChangeRepaint = CompositingChangeRepaintNow);
+ // Update the geometry for compositing children of compositingAncestor.
+ void updateCompositingDescendantGeometry(RenderLayer* compositingAncestor, RenderLayer* layer, RenderLayerBacking::UpdateDepth);
+
// Whether layer's backing needs a graphics layer to do clipping by an ancestor (non-stacking-context parent with overflow).
bool clippedByAncestor(RenderLayer*) const;
// Whether layer's backing needs a graphics layer to clip z-order children of the given layer.
@@ -75,7 +95,7 @@ public:
bool needsContentsCompositingLayer(const RenderLayer*) const;
// Return the bounding box required for compositing layer and its childern, relative to ancestorLayer.
// If layerBoundingBox is not 0, on return it contains the bounding box of this layer only.
- IntRect calculateCompositedBounds(const RenderLayer* layer, const RenderLayer* ancestorLayer, IntRect* layerBoundingBox = 0);
+ IntRect calculateCompositedBounds(const RenderLayer* layer, const RenderLayer* ancestorLayer);
// Repaint the appropriate layers when the given RenderLayer starts or stops being composited.
void repaintOnCompositingChange(RenderLayer*);
@@ -97,6 +117,13 @@ public:
void willMoveOffscreen();
void updateRootLayerPosition();
+
+ void didStartAcceleratedAnimation();
+
+#if ENABLE(VIDEO)
+ // Use by RenderVideo to ask if it should try to use accelerated compositing.
+ bool canAccelerateVideoRendering(RenderVideo*) const;
+#endif
// Walk the tree looking for layers with 3d transforms. Useful in case you need
// to know if there is non-affine content, e.g. for drawing into an image.
@@ -108,11 +135,19 @@ private:
// Whether the layer has an intrinsic need for compositing layer.
bool requiresCompositingLayer(const RenderLayer*) const;
+ // Make or destroy the backing for this layer; returns true if backing changed.
+ bool updateBacking(RenderLayer*, CompositingChangeRepaint shouldRepaint);
+
// Repaint the given rect (which is layer's coords), and regions of child layers that intersect that rect.
void recursiveRepaintLayerRect(RenderLayer* layer, const IntRect& rect);
- void computeCompositingRequirements(RenderLayer*, struct CompositingState&);
- void rebuildCompositingLayerTree(RenderLayer* layer, struct CompositingState&);
+ typedef HashMap<RenderLayer*, IntRect> OverlapMap;
+ static void addToOverlapMap(OverlapMap&, RenderLayer*, IntRect& layerBounds, bool& boundsComputed);
+ static bool overlapsCompositedLayers(OverlapMap&, const IntRect& layerBounds);
+
+ // Returns true if any layer's compositing changed
+ void computeCompositingRequirements(RenderLayer*, OverlapMap*, struct CompositingState&, bool& layersChanged);
+ void rebuildCompositingLayerTree(RenderLayer* layer, struct CompositingState&, bool updateHierarchy);
// Hook compositing layers together
void setCompositingParent(RenderLayer* childLayer, RenderLayer* parentLayer);
@@ -123,17 +158,22 @@ private:
bool layerHas3DContent(const RenderLayer*) const;
void ensureRootPlatformLayer();
-
+ void destroyRootPlatformLayer();
+
// Whether a running transition or animation enforces the need for a compositing layer.
- static bool requiresCompositingForAnimation(RenderObject*);
- static bool requiresCompositingForTransform(RenderObject*);
+ bool requiresCompositingForAnimation(RenderObject*) const;
+ bool requiresCompositingForTransform(RenderObject*) const;
+ bool requiresCompositingForVideo(RenderObject*) const;
private:
RenderView* m_renderView;
GraphicsLayer* m_rootPlatformLayer;
+ bool m_hasAcceleratedCompositing;
+ bool m_compositingConsultsOverlap;
bool m_compositing;
bool m_rootLayerAttached;
- bool m_compositingLayersNeedUpdate;
+ bool m_compositingLayersNeedRebuild;
+
#if PROFILE_LAYER_REBUILD
int m_rootLayerUpdateCount;
#endif