18f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian/*
28f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Copyright (C) 2009 Apple Inc. All rights reserved.
38f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *
48f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Redistribution and use in source and binary forms, with or without
58f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * modification, are permitted provided that the following conditions
68f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * are met:
78f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 1. Redistributions of source code must retain the above copyright
88f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *    notice, this list of conditions and the following disclaimer.
98f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 2. Redistributions in binary form must reproduce the above copyright
108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *    notice, this list of conditions and the following disclaimer in the
118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *    documentation and/or other materials provided with the distribution.
128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *
138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian */
258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#ifndef RenderLayerBacking_h
278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#define RenderLayerBacking_h
288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING)
308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "FloatPoint.h"
328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "FloatPoint3D.h"
338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "GraphicsLayer.h"
348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "GraphicsLayerClient.h"
358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "RenderLayer.h"
368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "TransformationMatrix.h"
378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qiannamespace WebCore {
398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianclass KeyframeList;
418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianclass RenderLayerCompositor;
428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
43967717af5423377c967781471ee106e2bb4e11c8Ben Murdochenum CompositingLayerType {
44967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    NormalCompositingLayer, // non-tiled layer with backing store
45967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    TiledCompositingLayer, // tiled layer (always has backing store)
46967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    MediaCompositingLayer, // layer that contains an image, video, webGL or plugin
47967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    ContainerCompositingLayer // layer with no backing store
48967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch};
49967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian// RenderLayerBacking controls the compositing behavior for a single RenderLayer.
518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian// It holds the various GraphicsLayers, and makes decisions about intra-layer rendering
528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian// optimizations.
538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian//
548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian// There is one RenderLayerBacking for each RenderLayer that is composited.
558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
56ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochclass RenderLayerBacking : public GraphicsLayerClient {
57ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WTF_MAKE_NONCOPYABLE(RenderLayerBacking); WTF_MAKE_FAST_ALLOCATED;
588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianpublic:
598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderLayerBacking(RenderLayer*);
608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    ~RenderLayerBacking();
618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
627e6e4dd41950ef98c67ee99be2d67daf563009caShimeng (Simon) Wang#if PLATFORM(ANDROID)
637e6e4dd41950ef98c67ee99be2d67daf563009caShimeng (Simon) Wang    virtual
647e6e4dd41950ef98c67ee99be2d67daf563009caShimeng (Simon) Wang#endif
658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderLayer* owningLayer() const { return m_owningLayer; }
668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    enum UpdateDepth { CompositingChildren, AllDescendants };
68cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    void updateAfterLayout(UpdateDepth, bool isUpdateRoot);
698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Returns true if layer configuration changed.
715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    bool updateGraphicsLayerConfiguration();
720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Update graphics layer position and bounds.
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void updateGraphicsLayerGeometry(); // make private
740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Update contents and clipping structure.
756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    void updateDrawsContent();
768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
77231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    GraphicsLayer* graphicsLayer() const { return m_graphicsLayer.get(); }
788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Layer to clip children
808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool hasClippingLayer() const { return m_clippingLayer != 0; }
81231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    GraphicsLayer* clippingLayer() const { return m_clippingLayer.get(); }
828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Layer to get clipped by ancestor
848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool hasAncestorClippingLayer() const { return m_ancestorClippingLayer != 0; }
85231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    GraphicsLayer* ancestorClippingLayer() const { return m_ancestorClippingLayer.get(); }
868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool hasContentsLayer() const { return m_foregroundLayer != 0; }
88231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    GraphicsLayer* foregroundLayer() const { return m_foregroundLayer.get(); }
898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
90231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    bool hasMaskLayer() const { return m_maskLayer != 0; }
91231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
92231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    GraphicsLayer* parentForSublayers() const { return m_clippingLayer ? m_clippingLayer.get() : m_graphicsLayer.get(); }
93231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    GraphicsLayer* childForSuperlayers() const { return m_ancestorClippingLayer ? m_ancestorClippingLayer.get() : m_graphicsLayer.get(); }
948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // RenderLayers with backing normally short-circuit paintLayer() because
968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // their content is rendered via callbacks from GraphicsLayer. However, the document
978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // layer is special, because it has a GraphicsLayer to act as a container for the GraphicsLayers
988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // for descendants, but its contents usually render into the window (in which case this returns true).
998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // This returns false for other layers, and when the document layer actually needs to paint into its backing store
1008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // for some reason.
1018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool paintingGoesToWindow() const;
1028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void setContentsNeedDisplay();
1048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // r is in the coordinate space of the layer's render object
1058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void setContentsNeedDisplayInRect(const IntRect& r);
1068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
107f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Notification from the renderer that its content changed.
108f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    void contentChanged(RenderLayer::ContentChangeType);
1098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Interface to start, finish, suspend and resume animations and transitions
111d0825bca7fe65beaee391d30da42e937db621564Steve Block    bool startTransition(double timeOffset, int property, const RenderStyle* fromStyle, const RenderStyle* toStyle);
112bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    void transitionPaused(double timeOffset, int property);
1138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void transitionFinished(int property);
1148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
115bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    bool startAnimation(double timeOffset, const Animation* anim, const KeyframeList& keyframes);
116bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    void animationPaused(double timeOffset, const String& name);
117bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    void animationFinished(const String& name);
118bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void suspendAnimations(double time = 0);
1208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void resumeAnimations();
1218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    IntRect compositedBounds() const;
1230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void setCompositedBounds(const IntRect&);
124231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    void updateCompositedBounds();
125e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
126e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    void updateAfterWidgetResize();
1270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // GraphicsLayerClient interface
1298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void notifyAnimationStarted(const GraphicsLayer*, double startTime);
1300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    virtual void notifySyncRequired(const GraphicsLayer*);
1318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void paintContents(const GraphicsLayer*, GraphicsContext&, GraphicsLayerPaintingPhase, const IntRect& clip);
1338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
134643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    virtual bool showDebugBorders() const;
135643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    virtual bool showRepaintCounter() const;
136643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    IntRect contentsBox() const;
1388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
139967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // For informative purposes only.
140967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    CompositingLayerType compositingLayerType() const;
141967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void updateContentsScale(float);
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    GraphicsLayer* layerForHorizontalScrollbar() const { return m_layerForHorizontalScrollbar.get(); }
1452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    GraphicsLayer* layerForVerticalScrollbar() const { return m_layerForVerticalScrollbar.get(); }
1462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    GraphicsLayer* layerForScrollCorner() const { return m_layerForScrollCorner.get(); }
1472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianprivate:
1498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void createGraphicsLayer();
1508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void destroyGraphicsLayer();
1518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderBoxModelObject* renderer() const { return m_owningLayer->renderer(); }
1538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderLayerCompositor* compositor() const { return m_owningLayer->compositor(); }
1548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void updateInternalHierarchy();
1568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool updateClippingLayers(bool needsAncestorClip, bool needsDescendantClip);
1572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool updateOverflowControlsLayers(bool needsHorizontalScrollbarLayer, bool needsVerticalScrollbarLayer, bool needsScrollCornerLayer);
1580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool updateForegroundLayer(bool needsForegroundLayer);
159231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    bool updateMaskLayer(bool needsMaskLayer);
1602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool requiresHorizontalScrollbarLayer() const;
1612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool requiresVerticalScrollbarLayer() const;
1622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool requiresScrollCornerLayer() const;
1638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
164231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    GraphicsLayerPaintingPhase paintingPhaseForPrimaryLayer() const;
165231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    IntSize contentOffsetInCompostingLayer() const;
1678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Result is transform origin in pixels.
1688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    FloatPoint3D computeTransformOrigin(const IntRect& borderBox) const;
1698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Result is perspective origin in pixels.
1708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    FloatPoint computePerspectiveOrigin(const IntRect& borderBox) const;
1718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
172cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    void updateLayerOpacity(const RenderStyle*);
173cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    void updateLayerTransform(const RenderStyle*);
1748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Return the opacity value that this layer should use for compositing.
1768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    float compositingOpacity(float rendererOpacity) const;
1778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
178d0825bca7fe65beaee391d30da42e937db621564Steve Block    // Returns true if this compositing layer has no visible content.
1795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    bool isSimpleContainerCompositingLayer() const;
180d0825bca7fe65beaee391d30da42e937db621564Steve Block    // Returns true if this layer has content that needs to be rendered by painting into the backing store.
181d0825bca7fe65beaee391d30da42e937db621564Steve Block    bool containsPaintedContent() const;
182d0825bca7fe65beaee391d30da42e937db621564Steve Block    // Returns true if the RenderLayer just contains an image that we can composite directly.
183d0825bca7fe65beaee391d30da42e937db621564Steve Block    bool isDirectlyCompositedImage() const;
1848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void updateImageContents();
1858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool rendererHasBackground() const;
187e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    const Color rendererBackgroundColor() const;
1888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
189db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    bool hasNonCompositingDescendants() const;
1908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void paintIntoLayer(RenderLayer* rootLayer, GraphicsContext*, const IntRect& paintDirtyRect,
192643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    PaintBehavior paintBehavior, GraphicsLayerPaintingPhase, RenderObject* paintingRoot);
1938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    static int graphicsLayerToCSSProperty(AnimatedPropertyID);
1958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    static AnimatedPropertyID cssToGraphicsLayerProperty(int);
1968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
197e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#ifndef NDEBUG
198e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    String nameForLayer() const;
199e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#endif
200e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
2018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianprivate:
2028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderLayer* m_owningLayer;
2038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
204231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    OwnPtr<GraphicsLayer> m_ancestorClippingLayer; // only used if we are clipped by an ancestor which is not a stacking context
205231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    OwnPtr<GraphicsLayer> m_graphicsLayer;
206231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    OwnPtr<GraphicsLayer> m_foregroundLayer;       // only used in cases where we need to draw the foreground separately
207231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    OwnPtr<GraphicsLayer> m_clippingLayer;         // only used if we have clipping on a stacking context, with compositing children
208231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    OwnPtr<GraphicsLayer> m_maskLayer;             // only used if we have a mask
2098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
2102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    OwnPtr<GraphicsLayer> m_layerForHorizontalScrollbar;
2112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    OwnPtr<GraphicsLayer> m_layerForVerticalScrollbar;
2122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    OwnPtr<GraphicsLayer> m_layerForScrollCorner;
2132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    IntRect m_compositedBounds;
2158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
216231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    bool m_artificiallyInflatedBounds;      // bounds had to be made non-zero to make transform-origin work
2178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian};
2188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
2198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} // namespace WebCore
2208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
2218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif // USE(ACCELERATED_COMPOSITING)
2228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
2238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif // RenderLayerBacking_h
224