1d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)/*
2d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
3d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * Copyright (C) 2014 Google Inc. All rights reserved.
4d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) *
5d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
6d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * modification, are permitted provided that the following conditions
7d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * are met:
8d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
9d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
10d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
11d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
12d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
13d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) *
14d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
15d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) */
26d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
27d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "config.h"
28d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/GraphicsLayerUpdater.h"
29d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
30d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/HTMLMediaElement.h"
317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/inspector/InspectorTraceEvents.h"
32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/RenderLayer.h"
33d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/RenderLayerReflectionInfo.h"
34d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/RenderPart.h"
35d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/CompositedLayerMapping.h"
36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/RenderLayerCompositor.h"
37197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "platform/TraceEvent.h"
38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
39c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
41197021e6b966cfb06891637935ef33fff06433d1Ben Murdochclass GraphicsLayerUpdater::UpdateContext {
42197021e6b966cfb06891637935ef33fff06433d1Ben Murdochpublic:
43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    UpdateContext()
44197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        : m_compositingStackingContext(0)
45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        , m_compositingAncestor(0)
46197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
4710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    }
4810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
49197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    UpdateContext(const UpdateContext& other, const RenderLayer& layer)
50197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        : m_compositingStackingContext(other.m_compositingStackingContext)
51197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        , m_compositingAncestor(other.compositingContainer(layer))
52197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
53197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        CompositingState compositingState = layer.compositingState();
54197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (compositingState != NotComposited && compositingState != PaintsIntoGroupedBacking) {
55197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            m_compositingAncestor = &layer;
56197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (layer.stackingNode()->isStackingContext())
57197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                m_compositingStackingContext = &layer;
58197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
59197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
60197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
61197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    const RenderLayer* compositingContainer(const RenderLayer& layer) const
62197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
63197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return layer.stackingNode()->isNormalFlowOnly() ? m_compositingAncestor : m_compositingStackingContext;
64197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
65197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
66c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    const RenderLayer* compositingStackingContext() const
67c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
68c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_compositingStackingContext;
69c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
70c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
71197021e6b966cfb06891637935ef33fff06433d1Ben Murdochprivate:
72197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    const RenderLayer* m_compositingStackingContext;
73197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    const RenderLayer* m_compositingAncestor;
74197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch};
7510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
7607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochGraphicsLayerUpdater::GraphicsLayerUpdater()
77a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    : m_needsRebuildTree(false)
78d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
79d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
80d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
81d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)GraphicsLayerUpdater::~GraphicsLayerUpdater()
82d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
83d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
84d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
85197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid GraphicsLayerUpdater::update(RenderLayer& layer, Vector<RenderLayer*>& layersNeedingPaintInvalidation)
86197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
87e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    TRACE_EVENT0("blink", "GraphicsLayerUpdater::update");
88197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    updateRecursive(layer, DoNotForceUpdate, UpdateContext(), layersNeedingPaintInvalidation);
89197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    layer.compositor()->updateRootLayerPosition();
90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
92197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid GraphicsLayerUpdater::updateRecursive(RenderLayer& layer, UpdateType updateType, const UpdateContext& context, Vector<RenderLayer*>& layersNeedingPaintInvalidation)
93d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
9407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (layer.hasCompositedLayerMapping()) {
95e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        CompositedLayerMapping* mapping = layer.compositedLayerMapping();
96d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
97197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (updateType == ForceUpdate || mapping->needsGraphicsLayerUpdate()) {
98197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            const RenderLayer* compositingContainer = context.compositingContainer(layer);
99197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            ASSERT(compositingContainer == layer.enclosingLayerWithCompositedLayerMapping(ExcludeSelf));
10010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
101197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (mapping->updateRequiresOwnBackingStoreForAncestorReasons(compositingContainer)) {
1027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                TRACE_LAYER_INVALIDATION(&layer, InspectorLayerInvalidationTrackingEvent::AncestorRequiresNewLayer);
103197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                layersNeedingPaintInvalidation.append(&layer);
104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                updateType = ForceUpdate;
105197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            }
106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
107197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (mapping->updateGraphicsLayerConfiguration())
108197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                m_needsRebuildTree = true;
109d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
110c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            mapping->updateGraphicsLayerGeometry(compositingContainer, context.compositingStackingContext(), layersNeedingPaintInvalidation);
111d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
112197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (mapping->hasUnpositionedOverflowControlsLayers())
113197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                layer.scrollableArea()->positionOverflowControls(IntSize());
114d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
115197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            updateType = mapping->updateTypeForChildren(updateType);
116197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            mapping->clearNeedsGraphicsLayerUpdate();
117197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
118d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
12010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    UpdateContext childContext(context, layer);
12107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    for (RenderLayer* child = layer.firstChild(); child; child = child->nextSibling())
122197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        updateRecursive(*child, updateType, childContext, layersNeedingPaintInvalidation);
12307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
124d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
125197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
126d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
12707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid GraphicsLayerUpdater::assertNeedsToUpdateGraphicsLayerBitsCleared(RenderLayer& layer)
12807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
12907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (layer.hasCompositedLayerMapping())
13007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        layer.compositedLayerMapping()->assertNeedsToUpdateGraphicsLayerBitsCleared();
131d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
13207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    for (RenderLayer* child = layer.firstChild(); child; child = child->nextSibling())
13307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        assertNeedsToUpdateGraphicsLayerBitsCleared(*child);
134d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
13607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#endif
13707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
138c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
139