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

Side by Side Diff: Source/core/rendering/RenderLayer.cpp

Issue 88863002: Land layer squashing behind a flag (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Addressed reviewer feedback Created 7 years 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
3 * 3 *
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation.
5 * 5 *
6 * Other contributors: 6 * Other contributors:
7 * Robert O'Callahan <roc+@cs.cmu.edu> 7 * Robert O'Callahan <roc+@cs.cmu.edu>
8 * David Baron <dbaron@fas.harvard.edu> 8 * David Baron <dbaron@fas.harvard.edu>
9 * Christian Biesinger <cbiesinger@web.de> 9 * Christian Biesinger <cbiesinger@web.de>
10 * Randall Jesup <rjesup@wgate.com> 10 * Randall Jesup <rjesup@wgate.com>
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 , m_blendMode(blink::WebBlendModeNormal) 127 , m_blendMode(blink::WebBlendModeNormal)
128 , m_renderer(renderer) 128 , m_renderer(renderer)
129 , m_parent(0) 129 , m_parent(0)
130 , m_previous(0) 130 , m_previous(0)
131 , m_next(0) 131 , m_next(0)
132 , m_first(0) 132 , m_first(0)
133 , m_last(0) 133 , m_last(0)
134 , m_staticInlinePosition(0) 134 , m_staticInlinePosition(0)
135 , m_staticBlockPosition(0) 135 , m_staticBlockPosition(0)
136 , m_enclosingPaginationLayer(0) 136 , m_enclosingPaginationLayer(0)
137 , m_groupedMapping(0)
137 , m_repainter(renderer) 138 , m_repainter(renderer)
138 , m_clipper(renderer) 139 , m_clipper(renderer)
139 { 140 {
140 updateStackingNode(); 141 updateStackingNode();
141 142
142 m_isSelfPaintingLayer = shouldBeSelfPaintingLayer(); 143 m_isSelfPaintingLayer = shouldBeSelfPaintingLayer();
143 144
144 if (!renderer->firstChild() && renderer->style()) { 145 if (!renderer->firstChild() && renderer->style()) {
145 m_visibleContentStatusDirty = false; 146 m_visibleContentStatusDirty = false;
146 m_hasVisibleContent = renderer->style()->visibility() == VISIBLE; 147 m_hasVisibleContent = renderer->style()->visibility() == VISIBLE;
(...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after
1103 return curr; 1104 return curr;
1104 } 1105 }
1105 1106
1106 static inline const RenderLayer* compositingContainer(const RenderLayer* layer) 1107 static inline const RenderLayer* compositingContainer(const RenderLayer* layer)
1107 { 1108 {
1108 return layer->stackingNode()->isNormalFlowOnly() ? layer->parent() : (layer- >stackingNode()->ancestorStackingContainerNode() ? layer->stackingNode()->ancest orStackingContainerNode()->layer() : 0); 1109 return layer->stackingNode()->isNormalFlowOnly() ? layer->parent() : (layer- >stackingNode()->ancestorStackingContainerNode() ? layer->stackingNode()->ancest orStackingContainerNode()->layer() : 0);
1109 } 1110 }
1110 1111
1111 // FIXME: having two different functions named enclosingCompositingLayer and enc losingCompositingLayerForRepaint 1112 // FIXME: having two different functions named enclosingCompositingLayer and enc losingCompositingLayerForRepaint
1112 // is error-prone and misleading for reading code that uses these functions - es pecially compounded with 1113 // is error-prone and misleading for reading code that uses these functions - es pecially compounded with
1113 // the includeSelf option. It is very likely that some call sites of this functi on actually mean to use 1114 // the includeSelf option. It is very likely that we don't even want either of t hese functions; A layer
1114 // enclosingCompositingLayerForRepaint(). 1115 // should be told explicitly which GraphicsLayer is the repaintContainer for a R enderLayer, and
1116 // any other use cases should probably have an API between the non-compositing a nd compositing sides of code.
1115 RenderLayer* RenderLayer::enclosingCompositingLayer(bool includeSelf) const 1117 RenderLayer* RenderLayer::enclosingCompositingLayer(bool includeSelf) const
1116 { 1118 {
1117 if (includeSelf && hasCompositedLayerMapping()) 1119 if (includeSelf && compositingState() != NotComposited && compositingState() != PaintsIntoGroupedBacking)
1118 return const_cast<RenderLayer*>(this); 1120 return const_cast<RenderLayer*>(this);
1119 1121
1120 for (const RenderLayer* curr = compositingContainer(this); curr; curr = comp ositingContainer(curr)) { 1122 for (const RenderLayer* curr = compositingContainer(this); curr; curr = comp ositingContainer(curr)) {
1121 if (curr->hasCompositedLayerMapping()) 1123 if (curr->compositingState() != NotComposited && curr->compositingState( ) != PaintsIntoGroupedBacking)
1122 return const_cast<RenderLayer*>(curr); 1124 return const_cast<RenderLayer*>(curr);
1123 } 1125 }
1124 1126
1125 return 0; 1127 return 0;
1126 } 1128 }
1127 1129
1128 RenderLayer* RenderLayer::enclosingCompositingLayerForRepaint(bool includeSelf) const 1130 RenderLayer* RenderLayer::enclosingCompositingLayerForRepaint(bool includeSelf) const
1129 { 1131 {
1130 if (includeSelf && compositingState() == PaintsIntoOwnBacking) 1132 if (includeSelf && (compositingState() == PaintsIntoOwnBacking || compositin gState() == PaintsIntoGroupedBacking))
1131 return const_cast<RenderLayer*>(this); 1133 return const_cast<RenderLayer*>(this);
1132 1134
1133 for (const RenderLayer* curr = compositingContainer(this); curr; curr = comp ositingContainer(curr)) { 1135 for (const RenderLayer* curr = compositingContainer(this); curr; curr = comp ositingContainer(curr)) {
1134 if (curr->compositingState() == PaintsIntoOwnBacking) 1136 if (curr->compositingState() == PaintsIntoOwnBacking || curr->compositin gState() == PaintsIntoGroupedBacking)
1135 return const_cast<RenderLayer*>(curr); 1137 return const_cast<RenderLayer*>(curr);
1136 } 1138 }
1137 1139
1138 return 0; 1140 return 0;
1139 } 1141 }
1140 1142
1141 RenderLayer* RenderLayer::ancestorCompositedScrollingLayer() const 1143 RenderLayer* RenderLayer::ancestorCompositedScrollingLayer() const
1142 { 1144 {
1143 if (!acceleratedCompositingForOverflowScrollEnabled()) 1145 if (!acceleratedCompositingForOverflowScrollEnabled())
1144 return 0; 1146 return 0;
(...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after
1877 return false; 1879 return false;
1878 } 1880 }
1879 1881
1880 static bool paintForFixedRootBackground(const RenderLayer* layer, PaintLayerFlag s paintFlags) 1882 static bool paintForFixedRootBackground(const RenderLayer* layer, PaintLayerFlag s paintFlags)
1881 { 1883 {
1882 return layer->renderer()->isRoot() && (paintFlags & PaintLayerPaintingRootBa ckgroundOnly); 1884 return layer->renderer()->isRoot() && (paintFlags & PaintLayerPaintingRootBa ckgroundOnly);
1883 } 1885 }
1884 1886
1885 void RenderLayer::paintLayer(GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) 1887 void RenderLayer::paintLayer(GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
1886 { 1888 {
1887 if (compositingState() != NotComposited) { 1889 if (compositingState() != NotComposited && compositingState() != PaintsIntoG roupedBacking) {
1888 // The updatingControlTints() painting pass goes through compositing lay ers, 1890 // The updatingControlTints() painting pass goes through compositing lay ers,
1889 // but we need to ensure that we don't cache clip rects computed with th e wrong root in this case. 1891 // but we need to ensure that we don't cache clip rects computed with th e wrong root in this case.
1890 if (context->updatingControlTints() || (paintingInfo.paintBehavior & Pai ntBehaviorFlattenCompositingLayers)) { 1892 if (context->updatingControlTints() || (paintingInfo.paintBehavior & Pai ntBehaviorFlattenCompositingLayers)) {
1891 paintFlags |= PaintLayerTemporaryClipRects; 1893 paintFlags |= PaintLayerTemporaryClipRects;
1892 } else if (!compositedLayerMapping()->paintsIntoCompositedAncestor() 1894 } else if (!compositedLayerMapping()->paintsIntoCompositedAncestor()
1893 && !shouldDoSoftwarePaint(this, paintFlags & PaintLayerPaintingRefle ction) 1895 && !shouldDoSoftwarePaint(this, paintFlags & PaintLayerPaintingRefle ction)
1894 && !paintForFixedRootBackground(this, paintFlags)) { 1896 && !paintForFixedRootBackground(this, paintFlags)) {
1895 // If this RenderLayer should paint into its own backing, that will be done via CompositedLayerMapping::paintIntoLayer(). 1897 // If this RenderLayer should paint into its own backing, that will be done via CompositedLayerMapping::paintIntoLayer().
1896 return; 1898 return;
1897 } 1899 }
(...skipping 1731 matching lines...) Expand 10 before | Expand all | Expand 10 after
3629 unionBounds.moveBy(ancestorRelOffset); 3631 unionBounds.moveBy(ancestorRelOffset);
3630 3632
3631 return pixelSnappedIntRect(unionBounds); 3633 return pixelSnappedIntRect(unionBounds);
3632 } 3634 }
3633 3635
3634 CompositingState RenderLayer::compositingState() const 3636 CompositingState RenderLayer::compositingState() const
3635 { 3637 {
3636 // This is computed procedurally so there is no redundant state variable tha t 3638 // This is computed procedurally so there is no redundant state variable tha t
3637 // can get out of sync from the real actual compositing state. 3639 // can get out of sync from the real actual compositing state.
3638 3640
3641 if (m_groupedMapping) {
3642 ASSERT(compositor()->isLayerSquashingEnabled());
3643 ASSERT(!m_compositedLayerMapping);
3644 return PaintsIntoGroupedBacking;
3645 }
3646
3639 if (!m_compositedLayerMapping) 3647 if (!m_compositedLayerMapping)
3640 return NotComposited; 3648 return NotComposited;
3641 3649
3642 if (m_compositedLayerMapping && compositedLayerMapping()->paintsIntoComposit edAncestor()) 3650 if (m_compositedLayerMapping && compositedLayerMapping()->paintsIntoComposit edAncestor())
3643 return HasOwnBackingButPaintsIntoAncestor; 3651 return HasOwnBackingButPaintsIntoAncestor;
3644 3652
3645 ASSERT(m_compositedLayerMapping); 3653 ASSERT(m_compositedLayerMapping);
3646 return PaintsIntoOwnBacking; 3654 return PaintsIntoOwnBacking;
3647 } 3655 }
3648 3656
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
3980 bool didPaintWithFilters = false; 3988 bool didPaintWithFilters = false;
3981 3989
3982 if (paintsWithFilters()) 3990 if (paintsWithFilters())
3983 didPaintWithFilters = true; 3991 didPaintWithFilters = true;
3984 updateFilters(oldStyle, renderer()->style()); 3992 updateFilters(oldStyle, renderer()->style());
3985 3993
3986 const RenderStyle* newStyle = renderer()->style(); 3994 const RenderStyle* newStyle = renderer()->style();
3987 if (compositor()->updateLayerCompositingState(this) 3995 if (compositor()->updateLayerCompositingState(this)
3988 || needsCompositingLayersRebuiltForClip(oldStyle, newStyle) 3996 || needsCompositingLayersRebuiltForClip(oldStyle, newStyle)
3989 || needsCompositingLayersRebuiltForOverflow(oldStyle, newStyle) 3997 || needsCompositingLayersRebuiltForOverflow(oldStyle, newStyle)
3990 || needsCompositingLayersRebuiltForFilters(oldStyle, newStyle, didPaintW ithFilters)) 3998 || needsCompositingLayersRebuiltForFilters(oldStyle, newStyle, didPaintW ithFilters)) {
3991 compositor()->setCompositingLayersNeedRebuild(); 3999 compositor()->setCompositingLayersNeedRebuild();
3992 else if (hasCompositedLayerMapping()) 4000 } else if (compositingState() == PaintsIntoOwnBacking || compositingState() == HasOwnBackingButPaintsIntoAncestor) {
4001 ASSERT(hasCompositedLayerMapping());
3993 compositedLayerMapping()->updateGraphicsLayerGeometry(); 4002 compositedLayerMapping()->updateGraphicsLayerGeometry();
4003 } else if (compositingState() == PaintsIntoGroupedBacking) {
4004 ASSERT(compositor()->isLayerSquashingEnabled());
4005 ASSERT(groupedMapping());
4006 // FIXME: double-check that updateGraphicsLayerGeometry is not necessary (well the squashing portion is what might be needed? but probably not)...
Ian Vollick 2013/12/02 21:17:05 Hmm. It'd be handy if we had up-to-date geometry f
4007 // FIXME: do we need to take any action here for a squashed layer?
4008 }
3994 } 4009 }
3995 4010
3996 bool RenderLayer::scrollsOverflow() const 4011 bool RenderLayer::scrollsOverflow() const
3997 { 4012 {
3998 if (RenderLayerScrollableArea* scrollableArea = this->scrollableArea()) 4013 if (RenderLayerScrollableArea* scrollableArea = this->scrollableArea())
3999 return scrollableArea->scrollsOverflow(); 4014 return scrollableArea->scrollsOverflow();
4000 4015
4001 return false; 4016 return false;
4002 } 4017 }
4003 4018
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
4160 } 4175 }
4161 } 4176 }
4162 4177
4163 void showLayerTree(const WebCore::RenderObject* renderer) 4178 void showLayerTree(const WebCore::RenderObject* renderer)
4164 { 4179 {
4165 if (!renderer) 4180 if (!renderer)
4166 return; 4181 return;
4167 showLayerTree(renderer->enclosingLayer()); 4182 showLayerTree(renderer->enclosingLayer());
4168 } 4183 }
4169 #endif 4184 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698