Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Unified Diff: Source/core/rendering/compositing/GraphicsLayerUpdater.cpp

Issue 185293002: Factor GraphicsLayerUpdater out of RenderLayerCompositor (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Address reviewer comments Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/rendering/compositing/GraphicsLayerUpdater.cpp
diff --git a/Source/core/rendering/compositing/GraphicsLayerUpdater.cpp b/Source/core/rendering/compositing/GraphicsLayerUpdater.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..40c419947199076cd33c2a73106ab36d3df34799
--- /dev/null
+++ b/Source/core/rendering/compositing/GraphicsLayerUpdater.cpp
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2014 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "core/rendering/compositing/GraphicsLayerUpdater.h"
+
+#include "core/rendering/RenderLayer.h"
+#include "core/rendering/RenderLayerReflectionInfo.h"
+#include "core/rendering/RenderPart.h"
+#include "core/rendering/RenderView.h"
+#include "core/rendering/compositing/CompositedLayerMapping.h"
+#include "core/rendering/compositing/RenderLayerCompositor.h"
+#include "public/platform/Platform.h"
+
+namespace WebCore {
+
+GraphicsLayerUpdater::GraphicsLayerUpdater(RenderView& renderView)
+ : m_renderView(renderView)
+ , m_pixelsWithoutPromotingAllTransitions(0.0)
+ , m_pixelsAddedByPromotingAllTransitions(0.0)
+{
+}
+
+GraphicsLayerUpdater::~GraphicsLayerUpdater()
+{
+}
+
+void GraphicsLayerUpdater::rebuildTree(RenderLayer& layer, Vector<GraphicsLayer*>& childLayersOfEnclosingLayer, int depth)
+{
+ // Make the layer compositing if necessary, and set up clipping and content layers.
+ // Note that we can only do work here that is independent of whether the descendant layers
+ // have been processed. computeCompositingRequirements() will already have done the repaint if necessary.
+
+ layer.stackingNode()->updateLayerListsIfNeeded();
+ layer.update3dRenderingContext();
+
+ const bool hasCompositedLayerMapping = layer.hasCompositedLayerMapping();
+ CompositedLayerMappingPtr currentCompositedLayerMapping = layer.compositedLayerMapping();
+
+ update(layer);
+
+ // Grab some stats for histograms.
+ if (hasCompositedLayerMapping) {
+ m_pixelsWithoutPromotingAllTransitions += layer.size().height() * layer.size().width();
+ } else {
+ if ((layer.renderer()->style()->transitionForProperty(CSSPropertyOpacity) ||
+ layer.renderer()->style()->transitionForProperty(CSSPropertyWebkitTransform)) &&
+ m_renderView.viewRect().intersects(layer.absoluteBoundingBox()))
+ m_pixelsAddedByPromotingAllTransitions += layer.size().height() * layer.size().width();
+ }
+
+ // If this layer has a compositedLayerMapping, then that is where we place subsequent children GraphicsLayers.
+ // Otherwise children continue to append to the child list of the enclosing layer.
+ Vector<GraphicsLayer*> layerChildren;
+ Vector<GraphicsLayer*>& childList = hasCompositedLayerMapping ? layerChildren : childLayersOfEnclosingLayer;
+
+#if !ASSERT_DISABLED
+ LayerListMutationDetector mutationChecker(layer.stackingNode());
+#endif
+
+ if (layer.stackingNode()->isStackingContainer()) {
+ RenderLayerStackingNodeIterator iterator(*layer.stackingNode(), NegativeZOrderChildren);
+ while (RenderLayerStackingNode* curNode = iterator.next())
+ rebuildTree(*curNode->layer(), childList, depth + 1);
+
+ // If a negative z-order child is compositing, we get a foreground layer which needs to get parented.
+ if (hasCompositedLayerMapping && currentCompositedLayerMapping->foregroundLayer())
+ childList.append(currentCompositedLayerMapping->foregroundLayer());
+ }
+
+ RenderLayerStackingNodeIterator iterator(*layer.stackingNode(), NormalFlowChildren | PositiveZOrderChildren);
+ while (RenderLayerStackingNode* curNode = iterator.next())
+ rebuildTree(*curNode->layer(), childList, depth + 1);
+
+ if (hasCompositedLayerMapping) {
+ bool parented = false;
+ if (layer.renderer()->isRenderPart())
+ parented = RenderLayerCompositor::parentFrameContentLayers(toRenderPart(layer.renderer()));
+
+ if (!parented)
+ currentCompositedLayerMapping->parentForSublayers()->setChildren(layerChildren);
+
+ // If the layer has a clipping layer the overflow controls layers will be siblings of the clipping layer.
+ // Otherwise, the overflow control layers are normal children.
+ if (!currentCompositedLayerMapping->hasClippingLayer() && !currentCompositedLayerMapping->hasScrollingLayer()) {
+ if (GraphicsLayer* overflowControlLayer = currentCompositedLayerMapping->layerForHorizontalScrollbar()) {
+ overflowControlLayer->removeFromParent();
+ currentCompositedLayerMapping->parentForSublayers()->addChild(overflowControlLayer);
+ }
+
+ if (GraphicsLayer* overflowControlLayer = currentCompositedLayerMapping->layerForVerticalScrollbar()) {
+ overflowControlLayer->removeFromParent();
+ currentCompositedLayerMapping->parentForSublayers()->addChild(overflowControlLayer);
+ }
+
+ if (GraphicsLayer* overflowControlLayer = currentCompositedLayerMapping->layerForScrollCorner()) {
+ overflowControlLayer->removeFromParent();
+ currentCompositedLayerMapping->parentForSublayers()->addChild(overflowControlLayer);
+ }
+ }
+
+ childLayersOfEnclosingLayer.append(currentCompositedLayerMapping->childForSuperlayers());
+ }
+
+ if (!depth) {
+ int percentageIncreaseInPixels = static_cast<int>(m_pixelsAddedByPromotingAllTransitions / m_pixelsWithoutPromotingAllTransitions * 100);
+ blink::Platform::current()->histogramCustomCounts("Renderer.PixelIncreaseFromTransitions", percentageIncreaseInPixels, 0, 1000, 50);
+ }
+}
+
+// This just updates layer geometry without changing the hierarchy.
+void GraphicsLayerUpdater::updateRecursive(RenderLayer& layer)
+{
+ update(layer);
+
+#if !ASSERT_DISABLED
+ LayerListMutationDetector mutationChecker(layer.stackingNode());
+#endif
+
+ RenderLayerStackingNodeIterator iterator(*layer.stackingNode(), AllChildren);
+ while (RenderLayerStackingNode* curNode = iterator.next())
+ updateRecursive(*curNode->layer());
+}
+
+void GraphicsLayerUpdater::update(RenderLayer& layer)
+{
+ if (!layer.hasCompositedLayerMapping())
+ return;
+
+ CompositedLayerMappingPtr mapping = layer.compositedLayerMapping();
+
+ // Note carefully: here we assume that the compositing state of all descendants have been updated already,
+ // so it is legitimate to compute and cache the composited bounds for this layer.
+ mapping->updateCompositedBounds();
+
+ if (RenderLayerReflectionInfo* reflection = layer.reflectionInfo()) {
+ if (reflection->reflectionLayer()->hasCompositedLayerMapping())
+ reflection->reflectionLayer()->compositedLayerMapping()->updateCompositedBounds();
+ }
+
+ mapping->updateGraphicsLayerConfiguration();
+ mapping->updateGraphicsLayerGeometry();
+
+ if (!layer.parent())
+ layer.compositor()->updateRootLayerPosition();
+
+ if (mapping->hasUnpositionedOverflowControlsLayers())
+ layer.scrollableArea()->positionOverflowControls();
+}
+
+} // namespace WebCore
« no previous file with comments | « Source/core/rendering/compositing/GraphicsLayerUpdater.h ('k') | Source/core/rendering/compositing/RenderLayerCompositor.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698