OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009, 2010, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009, 2010, 2011 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 #include "platform/graphics/paint/PaintRecordBuilder.h" | 77 #include "platform/graphics/paint/PaintRecordBuilder.h" |
78 #include "platform/graphics/paint/TransformDisplayItem.h" | 78 #include "platform/graphics/paint/TransformDisplayItem.h" |
79 #include "public/platform/WebLayerStickyPositionConstraint.h" | 79 #include "public/platform/WebLayerStickyPositionConstraint.h" |
80 #include "wtf/CurrentTime.h" | 80 #include "wtf/CurrentTime.h" |
81 #include "wtf/text/StringBuilder.h" | 81 #include "wtf/text/StringBuilder.h" |
82 | 82 |
83 namespace blink { | 83 namespace blink { |
84 | 84 |
85 using namespace HTMLNames; | 85 using namespace HTMLNames; |
86 | 86 |
87 static IntRect clipBox(LayoutBox* layoutObject); | 87 static IntRect clipBox(LayoutBox& layoutObject); |
88 | 88 |
89 static IntRect contentsRect(const LayoutObject* layoutObject) { | 89 static IntRect contentsRect(const LayoutObject& layoutObject) { |
90 if (!layoutObject->isBox()) | 90 if (!layoutObject.isBox()) |
91 return IntRect(); | 91 return IntRect(); |
92 if (layoutObject->isCanvas()) | 92 if (layoutObject.isCanvas()) { |
93 return pixelSnappedIntRect( | 93 return pixelSnappedIntRect( |
94 toLayoutHTMLCanvas(layoutObject)->replacedContentRect()); | 94 toLayoutHTMLCanvas(layoutObject).replacedContentRect()); |
95 if (layoutObject->isVideo()) | 95 } |
| 96 if (layoutObject.isVideo()) { |
96 return pixelSnappedIntRect( | 97 return pixelSnappedIntRect( |
97 toLayoutVideo(layoutObject)->replacedContentRect()); | 98 toLayoutVideo(layoutObject).replacedContentRect()); |
| 99 } |
98 | 100 |
99 return pixelSnappedIntRect(toLayoutBox(layoutObject)->contentBoxRect()); | 101 return pixelSnappedIntRect(toLayoutBox(layoutObject).contentBoxRect()); |
100 } | 102 } |
101 | 103 |
102 static IntRect backgroundRect(const LayoutObject* layoutObject) { | 104 static IntRect backgroundRect(const LayoutObject& layoutObject) { |
103 if (!layoutObject->isBox()) | 105 if (!layoutObject.isBox()) |
104 return IntRect(); | 106 return IntRect(); |
105 | 107 |
106 LayoutRect rect; | 108 LayoutRect rect; |
107 const LayoutBox* box = toLayoutBox(layoutObject); | 109 const LayoutBox& box = toLayoutBox(layoutObject); |
108 return pixelSnappedIntRect(box->backgroundRect(BackgroundClipRect)); | 110 return pixelSnappedIntRect(box.backgroundRect(BackgroundClipRect)); |
109 } | 111 } |
110 | 112 |
111 static inline bool isAcceleratedCanvas(const LayoutObject* layoutObject) { | 113 static inline bool isAcceleratedCanvas(const LayoutObject& layoutObject) { |
112 if (layoutObject->isCanvas()) { | 114 if (layoutObject.isCanvas()) { |
113 HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject->node()); | 115 HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject.node()); |
114 if (CanvasRenderingContext* context = canvas->renderingContext()) | 116 if (CanvasRenderingContext* context = canvas->renderingContext()) |
115 return context->isAccelerated(); | 117 return context->isAccelerated(); |
116 } | 118 } |
117 return false; | 119 return false; |
118 } | 120 } |
119 | 121 |
120 static inline bool isCanvasControlledByOffscreen( | 122 static inline bool isCanvasControlledByOffscreen( |
121 const LayoutObject* layoutObject) { | 123 const LayoutObject& layoutObject) { |
122 if (layoutObject->isCanvas()) { | 124 if (layoutObject.isCanvas()) { |
123 HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject->node()); | 125 HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject.node()); |
124 if (canvas->surfaceLayerBridge()) | 126 if (canvas->surfaceLayerBridge()) |
125 return true; | 127 return true; |
126 } | 128 } |
127 return false; | 129 return false; |
128 } | 130 } |
129 | 131 |
130 static bool hasBoxDecorationsOrBackgroundImage(const ComputedStyle& style) { | 132 static bool hasBoxDecorationsOrBackgroundImage(const ComputedStyle& style) { |
131 return style.hasBoxDecorations() || style.hasBackgroundImage(); | 133 return style.hasBoxDecorations() || style.hasBackgroundImage(); |
132 } | 134 } |
133 | 135 |
134 static bool contentLayerSupportsDirectBackgroundComposition( | 136 static bool contentLayerSupportsDirectBackgroundComposition( |
135 const LayoutObject* layoutObject) { | 137 const LayoutObject& layoutObject) { |
136 // No support for decorations - border, border-radius or outline. | 138 // No support for decorations - border, border-radius or outline. |
137 // Only simple background - solid color or transparent. | 139 // Only simple background - solid color or transparent. |
138 if (hasBoxDecorationsOrBackgroundImage(layoutObject->styleRef())) | 140 if (hasBoxDecorationsOrBackgroundImage(layoutObject.styleRef())) |
139 return false; | 141 return false; |
140 | 142 |
141 // If there is no background, there is nothing to support. | 143 // If there is no background, there is nothing to support. |
142 if (!layoutObject->style()->hasBackground()) | 144 if (!layoutObject.style()->hasBackground()) |
143 return true; | 145 return true; |
144 | 146 |
145 // Simple background that is contained within the contents rect. | 147 // Simple background that is contained within the contents rect. |
146 return contentsRect(layoutObject).contains(backgroundRect(layoutObject)); | 148 return contentsRect(layoutObject).contains(backgroundRect(layoutObject)); |
147 } | 149 } |
148 | 150 |
149 static WebLayer* platformLayerForPlugin(LayoutObject* layoutObject) { | 151 static WebLayer* platformLayerForPlugin(LayoutObject& layoutObject) { |
150 if (!layoutObject->isEmbeddedObject()) | 152 if (!layoutObject.isEmbeddedObject()) |
151 return nullptr; | 153 return nullptr; |
152 Widget* widget = toLayoutEmbeddedObject(layoutObject)->widget(); | 154 Widget* widget = toLayoutEmbeddedObject(layoutObject).widget(); |
153 if (!widget || !widget->isPluginView()) | 155 if (!widget || !widget->isPluginView()) |
154 return nullptr; | 156 return nullptr; |
155 return toPluginView(widget)->platformLayer(); | 157 return toPluginView(widget)->platformLayer(); |
156 } | 158 } |
157 | 159 |
158 static inline bool isAcceleratedContents(LayoutObject* layoutObject) { | 160 static inline bool isAcceleratedContents(LayoutObject& layoutObject) { |
159 return isAcceleratedCanvas(layoutObject) || | 161 return isAcceleratedCanvas(layoutObject) || |
160 (layoutObject->isEmbeddedObject() && | 162 (layoutObject.isEmbeddedObject() && |
161 toLayoutEmbeddedObject(layoutObject) | 163 toLayoutEmbeddedObject(layoutObject) |
162 ->requiresAcceleratedCompositing()) || | 164 .requiresAcceleratedCompositing()) || |
163 layoutObject->isVideo(); | 165 layoutObject.isVideo(); |
164 } | 166 } |
165 | 167 |
166 // Get the scrolling coordinator in a way that works inside | 168 // Get the scrolling coordinator in a way that works inside |
167 // CompositedLayerMapping's destructor. | 169 // CompositedLayerMapping's destructor. |
168 static ScrollingCoordinator* scrollingCoordinatorFromLayer(PaintLayer& layer) { | 170 static ScrollingCoordinator* scrollingCoordinatorFromLayer(PaintLayer& layer) { |
169 Page* page = layer.layoutObject()->frame()->page(); | 171 Page* page = layer.layoutObject().frame()->page(); |
170 return (!page) ? nullptr : page->scrollingCoordinator(); | 172 return (!page) ? nullptr : page->scrollingCoordinator(); |
171 } | 173 } |
172 | 174 |
173 CompositedLayerMapping::CompositedLayerMapping(PaintLayer& layer) | 175 CompositedLayerMapping::CompositedLayerMapping(PaintLayer& layer) |
174 : m_owningLayer(layer), | 176 : m_owningLayer(layer), |
175 m_contentOffsetInCompositingLayerDirty(false), | 177 m_contentOffsetInCompositingLayerDirty(false), |
176 m_pendingUpdateScope(GraphicsLayerUpdateNone), | 178 m_pendingUpdateScope(GraphicsLayerUpdateNone), |
177 m_isMainFrameLayoutViewLayer(false), | 179 m_isMainFrameLayoutViewLayer(false), |
178 m_backgroundLayerPaintsFixedRootBackground(false), | 180 m_backgroundLayerPaintsFixedRootBackground(false), |
179 m_scrollingContentsAreEmpty(false), | 181 m_scrollingContentsAreEmpty(false), |
180 m_backgroundPaintsOntoScrollingContentsLayer(false), | 182 m_backgroundPaintsOntoScrollingContentsLayer(false), |
181 m_backgroundPaintsOntoGraphicsLayer(false), | 183 m_backgroundPaintsOntoGraphicsLayer(false), |
182 m_drawsBackgroundOntoContentLayer(false) { | 184 m_drawsBackgroundOntoContentLayer(false) { |
183 if (layer.isRootLayer() && layoutObject()->frame()->isMainFrame()) | 185 if (layer.isRootLayer() && layoutObject().frame()->isMainFrame()) |
184 m_isMainFrameLayoutViewLayer = true; | 186 m_isMainFrameLayoutViewLayer = true; |
185 | 187 |
186 createPrimaryGraphicsLayer(); | 188 createPrimaryGraphicsLayer(); |
187 } | 189 } |
188 | 190 |
189 CompositedLayerMapping::~CompositedLayerMapping() { | 191 CompositedLayerMapping::~CompositedLayerMapping() { |
190 // Hits in compositing/squashing/squash-onto-nephew.html. | 192 // Hits in compositing/squashing/squash-onto-nephew.html. |
191 DisableCompositingQueryAsserts disabler; | 193 DisableCompositingQueryAsserts disabler; |
192 | 194 |
193 // Do not leave the destroyed pointer dangling on any Layers that painted to | 195 // Do not leave the destroyed pointer dangling on any Layers that painted to |
(...skipping 21 matching lines...) Expand all Loading... |
215 destroyGraphicsLayers(); | 217 destroyGraphicsLayers(); |
216 } | 218 } |
217 | 219 |
218 std::unique_ptr<GraphicsLayer> CompositedLayerMapping::createGraphicsLayer( | 220 std::unique_ptr<GraphicsLayer> CompositedLayerMapping::createGraphicsLayer( |
219 CompositingReasons reasons, | 221 CompositingReasons reasons, |
220 SquashingDisallowedReasons squashingDisallowedReasons) { | 222 SquashingDisallowedReasons squashingDisallowedReasons) { |
221 std::unique_ptr<GraphicsLayer> graphicsLayer = GraphicsLayer::create(this); | 223 std::unique_ptr<GraphicsLayer> graphicsLayer = GraphicsLayer::create(this); |
222 | 224 |
223 graphicsLayer->setCompositingReasons(reasons); | 225 graphicsLayer->setCompositingReasons(reasons); |
224 graphicsLayer->setSquashingDisallowedReasons(squashingDisallowedReasons); | 226 graphicsLayer->setSquashingDisallowedReasons(squashingDisallowedReasons); |
225 if (Node* owningNode = m_owningLayer.layoutObject()->node()) | 227 if (Node* owningNode = m_owningLayer.layoutObject().node()) |
226 graphicsLayer->setOwnerNodeId(DOMNodeIds::idForNode(owningNode)); | 228 graphicsLayer->setOwnerNodeId(DOMNodeIds::idForNode(owningNode)); |
227 | 229 |
228 return graphicsLayer; | 230 return graphicsLayer; |
229 } | 231 } |
230 | 232 |
231 void CompositedLayerMapping::createPrimaryGraphicsLayer() { | 233 void CompositedLayerMapping::createPrimaryGraphicsLayer() { |
232 m_graphicsLayer = | 234 m_graphicsLayer = |
233 createGraphicsLayer(m_owningLayer.getCompositingReasons(), | 235 createGraphicsLayer(m_owningLayer.getCompositingReasons(), |
234 m_owningLayer.getSquashingDisallowedReasons()); | 236 m_owningLayer.getSquashingDisallowedReasons()); |
235 | 237 |
236 updateOpacity(layoutObject()->styleRef()); | 238 updateOpacity(layoutObject().styleRef()); |
237 updateTransform(layoutObject()->styleRef()); | 239 updateTransform(layoutObject().styleRef()); |
238 updateFilters(layoutObject()->styleRef()); | 240 updateFilters(layoutObject().styleRef()); |
239 updateBackdropFilters(layoutObject()->styleRef()); | 241 updateBackdropFilters(layoutObject().styleRef()); |
240 updateLayerBlendMode(layoutObject()->styleRef()); | 242 updateLayerBlendMode(layoutObject().styleRef()); |
241 updateIsRootForIsolatedGroup(); | 243 updateIsRootForIsolatedGroup(); |
242 } | 244 } |
243 | 245 |
244 void CompositedLayerMapping::destroyGraphicsLayers() { | 246 void CompositedLayerMapping::destroyGraphicsLayers() { |
245 if (m_graphicsLayer) | 247 if (m_graphicsLayer) |
246 m_graphicsLayer->removeFromParent(); | 248 m_graphicsLayer->removeFromParent(); |
247 | 249 |
248 m_ancestorClippingLayer = nullptr; | 250 m_ancestorClippingLayer = nullptr; |
249 m_ancestorClippingMaskLayer = nullptr; | 251 m_ancestorClippingMaskLayer = nullptr; |
250 m_graphicsLayer = nullptr; | 252 m_graphicsLayer = nullptr; |
(...skipping 11 matching lines...) Expand all Loading... |
262 void CompositedLayerMapping::updateOpacity(const ComputedStyle& style) { | 264 void CompositedLayerMapping::updateOpacity(const ComputedStyle& style) { |
263 m_graphicsLayer->setOpacity(compositingOpacity(style.opacity())); | 265 m_graphicsLayer->setOpacity(compositingOpacity(style.opacity())); |
264 } | 266 } |
265 | 267 |
266 void CompositedLayerMapping::updateTransform(const ComputedStyle& style) { | 268 void CompositedLayerMapping::updateTransform(const ComputedStyle& style) { |
267 // FIXME: This could use m_owningLayer.transform(), but that currently has | 269 // FIXME: This could use m_owningLayer.transform(), but that currently has |
268 // transform-origin baked into it, and we don't want that. | 270 // transform-origin baked into it, and we don't want that. |
269 TransformationMatrix t; | 271 TransformationMatrix t; |
270 if (m_owningLayer.hasTransformRelatedProperty()) { | 272 if (m_owningLayer.hasTransformRelatedProperty()) { |
271 style.applyTransform( | 273 style.applyTransform( |
272 t, LayoutSize(toLayoutBox(layoutObject())->pixelSnappedSize()), | 274 t, LayoutSize(toLayoutBox(layoutObject()).pixelSnappedSize()), |
273 ComputedStyle::ExcludeTransformOrigin, ComputedStyle::IncludeMotionPath, | 275 ComputedStyle::ExcludeTransformOrigin, ComputedStyle::IncludeMotionPath, |
274 ComputedStyle::IncludeIndependentTransformProperties); | 276 ComputedStyle::IncludeIndependentTransformProperties); |
275 makeMatrixRenderable(t, compositor()->hasAcceleratedCompositing()); | 277 makeMatrixRenderable(t, compositor()->hasAcceleratedCompositing()); |
276 } | 278 } |
277 | 279 |
278 m_graphicsLayer->setTransform(t); | 280 m_graphicsLayer->setTransform(t); |
279 } | 281 } |
280 | 282 |
281 void CompositedLayerMapping::updateFilters(const ComputedStyle& style) { | 283 void CompositedLayerMapping::updateFilters(const ComputedStyle& style) { |
282 m_graphicsLayer->setFilters( | 284 m_graphicsLayer->setFilters( |
283 owningLayer().createCompositorFilterOperationsForFilter(style)); | 285 owningLayer().createCompositorFilterOperationsForFilter(style)); |
284 } | 286 } |
285 | 287 |
286 void CompositedLayerMapping::updateBackdropFilters(const ComputedStyle& style) { | 288 void CompositedLayerMapping::updateBackdropFilters(const ComputedStyle& style) { |
287 m_graphicsLayer->setBackdropFilters( | 289 m_graphicsLayer->setBackdropFilters( |
288 owningLayer().createCompositorFilterOperationsForBackdropFilter(style)); | 290 owningLayer().createCompositorFilterOperationsForBackdropFilter(style)); |
289 } | 291 } |
290 | 292 |
291 void CompositedLayerMapping::updateStickyConstraints( | 293 void CompositedLayerMapping::updateStickyConstraints( |
292 const ComputedStyle& style) { | 294 const ComputedStyle& style) { |
293 bool sticky = style.position() == EPosition::kSticky; | 295 bool sticky = style.position() == EPosition::kSticky; |
294 const PaintLayer* ancestorOverflowLayer = | 296 const PaintLayer* ancestorOverflowLayer = |
295 m_owningLayer.ancestorOverflowLayer(); | 297 m_owningLayer.ancestorOverflowLayer(); |
296 // TODO(flackr): Do we still need this? | 298 // TODO(flackr): Do we still need this? |
297 if (sticky) { | 299 if (sticky) { |
298 if (!ancestorOverflowLayer->isRootLayer()) { | 300 if (!ancestorOverflowLayer->isRootLayer()) { |
299 sticky = ancestorOverflowLayer->needsCompositedScrolling(); | 301 sticky = ancestorOverflowLayer->needsCompositedScrolling(); |
300 } else { | 302 } else { |
301 sticky = layoutObject()->view()->frameView()->isScrollable(); | 303 sticky = layoutObject().view()->frameView()->isScrollable(); |
302 } | 304 } |
303 } | 305 } |
304 | 306 |
305 WebLayerStickyPositionConstraint webConstraint; | 307 WebLayerStickyPositionConstraint webConstraint; |
306 if (sticky) { | 308 if (sticky) { |
307 const StickyPositionScrollingConstraints& constraints = | 309 const StickyPositionScrollingConstraints& constraints = |
308 ancestorOverflowLayer->getScrollableArea()->stickyConstraintsMap().get( | 310 ancestorOverflowLayer->getScrollableArea()->stickyConstraintsMap().get( |
309 &m_owningLayer); | 311 &m_owningLayer); |
310 | 312 |
311 // Find the layout offset of the unshifted sticky box within its enclosing | 313 // Find the layout offset of the unshifted sticky box within its enclosing |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 m_backgroundPaintsOntoGraphicsLayer = shouldPaintOntoGraphicsLayer; | 389 m_backgroundPaintsOntoGraphicsLayer = shouldPaintOntoGraphicsLayer; |
388 // The graphics layer needs to be updated for changed | 390 // The graphics layer needs to be updated for changed |
389 // m_backgroundPaintsOntoGraphicsLayer. | 391 // m_backgroundPaintsOntoGraphicsLayer. |
390 m_graphicsLayer->setNeedsDisplay(); | 392 m_graphicsLayer->setNeedsDisplay(); |
391 } | 393 } |
392 } | 394 } |
393 | 395 |
394 void CompositedLayerMapping::updateContentsOpaque() { | 396 void CompositedLayerMapping::updateContentsOpaque() { |
395 if (isAcceleratedCanvas(layoutObject())) { | 397 if (isAcceleratedCanvas(layoutObject())) { |
396 CanvasRenderingContext* context = | 398 CanvasRenderingContext* context = |
397 toHTMLCanvasElement(layoutObject()->node())->renderingContext(); | 399 toHTMLCanvasElement(layoutObject().node())->renderingContext(); |
398 WebLayer* layer = context ? context->platformLayer() : nullptr; | 400 WebLayer* layer = context ? context->platformLayer() : nullptr; |
399 // Determine whether the external texture layer covers the whole graphics | 401 // Determine whether the external texture layer covers the whole graphics |
400 // layer. This may not be the case if there are box decorations or | 402 // layer. This may not be the case if there are box decorations or |
401 // shadows. | 403 // shadows. |
402 if (layer && | 404 if (layer && |
403 layer->bounds() == m_graphicsLayer->platformLayer()->bounds()) { | 405 layer->bounds() == m_graphicsLayer->platformLayer()->bounds()) { |
404 // Determine whether the rendering context's external texture layer is | 406 // Determine whether the rendering context's external texture layer is |
405 // opaque. | 407 // opaque. |
406 if (!context->creationAttributes().alpha()) { | 408 if (!context->creationAttributes().alpha()) { |
407 m_graphicsLayer->setContentsOpaque(true); | 409 m_graphicsLayer->setContentsOpaque(true); |
(...skipping 13 matching lines...) Expand all Loading... |
421 // layer if all backgrounds are background attachment local, otherwise | 423 // layer if all backgrounds are background attachment local, otherwise |
422 // background is painted by the primary graphics layer. | 424 // background is painted by the primary graphics layer. |
423 if (hasScrollingLayer() && m_backgroundPaintsOntoScrollingContentsLayer) { | 425 if (hasScrollingLayer() && m_backgroundPaintsOntoScrollingContentsLayer) { |
424 // Backgrounds painted onto the foreground are clipped by the padding box | 426 // Backgrounds painted onto the foreground are clipped by the padding box |
425 // rect. | 427 // rect. |
426 // TODO(flackr): This should actually check the entire overflow rect | 428 // TODO(flackr): This should actually check the entire overflow rect |
427 // within the scrolling contents layer but since we currently only trigger | 429 // within the scrolling contents layer but since we currently only trigger |
428 // this for solid color backgrounds the answer will be the same. | 430 // this for solid color backgrounds the answer will be the same. |
429 m_scrollingContentsLayer->setContentsOpaque( | 431 m_scrollingContentsLayer->setContentsOpaque( |
430 m_owningLayer.backgroundIsKnownToBeOpaqueInRect( | 432 m_owningLayer.backgroundIsKnownToBeOpaqueInRect( |
431 toLayoutBox(layoutObject())->paddingBoxRect())); | 433 toLayoutBox(layoutObject()).paddingBoxRect())); |
432 | 434 |
433 if (m_owningLayer.backgroundPaintLocation() & | 435 if (m_owningLayer.backgroundPaintLocation() & |
434 BackgroundPaintInGraphicsLayer) { | 436 BackgroundPaintInGraphicsLayer) { |
435 m_graphicsLayer->setContentsOpaque( | 437 m_graphicsLayer->setContentsOpaque( |
436 m_owningLayer.backgroundIsKnownToBeOpaqueInRect( | 438 m_owningLayer.backgroundIsKnownToBeOpaqueInRect( |
437 compositedBounds())); | 439 compositedBounds())); |
438 } else { | 440 } else { |
439 // If we only paint the background onto the scrolling contents layer we | 441 // If we only paint the background onto the scrolling contents layer we |
440 // are going to leave a hole in the m_graphicsLayer where the background | 442 // are going to leave a hole in the m_graphicsLayer where the background |
441 // is so it is not opaque. | 443 // is so it is not opaque. |
(...skipping 11 matching lines...) Expand all Loading... |
453 void CompositedLayerMapping::updateCompositedBounds() { | 455 void CompositedLayerMapping::updateCompositedBounds() { |
454 ASSERT(m_owningLayer.compositor()->lifecycle().state() == | 456 ASSERT(m_owningLayer.compositor()->lifecycle().state() == |
455 DocumentLifecycle::InCompositingUpdate); | 457 DocumentLifecycle::InCompositingUpdate); |
456 // FIXME: if this is really needed for performance, it would be better to | 458 // FIXME: if this is really needed for performance, it would be better to |
457 // store it on Layer. | 459 // store it on Layer. |
458 m_compositedBounds = m_owningLayer.boundingBoxForCompositing(); | 460 m_compositedBounds = m_owningLayer.boundingBoxForCompositing(); |
459 m_contentOffsetInCompositingLayerDirty = true; | 461 m_contentOffsetInCompositingLayerDirty = true; |
460 } | 462 } |
461 | 463 |
462 void CompositedLayerMapping::updateAfterPartResize() { | 464 void CompositedLayerMapping::updateAfterPartResize() { |
463 if (layoutObject()->isLayoutPart()) { | 465 if (layoutObject().isLayoutPart()) { |
464 if (PaintLayerCompositor* innerCompositor = | 466 if (PaintLayerCompositor* innerCompositor = |
465 PaintLayerCompositor::frameContentsCompositor( | 467 PaintLayerCompositor::frameContentsCompositor( |
466 toLayoutPart(layoutObject()))) { | 468 toLayoutPart(layoutObject()))) { |
467 innerCompositor->frameViewDidChangeSize(); | 469 innerCompositor->frameViewDidChangeSize(); |
468 // We can floor this point because our frameviews are always aligned to | 470 // We can floor this point because our frameviews are always aligned to |
469 // pixel boundaries. | 471 // pixel boundaries. |
470 ASSERT(m_compositedBounds.location() == | 472 ASSERT(m_compositedBounds.location() == |
471 flooredIntPoint(m_compositedBounds.location())); | 473 flooredIntPoint(m_compositedBounds.location())); |
472 innerCompositor->frameViewDidChangeLocation( | 474 innerCompositor->frameViewDidChangeLocation( |
473 flooredIntPoint(contentsBox().location())); | 475 flooredIntPoint(contentsBox().location())); |
474 } | 476 } |
475 } | 477 } |
476 } | 478 } |
477 | 479 |
478 void CompositedLayerMapping::updateCompositingReasons() { | 480 void CompositedLayerMapping::updateCompositingReasons() { |
479 // All other layers owned by this mapping will have the same compositing | 481 // All other layers owned by this mapping will have the same compositing |
480 // reason for their lifetime, so they are initialized only when created. | 482 // reason for their lifetime, so they are initialized only when created. |
481 m_graphicsLayer->setCompositingReasons(m_owningLayer.getCompositingReasons()); | 483 m_graphicsLayer->setCompositingReasons(m_owningLayer.getCompositingReasons()); |
482 m_graphicsLayer->setSquashingDisallowedReasons( | 484 m_graphicsLayer->setSquashingDisallowedReasons( |
483 m_owningLayer.getSquashingDisallowedReasons()); | 485 m_owningLayer.getSquashingDisallowedReasons()); |
484 } | 486 } |
485 | 487 |
486 bool CompositedLayerMapping::ancestorRoundedCornersWontClip( | 488 bool CompositedLayerMapping::ancestorRoundedCornersWontClip( |
487 const LayoutObject* child, | 489 const LayoutBoxModelObject& child, |
488 const LayoutObject* clippingAncestor) { | 490 const LayoutBoxModelObject& clippingAncestor) { |
489 if (!clippingAncestor->isBoxModelObject()) | |
490 return false; | |
491 const LayoutBoxModelObject* clippingObject = | |
492 toLayoutBoxModelObject(clippingAncestor); | |
493 LayoutRect localVisualRect = m_compositedBounds; | 491 LayoutRect localVisualRect = m_compositedBounds; |
494 child->mapToVisualRectInAncestorSpace(clippingObject, localVisualRect); | 492 child.mapToVisualRectInAncestorSpace(&clippingAncestor, localVisualRect); |
495 FloatRoundedRect roundedClipRect = | 493 FloatRoundedRect roundedClipRect = |
496 clippingObject->style()->getRoundedInnerBorderFor( | 494 clippingAncestor.style()->getRoundedInnerBorderFor( |
497 clippingObject->localVisualRect()); | 495 clippingAncestor.localVisualRect()); |
498 FloatRect innerClipRect = roundedClipRect.radiusCenterRect(); | 496 FloatRect innerClipRect = roundedClipRect.radiusCenterRect(); |
499 // The first condition catches cases where the child is certainly inside | 497 // The first condition catches cases where the child is certainly inside |
500 // the rounded corner portion of the border, and cannot be clipped by | 498 // the rounded corner portion of the border, and cannot be clipped by |
501 // the rounded portion. The second catches cases where the child is | 499 // the rounded portion. The second catches cases where the child is |
502 // entirely outside the rectangular border (ignoring rounded corners) so | 500 // entirely outside the rectangular border (ignoring rounded corners) so |
503 // is also unaffected by the rounded corners. In both cases the existing | 501 // is also unaffected by the rounded corners. In both cases the existing |
504 // rectangular clip is adequate and the mask is unnecessary. | 502 // rectangular clip is adequate and the mask is unnecessary. |
505 return innerClipRect.contains(FloatRect(localVisualRect)) || | 503 return innerClipRect.contains(FloatRect(localVisualRect)) || |
506 !localVisualRect.intersects( | 504 !localVisualRect.intersects( |
507 enclosingLayoutRect(roundedClipRect.rect())); | 505 enclosingLayoutRect(roundedClipRect.rect())); |
508 } | 506 } |
509 | 507 |
510 void CompositedLayerMapping:: | 508 void CompositedLayerMapping:: |
511 owningLayerClippedOrMaskedByLayerNotAboveCompositedAncestor( | 509 owningLayerClippedOrMaskedByLayerNotAboveCompositedAncestor( |
512 const PaintLayer* scrollParent, | 510 const PaintLayer* scrollParent, |
513 bool& owningLayerIsClipped, | 511 bool& owningLayerIsClipped, |
514 bool& owningLayerIsMasked) { | 512 bool& owningLayerIsMasked) { |
515 owningLayerIsClipped = false; | 513 owningLayerIsClipped = false; |
516 owningLayerIsMasked = false; | 514 owningLayerIsMasked = false; |
517 | 515 |
518 if (!m_owningLayer.parent()) | 516 if (!m_owningLayer.parent()) |
519 return; | 517 return; |
520 | 518 |
521 const PaintLayer* compositingAncestor = | 519 const PaintLayer* compositingAncestor = |
522 m_owningLayer.enclosingLayerWithCompositedLayerMapping(ExcludeSelf); | 520 m_owningLayer.enclosingLayerWithCompositedLayerMapping(ExcludeSelf); |
523 if (!compositingAncestor) | 521 if (!compositingAncestor) |
524 return; | 522 return; |
525 | 523 |
526 const LayoutObject* clippingContainer = m_owningLayer.clippingContainer(); | 524 const LayoutBoxModelObject* clippingContainer = |
| 525 m_owningLayer.clippingContainer(); |
527 if (!clippingContainer) | 526 if (!clippingContainer) |
528 return; | 527 return; |
529 | 528 |
530 if (clippingContainer->enclosingLayer() == scrollParent) | 529 if (clippingContainer->enclosingLayer() == scrollParent) |
531 return; | 530 return; |
532 | 531 |
533 if (clippingContainer->enclosingLayer()->hasRootScrollerAsDescendant()) | 532 if (clippingContainer->enclosingLayer()->hasRootScrollerAsDescendant()) |
534 return; | 533 return; |
535 | 534 |
536 if (compositingAncestor->layoutObject()->isDescendantOf(clippingContainer)) | 535 if (compositingAncestor->layoutObject().isDescendantOf(clippingContainer)) |
537 return; | 536 return; |
538 | 537 |
539 // We ignore overflow clip here; we want composited overflow content to | 538 // We ignore overflow clip here; we want composited overflow content to |
540 // behave as if it lives in an unclipped universe so it can prepaint, etc. | 539 // behave as if it lives in an unclipped universe so it can prepaint, etc. |
541 // This means that we need to check if we are actually clipped before | 540 // This means that we need to check if we are actually clipped before |
542 // setting up m_ancestorClippingLayer otherwise | 541 // setting up m_ancestorClippingLayer otherwise |
543 // updateAncestorClippingLayerGeometry will fail as the clip rect will be | 542 // updateAncestorClippingLayerGeometry will fail as the clip rect will be |
544 // infinite. | 543 // infinite. |
545 // FIXME: this should use cached clip rects, but this sometimes give | 544 // FIXME: this should use cached clip rects, but this sometimes give |
546 // inaccurate results (and trips the ASSERTS in PaintLayerClipper). | 545 // inaccurate results (and trips the ASSERTS in PaintLayerClipper). |
547 ClipRectsContext clipRectsContext(compositingAncestor, UncachedClipRects, | 546 ClipRectsContext clipRectsContext(compositingAncestor, UncachedClipRects, |
548 IgnoreOverlayScrollbarSize); | 547 IgnoreOverlayScrollbarSize); |
549 clipRectsContext.setIgnoreOverflowClip(); | 548 clipRectsContext.setIgnoreOverflowClip(); |
550 LayoutRect unsnappedParentClipRect = | 549 LayoutRect unsnappedParentClipRect = |
551 m_owningLayer.clipper(PaintLayer::DoNotUseGeometryMapper) | 550 m_owningLayer.clipper(PaintLayer::DoNotUseGeometryMapper) |
552 .backgroundClipRect(clipRectsContext) | 551 .backgroundClipRect(clipRectsContext) |
553 .rect(); | 552 .rect(); |
554 IntRect parentClipRect = pixelSnappedIntRect(unsnappedParentClipRect); | 553 IntRect parentClipRect = pixelSnappedIntRect(unsnappedParentClipRect); |
555 owningLayerIsClipped = parentClipRect != LayoutRect::infiniteIntRect(); | 554 owningLayerIsClipped = parentClipRect != LayoutRect::infiniteIntRect(); |
556 | 555 |
557 // TODO(schenney): CSS clips are not applied to composited children, and | 556 // TODO(schenney): CSS clips are not applied to composited children, and |
558 // should be via mask or by compositing the parent too. | 557 // should be via mask or by compositing the parent too. |
559 // https://bugs.chromium.org/p/chromium/issues/detail?id=615870 | 558 // https://bugs.chromium.org/p/chromium/issues/detail?id=615870 |
560 DCHECK(clippingContainer->style()); | 559 DCHECK(clippingContainer->style()); |
561 owningLayerIsMasked = | 560 owningLayerIsMasked = |
562 owningLayerIsClipped && clippingContainer->style()->hasBorderRadius() && | 561 owningLayerIsClipped && clippingContainer->style()->hasBorderRadius() && |
563 !ancestorRoundedCornersWontClip(layoutObject(), clippingContainer); | 562 !ancestorRoundedCornersWontClip(layoutObject(), *clippingContainer); |
564 } | 563 } |
565 | 564 |
566 const PaintLayer* CompositedLayerMapping::scrollParent() { | 565 const PaintLayer* CompositedLayerMapping::scrollParent() { |
567 const PaintLayer* scrollParent = m_owningLayer.scrollParent(); | 566 const PaintLayer* scrollParent = m_owningLayer.scrollParent(); |
568 if (scrollParent && !scrollParent->needsCompositedScrolling()) | 567 if (scrollParent && !scrollParent->needsCompositedScrolling()) |
569 return nullptr; | 568 return nullptr; |
570 return scrollParent; | 569 return scrollParent; |
571 } | 570 } |
572 | 571 |
573 bool CompositedLayerMapping::updateGraphicsLayerConfiguration() { | 572 bool CompositedLayerMapping::updateGraphicsLayerConfiguration() { |
574 ASSERT(m_owningLayer.compositor()->lifecycle().state() == | 573 ASSERT(m_owningLayer.compositor()->lifecycle().state() == |
575 DocumentLifecycle::InCompositingUpdate); | 574 DocumentLifecycle::InCompositingUpdate); |
576 | 575 |
577 // Note carefully: here we assume that the compositing state of all | 576 // Note carefully: here we assume that the compositing state of all |
578 // descendants have been updated already, so it is legitimate to compute and | 577 // descendants have been updated already, so it is legitimate to compute and |
579 // cache the composited bounds for this layer. | 578 // cache the composited bounds for this layer. |
580 updateCompositedBounds(); | 579 updateCompositedBounds(); |
581 | 580 |
582 PaintLayerCompositor* compositor = this->compositor(); | 581 PaintLayerCompositor* compositor = this->compositor(); |
583 LayoutObject* layoutObject = this->layoutObject(); | 582 LayoutObject& layoutObject = this->layoutObject(); |
584 const ComputedStyle& style = layoutObject->styleRef(); | 583 const ComputedStyle& style = layoutObject.styleRef(); |
585 | 584 |
586 bool layerConfigChanged = false; | 585 bool layerConfigChanged = false; |
587 setBackgroundLayerPaintsFixedRootBackground( | 586 setBackgroundLayerPaintsFixedRootBackground( |
588 compositor->needsFixedRootBackgroundLayer(&m_owningLayer)); | 587 compositor->needsFixedRootBackgroundLayer(&m_owningLayer)); |
589 | 588 |
590 // The background layer is currently only used for fixed root backgrounds. | 589 // The background layer is currently only used for fixed root backgrounds. |
591 if (updateBackgroundLayer(m_backgroundLayerPaintsFixedRootBackground)) | 590 if (updateBackgroundLayer(m_backgroundLayerPaintsFixedRootBackground)) |
592 layerConfigChanged = true; | 591 layerConfigChanged = true; |
593 | 592 |
594 if (updateForegroundLayer( | 593 if (updateForegroundLayer( |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
626 | 625 |
627 bool scrollingConfigChanged = false; | 626 bool scrollingConfigChanged = false; |
628 if (updateScrollingLayers(m_owningLayer.needsCompositedScrolling())) { | 627 if (updateScrollingLayers(m_owningLayer.needsCompositedScrolling())) { |
629 layerConfigChanged = true; | 628 layerConfigChanged = true; |
630 scrollingConfigChanged = true; | 629 scrollingConfigChanged = true; |
631 } | 630 } |
632 | 631 |
633 // If the outline needs to draw over the composited scrolling contents layer | 632 // If the outline needs to draw over the composited scrolling contents layer |
634 // or scrollbar layers it needs to be drawn into a separate layer. | 633 // or scrollbar layers it needs to be drawn into a separate layer. |
635 int minBorderWidth = | 634 int minBorderWidth = |
636 std::min(layoutObject->style()->borderTopWidth(), | 635 std::min(layoutObject.style()->borderTopWidth(), |
637 std::min(layoutObject->style()->borderLeftWidth(), | 636 std::min(layoutObject.style()->borderLeftWidth(), |
638 std::min(layoutObject->style()->borderRightWidth(), | 637 std::min(layoutObject.style()->borderRightWidth(), |
639 layoutObject->style()->borderBottomWidth()))); | 638 layoutObject.style()->borderBottomWidth()))); |
640 bool needsDecorationOutlineLayer = | 639 bool needsDecorationOutlineLayer = |
641 m_owningLayer.getScrollableArea() && | 640 m_owningLayer.getScrollableArea() && |
642 m_owningLayer.getScrollableArea()->usesCompositedScrolling() && | 641 m_owningLayer.getScrollableArea()->usesCompositedScrolling() && |
643 layoutObject->style()->hasOutline() && | 642 layoutObject.style()->hasOutline() && |
644 layoutObject->style()->outlineOffset() < -minBorderWidth; | 643 layoutObject.style()->outlineOffset() < -minBorderWidth; |
645 | 644 |
646 if (updateDecorationOutlineLayer(needsDecorationOutlineLayer)) | 645 if (updateDecorationOutlineLayer(needsDecorationOutlineLayer)) |
647 layerConfigChanged = true; | 646 layerConfigChanged = true; |
648 | 647 |
649 if (updateOverflowControlsLayers( | 648 if (updateOverflowControlsLayers( |
650 requiresHorizontalScrollbarLayer(), requiresVerticalScrollbarLayer(), | 649 requiresHorizontalScrollbarLayer(), requiresVerticalScrollbarLayer(), |
651 requiresScrollCornerLayer(), needsAncestorClip)) | 650 requiresScrollCornerLayer(), needsAncestorClip)) |
652 layerConfigChanged = true; | 651 layerConfigChanged = true; |
653 | 652 |
654 bool hasPerspective = style.hasPerspective(); | 653 bool hasPerspective = style.hasPerspective(); |
655 bool needsChildTransformLayer = hasPerspective && layoutObject->isBox(); | 654 bool needsChildTransformLayer = hasPerspective && layoutObject.isBox(); |
656 if (updateChildTransformLayer(needsChildTransformLayer)) | 655 if (updateChildTransformLayer(needsChildTransformLayer)) |
657 layerConfigChanged = true; | 656 layerConfigChanged = true; |
658 | 657 |
659 if (updateSquashingLayers(!m_squashedLayers.isEmpty())) | 658 if (updateSquashingLayers(!m_squashedLayers.isEmpty())) |
660 layerConfigChanged = true; | 659 layerConfigChanged = true; |
661 | 660 |
662 updateScrollParent(scrollParent); | 661 updateScrollParent(scrollParent); |
663 updateClipParent(scrollParent); | 662 updateClipParent(scrollParent); |
664 | 663 |
665 if (layerConfigChanged) | 664 if (layerConfigChanged) |
666 updateInternalHierarchy(); | 665 updateInternalHierarchy(); |
667 | 666 |
668 if (scrollingConfigChanged) { | 667 if (scrollingConfigChanged) { |
669 if (layoutObject->view()) | 668 if (layoutObject.view()) |
670 compositor->scrollingLayerDidChange(&m_owningLayer); | 669 compositor->scrollingLayerDidChange(&m_owningLayer); |
671 } | 670 } |
672 | 671 |
673 // A mask layer is not part of the hierarchy proper, it's an auxiliary layer | 672 // A mask layer is not part of the hierarchy proper, it's an auxiliary layer |
674 // that's plugged into another GraphicsLayer that is part of the hierarchy. | 673 // that's plugged into another GraphicsLayer that is part of the hierarchy. |
675 // It has no parent or child GraphicsLayer. For that reason, we process it | 674 // It has no parent or child GraphicsLayer. For that reason, we process it |
676 // here, after the hierarchy has been updated. | 675 // here, after the hierarchy has been updated. |
677 bool maskLayerChanged = updateMaskLayer(layoutObject->hasMask()); | 676 bool maskLayerChanged = updateMaskLayer(layoutObject.hasMask()); |
678 if (maskLayerChanged) | 677 if (maskLayerChanged) |
679 m_graphicsLayer->setMaskLayer(m_maskLayer.get()); | 678 m_graphicsLayer->setMaskLayer(m_maskLayer.get()); |
680 | 679 |
681 bool hasChildClippingLayer = | 680 bool hasChildClippingLayer = |
682 compositor->clipsCompositingDescendants(&m_owningLayer) && | 681 compositor->clipsCompositingDescendants(&m_owningLayer) && |
683 (hasClippingLayer() || hasScrollingLayer()); | 682 (hasClippingLayer() || hasScrollingLayer()); |
684 // If we have a border radius or clip path on a scrolling layer, we need a | 683 // If we have a border radius or clip path on a scrolling layer, we need a |
685 // clipping mask to properly clip the scrolled contents, even if there are no | 684 // clipping mask to properly clip the scrolled contents, even if there are no |
686 // composited descendants. | 685 // composited descendants. |
687 bool hasClipPath = style.clipPath(); | 686 bool hasClipPath = style.clipPath(); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
727 scrollingLayer()->setMaskLayer(layerToApplyChildClippingMask == | 726 scrollingLayer()->setMaskLayer(layerToApplyChildClippingMask == |
728 scrollingLayer() | 727 scrollingLayer() |
729 ? m_childClippingMaskLayer.get() | 728 ? m_childClippingMaskLayer.get() |
730 : nullptr); | 729 : nullptr); |
731 m_graphicsLayer->setContentsClippingMaskLayer( | 730 m_graphicsLayer->setContentsClippingMaskLayer( |
732 shouldApplyChildClippingMaskOnContents ? m_childClippingMaskLayer.get() | 731 shouldApplyChildClippingMaskOnContents ? m_childClippingMaskLayer.get() |
733 : nullptr); | 732 : nullptr); |
734 | 733 |
735 updateBackgroundColor(); | 734 updateBackgroundColor(); |
736 | 735 |
737 if (layoutObject->isImage()) { | 736 if (layoutObject.isImage()) { |
738 if (isDirectlyCompositedImage()) { | 737 if (isDirectlyCompositedImage()) { |
739 updateImageContents(); | 738 updateImageContents(); |
740 } else if (m_graphicsLayer->hasContentsLayer()) { | 739 } else if (m_graphicsLayer->hasContentsLayer()) { |
741 m_graphicsLayer->setContentsToImage(nullptr); | 740 m_graphicsLayer->setContentsToImage(nullptr); |
742 } | 741 } |
743 } | 742 } |
744 | 743 |
745 if (WebLayer* layer = platformLayerForPlugin(layoutObject)) { | 744 if (WebLayer* layer = platformLayerForPlugin(layoutObject)) { |
746 m_graphicsLayer->setContentsToPlatformLayer(layer); | 745 m_graphicsLayer->setContentsToPlatformLayer(layer); |
747 } else if (layoutObject->node() && | 746 } else if (layoutObject.node() && |
748 layoutObject->node()->isFrameOwnerElement() && | 747 layoutObject.node()->isFrameOwnerElement() && |
749 toHTMLFrameOwnerElement(layoutObject->node())->contentFrame()) { | 748 toHTMLFrameOwnerElement(layoutObject.node())->contentFrame()) { |
750 Frame* frame = | 749 Frame* frame = toHTMLFrameOwnerElement(layoutObject.node())->contentFrame(); |
751 toHTMLFrameOwnerElement(layoutObject->node())->contentFrame(); | |
752 if (frame->isRemoteFrame()) { | 750 if (frame->isRemoteFrame()) { |
753 WebLayer* layer = toRemoteFrame(frame)->webLayer(); | 751 WebLayer* layer = toRemoteFrame(frame)->webLayer(); |
754 m_graphicsLayer->setContentsToPlatformLayer(layer); | 752 m_graphicsLayer->setContentsToPlatformLayer(layer); |
755 } | 753 } |
756 } else if (layoutObject->isVideo()) { | 754 } else if (layoutObject.isVideo()) { |
757 HTMLMediaElement* mediaElement = toHTMLMediaElement(layoutObject->node()); | 755 HTMLMediaElement* mediaElement = toHTMLMediaElement(layoutObject.node()); |
758 m_graphicsLayer->setContentsToPlatformLayer(mediaElement->platformLayer()); | 756 m_graphicsLayer->setContentsToPlatformLayer(mediaElement->platformLayer()); |
759 } else if (isCanvasControlledByOffscreen(layoutObject)) { | 757 } else if (isCanvasControlledByOffscreen(layoutObject)) { |
760 HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject->node()); | 758 HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject.node()); |
761 m_graphicsLayer->setContentsToPlatformLayer( | 759 m_graphicsLayer->setContentsToPlatformLayer( |
762 canvas->surfaceLayerBridge()->getWebLayer()); | 760 canvas->surfaceLayerBridge()->getWebLayer()); |
763 layerConfigChanged = true; | 761 layerConfigChanged = true; |
764 } else if (isAcceleratedCanvas(layoutObject)) { | 762 } else if (isAcceleratedCanvas(layoutObject)) { |
765 HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject->node()); | 763 HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject.node()); |
766 if (CanvasRenderingContext* context = canvas->renderingContext()) | 764 if (CanvasRenderingContext* context = canvas->renderingContext()) |
767 m_graphicsLayer->setContentsToPlatformLayer(context->platformLayer()); | 765 m_graphicsLayer->setContentsToPlatformLayer(context->platformLayer()); |
768 layerConfigChanged = true; | 766 layerConfigChanged = true; |
769 } | 767 } |
770 if (layoutObject->isLayoutPart()) { | 768 if (layoutObject.isLayoutPart()) { |
771 if (PaintLayerCompositor::attachFrameContentLayersToIframeLayer( | 769 if (PaintLayerCompositor::attachFrameContentLayersToIframeLayer( |
772 toLayoutPart(layoutObject))) | 770 toLayoutPart(layoutObject))) |
773 layerConfigChanged = true; | 771 layerConfigChanged = true; |
774 } | 772 } |
775 | 773 |
776 // Changes to either the internal hierarchy or the mask layer have an impact | 774 // Changes to either the internal hierarchy or the mask layer have an impact |
777 // on painting phases, so we need to update when either are updated. | 775 // on painting phases, so we need to update when either are updated. |
778 if (layerConfigChanged || maskLayerChanged) | 776 if (layerConfigChanged || maskLayerChanged) |
779 updatePaintingPhases(); | 777 updatePaintingPhases(); |
780 | 778 |
781 updateElementIdAndCompositorMutableProperties(); | 779 updateElementIdAndCompositorMutableProperties(); |
782 | 780 |
783 m_graphicsLayer->setHasWillChangeTransformHint( | 781 m_graphicsLayer->setHasWillChangeTransformHint( |
784 style.hasWillChangeTransformHint()); | 782 style.hasWillChangeTransformHint()); |
785 | 783 |
786 if (style.preserves3D() && style.hasOpacity() && | 784 if (style.preserves3D() && style.hasOpacity() && |
787 m_owningLayer.has3DTransformedDescendant()) | 785 m_owningLayer.has3DTransformedDescendant()) |
788 UseCounter::count(layoutObject->document(), | 786 UseCounter::count(layoutObject.document(), |
789 UseCounter::OpacityWithPreserve3DQuirk); | 787 UseCounter::OpacityWithPreserve3DQuirk); |
790 | 788 |
791 return layerConfigChanged; | 789 return layerConfigChanged; |
792 } | 790 } |
793 | 791 |
794 static IntRect clipBox(LayoutBox* layoutObject) { | 792 static IntRect clipBox(LayoutBox& layoutObject) { |
795 // TODO(chrishtr): pixel snapping is most likely incorrect here. | 793 // TODO(chrishtr): pixel snapping is most likely incorrect here. |
796 return pixelSnappedIntRect(layoutObject->clippingRect()); | 794 return pixelSnappedIntRect(layoutObject.clippingRect()); |
797 } | 795 } |
798 | 796 |
799 static LayoutPoint computeOffsetFromCompositedAncestor( | 797 static LayoutPoint computeOffsetFromCompositedAncestor( |
800 const PaintLayer* layer, | 798 const PaintLayer* layer, |
801 const PaintLayer* compositedAncestor) { | 799 const PaintLayer* compositedAncestor) { |
802 LayoutPoint offset = layer->visualOffsetFromAncestor(compositedAncestor); | 800 LayoutPoint offset = layer->visualOffsetFromAncestor(compositedAncestor); |
803 if (compositedAncestor) | 801 if (compositedAncestor) |
804 offset.move(compositedAncestor->compositedLayerMapping() | 802 offset.move(compositedAncestor->compositedLayerMapping() |
805 ->owningLayer() | 803 ->owningLayer() |
806 .subpixelAccumulation()); | 804 .subpixelAccumulation()); |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
923 IntSize newOffsetFromLayoutObject = | 921 IntSize newOffsetFromLayoutObject = |
924 -IntSize(offsetFromSquashLayerOrigin.width().round(), | 922 -IntSize(offsetFromSquashLayerOrigin.width().round(), |
925 offsetFromSquashLayerOrigin.height().round()); | 923 offsetFromSquashLayerOrigin.height().round()); |
926 LayoutSize subpixelAccumulation = | 924 LayoutSize subpixelAccumulation = |
927 offsetFromSquashLayerOrigin + newOffsetFromLayoutObject; | 925 offsetFromSquashLayerOrigin + newOffsetFromLayoutObject; |
928 if (layers[i].offsetFromLayoutObjectSet && | 926 if (layers[i].offsetFromLayoutObjectSet && |
929 layers[i].offsetFromLayoutObject != newOffsetFromLayoutObject) { | 927 layers[i].offsetFromLayoutObject != newOffsetFromLayoutObject) { |
930 // It is ok to issue paint invalidation here, because all of the geometry | 928 // It is ok to issue paint invalidation here, because all of the geometry |
931 // needed to correctly invalidate paint is computed by this point. | 929 // needed to correctly invalidate paint is computed by this point. |
932 DisablePaintInvalidationStateAsserts disabler; | 930 DisablePaintInvalidationStateAsserts disabler; |
933 ObjectPaintInvalidator(*layers[i].paintLayer->layoutObject()) | 931 ObjectPaintInvalidator(layers[i].paintLayer->layoutObject()) |
934 .invalidatePaintIncludingNonCompositingDescendants(); | 932 .invalidatePaintIncludingNonCompositingDescendants(); |
935 | 933 |
936 TRACE_LAYER_INVALIDATION(layers[i].paintLayer, | 934 TRACE_LAYER_INVALIDATION(layers[i].paintLayer, |
937 InspectorLayerInvalidationTrackingEvent:: | 935 InspectorLayerInvalidationTrackingEvent:: |
938 SquashingLayerGeometryWasUpdated); | 936 SquashingLayerGeometryWasUpdated); |
939 layersNeedingPaintInvalidation.push_back(layers[i].paintLayer); | 937 layersNeedingPaintInvalidation.push_back(layers[i].paintLayer); |
940 } | 938 } |
941 layers[i].offsetFromLayoutObject = newOffsetFromLayoutObject; | 939 layers[i].offsetFromLayoutObject = newOffsetFromLayoutObject; |
942 layers[i].offsetFromLayoutObjectSet = true; | 940 layers[i].offsetFromLayoutObjectSet = true; |
943 | 941 |
(...skipping 15 matching lines...) Expand all Loading... |
959 | 957 |
960 void CompositedLayerMapping::updateGraphicsLayerGeometry( | 958 void CompositedLayerMapping::updateGraphicsLayerGeometry( |
961 const PaintLayer* compositingContainer, | 959 const PaintLayer* compositingContainer, |
962 const PaintLayer* compositingStackingContext, | 960 const PaintLayer* compositingStackingContext, |
963 Vector<PaintLayer*>& layersNeedingPaintInvalidation) { | 961 Vector<PaintLayer*>& layersNeedingPaintInvalidation) { |
964 ASSERT(m_owningLayer.compositor()->lifecycle().state() == | 962 ASSERT(m_owningLayer.compositor()->lifecycle().state() == |
965 DocumentLifecycle::InCompositingUpdate); | 963 DocumentLifecycle::InCompositingUpdate); |
966 | 964 |
967 // Set transform property, if it is not animating. We have to do this here | 965 // Set transform property, if it is not animating. We have to do this here |
968 // because the transform is affected by the layer dimensions. | 966 // because the transform is affected by the layer dimensions. |
969 if (!layoutObject()->style()->isRunningTransformAnimationOnCompositor()) | 967 if (!layoutObject().style()->isRunningTransformAnimationOnCompositor()) |
970 updateTransform(layoutObject()->styleRef()); | 968 updateTransform(layoutObject().styleRef()); |
971 | 969 |
972 // Set opacity, if it is not animating. | 970 // Set opacity, if it is not animating. |
973 if (!layoutObject()->style()->isRunningOpacityAnimationOnCompositor()) | 971 if (!layoutObject().style()->isRunningOpacityAnimationOnCompositor()) |
974 updateOpacity(layoutObject()->styleRef()); | 972 updateOpacity(layoutObject().styleRef()); |
975 | 973 |
976 if (!layoutObject()->style()->isRunningFilterAnimationOnCompositor()) | 974 if (!layoutObject().style()->isRunningFilterAnimationOnCompositor()) |
977 updateFilters(layoutObject()->styleRef()); | 975 updateFilters(layoutObject().styleRef()); |
978 | 976 |
979 if (!layoutObject()->style()->isRunningBackdropFilterAnimationOnCompositor()) | 977 if (!layoutObject().style()->isRunningBackdropFilterAnimationOnCompositor()) |
980 updateBackdropFilters(layoutObject()->styleRef()); | 978 updateBackdropFilters(layoutObject().styleRef()); |
981 | 979 |
982 // We compute everything relative to the enclosing compositing layer. | 980 // We compute everything relative to the enclosing compositing layer. |
983 IntRect ancestorCompositingBounds; | 981 IntRect ancestorCompositingBounds; |
984 if (compositingContainer) { | 982 if (compositingContainer) { |
985 ASSERT(compositingContainer->hasCompositedLayerMapping()); | 983 ASSERT(compositingContainer->hasCompositedLayerMapping()); |
986 ancestorCompositingBounds = compositingContainer->compositedLayerMapping() | 984 ancestorCompositingBounds = compositingContainer->compositedLayerMapping() |
987 ->pixelSnappedCompositedBounds(); | 985 ->pixelSnappedCompositedBounds(); |
988 } | 986 } |
989 | 987 |
990 IntRect localCompositingBounds; | 988 IntRect localCompositingBounds; |
(...skipping 17 matching lines...) Expand all Loading... |
1008 FloatSize contentsSize(relativeCompositingBounds.size()); | 1006 FloatSize contentsSize(relativeCompositingBounds.size()); |
1009 | 1007 |
1010 updateMainGraphicsLayerGeometry(relativeCompositingBounds, | 1008 updateMainGraphicsLayerGeometry(relativeCompositingBounds, |
1011 localCompositingBounds, | 1009 localCompositingBounds, |
1012 graphicsLayerParentLocation); | 1010 graphicsLayerParentLocation); |
1013 updateOverflowControlsHostLayerGeometry(compositingStackingContext, | 1011 updateOverflowControlsHostLayerGeometry(compositingStackingContext, |
1014 compositingContainer, | 1012 compositingContainer, |
1015 graphicsLayerParentLocation); | 1013 graphicsLayerParentLocation); |
1016 updateContentsOffsetInCompositingLayer(snappedOffsetFromCompositedAncestor, | 1014 updateContentsOffsetInCompositingLayer(snappedOffsetFromCompositedAncestor, |
1017 graphicsLayerParentLocation); | 1015 graphicsLayerParentLocation); |
1018 updateStickyConstraints(layoutObject()->styleRef()); | 1016 updateStickyConstraints(layoutObject().styleRef()); |
1019 updateSquashingLayerGeometry( | 1017 updateSquashingLayerGeometry( |
1020 graphicsLayerParentLocation, compositingContainer, m_squashedLayers, | 1018 graphicsLayerParentLocation, compositingContainer, m_squashedLayers, |
1021 m_squashingLayer.get(), &m_squashingLayerOffsetFromTransformedAncestor, | 1019 m_squashingLayer.get(), &m_squashingLayerOffsetFromTransformedAncestor, |
1022 layersNeedingPaintInvalidation); | 1020 layersNeedingPaintInvalidation); |
1023 | 1021 |
1024 // If we have a layer that clips children, position it. | 1022 // If we have a layer that clips children, position it. |
1025 IntRect clippingBox; | 1023 IntRect clippingBox; |
1026 if (m_childContainmentLayer && layoutObject()->isBox()) | 1024 if (m_childContainmentLayer && layoutObject().isBox()) |
1027 clippingBox = clipBox(toLayoutBox(layoutObject())); | 1025 clippingBox = clipBox(toLayoutBox(layoutObject())); |
1028 | 1026 |
1029 updateChildTransformLayerGeometry(); | 1027 updateChildTransformLayerGeometry(); |
1030 updateChildContainmentLayerGeometry(clippingBox, localCompositingBounds); | 1028 updateChildContainmentLayerGeometry(clippingBox, localCompositingBounds); |
1031 | 1029 |
1032 updateMaskLayerGeometry(); | 1030 updateMaskLayerGeometry(); |
1033 updateTransformGeometry(snappedOffsetFromCompositedAncestor, | 1031 updateTransformGeometry(snappedOffsetFromCompositedAncestor, |
1034 relativeCompositingBounds); | 1032 relativeCompositingBounds); |
1035 updateForegroundLayerGeometry(contentsSize, clippingBox); | 1033 updateForegroundLayerGeometry(contentsSize, clippingBox); |
1036 updateBackgroundLayerGeometry(contentsSize); | 1034 updateBackgroundLayerGeometry(contentsSize); |
1037 // TODO(yigu): Currently the decoration layer uses the same contentSize | 1035 // TODO(yigu): Currently the decoration layer uses the same contentSize |
1038 // as background layer and foreground layer. There are scenarios that | 1036 // as background layer and foreground layer. There are scenarios that |
1039 // the sizes could be different. The actual size of the decoration layer | 1037 // the sizes could be different. The actual size of the decoration layer |
1040 // should be calculated separately. | 1038 // should be calculated separately. |
1041 // The size of the background layer should be different as well. We need to | 1039 // The size of the background layer should be different as well. We need to |
1042 // check whether we are painting the decoration layer into the background and | 1040 // check whether we are painting the decoration layer into the background and |
1043 // then ignore or consider the outline when determining the contentSize. | 1041 // then ignore or consider the outline when determining the contentSize. |
1044 updateDecorationOutlineLayerGeometry(contentsSize); | 1042 updateDecorationOutlineLayerGeometry(contentsSize); |
1045 updateScrollingLayerGeometry(localCompositingBounds); | 1043 updateScrollingLayerGeometry(localCompositingBounds); |
1046 updateChildClippingMaskLayerGeometry(); | 1044 updateChildClippingMaskLayerGeometry(); |
1047 | 1045 |
1048 if (m_owningLayer.getScrollableArea() && | 1046 if (m_owningLayer.getScrollableArea() && |
1049 m_owningLayer.getScrollableArea()->scrollsOverflow()) | 1047 m_owningLayer.getScrollableArea()->scrollsOverflow()) |
1050 m_owningLayer.getScrollableArea()->positionOverflowControls(); | 1048 m_owningLayer.getScrollableArea()->positionOverflowControls(); |
1051 | 1049 |
1052 updateLayerBlendMode(layoutObject()->styleRef()); | 1050 updateLayerBlendMode(layoutObject().styleRef()); |
1053 updateIsRootForIsolatedGroup(); | 1051 updateIsRootForIsolatedGroup(); |
1054 updateContentsRect(); | 1052 updateContentsRect(); |
1055 updateBackgroundColor(); | 1053 updateBackgroundColor(); |
1056 updateDrawsContent(); | 1054 updateDrawsContent(); |
1057 updateElementIdAndCompositorMutableProperties(); | 1055 updateElementIdAndCompositorMutableProperties(); |
1058 updateBackgroundPaintsOntoScrollingContentsLayer(); | 1056 updateBackgroundPaintsOntoScrollingContentsLayer(); |
1059 updateContentsOpaque(); | 1057 updateContentsOpaque(); |
1060 updateAfterPartResize(); | 1058 updateAfterPartResize(); |
1061 updateRenderingContext(); | 1059 updateRenderingContext(); |
1062 updateShouldFlattenTransform(); | 1060 updateShouldFlattenTransform(); |
(...skipping 20 matching lines...) Expand all Loading... |
1083 | 1081 |
1084 // m_graphicsLayer is the corresponding GraphicsLayer for this PaintLayer and | 1082 // m_graphicsLayer is the corresponding GraphicsLayer for this PaintLayer and |
1085 // its non-compositing descendants. So, the visibility flag for | 1083 // its non-compositing descendants. So, the visibility flag for |
1086 // m_graphicsLayer should be true if there are any non-compositing visible | 1084 // m_graphicsLayer should be true if there are any non-compositing visible |
1087 // layers. | 1085 // layers. |
1088 bool contentsVisible = m_owningLayer.hasVisibleContent() || | 1086 bool contentsVisible = m_owningLayer.hasVisibleContent() || |
1089 hasVisibleNonCompositingDescendant(&m_owningLayer); | 1087 hasVisibleNonCompositingDescendant(&m_owningLayer); |
1090 m_graphicsLayer->setContentsVisible(contentsVisible); | 1088 m_graphicsLayer->setContentsVisible(contentsVisible); |
1091 | 1089 |
1092 m_graphicsLayer->setBackfaceVisibility( | 1090 m_graphicsLayer->setBackfaceVisibility( |
1093 layoutObject()->style()->backfaceVisibility() == | 1091 layoutObject().style()->backfaceVisibility() == |
1094 BackfaceVisibilityVisible); | 1092 BackfaceVisibilityVisible); |
1095 } | 1093 } |
1096 | 1094 |
1097 void CompositedLayerMapping::computeGraphicsLayerParentLocation( | 1095 void CompositedLayerMapping::computeGraphicsLayerParentLocation( |
1098 const PaintLayer* compositingContainer, | 1096 const PaintLayer* compositingContainer, |
1099 const IntRect& ancestorCompositingBounds, | 1097 const IntRect& ancestorCompositingBounds, |
1100 IntPoint& graphicsLayerParentLocation) { | 1098 IntPoint& graphicsLayerParentLocation) { |
1101 if (compositingContainer && | 1099 if (compositingContainer && |
1102 compositingContainer->compositedLayerMapping()->hasClippingLayer() && | 1100 compositingContainer->compositedLayerMapping()->hasClippingLayer() && |
1103 compositingContainer->layoutObject()->isBox()) { | 1101 compositingContainer->layoutObject().isBox()) { |
1104 // If the compositing ancestor has a layer to clip children, we parent in | 1102 // If the compositing ancestor has a layer to clip children, we parent in |
1105 // that, and therefore position relative to it. | 1103 // that, and therefore position relative to it. |
1106 IntRect clippingBox = | 1104 IntRect clippingBox = |
1107 clipBox(toLayoutBox(compositingContainer->layoutObject())); | 1105 clipBox(toLayoutBox(compositingContainer->layoutObject())); |
1108 graphicsLayerParentLocation = | 1106 graphicsLayerParentLocation = |
1109 clippingBox.location() + | 1107 clippingBox.location() + |
1110 roundedIntSize(compositingContainer->subpixelAccumulation()); | 1108 roundedIntSize(compositingContainer->subpixelAccumulation()); |
1111 } else if (compositingContainer && | 1109 } else if (compositingContainer && |
1112 compositingContainer->compositedLayerMapping() | 1110 compositingContainer->compositedLayerMapping() |
1113 ->childTransformLayer()) { | 1111 ->childTransformLayer()) { |
1114 // Similarly, if the compositing ancestor has a child transform layer, we | 1112 // Similarly, if the compositing ancestor has a child transform layer, we |
1115 // parent in that, and therefore position relative to it. It's already taken | 1113 // parent in that, and therefore position relative to it. It's already taken |
1116 // into account the contents offset, so we do not need to here. | 1114 // into account the contents offset, so we do not need to here. |
1117 graphicsLayerParentLocation = | 1115 graphicsLayerParentLocation = |
1118 roundedIntPoint(compositingContainer->subpixelAccumulation()); | 1116 roundedIntPoint(compositingContainer->subpixelAccumulation()); |
1119 } else if (compositingContainer) { | 1117 } else if (compositingContainer) { |
1120 graphicsLayerParentLocation = ancestorCompositingBounds.location(); | 1118 graphicsLayerParentLocation = ancestorCompositingBounds.location(); |
1121 } else { | 1119 } else { |
1122 graphicsLayerParentLocation = | 1120 graphicsLayerParentLocation = |
1123 layoutObject()->view()->documentRect().location(); | 1121 layoutObject().view()->documentRect().location(); |
1124 } | 1122 } |
1125 | 1123 |
1126 if (compositingContainer && | 1124 if (compositingContainer && |
1127 compositingContainer->needsCompositedScrolling()) { | 1125 compositingContainer->needsCompositedScrolling()) { |
1128 LayoutBox* layoutBox = toLayoutBox(compositingContainer->layoutObject()); | 1126 LayoutBox& layoutBox = toLayoutBox(compositingContainer->layoutObject()); |
1129 IntSize scrollOffset = layoutBox->scrolledContentOffset(); | 1127 IntSize scrollOffset = layoutBox.scrolledContentOffset(); |
1130 IntPoint scrollOrigin = | 1128 IntPoint scrollOrigin = |
1131 compositingContainer->getScrollableArea()->scrollOrigin(); | 1129 compositingContainer->getScrollableArea()->scrollOrigin(); |
1132 scrollOrigin.move(-layoutBox->borderLeft().toInt(), | 1130 scrollOrigin.move(-layoutBox.borderLeft().toInt(), |
1133 -layoutBox->borderTop().toInt()); | 1131 -layoutBox.borderTop().toInt()); |
1134 graphicsLayerParentLocation = -(scrollOrigin + scrollOffset); | 1132 graphicsLayerParentLocation = -(scrollOrigin + scrollOffset); |
1135 } | 1133 } |
1136 } | 1134 } |
1137 | 1135 |
1138 void CompositedLayerMapping::updateAncestorClippingLayerGeometry( | 1136 void CompositedLayerMapping::updateAncestorClippingLayerGeometry( |
1139 const PaintLayer* compositingContainer, | 1137 const PaintLayer* compositingContainer, |
1140 const IntPoint& snappedOffsetFromCompositedAncestor, | 1138 const IntPoint& snappedOffsetFromCompositedAncestor, |
1141 IntPoint& graphicsLayerParentLocation) { | 1139 IntPoint& graphicsLayerParentLocation) { |
1142 if (!compositingContainer || !m_ancestorClippingLayer) | 1140 if (!compositingContainer || !m_ancestorClippingLayer) |
1143 return; | 1141 return; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1218 } | 1216 } |
1219 | 1217 |
1220 m_overflowControlsAncestorClippingLayer->setPosition(position); | 1218 m_overflowControlsAncestorClippingLayer->setPosition(position); |
1221 hostLayerPosition.move( | 1219 hostLayerPosition.move( |
1222 -m_ancestorClippingLayer->offsetFromLayoutObject()); | 1220 -m_ancestorClippingLayer->offsetFromLayoutObject()); |
1223 } else { | 1221 } else { |
1224 // The controls are in the same 2D space as the compositing container, so | 1222 // The controls are in the same 2D space as the compositing container, so |
1225 // we can map them into the space of the container. | 1223 // we can map them into the space of the container. |
1226 TransformState transformState(TransformState::ApplyTransformDirection, | 1224 TransformState transformState(TransformState::ApplyTransformDirection, |
1227 FloatPoint()); | 1225 FloatPoint()); |
1228 m_owningLayer.layoutObject()->mapLocalToAncestor( | 1226 m_owningLayer.layoutObject().mapLocalToAncestor( |
1229 compositingStackingContext->layoutObject(), transformState, | 1227 &compositingStackingContext->layoutObject(), transformState, |
1230 ApplyContainerFlip); | 1228 ApplyContainerFlip); |
1231 transformState.flatten(); | 1229 transformState.flatten(); |
1232 hostLayerPosition = LayoutPoint(transformState.lastPlanarPoint()); | 1230 hostLayerPosition = LayoutPoint(transformState.lastPlanarPoint()); |
1233 if (PaintLayerScrollableArea* scrollableArea = | 1231 if (PaintLayerScrollableArea* scrollableArea = |
1234 compositingStackingContext->getScrollableArea()) { | 1232 compositingStackingContext->getScrollableArea()) { |
1235 hostLayerPosition.move( | 1233 hostLayerPosition.move( |
1236 LayoutSize(toFloatSize(scrollableArea->scrollPosition()))); | 1234 LayoutSize(toFloatSize(scrollableArea->scrollPosition()))); |
1237 } | 1235 } |
1238 hostLayerPosition.move(-stackingOffsetFromLayoutObject); | 1236 hostLayerPosition.move(-stackingOffsetFromLayoutObject); |
1239 } | 1237 } |
1240 } else { | 1238 } else { |
1241 hostLayerPosition.move(-m_graphicsLayer->offsetFromLayoutObject()); | 1239 hostLayerPosition.move(-m_graphicsLayer->offsetFromLayoutObject()); |
1242 } | 1240 } |
1243 | 1241 |
1244 m_overflowControlsHostLayer->setPosition(FloatPoint(hostLayerPosition)); | 1242 m_overflowControlsHostLayer->setPosition(FloatPoint(hostLayerPosition)); |
1245 | 1243 |
1246 const IntRect borderBox = | 1244 const IntRect borderBox = |
1247 toLayoutBox(m_owningLayer.layoutObject())->pixelSnappedBorderBoxRect(); | 1245 toLayoutBox(m_owningLayer.layoutObject()).pixelSnappedBorderBoxRect(); |
1248 m_overflowControlsHostLayer->setSize(FloatSize(borderBox.size())); | 1246 m_overflowControlsHostLayer->setSize(FloatSize(borderBox.size())); |
1249 m_overflowControlsHostLayer->setMasksToBounds(true); | 1247 m_overflowControlsHostLayer->setMasksToBounds(true); |
1250 } | 1248 } |
1251 | 1249 |
1252 void CompositedLayerMapping::updateChildContainmentLayerGeometry( | 1250 void CompositedLayerMapping::updateChildContainmentLayerGeometry( |
1253 const IntRect& clippingBox, | 1251 const IntRect& clippingBox, |
1254 const IntRect& localCompositingBounds) { | 1252 const IntRect& localCompositingBounds) { |
1255 if (!m_childContainmentLayer) | 1253 if (!m_childContainmentLayer) |
1256 return; | 1254 return; |
1257 | 1255 |
1258 FloatPoint clipPositionInLayoutObjectSpace( | 1256 FloatPoint clipPositionInLayoutObjectSpace( |
1259 clippingBox.location() - localCompositingBounds.location() + | 1257 clippingBox.location() - localCompositingBounds.location() + |
1260 roundedIntSize(m_owningLayer.subpixelAccumulation())); | 1258 roundedIntSize(m_owningLayer.subpixelAccumulation())); |
1261 | 1259 |
1262 // If there are layers between the the child containment layer and | 1260 // If there are layers between the the child containment layer and |
1263 // m_graphicsLayer (eg, the child transform layer), we must adjust the clip | 1261 // m_graphicsLayer (eg, the child transform layer), we must adjust the clip |
1264 // position to get it in the correct space. | 1262 // position to get it in the correct space. |
1265 FloatPoint clipPositionInParentSpace = clipPositionInLayoutObjectSpace; | 1263 FloatPoint clipPositionInParentSpace = clipPositionInLayoutObjectSpace; |
1266 for (GraphicsLayer* ancestor = m_childContainmentLayer->parent(); | 1264 for (GraphicsLayer* ancestor = m_childContainmentLayer->parent(); |
1267 ancestor != mainGraphicsLayer(); ancestor = ancestor->parent()) | 1265 ancestor != mainGraphicsLayer(); ancestor = ancestor->parent()) |
1268 clipPositionInParentSpace -= toFloatSize(ancestor->position()); | 1266 clipPositionInParentSpace -= toFloatSize(ancestor->position()); |
1269 | 1267 |
1270 m_childContainmentLayer->setPosition(clipPositionInParentSpace); | 1268 m_childContainmentLayer->setPosition(clipPositionInParentSpace); |
1271 m_childContainmentLayer->setSize(FloatSize(clippingBox.size())); | 1269 m_childContainmentLayer->setSize(FloatSize(clippingBox.size())); |
1272 m_childContainmentLayer->setOffsetFromLayoutObject( | 1270 m_childContainmentLayer->setOffsetFromLayoutObject( |
1273 toIntSize(clippingBox.location())); | 1271 toIntSize(clippingBox.location())); |
1274 if (m_childClippingMaskLayer && !m_scrollingLayer && | 1272 if (m_childClippingMaskLayer && !m_scrollingLayer && |
1275 !layoutObject()->style()->clipPath()) { | 1273 !layoutObject().style()->clipPath()) { |
1276 m_childClippingMaskLayer->setSize(m_childContainmentLayer->size()); | 1274 m_childClippingMaskLayer->setSize(m_childContainmentLayer->size()); |
1277 m_childClippingMaskLayer->setOffsetFromLayoutObject( | 1275 m_childClippingMaskLayer->setOffsetFromLayoutObject( |
1278 m_childContainmentLayer->offsetFromLayoutObject()); | 1276 m_childContainmentLayer->offsetFromLayoutObject()); |
1279 } | 1277 } |
1280 } | 1278 } |
1281 | 1279 |
1282 void CompositedLayerMapping::updateChildTransformLayerGeometry() { | 1280 void CompositedLayerMapping::updateChildTransformLayerGeometry() { |
1283 if (!m_childTransformLayer) | 1281 if (!m_childTransformLayer) |
1284 return; | 1282 return; |
1285 const IntRect borderBox = | 1283 const IntRect borderBox = |
1286 toLayoutBox(m_owningLayer.layoutObject())->pixelSnappedBorderBoxRect(); | 1284 toLayoutBox(m_owningLayer.layoutObject()).pixelSnappedBorderBoxRect(); |
1287 m_childTransformLayer->setSize(FloatSize(borderBox.size())); | 1285 m_childTransformLayer->setSize(FloatSize(borderBox.size())); |
1288 m_childTransformLayer->setPosition( | 1286 m_childTransformLayer->setPosition( |
1289 FloatPoint(contentOffsetInCompositingLayer())); | 1287 FloatPoint(contentOffsetInCompositingLayer())); |
1290 } | 1288 } |
1291 | 1289 |
1292 void CompositedLayerMapping::updateMaskLayerGeometry() { | 1290 void CompositedLayerMapping::updateMaskLayerGeometry() { |
1293 if (!m_maskLayer) | 1291 if (!m_maskLayer) |
1294 return; | 1292 return; |
1295 | 1293 |
1296 if (m_maskLayer->size() != m_graphicsLayer->size()) { | 1294 if (m_maskLayer->size() != m_graphicsLayer->size()) { |
1297 m_maskLayer->setSize(m_graphicsLayer->size()); | 1295 m_maskLayer->setSize(m_graphicsLayer->size()); |
1298 m_maskLayer->setNeedsDisplay(); | 1296 m_maskLayer->setNeedsDisplay(); |
1299 } | 1297 } |
1300 m_maskLayer->setPosition(FloatPoint()); | 1298 m_maskLayer->setPosition(FloatPoint()); |
1301 m_maskLayer->setOffsetFromLayoutObject( | 1299 m_maskLayer->setOffsetFromLayoutObject( |
1302 m_graphicsLayer->offsetFromLayoutObject()); | 1300 m_graphicsLayer->offsetFromLayoutObject()); |
1303 } | 1301 } |
1304 | 1302 |
1305 void CompositedLayerMapping::updateTransformGeometry( | 1303 void CompositedLayerMapping::updateTransformGeometry( |
1306 const IntPoint& snappedOffsetFromCompositedAncestor, | 1304 const IntPoint& snappedOffsetFromCompositedAncestor, |
1307 const IntRect& relativeCompositingBounds) { | 1305 const IntRect& relativeCompositingBounds) { |
1308 if (m_owningLayer.hasTransformRelatedProperty()) { | 1306 if (m_owningLayer.hasTransformRelatedProperty()) { |
1309 const LayoutRect borderBox = toLayoutBox(layoutObject())->borderBoxRect(); | 1307 const LayoutRect borderBox = toLayoutBox(layoutObject()).borderBoxRect(); |
1310 | 1308 |
1311 // Get layout bounds in the coords of compositingContainer to match | 1309 // Get layout bounds in the coords of compositingContainer to match |
1312 // relativeCompositingBounds. | 1310 // relativeCompositingBounds. |
1313 IntRect layerBounds = pixelSnappedIntRect( | 1311 IntRect layerBounds = pixelSnappedIntRect( |
1314 toLayoutPoint(m_owningLayer.subpixelAccumulation()), borderBox.size()); | 1312 toLayoutPoint(m_owningLayer.subpixelAccumulation()), borderBox.size()); |
1315 layerBounds.moveBy(snappedOffsetFromCompositedAncestor); | 1313 layerBounds.moveBy(snappedOffsetFromCompositedAncestor); |
1316 | 1314 |
1317 // Update properties that depend on layer dimensions | 1315 // Update properties that depend on layer dimensions |
1318 FloatPoint3D transformOrigin = | 1316 FloatPoint3D transformOrigin = |
1319 computeTransformOrigin(IntRect(IntPoint(), layerBounds.size())); | 1317 computeTransformOrigin(IntRect(IntPoint(), layerBounds.size())); |
(...skipping 14 matching lines...) Expand all Loading... |
1334 m_graphicsLayer->setTransformOrigin(compositedTransformOrigin); | 1332 m_graphicsLayer->setTransformOrigin(compositedTransformOrigin); |
1335 } | 1333 } |
1336 } | 1334 } |
1337 | 1335 |
1338 void CompositedLayerMapping::updateScrollingLayerGeometry( | 1336 void CompositedLayerMapping::updateScrollingLayerGeometry( |
1339 const IntRect& localCompositingBounds) { | 1337 const IntRect& localCompositingBounds) { |
1340 if (!m_scrollingLayer) | 1338 if (!m_scrollingLayer) |
1341 return; | 1339 return; |
1342 | 1340 |
1343 ASSERT(m_scrollingContentsLayer); | 1341 ASSERT(m_scrollingContentsLayer); |
1344 LayoutBox* layoutBox = toLayoutBox(layoutObject()); | 1342 LayoutBox& layoutBox = toLayoutBox(layoutObject()); |
1345 IntRect overflowClipRect = | 1343 IntRect overflowClipRect = |
1346 pixelSnappedIntRect(layoutBox->overflowClipRect(LayoutPoint())); | 1344 pixelSnappedIntRect(layoutBox.overflowClipRect(LayoutPoint())); |
1347 | 1345 |
1348 const TopDocumentRootScrollerController& globalRootScrollerController = | 1346 const TopDocumentRootScrollerController& globalRootScrollerController = |
1349 layoutBox->document().frameHost()->globalRootScrollerController(); | 1347 layoutBox.document().frameHost()->globalRootScrollerController(); |
1350 | 1348 |
1351 if (&m_owningLayer == globalRootScrollerController.rootScrollerPaintLayer()) { | 1349 if (&m_owningLayer == globalRootScrollerController.rootScrollerPaintLayer()) { |
1352 LayoutRect clipRect = | 1350 LayoutRect clipRect = |
1353 layoutBox->document().layoutView()->overflowClipRect(LayoutPoint()); | 1351 layoutBox.document().layoutView()->overflowClipRect(LayoutPoint()); |
1354 DCHECK(clipRect.size() == LayoutSize(pixelSnappedIntRect(clipRect).size())); | 1352 DCHECK(clipRect.size() == LayoutSize(pixelSnappedIntRect(clipRect).size())); |
1355 overflowClipRect.setSize(pixelSnappedIntRect(clipRect).size()); | 1353 overflowClipRect.setSize(pixelSnappedIntRect(clipRect).size()); |
1356 } | 1354 } |
1357 | 1355 |
1358 // When a m_childTransformLayer exists, local content offsets for the | 1356 // When a m_childTransformLayer exists, local content offsets for the |
1359 // m_scrollingLayer have already been applied. Otherwise, we apply them here. | 1357 // m_scrollingLayer have already been applied. Otherwise, we apply them here. |
1360 IntSize localContentOffset(0, 0); | 1358 IntSize localContentOffset(0, 0); |
1361 if (!m_childTransformLayer) { | 1359 if (!m_childTransformLayer) { |
1362 localContentOffset = roundedIntPoint(m_owningLayer.subpixelAccumulation()) - | 1360 localContentOffset = roundedIntPoint(m_owningLayer.subpixelAccumulation()) - |
1363 localCompositingBounds.location(); | 1361 localCompositingBounds.location(); |
1364 } | 1362 } |
1365 m_scrollingLayer->setPosition( | 1363 m_scrollingLayer->setPosition( |
1366 FloatPoint(overflowClipRect.location() + localContentOffset)); | 1364 FloatPoint(overflowClipRect.location() + localContentOffset)); |
1367 m_scrollingLayer->setSize(FloatSize(overflowClipRect.size())); | 1365 m_scrollingLayer->setSize(FloatSize(overflowClipRect.size())); |
1368 | 1366 |
1369 IntSize oldScrollingLayerOffset = m_scrollingLayer->offsetFromLayoutObject(); | 1367 IntSize oldScrollingLayerOffset = m_scrollingLayer->offsetFromLayoutObject(); |
1370 m_scrollingLayer->setOffsetFromLayoutObject( | 1368 m_scrollingLayer->setOffsetFromLayoutObject( |
1371 -toIntSize(overflowClipRect.location())); | 1369 -toIntSize(overflowClipRect.location())); |
1372 | 1370 |
1373 if (m_childClippingMaskLayer && !layoutObject()->style()->clipPath()) { | 1371 if (m_childClippingMaskLayer && !layoutObject().style()->clipPath()) { |
1374 m_childClippingMaskLayer->setPosition(m_scrollingLayer->position()); | 1372 m_childClippingMaskLayer->setPosition(m_scrollingLayer->position()); |
1375 m_childClippingMaskLayer->setSize(m_scrollingLayer->size()); | 1373 m_childClippingMaskLayer->setSize(m_scrollingLayer->size()); |
1376 m_childClippingMaskLayer->setOffsetFromLayoutObject( | 1374 m_childClippingMaskLayer->setOffsetFromLayoutObject( |
1377 toIntSize(overflowClipRect.location())); | 1375 toIntSize(overflowClipRect.location())); |
1378 } | 1376 } |
1379 | 1377 |
1380 bool overflowClipRectOffsetChanged = | 1378 bool overflowClipRectOffsetChanged = |
1381 oldScrollingLayerOffset != m_scrollingLayer->offsetFromLayoutObject(); | 1379 oldScrollingLayerOffset != m_scrollingLayer->offsetFromLayoutObject(); |
1382 | 1380 |
1383 IntSize scrollSize(layoutBox->pixelSnappedScrollWidth(), | 1381 IntSize scrollSize(layoutBox.pixelSnappedScrollWidth(), |
1384 layoutBox->pixelSnappedScrollHeight()); | 1382 layoutBox.pixelSnappedScrollHeight()); |
1385 if (overflowClipRectOffsetChanged) | 1383 if (overflowClipRectOffsetChanged) |
1386 m_scrollingContentsLayer->setNeedsDisplay(); | 1384 m_scrollingContentsLayer->setNeedsDisplay(); |
1387 | 1385 |
1388 FloatPoint scrollPosition = | 1386 FloatPoint scrollPosition = |
1389 m_owningLayer.getScrollableArea()->scrollPosition(); | 1387 m_owningLayer.getScrollableArea()->scrollPosition(); |
1390 DoubleSize scrollingContentsOffset( | 1388 DoubleSize scrollingContentsOffset( |
1391 overflowClipRect.location().x() - scrollPosition.x(), | 1389 overflowClipRect.location().x() - scrollPosition.x(), |
1392 overflowClipRect.location().y() - scrollPosition.y()); | 1390 overflowClipRect.location().y() - scrollPosition.y()); |
1393 // The scroll offset change is compared using floating point so that | 1391 // The scroll offset change is compared using floating point so that |
1394 // fractional scroll offset change can be propagated to compositor. | 1392 // fractional scroll offset change can be propagated to compositor. |
(...skipping 25 matching lines...) Expand all Loading... |
1420 if (m_foregroundLayer) { | 1418 if (m_foregroundLayer) { |
1421 if (m_foregroundLayer->size() != m_scrollingContentsLayer->size()) | 1419 if (m_foregroundLayer->size() != m_scrollingContentsLayer->size()) |
1422 m_foregroundLayer->setSize(m_scrollingContentsLayer->size()); | 1420 m_foregroundLayer->setSize(m_scrollingContentsLayer->size()); |
1423 m_foregroundLayer->setNeedsDisplay(); | 1421 m_foregroundLayer->setNeedsDisplay(); |
1424 m_foregroundLayer->setOffsetFromLayoutObject( | 1422 m_foregroundLayer->setOffsetFromLayoutObject( |
1425 m_scrollingContentsLayer->offsetFromLayoutObject()); | 1423 m_scrollingContentsLayer->offsetFromLayoutObject()); |
1426 } | 1424 } |
1427 } | 1425 } |
1428 | 1426 |
1429 void CompositedLayerMapping::updateChildClippingMaskLayerGeometry() { | 1427 void CompositedLayerMapping::updateChildClippingMaskLayerGeometry() { |
1430 if (!m_childClippingMaskLayer || !layoutObject()->style()->clipPath() || | 1428 if (!m_childClippingMaskLayer || !layoutObject().style()->clipPath() || |
1431 !layoutObject()->isBox()) | 1429 !layoutObject().isBox()) |
1432 return; | 1430 return; |
1433 LayoutBox* layoutBox = toLayoutBox(layoutObject()); | 1431 LayoutBox& layoutBox = toLayoutBox(layoutObject()); |
1434 IntRect clientBox = enclosingIntRect(layoutBox->clientBoxRect()); | 1432 IntRect clientBox = enclosingIntRect(layoutBox.clientBoxRect()); |
1435 | 1433 |
1436 m_childClippingMaskLayer->setPosition(m_graphicsLayer->position()); | 1434 m_childClippingMaskLayer->setPosition(m_graphicsLayer->position()); |
1437 m_childClippingMaskLayer->setSize(m_graphicsLayer->size()); | 1435 m_childClippingMaskLayer->setSize(m_graphicsLayer->size()); |
1438 m_childClippingMaskLayer->setOffsetFromLayoutObject( | 1436 m_childClippingMaskLayer->setOffsetFromLayoutObject( |
1439 toIntSize(clientBox.location())); | 1437 toIntSize(clientBox.location())); |
1440 | 1438 |
1441 // NOTE: also some stuff happening in updateChildContainmentLayerGeometry(). | 1439 // NOTE: also some stuff happening in updateChildContainmentLayerGeometry(). |
1442 } | 1440 } |
1443 | 1441 |
1444 void CompositedLayerMapping::updateForegroundLayerGeometry( | 1442 void CompositedLayerMapping::updateForegroundLayerGeometry( |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1478 // updateScrollingLayerGeometry(). | 1476 // updateScrollingLayerGeometry(). |
1479 } | 1477 } |
1480 | 1478 |
1481 void CompositedLayerMapping::updateBackgroundLayerGeometry( | 1479 void CompositedLayerMapping::updateBackgroundLayerGeometry( |
1482 const FloatSize& relativeCompositingBoundsSize) { | 1480 const FloatSize& relativeCompositingBoundsSize) { |
1483 if (!m_backgroundLayer) | 1481 if (!m_backgroundLayer) |
1484 return; | 1482 return; |
1485 | 1483 |
1486 FloatSize backgroundSize = relativeCompositingBoundsSize; | 1484 FloatSize backgroundSize = relativeCompositingBoundsSize; |
1487 if (backgroundLayerPaintsFixedRootBackground()) { | 1485 if (backgroundLayerPaintsFixedRootBackground()) { |
1488 FrameView* frameView = toLayoutView(layoutObject())->frameView(); | 1486 FrameView* frameView = toLayoutView(layoutObject()).frameView(); |
1489 backgroundSize = FloatSize(frameView->visibleContentRect().size()); | 1487 backgroundSize = FloatSize(frameView->visibleContentRect().size()); |
1490 } | 1488 } |
1491 m_backgroundLayer->setPosition(FloatPoint()); | 1489 m_backgroundLayer->setPosition(FloatPoint()); |
1492 if (backgroundSize != m_backgroundLayer->size()) { | 1490 if (backgroundSize != m_backgroundLayer->size()) { |
1493 m_backgroundLayer->setSize(backgroundSize); | 1491 m_backgroundLayer->setSize(backgroundSize); |
1494 m_backgroundLayer->setNeedsDisplay(); | 1492 m_backgroundLayer->setNeedsDisplay(); |
1495 } | 1493 } |
1496 m_backgroundLayer->setOffsetFromLayoutObject( | 1494 m_backgroundLayer->setOffsetFromLayoutObject( |
1497 m_graphicsLayer->offsetFromLayoutObject()); | 1495 m_graphicsLayer->offsetFromLayoutObject()); |
1498 } | 1496 } |
(...skipping 19 matching lines...) Expand all Loading... |
1518 scrollingCoordinatorFromLayer(m_owningLayer); | 1516 scrollingCoordinatorFromLayer(m_owningLayer); |
1519 if (!scrollingCoordinator) | 1517 if (!scrollingCoordinator) |
1520 return; | 1518 return; |
1521 | 1519 |
1522 scrollingCoordinator->updateLayerPositionConstraint(&m_owningLayer); | 1520 scrollingCoordinator->updateLayerPositionConstraint(&m_owningLayer); |
1523 | 1521 |
1524 // Page scale is applied as a transform on the root layout view layer. Because | 1522 // Page scale is applied as a transform on the root layout view layer. Because |
1525 // the scroll layer is further up in the hierarchy, we need to avoid marking | 1523 // the scroll layer is further up in the hierarchy, we need to avoid marking |
1526 // the root layout view layer as a container. | 1524 // the root layout view layer as a container. |
1527 bool isContainer = | 1525 bool isContainer = |
1528 m_owningLayer.layoutObject()->style()->canContainFixedPositionObjects() && | 1526 m_owningLayer.layoutObject().style()->canContainFixedPositionObjects() && |
1529 !m_owningLayer.isRootLayer(); | 1527 !m_owningLayer.isRootLayer(); |
1530 scrollingCoordinator->setLayerIsContainerForFixedPositionLayers( | 1528 scrollingCoordinator->setLayerIsContainerForFixedPositionLayers( |
1531 m_graphicsLayer.get(), isContainer); | 1529 m_graphicsLayer.get(), isContainer); |
1532 } | 1530 } |
1533 | 1531 |
1534 void CompositedLayerMapping::updateInternalHierarchy() { | 1532 void CompositedLayerMapping::updateInternalHierarchy() { |
1535 // m_foregroundLayer has to be inserted in the correct order with child | 1533 // m_foregroundLayer has to be inserted in the correct order with child |
1536 // layers, so it's not inserted here. | 1534 // layers, so it's not inserted here. |
1537 if (m_ancestorClippingLayer) | 1535 if (m_ancestorClippingLayer) |
1538 m_ancestorClippingLayer->removeAllChildren(); | 1536 m_ancestorClippingLayer->removeAllChildren(); |
(...skipping 16 matching lines...) Expand all Loading... |
1555 updateBottomLayer(m_childContainmentLayer.get()); | 1553 updateBottomLayer(m_childContainmentLayer.get()); |
1556 updateBottomLayer(m_scrollingLayer.get()); | 1554 updateBottomLayer(m_scrollingLayer.get()); |
1557 | 1555 |
1558 // Now constructing the subtree for the overflow controls. | 1556 // Now constructing the subtree for the overflow controls. |
1559 bottomLayer = m_graphicsLayer.get(); | 1557 bottomLayer = m_graphicsLayer.get(); |
1560 // TODO(pdr): Ensure painting uses the correct GraphicsLayer when root layer | 1558 // TODO(pdr): Ensure painting uses the correct GraphicsLayer when root layer |
1561 // scrolls is enabled. crbug.com/638719 | 1559 // scrolls is enabled. crbug.com/638719 |
1562 if (m_isMainFrameLayoutViewLayer && | 1560 if (m_isMainFrameLayoutViewLayer && |
1563 !RuntimeEnabledFeatures::slimmingPaintV2Enabled()) | 1561 !RuntimeEnabledFeatures::slimmingPaintV2Enabled()) |
1564 bottomLayer = layoutObject() | 1562 bottomLayer = layoutObject() |
1565 ->frame() | 1563 .frame() |
1566 ->page() | 1564 ->page() |
1567 ->frameHost() | 1565 ->frameHost() |
1568 .visualViewport() | 1566 .visualViewport() |
1569 .containerLayer(); | 1567 .containerLayer(); |
1570 updateBottomLayer(m_overflowControlsAncestorClippingLayer.get()); | 1568 updateBottomLayer(m_overflowControlsAncestorClippingLayer.get()); |
1571 updateBottomLayer(m_overflowControlsHostLayer.get()); | 1569 updateBottomLayer(m_overflowControlsHostLayer.get()); |
1572 if (m_layerForHorizontalScrollbar) | 1570 if (m_layerForHorizontalScrollbar) |
1573 m_overflowControlsHostLayer->addChild(m_layerForHorizontalScrollbar.get()); | 1571 m_overflowControlsHostLayer->addChild(m_layerForHorizontalScrollbar.get()); |
1574 if (m_layerForVerticalScrollbar) | 1572 if (m_layerForVerticalScrollbar) |
1575 m_overflowControlsHostLayer->addChild(m_layerForVerticalScrollbar.get()); | 1573 m_overflowControlsHostLayer->addChild(m_layerForVerticalScrollbar.get()); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1664 // graphicsLayerParentLocation it appears). | 1662 // graphicsLayerParentLocation it appears). |
1665 FloatPoint offsetDueToAncestorGraphicsLayers = | 1663 FloatPoint offsetDueToAncestorGraphicsLayers = |
1666 m_graphicsLayer->position() + graphicsLayerParentLocation; | 1664 m_graphicsLayer->position() + graphicsLayerParentLocation; |
1667 m_contentOffsetInCompositingLayer = LayoutSize( | 1665 m_contentOffsetInCompositingLayer = LayoutSize( |
1668 snappedOffsetFromCompositedAncestor - offsetDueToAncestorGraphicsLayers); | 1666 snappedOffsetFromCompositedAncestor - offsetDueToAncestorGraphicsLayers); |
1669 m_contentOffsetInCompositingLayerDirty = false; | 1667 m_contentOffsetInCompositingLayerDirty = false; |
1670 } | 1668 } |
1671 | 1669 |
1672 void CompositedLayerMapping::updateDrawsContent() { | 1670 void CompositedLayerMapping::updateDrawsContent() { |
1673 bool inOverlayFullscreenVideo = false; | 1671 bool inOverlayFullscreenVideo = false; |
1674 if (layoutObject()->isVideo()) { | 1672 if (layoutObject().isVideo()) { |
1675 HTMLVideoElement* videoElement = toHTMLVideoElement(layoutObject()->node()); | 1673 HTMLVideoElement* videoElement = toHTMLVideoElement(layoutObject().node()); |
1676 if (videoElement->isFullscreen() && | 1674 if (videoElement->isFullscreen() && |
1677 videoElement->usesOverlayFullscreenVideo()) | 1675 videoElement->usesOverlayFullscreenVideo()) |
1678 inOverlayFullscreenVideo = true; | 1676 inOverlayFullscreenVideo = true; |
1679 } | 1677 } |
1680 bool hasPaintedContent = | 1678 bool hasPaintedContent = |
1681 inOverlayFullscreenVideo ? false : containsPaintedContent(); | 1679 inOverlayFullscreenVideo ? false : containsPaintedContent(); |
1682 m_graphicsLayer->setDrawsContent(hasPaintedContent); | 1680 m_graphicsLayer->setDrawsContent(hasPaintedContent); |
1683 | 1681 |
1684 if (m_scrollingLayer) { | 1682 if (m_scrollingLayer) { |
1685 // m_scrollingLayer never has backing store. | 1683 // m_scrollingLayer never has backing store. |
1686 // m_scrollingContentsLayer only needs backing store if the scrolled | 1684 // m_scrollingContentsLayer only needs backing store if the scrolled |
1687 // contents need to paint. | 1685 // contents need to paint. |
1688 m_scrollingContentsAreEmpty = | 1686 m_scrollingContentsAreEmpty = |
1689 !m_owningLayer.hasVisibleContent() || | 1687 !m_owningLayer.hasVisibleContent() || |
1690 !(layoutObject()->styleRef().hasBackground() || | 1688 !(layoutObject().styleRef().hasBackground() || |
1691 layoutObject()->hasBackdropFilter() || paintsChildren()); | 1689 layoutObject().hasBackdropFilter() || paintsChildren()); |
1692 m_scrollingContentsLayer->setDrawsContent(!m_scrollingContentsAreEmpty); | 1690 m_scrollingContentsLayer->setDrawsContent(!m_scrollingContentsAreEmpty); |
1693 } | 1691 } |
1694 | 1692 |
1695 m_drawsBackgroundOntoContentLayer = false; | 1693 m_drawsBackgroundOntoContentLayer = false; |
1696 | 1694 |
1697 if (hasPaintedContent && isAcceleratedCanvas(layoutObject())) { | 1695 if (hasPaintedContent && isAcceleratedCanvas(layoutObject())) { |
1698 CanvasRenderingContext* context = | 1696 CanvasRenderingContext* context = |
1699 toHTMLCanvasElement(layoutObject()->node())->renderingContext(); | 1697 toHTMLCanvasElement(layoutObject().node())->renderingContext(); |
1700 // Content layer may be null if context is lost. | 1698 // Content layer may be null if context is lost. |
1701 if (WebLayer* contentLayer = context->platformLayer()) { | 1699 if (WebLayer* contentLayer = context->platformLayer()) { |
1702 Color bgColor(Color::transparent); | 1700 Color bgColor(Color::transparent); |
1703 if (contentLayerSupportsDirectBackgroundComposition(layoutObject())) { | 1701 if (contentLayerSupportsDirectBackgroundComposition(layoutObject())) { |
1704 bgColor = layoutObjectBackgroundColor(); | 1702 bgColor = layoutObjectBackgroundColor(); |
1705 hasPaintedContent = false; | 1703 hasPaintedContent = false; |
1706 m_drawsBackgroundOntoContentLayer = true; | 1704 m_drawsBackgroundOntoContentLayer = true; |
1707 } | 1705 } |
1708 contentLayer->setBackgroundColor(bgColor.rgb()); | 1706 contentLayer->setBackgroundColor(bgColor.rgb()); |
1709 } | 1707 } |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2054 // NB, it is illegal at this point to query an ancestor's compositing state. | 2052 // NB, it is illegal at this point to query an ancestor's compositing state. |
2055 // Some compositing reasons depend on the compositing state of ancestors. So | 2053 // Some compositing reasons depend on the compositing state of ancestors. So |
2056 // if we want a rendering context id for the context root, we cannot ask for | 2054 // if we want a rendering context id for the context root, we cannot ask for |
2057 // the id of its associated WebLayer now; it may not have one yet. We could do | 2055 // the id of its associated WebLayer now; it may not have one yet. We could do |
2058 // a second pass after doing the compositing updates to get these ids, but | 2056 // a second pass after doing the compositing updates to get these ids, but |
2059 // this would actually be harmful. We do not want to attach any semantic | 2057 // this would actually be harmful. We do not want to attach any semantic |
2060 // meaning to the context id other than the fact that they group a number of | 2058 // meaning to the context id other than the fact that they group a number of |
2061 // layers together for the sake of 3d sorting. So instead we will ask the | 2059 // layers together for the sake of 3d sorting. So instead we will ask the |
2062 // compositor to vend us an arbitrary, but consistent id. | 2060 // compositor to vend us an arbitrary, but consistent id. |
2063 if (PaintLayer* root = m_owningLayer.renderingContextRoot()) { | 2061 if (PaintLayer* root = m_owningLayer.renderingContextRoot()) { |
2064 if (Node* node = root->layoutObject()->node()) | 2062 if (Node* node = root->layoutObject().node()) |
2065 id = static_cast<int>(PtrHash<Node>::hash(node)); | 2063 id = static_cast<int>(PtrHash<Node>::hash(node)); |
2066 } | 2064 } |
2067 | 2065 |
2068 UpdateRenderingContextFunctor functor = {id}; | 2066 UpdateRenderingContextFunctor functor = {id}; |
2069 ApplyToGraphicsLayers<UpdateRenderingContextFunctor>( | 2067 ApplyToGraphicsLayers<UpdateRenderingContextFunctor>( |
2070 this, functor, ApplyToAllGraphicsLayers); | 2068 this, functor, ApplyToAllGraphicsLayers); |
2071 } | 2069 } |
2072 | 2070 |
2073 struct UpdateShouldFlattenTransformFunctor { | 2071 struct UpdateShouldFlattenTransformFunctor { |
2074 void operator()(GraphicsLayer* layer) const { | 2072 void operator()(GraphicsLayer* layer) const { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2116 // | 2114 // |
2117 // The element id for the scroll layers is assigned when they're constructed, | 2115 // The element id for the scroll layers is assigned when they're constructed, |
2118 // since this is unconditional. However, the element id for the primary layer as | 2116 // since this is unconditional. However, the element id for the primary layer as |
2119 // well as the mutable properties for all layers may change according to the | 2117 // well as the mutable properties for all layers may change according to the |
2120 // rules above so we update those values here. | 2118 // rules above so we update those values here. |
2121 void CompositedLayerMapping::updateElementIdAndCompositorMutableProperties() { | 2119 void CompositedLayerMapping::updateElementIdAndCompositorMutableProperties() { |
2122 int elementId = 0; | 2120 int elementId = 0; |
2123 uint32_t primaryMutableProperties = CompositorMutableProperty::kNone; | 2121 uint32_t primaryMutableProperties = CompositorMutableProperty::kNone; |
2124 uint32_t scrollMutableProperties = CompositorMutableProperty::kNone; | 2122 uint32_t scrollMutableProperties = CompositorMutableProperty::kNone; |
2125 | 2123 |
2126 Node* owningNode = m_owningLayer.layoutObject()->node(); | 2124 Node* owningNode = m_owningLayer.layoutObject().node(); |
2127 Element* animatingElement = nullptr; | 2125 Element* animatingElement = nullptr; |
2128 const ComputedStyle* animatingStyle = nullptr; | 2126 const ComputedStyle* animatingStyle = nullptr; |
2129 if (owningNode) { | 2127 if (owningNode) { |
2130 Document& document = owningNode->document(); | 2128 Document& document = owningNode->document(); |
2131 Element* scrollingElement = document.scrollingElementNoLayout(); | 2129 Element* scrollingElement = document.scrollingElementNoLayout(); |
2132 if (owningNode->isElementNode() && | 2130 if (owningNode->isElementNode() && |
2133 (!RuntimeEnabledFeatures::rootLayerScrollingEnabled() || | 2131 (!RuntimeEnabledFeatures::rootLayerScrollingEnabled() || |
2134 owningNode != scrollingElement)) { | 2132 owningNode != scrollingElement)) { |
2135 animatingElement = toElement(owningNode); | 2133 animatingElement = toElement(owningNode); |
2136 animatingStyle = m_owningLayer.layoutObject()->style(); | 2134 animatingStyle = m_owningLayer.layoutObject().style(); |
2137 } else if (owningNode->isDocumentNode() && | 2135 } else if (owningNode->isDocumentNode() && |
2138 RuntimeEnabledFeatures::rootLayerScrollingEnabled()) { | 2136 RuntimeEnabledFeatures::rootLayerScrollingEnabled()) { |
2139 owningNode = animatingElement = scrollingElement; | 2137 owningNode = animatingElement = scrollingElement; |
2140 if (scrollingElement && scrollingElement->layoutObject()) | 2138 if (scrollingElement && scrollingElement->layoutObject()) |
2141 animatingStyle = scrollingElement->layoutObject()->style(); | 2139 animatingStyle = scrollingElement->layoutObject()->style(); |
2142 } | 2140 } |
2143 } | 2141 } |
2144 | 2142 |
2145 if (RuntimeEnabledFeatures::compositorWorkerEnabled() && animatingStyle && | 2143 if (RuntimeEnabledFeatures::compositorWorkerEnabled() && animatingStyle && |
2146 animatingStyle->hasCompositorProxy()) { | 2144 animatingStyle->hasCompositorProxy()) { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2202 layerChanged = true; | 2200 layerChanged = true; |
2203 } | 2201 } |
2204 } else { | 2202 } else { |
2205 if (m_backgroundLayer) { | 2203 if (m_backgroundLayer) { |
2206 m_backgroundLayer->removeFromParent(); | 2204 m_backgroundLayer->removeFromParent(); |
2207 m_backgroundLayer = nullptr; | 2205 m_backgroundLayer = nullptr; |
2208 layerChanged = true; | 2206 layerChanged = true; |
2209 } | 2207 } |
2210 } | 2208 } |
2211 | 2209 |
2212 if (layerChanged && !m_owningLayer.layoutObject()->documentBeingDestroyed()) | 2210 if (layerChanged && !m_owningLayer.layoutObject().documentBeingDestroyed()) |
2213 compositor()->rootFixedBackgroundsChanged(); | 2211 compositor()->rootFixedBackgroundsChanged(); |
2214 | 2212 |
2215 return layerChanged; | 2213 return layerChanged; |
2216 } | 2214 } |
2217 | 2215 |
2218 bool CompositedLayerMapping::updateDecorationOutlineLayer( | 2216 bool CompositedLayerMapping::updateDecorationOutlineLayer( |
2219 bool needsDecorationOutlineLayer) { | 2217 bool needsDecorationOutlineLayer) { |
2220 bool layerChanged = false; | 2218 bool layerChanged = false; |
2221 if (needsDecorationOutlineLayer) { | 2219 if (needsDecorationOutlineLayer) { |
2222 if (!m_decorationOutlineLayer) { | 2220 if (!m_decorationOutlineLayer) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2272 if (!m_scrollingLayer) { | 2270 if (!m_scrollingLayer) { |
2273 // Outer layer which corresponds with the scroll view. | 2271 // Outer layer which corresponds with the scroll view. |
2274 m_scrollingLayer = | 2272 m_scrollingLayer = |
2275 createGraphicsLayer(CompositingReasonLayerForScrollingContainer); | 2273 createGraphicsLayer(CompositingReasonLayerForScrollingContainer); |
2276 m_scrollingLayer->setDrawsContent(false); | 2274 m_scrollingLayer->setDrawsContent(false); |
2277 | 2275 |
2278 // Inner layer which renders the content that scrolls. | 2276 // Inner layer which renders the content that scrolls. |
2279 m_scrollingContentsLayer = | 2277 m_scrollingContentsLayer = |
2280 createGraphicsLayer(CompositingReasonLayerForScrollingContents); | 2278 createGraphicsLayer(CompositingReasonLayerForScrollingContents); |
2281 | 2279 |
2282 if (Node* owningNode = m_owningLayer.layoutObject()->node()) | 2280 if (Node* owningNode = m_owningLayer.layoutObject().node()) |
2283 m_scrollingContentsLayer->setElementId(createCompositorElementId( | 2281 m_scrollingContentsLayer->setElementId(createCompositorElementId( |
2284 DOMNodeIds::idForNode(owningNode), CompositorSubElementId::Scroll)); | 2282 DOMNodeIds::idForNode(owningNode), CompositorSubElementId::Scroll)); |
2285 | 2283 |
2286 m_scrollingLayer->addChild(m_scrollingContentsLayer.get()); | 2284 m_scrollingLayer->addChild(m_scrollingContentsLayer.get()); |
2287 | 2285 |
2288 layerChanged = true; | 2286 layerChanged = true; |
2289 if (scrollingCoordinator) { | 2287 if (scrollingCoordinator) { |
2290 scrollingCoordinator->scrollableAreaScrollLayerDidChange( | 2288 scrollingCoordinator->scrollableAreaScrollLayerDidChange( |
2291 m_owningLayer.getScrollableArea()); | 2289 m_owningLayer.getScrollableArea()); |
2292 scrollingCoordinator->scrollableAreasDidChange(); | 2290 scrollingCoordinator->scrollableAreasDidChange(); |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2465 // break here. | 2463 // break here. |
2466 // | 2464 // |
2467 // FIXME: with grouped backings, a composited descendant will have to | 2465 // FIXME: with grouped backings, a composited descendant will have to |
2468 // continue past the grouped (squashed) layers that its parents may | 2466 // continue past the grouped (squashed) layers that its parents may |
2469 // contribute to. This whole confusion can be avoided by specifying | 2467 // contribute to. This whole confusion can be avoided by specifying |
2470 // explicitly the composited ancestor where we would stop accumulating | 2468 // explicitly the composited ancestor where we would stop accumulating |
2471 // opacity. | 2469 // opacity. |
2472 if (curr->compositingState() == PaintsIntoOwnBacking) | 2470 if (curr->compositingState() == PaintsIntoOwnBacking) |
2473 break; | 2471 break; |
2474 | 2472 |
2475 finalOpacity *= curr->layoutObject()->opacity(); | 2473 finalOpacity *= curr->layoutObject().opacity(); |
2476 } | 2474 } |
2477 | 2475 |
2478 return finalOpacity; | 2476 return finalOpacity; |
2479 } | 2477 } |
2480 | 2478 |
2481 Color CompositedLayerMapping::layoutObjectBackgroundColor() const { | 2479 Color CompositedLayerMapping::layoutObjectBackgroundColor() const { |
2482 return layoutObject()->resolveColor(CSSPropertyBackgroundColor); | 2480 return layoutObject().resolveColor(CSSPropertyBackgroundColor); |
2483 } | 2481 } |
2484 | 2482 |
2485 void CompositedLayerMapping::updateBackgroundColor() { | 2483 void CompositedLayerMapping::updateBackgroundColor() { |
2486 m_graphicsLayer->setBackgroundColor(layoutObjectBackgroundColor()); | 2484 m_graphicsLayer->setBackgroundColor(layoutObjectBackgroundColor()); |
2487 } | 2485 } |
2488 | 2486 |
2489 bool CompositedLayerMapping::paintsChildren() const { | 2487 bool CompositedLayerMapping::paintsChildren() const { |
2490 if (m_owningLayer.hasVisibleContent() && | 2488 if (m_owningLayer.hasVisibleContent() && |
2491 m_owningLayer.hasNonEmptyChildLayoutObjects()) | 2489 m_owningLayer.hasNonEmptyChildLayoutObjects()) |
2492 return true; | 2490 return true; |
2493 | 2491 |
2494 if (hasVisibleNonCompositingDescendant(&m_owningLayer)) | 2492 if (hasVisibleNonCompositingDescendant(&m_owningLayer)) |
2495 return true; | 2493 return true; |
2496 | 2494 |
2497 return false; | 2495 return false; |
2498 } | 2496 } |
2499 | 2497 |
2500 static bool isCompositedPlugin(LayoutObject* layoutObject) { | 2498 static bool isCompositedPlugin(LayoutObject& layoutObject) { |
2501 return layoutObject->isEmbeddedObject() && | 2499 return layoutObject.isEmbeddedObject() && |
2502 toLayoutEmbeddedObject(layoutObject)->requiresAcceleratedCompositing(); | 2500 toLayoutEmbeddedObject(layoutObject).requiresAcceleratedCompositing(); |
2503 } | 2501 } |
2504 | 2502 |
2505 bool CompositedLayerMapping::hasVisibleNonCompositingDescendant( | 2503 bool CompositedLayerMapping::hasVisibleNonCompositingDescendant( |
2506 PaintLayer* parent) { | 2504 PaintLayer* parent) { |
2507 if (!parent->hasVisibleDescendant()) | 2505 if (!parent->hasVisibleDescendant()) |
2508 return false; | 2506 return false; |
2509 | 2507 |
2510 // FIXME: We shouldn't be called with a stale z-order lists. See bug 85512. | 2508 // FIXME: We shouldn't be called with a stale z-order lists. See bug 85512. |
2511 parent->stackingNode()->updateLayerListsIfNeeded(); | 2509 parent->stackingNode()->updateLayerListsIfNeeded(); |
2512 | 2510 |
2513 #if DCHECK_IS_ON() | 2511 #if DCHECK_IS_ON() |
2514 LayerListMutationDetector mutationChecker(parent->stackingNode()); | 2512 LayerListMutationDetector mutationChecker(parent->stackingNode()); |
2515 #endif | 2513 #endif |
2516 | 2514 |
2517 PaintLayerStackingNodeIterator normalFlowIterator(*parent->stackingNode(), | 2515 PaintLayerStackingNodeIterator normalFlowIterator(*parent->stackingNode(), |
2518 AllChildren); | 2516 AllChildren); |
2519 while (PaintLayerStackingNode* curNode = normalFlowIterator.next()) { | 2517 while (PaintLayerStackingNode* curNode = normalFlowIterator.next()) { |
2520 PaintLayer* curLayer = curNode->layer(); | 2518 PaintLayer* curLayer = curNode->layer(); |
2521 if (curLayer->hasCompositedLayerMapping()) | 2519 if (curLayer->hasCompositedLayerMapping()) |
2522 continue; | 2520 continue; |
2523 if (curLayer->hasVisibleContent() || | 2521 if (curLayer->hasVisibleContent() || |
2524 hasVisibleNonCompositingDescendant(curLayer)) | 2522 hasVisibleNonCompositingDescendant(curLayer)) |
2525 return true; | 2523 return true; |
2526 } | 2524 } |
2527 | 2525 |
2528 return false; | 2526 return false; |
2529 } | 2527 } |
2530 | 2528 |
2531 bool CompositedLayerMapping::containsPaintedContent() const { | 2529 bool CompositedLayerMapping::containsPaintedContent() const { |
2532 if (layoutObject()->isImage() && isDirectlyCompositedImage()) | 2530 if (layoutObject().isImage() && isDirectlyCompositedImage()) |
2533 return false; | 2531 return false; |
2534 | 2532 |
2535 LayoutObject* layoutObject = this->layoutObject(); | 2533 LayoutObject& layoutObject = this->layoutObject(); |
2536 // FIXME: we could optimize cases where the image, video or canvas is known to | 2534 // FIXME: we could optimize cases where the image, video or canvas is known to |
2537 // fill the border box entirely, and set background color on the layer in that | 2535 // fill the border box entirely, and set background color on the layer in that |
2538 // case, instead of allocating backing store and painting. | 2536 // case, instead of allocating backing store and painting. |
2539 if (layoutObject->isVideo() && | 2537 if (layoutObject.isVideo() && |
2540 toLayoutVideo(layoutObject)->shouldDisplayVideo()) | 2538 toLayoutVideo(layoutObject).shouldDisplayVideo()) |
2541 return m_owningLayer.hasBoxDecorationsOrBackground(); | 2539 return m_owningLayer.hasBoxDecorationsOrBackground(); |
2542 | 2540 |
2543 if (m_owningLayer.hasVisibleBoxDecorations()) | 2541 if (m_owningLayer.hasVisibleBoxDecorations()) |
2544 return true; | 2542 return true; |
2545 | 2543 |
2546 if (layoutObject->hasMask()) // masks require special treatment | 2544 if (layoutObject.hasMask()) // masks require special treatment |
2547 return true; | 2545 return true; |
2548 | 2546 |
2549 if (layoutObject->isAtomicInlineLevel() && !isCompositedPlugin(layoutObject)) | 2547 if (layoutObject.isAtomicInlineLevel() && !isCompositedPlugin(layoutObject)) |
2550 return true; | 2548 return true; |
2551 | 2549 |
2552 if (layoutObject->isLayoutMultiColumnSet()) | 2550 if (layoutObject.isLayoutMultiColumnSet()) |
2553 return true; | 2551 return true; |
2554 | 2552 |
2555 if (layoutObject->node() && layoutObject->node()->isDocumentNode()) { | 2553 if (layoutObject.node() && layoutObject.node()->isDocumentNode()) { |
2556 // Look to see if the root object has a non-simple background | 2554 // Look to see if the root object has a non-simple background |
2557 LayoutObject* rootObject = | 2555 LayoutObject* rootObject = |
2558 layoutObject->document().documentElement() | 2556 layoutObject.document().documentElement() |
2559 ? layoutObject->document().documentElement()->layoutObject() | 2557 ? layoutObject.document().documentElement()->layoutObject() |
2560 : 0; | 2558 : 0; |
2561 // Reject anything that has a border, a border-radius or outline, | 2559 // Reject anything that has a border, a border-radius or outline, |
2562 // or is not a simple background (no background, or solid color). | 2560 // or is not a simple background (no background, or solid color). |
2563 if (rootObject && | 2561 if (rootObject && |
2564 hasBoxDecorationsOrBackgroundImage(rootObject->styleRef())) | 2562 hasBoxDecorationsOrBackgroundImage(rootObject->styleRef())) |
2565 return true; | 2563 return true; |
2566 | 2564 |
2567 // Now look at the body's layoutObject. | 2565 // Now look at the body's layoutObject. |
2568 HTMLElement* body = layoutObject->document().body(); | 2566 HTMLElement* body = layoutObject.document().body(); |
2569 LayoutObject* bodyObject = | 2567 LayoutObject* bodyObject = |
2570 isHTMLBodyElement(body) ? body->layoutObject() : 0; | 2568 isHTMLBodyElement(body) ? body->layoutObject() : 0; |
2571 if (bodyObject && | 2569 if (bodyObject && |
2572 hasBoxDecorationsOrBackgroundImage(bodyObject->styleRef())) | 2570 hasBoxDecorationsOrBackgroundImage(bodyObject->styleRef())) |
2573 return true; | 2571 return true; |
2574 } | 2572 } |
2575 | 2573 |
2576 // FIXME: it's O(n^2). A better solution is needed. | 2574 // FIXME: it's O(n^2). A better solution is needed. |
2577 return paintsChildren(); | 2575 return paintsChildren(); |
2578 } | 2576 } |
2579 | 2577 |
2580 // An image can be directly composited if it's the sole content of the layer, | 2578 // An image can be directly composited if it's the sole content of the layer, |
2581 // and has no box decorations or clipping that require painting. Direct | 2579 // and has no box decorations or clipping that require painting. Direct |
2582 // compositing saves a backing store. | 2580 // compositing saves a backing store. |
2583 bool CompositedLayerMapping::isDirectlyCompositedImage() const { | 2581 bool CompositedLayerMapping::isDirectlyCompositedImage() const { |
2584 ASSERT(layoutObject()->isImage()); | 2582 DCHECK(layoutObject().isImage()); |
2585 LayoutImage* imageLayoutObject = toLayoutImage(layoutObject()); | 2583 LayoutImage& imageLayoutObject = toLayoutImage(layoutObject()); |
2586 | 2584 |
2587 if (m_owningLayer.hasBoxDecorationsOrBackground() || | 2585 if (m_owningLayer.hasBoxDecorationsOrBackground() || |
2588 imageLayoutObject->hasClip() || imageLayoutObject->hasClipPath() || | 2586 imageLayoutObject.hasClip() || imageLayoutObject.hasClipPath() || |
2589 imageLayoutObject->hasObjectFit()) | 2587 imageLayoutObject.hasObjectFit()) |
2590 return false; | 2588 return false; |
2591 | 2589 |
2592 if (ImageResourceContent* cachedImage = imageLayoutObject->cachedImage()) { | 2590 if (ImageResourceContent* cachedImage = imageLayoutObject.cachedImage()) { |
2593 if (!cachedImage->hasImage()) | 2591 if (!cachedImage->hasImage()) |
2594 return false; | 2592 return false; |
2595 | 2593 |
2596 Image* image = cachedImage->getImage(); | 2594 Image* image = cachedImage->getImage(); |
2597 if (!image->isBitmapImage()) | 2595 if (!image->isBitmapImage()) |
2598 return false; | 2596 return false; |
2599 | 2597 |
2600 return true; | 2598 return true; |
2601 } | 2599 } |
2602 | 2600 |
2603 return false; | 2601 return false; |
2604 } | 2602 } |
2605 | 2603 |
2606 void CompositedLayerMapping::contentChanged(ContentChangeType changeType) { | 2604 void CompositedLayerMapping::contentChanged(ContentChangeType changeType) { |
2607 if ((changeType == ImageChanged) && layoutObject()->isImage() && | 2605 if ((changeType == ImageChanged) && layoutObject().isImage() && |
2608 isDirectlyCompositedImage()) { | 2606 isDirectlyCompositedImage()) { |
2609 updateImageContents(); | 2607 updateImageContents(); |
2610 return; | 2608 return; |
2611 } | 2609 } |
2612 | 2610 |
2613 if (changeType == CanvasChanged && isAcceleratedCanvas(layoutObject())) { | 2611 if (changeType == CanvasChanged && isAcceleratedCanvas(layoutObject())) { |
2614 m_graphicsLayer->setContentsNeedsDisplay(); | 2612 m_graphicsLayer->setContentsNeedsDisplay(); |
2615 return; | 2613 return; |
2616 } | 2614 } |
2617 } | 2615 } |
2618 | 2616 |
2619 void CompositedLayerMapping::updateImageContents() { | 2617 void CompositedLayerMapping::updateImageContents() { |
2620 ASSERT(layoutObject()->isImage()); | 2618 DCHECK(layoutObject().isImage()); |
2621 LayoutImage* imageLayoutObject = toLayoutImage(layoutObject()); | 2619 LayoutImage& imageLayoutObject = toLayoutImage(layoutObject()); |
2622 | 2620 |
2623 ImageResourceContent* cachedImage = imageLayoutObject->cachedImage(); | 2621 ImageResourceContent* cachedImage = imageLayoutObject.cachedImage(); |
2624 if (!cachedImage) | 2622 if (!cachedImage) |
2625 return; | 2623 return; |
2626 | 2624 |
2627 Image* image = cachedImage->getImage(); | 2625 Image* image = cachedImage->getImage(); |
2628 if (!image) | 2626 if (!image) |
2629 return; | 2627 return; |
2630 | 2628 |
2631 // This is a no-op if the layer doesn't have an inner layer for the image. | 2629 // This is a no-op if the layer doesn't have an inner layer for the image. |
2632 m_graphicsLayer->setContentsToImage( | 2630 m_graphicsLayer->setContentsToImage( |
2633 image, LayoutObject::shouldRespectImageOrientation(imageLayoutObject)); | 2631 image, LayoutObject::shouldRespectImageOrientation(&imageLayoutObject)); |
2634 | 2632 |
2635 m_graphicsLayer->setFilterQuality(layoutObject()->style()->imageRendering() == | 2633 m_graphicsLayer->setFilterQuality(layoutObject().style()->imageRendering() == |
2636 ImageRenderingPixelated | 2634 ImageRenderingPixelated |
2637 ? kNone_SkFilterQuality | 2635 ? kNone_SkFilterQuality |
2638 : kLow_SkFilterQuality); | 2636 : kLow_SkFilterQuality); |
2639 | 2637 |
2640 // Prevent double-drawing: https://bugs.webkit.org/show_bug.cgi?id=58632 | 2638 // Prevent double-drawing: https://bugs.webkit.org/show_bug.cgi?id=58632 |
2641 updateDrawsContent(); | 2639 updateDrawsContent(); |
2642 | 2640 |
2643 // Image animation is "lazy", in that it automatically stops unless someone is | 2641 // Image animation is "lazy", in that it automatically stops unless someone is |
2644 // drawing the image. So we have to kick the animation each time; this has the | 2642 // drawing the image. So we have to kick the animation each time; this has the |
2645 // downside that the image will keep animating, even if its layer is not | 2643 // downside that the image will keep animating, even if its layer is not |
2646 // visible. | 2644 // visible. |
2647 image->startAnimation(); | 2645 image->startAnimation(); |
2648 } | 2646 } |
2649 | 2647 |
2650 FloatPoint3D CompositedLayerMapping::computeTransformOrigin( | 2648 FloatPoint3D CompositedLayerMapping::computeTransformOrigin( |
2651 const IntRect& borderBox) const { | 2649 const IntRect& borderBox) const { |
2652 const ComputedStyle& style = layoutObject()->styleRef(); | 2650 const ComputedStyle& style = layoutObject().styleRef(); |
2653 | 2651 |
2654 FloatPoint3D origin; | 2652 FloatPoint3D origin; |
2655 origin.setX(floatValueForLength(style.transformOriginX(), borderBox.width())); | 2653 origin.setX(floatValueForLength(style.transformOriginX(), borderBox.width())); |
2656 origin.setY( | 2654 origin.setY( |
2657 floatValueForLength(style.transformOriginY(), borderBox.height())); | 2655 floatValueForLength(style.transformOriginY(), borderBox.height())); |
2658 origin.setZ(style.transformOriginZ()); | 2656 origin.setZ(style.transformOriginZ()); |
2659 | 2657 |
2660 return origin; | 2658 return origin; |
2661 } | 2659 } |
2662 | 2660 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2776 | 2774 |
2777 IntRect r; | 2775 IntRect r; |
2778 PaintInvalidationReason invalidationReason; | 2776 PaintInvalidationReason invalidationReason; |
2779 const DisplayItemClient& client; | 2777 const DisplayItemClient& client; |
2780 }; | 2778 }; |
2781 | 2779 |
2782 void CompositedLayerMapping::setContentsNeedDisplayInRect( | 2780 void CompositedLayerMapping::setContentsNeedDisplayInRect( |
2783 const LayoutRect& r, | 2781 const LayoutRect& r, |
2784 PaintInvalidationReason invalidationReason, | 2782 PaintInvalidationReason invalidationReason, |
2785 const DisplayItemClient& client) { | 2783 const DisplayItemClient& client) { |
2786 DCHECK(!m_owningLayer.layoutObject()->usesCompositedScrolling()); | 2784 DCHECK(!m_owningLayer.layoutObject().usesCompositedScrolling()); |
2787 // TODO(wangxianzhu): Enable the following assert after paint invalidation for | 2785 // TODO(wangxianzhu): Enable the following assert after paint invalidation for |
2788 // spv2 is ready. | 2786 // spv2 is ready. |
2789 // ASSERT(!RuntimeEnabledFeatures::slimmingPaintV2Enabled()); | 2787 // ASSERT(!RuntimeEnabledFeatures::slimmingPaintV2Enabled()); |
2790 | 2788 |
2791 SetContentsNeedsDisplayInRectFunctor functor = { | 2789 SetContentsNeedsDisplayInRectFunctor functor = { |
2792 enclosingIntRect(LayoutRect( | 2790 enclosingIntRect(LayoutRect( |
2793 r.location() + m_owningLayer.subpixelAccumulation(), r.size())), | 2791 r.location() + m_owningLayer.subpixelAccumulation(), r.size())), |
2794 invalidationReason, client}; | 2792 invalidationReason, client}; |
2795 ApplyToGraphicsLayers(this, functor, ApplyToContentLayers); | 2793 ApplyToGraphicsLayers(this, functor, ApplyToContentLayers); |
2796 } | 2794 } |
2797 | 2795 |
2798 void CompositedLayerMapping::setNonScrollingContentsNeedDisplayInRect( | 2796 void CompositedLayerMapping::setNonScrollingContentsNeedDisplayInRect( |
2799 const LayoutRect& r, | 2797 const LayoutRect& r, |
2800 PaintInvalidationReason invalidationReason, | 2798 PaintInvalidationReason invalidationReason, |
2801 const DisplayItemClient& client) { | 2799 const DisplayItemClient& client) { |
2802 DCHECK(m_owningLayer.layoutObject()->usesCompositedScrolling()); | 2800 DCHECK(m_owningLayer.layoutObject().usesCompositedScrolling()); |
2803 // TODO(wangxianzhu): Enable the following assert after paint invalidation for | 2801 // TODO(wangxianzhu): Enable the following assert after paint invalidation for |
2804 // spv2 is ready. | 2802 // spv2 is ready. |
2805 // ASSERT(!RuntimeEnabledFeatures::slimmingPaintV2Enabled()); | 2803 // ASSERT(!RuntimeEnabledFeatures::slimmingPaintV2Enabled()); |
2806 | 2804 |
2807 SetContentsNeedsDisplayInRectFunctor functor = { | 2805 SetContentsNeedsDisplayInRectFunctor functor = { |
2808 enclosingIntRect(LayoutRect( | 2806 enclosingIntRect(LayoutRect( |
2809 r.location() + m_owningLayer.subpixelAccumulation(), r.size())), | 2807 r.location() + m_owningLayer.subpixelAccumulation(), r.size())), |
2810 invalidationReason, client}; | 2808 invalidationReason, client}; |
2811 ApplyToGraphicsLayers(this, functor, ApplyToNonScrollingContentLayers); | 2809 ApplyToGraphicsLayers(this, functor, ApplyToNonScrollingContentLayers); |
2812 } | 2810 } |
2813 | 2811 |
2814 void CompositedLayerMapping::setScrollingContentsNeedDisplayInRect( | 2812 void CompositedLayerMapping::setScrollingContentsNeedDisplayInRect( |
2815 const LayoutRect& r, | 2813 const LayoutRect& r, |
2816 PaintInvalidationReason invalidationReason, | 2814 PaintInvalidationReason invalidationReason, |
2817 const DisplayItemClient& client) { | 2815 const DisplayItemClient& client) { |
2818 DCHECK(m_owningLayer.layoutObject()->usesCompositedScrolling()); | 2816 DCHECK(m_owningLayer.layoutObject().usesCompositedScrolling()); |
2819 // TODO(wangxianzhu): Enable the following assert after paint invalidation for | 2817 // TODO(wangxianzhu): Enable the following assert after paint invalidation for |
2820 // spv2 is ready. | 2818 // spv2 is ready. |
2821 // ASSERT(!RuntimeEnabledFeatures::slimmingPaintV2Enabled()); | 2819 // ASSERT(!RuntimeEnabledFeatures::slimmingPaintV2Enabled()); |
2822 | 2820 |
2823 SetContentsNeedsDisplayInRectFunctor functor = { | 2821 SetContentsNeedsDisplayInRectFunctor functor = { |
2824 enclosingIntRect(LayoutRect( | 2822 enclosingIntRect(LayoutRect( |
2825 r.location() + m_owningLayer.subpixelAccumulation(), r.size())), | 2823 r.location() + m_owningLayer.subpixelAccumulation(), r.size())), |
2826 invalidationReason, client}; | 2824 invalidationReason, client}; |
2827 ApplyToGraphicsLayers(this, functor, ApplyToScrollingContentLayers); | 2825 ApplyToGraphicsLayers(this, functor, ApplyToScrollingContentLayers); |
2828 } | 2826 } |
2829 | 2827 |
2830 const GraphicsLayerPaintInfo* CompositedLayerMapping::containingSquashedLayer( | 2828 const GraphicsLayerPaintInfo* CompositedLayerMapping::containingSquashedLayer( |
2831 const LayoutObject* layoutObject, | 2829 const LayoutObject* layoutObject, |
2832 const Vector<GraphicsLayerPaintInfo>& layers, | 2830 const Vector<GraphicsLayerPaintInfo>& layers, |
2833 unsigned maxSquashedLayerIndex) { | 2831 unsigned maxSquashedLayerIndex) { |
2834 if (!layoutObject) | 2832 if (!layoutObject) |
2835 return nullptr; | 2833 return nullptr; |
2836 for (size_t i = 0; i < layers.size() && i < maxSquashedLayerIndex; ++i) { | 2834 for (size_t i = 0; i < layers.size() && i < maxSquashedLayerIndex; ++i) { |
2837 if (layoutObject->isDescendantOf(layers[i].paintLayer->layoutObject())) | 2835 if (layoutObject->isDescendantOf(&layers[i].paintLayer->layoutObject())) |
2838 return &layers[i]; | 2836 return &layers[i]; |
2839 } | 2837 } |
2840 return nullptr; | 2838 return nullptr; |
2841 } | 2839 } |
2842 | 2840 |
2843 const GraphicsLayerPaintInfo* CompositedLayerMapping::containingSquashedLayer( | 2841 const GraphicsLayerPaintInfo* CompositedLayerMapping::containingSquashedLayer( |
2844 const LayoutObject* layoutObject, | 2842 const LayoutObject* layoutObject, |
2845 unsigned maxSquashedLayerIndex) { | 2843 unsigned maxSquashedLayerIndex) { |
2846 return CompositedLayerMapping::containingSquashedLayer( | 2844 return CompositedLayerMapping::containingSquashedLayer( |
2847 layoutObject, m_squashedLayers, maxSquashedLayerIndex); | 2845 layoutObject, m_squashedLayers, maxSquashedLayerIndex); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2903 PaintLayerPaintingAncestorClippingMaskPhase)) { | 2901 PaintLayerPaintingAncestorClippingMaskPhase)) { |
2904 dirtyRect.move( | 2902 dirtyRect.move( |
2905 roundedIntSize(paintInfo.paintLayer->subpixelAccumulation())); | 2903 roundedIntSize(paintInfo.paintLayer->subpixelAccumulation())); |
2906 } else { | 2904 } else { |
2907 LayoutRect bounds = paintInfo.compositedBounds; | 2905 LayoutRect bounds = paintInfo.compositedBounds; |
2908 bounds.move(paintInfo.paintLayer->subpixelAccumulation()); | 2906 bounds.move(paintInfo.paintLayer->subpixelAccumulation()); |
2909 dirtyRect.intersect(pixelSnappedIntRect(bounds)); | 2907 dirtyRect.intersect(pixelSnappedIntRect(bounds)); |
2910 } | 2908 } |
2911 | 2909 |
2912 #if DCHECK_IS_ON() | 2910 #if DCHECK_IS_ON() |
2913 if (!layoutObject()->view()->frame() || | 2911 if (!layoutObject().view()->frame() || |
2914 !layoutObject()->view()->frame()->shouldThrottleRendering()) | 2912 !layoutObject().view()->frame()->shouldThrottleRendering()) |
2915 paintInfo.paintLayer->layoutObject()->assertSubtreeIsLaidOut(); | 2913 paintInfo.paintLayer->layoutObject().assertSubtreeIsLaidOut(); |
2916 #endif | 2914 #endif |
2917 | 2915 |
2918 float deviceScaleFactor = | 2916 float deviceScaleFactor = |
2919 blink::deviceScaleFactor(paintInfo.paintLayer->layoutObject()->frame()); | 2917 blink::deviceScaleFactor(paintInfo.paintLayer->layoutObject().frame()); |
2920 context.setDeviceScaleFactor(deviceScaleFactor); | 2918 context.setDeviceScaleFactor(deviceScaleFactor); |
2921 | 2919 |
2922 if (paintInfo.paintLayer->compositingState() != PaintsIntoGroupedBacking) { | 2920 if (paintInfo.paintLayer->compositingState() != PaintsIntoGroupedBacking) { |
2923 // FIXME: GraphicsLayers need a way to split for multicol. | 2921 // FIXME: GraphicsLayers need a way to split for multicol. |
2924 PaintLayerPaintingInfo paintingInfo( | 2922 PaintLayerPaintingInfo paintingInfo( |
2925 paintInfo.paintLayer, LayoutRect(dirtyRect), GlobalPaintNormalPhase, | 2923 paintInfo.paintLayer, LayoutRect(dirtyRect), GlobalPaintNormalPhase, |
2926 paintInfo.paintLayer->subpixelAccumulation()); | 2924 paintInfo.paintLayer->subpixelAccumulation()); |
2927 PaintLayerPainter(*paintInfo.paintLayer) | 2925 PaintLayerPainter(*paintInfo.paintLayer) |
2928 .paintLayerContents(context, paintingInfo, paintLayerFlags); | 2926 .paintLayerContents(context, paintingInfo, paintLayerFlags); |
2929 | 2927 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2989 if (graphicsLayer == m_squashingLayer.get()) { | 2987 if (graphicsLayer == m_squashingLayer.get()) { |
2990 // TODO(chrishtr): this is a speculative fix for crbug.com/561306. However, | 2988 // TODO(chrishtr): this is a speculative fix for crbug.com/561306. However, |
2991 // it should never be the case that m_squashingLayer exists, | 2989 // it should never be the case that m_squashingLayer exists, |
2992 // yet m_squashedLayers.size() == 0. There must be a bug elsewhere. | 2990 // yet m_squashedLayers.size() == 0. There must be a bug elsewhere. |
2993 if (m_squashedLayers.size() == 0) | 2991 if (m_squashedLayers.size() == 0) |
2994 return IntRect(); | 2992 return IntRect(); |
2995 // All squashed layers have the same clip and transform space, so we can use | 2993 // All squashed layers have the same clip and transform space, so we can use |
2996 // the first squashed layer's layoutObject to map the squashing layer's | 2994 // the first squashed layer's layoutObject to map the squashing layer's |
2997 // bounds into viewport space, with offsetFromAnchorLayoutObject to | 2995 // bounds into viewport space, with offsetFromAnchorLayoutObject to |
2998 // translate squashing layer's bounds into the first squashed layer's space. | 2996 // translate squashing layer's bounds into the first squashed layer's space. |
2999 anchorLayoutObject = m_squashedLayers[0].paintLayer->layoutObject(); | 2997 anchorLayoutObject = &m_squashedLayers[0].paintLayer->layoutObject(); |
3000 offsetFromAnchorLayoutObject = m_squashedLayers[0].offsetFromLayoutObject; | 2998 offsetFromAnchorLayoutObject = m_squashedLayers[0].offsetFromLayoutObject; |
3001 } else { | 2999 } else { |
3002 ASSERT(graphicsLayer == m_graphicsLayer.get() || | 3000 ASSERT(graphicsLayer == m_graphicsLayer.get() || |
3003 graphicsLayer == m_scrollingContentsLayer.get()); | 3001 graphicsLayer == m_scrollingContentsLayer.get()); |
3004 anchorLayoutObject = m_owningLayer.layoutObject(); | 3002 anchorLayoutObject = &m_owningLayer.layoutObject(); |
3005 offsetFromAnchorLayoutObject = graphicsLayer->offsetFromLayoutObject(); | 3003 offsetFromAnchorLayoutObject = graphicsLayer->offsetFromLayoutObject(); |
3006 adjustForCompositedScrolling(graphicsLayer, offsetFromAnchorLayoutObject); | 3004 adjustForCompositedScrolling(graphicsLayer, offsetFromAnchorLayoutObject); |
3007 } | 3005 } |
3008 | 3006 |
3009 // Start with the bounds of the graphics layer in the space of the anchor | 3007 // Start with the bounds of the graphics layer in the space of the anchor |
3010 // LayoutObject. | 3008 // LayoutObject. |
3011 FloatRect graphicsLayerBoundsInObjectSpace(graphicsLayerBounds); | 3009 FloatRect graphicsLayerBoundsInObjectSpace(graphicsLayerBounds); |
3012 graphicsLayerBoundsInObjectSpace.move(offsetFromAnchorLayoutObject); | 3010 graphicsLayerBoundsInObjectSpace.move(offsetFromAnchorLayoutObject); |
3013 | 3011 |
3014 // Now map the bounds to its visible content rect in root view space, | 3012 // Now map the bounds to its visible content rect in root view space, |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3149 void CompositedLayerMapping::paintContents( | 3147 void CompositedLayerMapping::paintContents( |
3150 const GraphicsLayer* graphicsLayer, | 3148 const GraphicsLayer* graphicsLayer, |
3151 GraphicsContext& context, | 3149 GraphicsContext& context, |
3152 GraphicsLayerPaintingPhase graphicsLayerPaintingPhase, | 3150 GraphicsLayerPaintingPhase graphicsLayerPaintingPhase, |
3153 const IntRect& interestRect) const { | 3151 const IntRect& interestRect) const { |
3154 // https://code.google.com/p/chromium/issues/detail?id=343772 | 3152 // https://code.google.com/p/chromium/issues/detail?id=343772 |
3155 DisableCompositingQueryAsserts disabler; | 3153 DisableCompositingQueryAsserts disabler; |
3156 // Allow throttling to make sure no painting paths (e.g., | 3154 // Allow throttling to make sure no painting paths (e.g., |
3157 // ContentLayerDelegate::paintContents) try to paint throttled content. | 3155 // ContentLayerDelegate::paintContents) try to paint throttled content. |
3158 DocumentLifecycle::AllowThrottlingScope allowThrottling( | 3156 DocumentLifecycle::AllowThrottlingScope allowThrottling( |
3159 m_owningLayer.layoutObject()->document().lifecycle()); | 3157 m_owningLayer.layoutObject().document().lifecycle()); |
3160 #if DCHECK_IS_ON() | 3158 #if DCHECK_IS_ON() |
3161 // FIXME: once the state machine is ready, this can be removed and we can | 3159 // FIXME: once the state machine is ready, this can be removed and we can |
3162 // refer to that instead. | 3160 // refer to that instead. |
3163 if (Page* page = layoutObject()->frame()->page()) | 3161 if (Page* page = layoutObject().frame()->page()) |
3164 page->setIsPainting(true); | 3162 page->setIsPainting(true); |
3165 #endif | 3163 #endif |
3166 | 3164 |
3167 TRACE_EVENT1( | 3165 TRACE_EVENT1( |
3168 "devtools.timeline,rail", "Paint", "data", | 3166 "devtools.timeline,rail", "Paint", "data", |
3169 InspectorPaintEvent::data(m_owningLayer.layoutObject(), | 3167 InspectorPaintEvent::data(&m_owningLayer.layoutObject(), |
3170 LayoutRect(interestRect), graphicsLayer)); | 3168 LayoutRect(interestRect), graphicsLayer)); |
3171 | 3169 |
3172 PaintLayerFlags paintLayerFlags = 0; | 3170 PaintLayerFlags paintLayerFlags = 0; |
3173 if (graphicsLayerPaintingPhase & GraphicsLayerPaintBackground) | 3171 if (graphicsLayerPaintingPhase & GraphicsLayerPaintBackground) |
3174 paintLayerFlags |= PaintLayerPaintingCompositingBackgroundPhase; | 3172 paintLayerFlags |= PaintLayerPaintingCompositingBackgroundPhase; |
3175 else | 3173 else |
3176 paintLayerFlags |= PaintLayerPaintingSkipRootBackground; | 3174 paintLayerFlags |= PaintLayerPaintingSkipRootBackground; |
3177 if (graphicsLayerPaintingPhase & GraphicsLayerPaintForeground) | 3175 if (graphicsLayerPaintingPhase & GraphicsLayerPaintForeground) |
3178 paintLayerFlags |= PaintLayerPaintingCompositingForegroundPhase; | 3176 paintLayerFlags |= PaintLayerPaintingCompositingForegroundPhase; |
3179 if (graphicsLayerPaintingPhase & GraphicsLayerPaintMask) | 3177 if (graphicsLayerPaintingPhase & GraphicsLayerPaintMask) |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3225 // compute and cache clipRects. | 3223 // compute and cache clipRects. |
3226 doPaintTask(paintInfo, *graphicsLayer, paintLayerFlags, context, | 3224 doPaintTask(paintInfo, *graphicsLayer, paintLayerFlags, context, |
3227 interestRect); | 3225 interestRect); |
3228 } else if (graphicsLayer == m_squashingLayer.get()) { | 3226 } else if (graphicsLayer == m_squashingLayer.get()) { |
3229 for (size_t i = 0; i < m_squashedLayers.size(); ++i) | 3227 for (size_t i = 0; i < m_squashedLayers.size(); ++i) |
3230 doPaintTask(m_squashedLayers[i], *graphicsLayer, paintLayerFlags, context, | 3228 doPaintTask(m_squashedLayers[i], *graphicsLayer, paintLayerFlags, context, |
3231 interestRect); | 3229 interestRect); |
3232 } else if (isScrollableAreaLayer(graphicsLayer)) { | 3230 } else if (isScrollableAreaLayer(graphicsLayer)) { |
3233 paintScrollableArea(graphicsLayer, context, interestRect); | 3231 paintScrollableArea(graphicsLayer, context, interestRect); |
3234 } | 3232 } |
3235 InspectorInstrumentation::didPaint(m_owningLayer.layoutObject()->frame(), | 3233 InspectorInstrumentation::didPaint(m_owningLayer.layoutObject().frame(), |
3236 graphicsLayer, context, | 3234 graphicsLayer, context, |
3237 LayoutRect(interestRect)); | 3235 LayoutRect(interestRect)); |
3238 #if DCHECK_IS_ON() | 3236 #if DCHECK_IS_ON() |
3239 if (Page* page = layoutObject()->frame()->page()) | 3237 if (Page* page = layoutObject().frame()->page()) |
3240 page->setIsPainting(false); | 3238 page->setIsPainting(false); |
3241 #endif | 3239 #endif |
3242 } | 3240 } |
3243 | 3241 |
3244 void CompositedLayerMapping::paintScrollableArea( | 3242 void CompositedLayerMapping::paintScrollableArea( |
3245 const GraphicsLayer* graphicsLayer, | 3243 const GraphicsLayer* graphicsLayer, |
3246 GraphicsContext& context, | 3244 GraphicsContext& context, |
3247 const IntRect& interestRect) const { | 3245 const IntRect& interestRect) const { |
3248 // Note the composited scrollable area painted here is never associated with a | 3246 // Note the composited scrollable area painted here is never associated with a |
3249 // frame. For painting frame ScrollableAreas, see | 3247 // frame. For painting frame ScrollableAreas, see |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3291 graphicsLayer == layerForScrollCorner(); | 3289 graphicsLayer == layerForScrollCorner(); |
3292 } | 3290 } |
3293 | 3291 |
3294 bool CompositedLayerMapping::isTrackingRasterInvalidations() const { | 3292 bool CompositedLayerMapping::isTrackingRasterInvalidations() const { |
3295 GraphicsLayerClient* client = compositor(); | 3293 GraphicsLayerClient* client = compositor(); |
3296 return client ? client->isTrackingRasterInvalidations() : false; | 3294 return client ? client->isTrackingRasterInvalidations() : false; |
3297 } | 3295 } |
3298 | 3296 |
3299 #if DCHECK_IS_ON() | 3297 #if DCHECK_IS_ON() |
3300 void CompositedLayerMapping::verifyNotPainting() { | 3298 void CompositedLayerMapping::verifyNotPainting() { |
3301 ASSERT(!layoutObject()->frame()->page() || | 3299 DCHECK(!layoutObject().frame()->page() || |
3302 !layoutObject()->frame()->page()->isPainting()); | 3300 !layoutObject().frame()->page()->isPainting()); |
3303 } | 3301 } |
3304 #endif | 3302 #endif |
3305 | 3303 |
3306 // Only used for performance benchmark testing. Intended to be a | 3304 // Only used for performance benchmark testing. Intended to be a |
3307 // sufficiently-unique element id name to allow picking out the target element | 3305 // sufficiently-unique element id name to allow picking out the target element |
3308 // for invalidation. | 3306 // for invalidation. |
3309 static const char* kTestPaintInvalidationTargetName = | 3307 static const char* kTestPaintInvalidationTargetName = |
3310 "blinkPaintInvalidationTarget"; | 3308 "blinkPaintInvalidationTarget"; |
3311 | 3309 |
3312 void CompositedLayerMapping::invalidateTargetElementForTesting() { | 3310 void CompositedLayerMapping::invalidateTargetElementForTesting() { |
3313 // The below is an artificial construct formed intentionally to focus a | 3311 // The below is an artificial construct formed intentionally to focus a |
3314 // microbenchmark on the cost of paint with a partial invalidation. | 3312 // microbenchmark on the cost of paint with a partial invalidation. |
3315 Element* targetElement = | 3313 Element* targetElement = |
3316 m_owningLayer.layoutObject()->document().getElementById( | 3314 m_owningLayer.layoutObject().document().getElementById( |
3317 AtomicString(kTestPaintInvalidationTargetName)); | 3315 AtomicString(kTestPaintInvalidationTargetName)); |
3318 // TODO(wkorman): If we don't find the expected target element, we could | 3316 // TODO(wkorman): If we don't find the expected target element, we could |
3319 // consider walking to the first leaf node so that the partial-invalidation | 3317 // consider walking to the first leaf node so that the partial-invalidation |
3320 // benchmark mode still provides some value when running on generic pages. | 3318 // benchmark mode still provides some value when running on generic pages. |
3321 if (!targetElement) | 3319 if (!targetElement) |
3322 return; | 3320 return; |
3323 LayoutObject* targetObject = targetElement->layoutObject(); | 3321 LayoutObject* targetObject = targetElement->layoutObject(); |
3324 if (!targetObject) | 3322 if (!targetObject) |
3325 return; | 3323 return; |
3326 targetObject->enclosingLayer()->setNeedsRepaint(); | 3324 targetObject->enclosingLayer()->setNeedsRepaint(); |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3482 } else if (graphicsLayer == m_decorationOutlineLayer.get()) { | 3480 } else if (graphicsLayer == m_decorationOutlineLayer.get()) { |
3483 name = "Decoration Layer"; | 3481 name = "Decoration Layer"; |
3484 } else { | 3482 } else { |
3485 ASSERT_NOT_REACHED(); | 3483 ASSERT_NOT_REACHED(); |
3486 } | 3484 } |
3487 | 3485 |
3488 return name; | 3486 return name; |
3489 } | 3487 } |
3490 | 3488 |
3491 } // namespace blink | 3489 } // namespace blink |
OLD | NEW |