Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. | 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. |
| 5 * | 5 * |
| 6 * Other contributors: | 6 * Other contributors: |
| 7 * Robert O'Callahan <roc+@cs.cmu.edu> | 7 * Robert O'Callahan <roc+@cs.cmu.edu> |
| 8 * David Baron <dbaron@fas.harvard.edu> | 8 * David Baron <dbaron@fas.harvard.edu> |
| 9 * Christian Biesinger <cbiesinger@web.de> | 9 * Christian Biesinger <cbiesinger@web.de> |
| 10 * Randall Jesup <rjesup@wgate.com> | 10 * Randall Jesup <rjesup@wgate.com> |
| (...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 704 } | 704 } |
| 705 | 705 |
| 706 // If we live in a 3d hierarchy, then the layer at the root of that hierarch y needs | 706 // If we live in a 3d hierarchy, then the layer at the root of that hierarch y needs |
| 707 // the m_has3DTransformedDescendant set. | 707 // the m_has3DTransformedDescendant set. |
| 708 if (preserves3D()) | 708 if (preserves3D()) |
| 709 return has3DTransform() || m_has3DTransformedDescendant; | 709 return has3DTransform() || m_has3DTransformedDescendant; |
| 710 | 710 |
| 711 return has3DTransform(); | 711 return has3DTransform(); |
| 712 } | 712 } |
| 713 | 713 |
| 714 LayoutPoint DeprecatedPaintLayer::locationExcludingOverflowScroll() const | |
| 715 { | |
| 716 ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled()); | |
| 717 | |
| 718 // Our m_location already has scroll offset baked-in. We have to revert it h ere. | |
| 719 IntSize scrollOffset; | |
| 720 DeprecatedPaintLayer* scrollParent = layoutObject()->isOutOfFlowPositioned() ? enclosingPositionedAncestor() : parent(); | |
| 721 if (scrollParent && scrollParent->layoutObject()->hasOverflowClip()) | |
| 722 scrollOffset = scrollParent->layoutBox()->scrolledContentOffset(); | |
| 723 return m_location + LayoutSize(scrollOffset); | |
| 724 } | |
| 725 | |
| 714 bool DeprecatedPaintLayer::updateLayerPosition() | 726 bool DeprecatedPaintLayer::updateLayerPosition() |
| 715 { | 727 { |
| 716 LayoutPoint localPoint; | 728 LayoutPoint localPoint; |
| 717 LayoutPoint inlineBoundingBoxOffset; // We don't put this into the Layer x/y for inlines, so we need to subtract it out when done. | 729 LayoutPoint inlineBoundingBoxOffset; // We don't put this into the Layer x/y for inlines, so we need to subtract it out when done. |
| 718 | 730 |
| 719 if (layoutObject()->isInline() && layoutObject()->isLayoutInline()) { | 731 if (layoutObject()->isInline() && layoutObject()->isLayoutInline()) { |
| 720 LayoutInline* inlineFlow = toLayoutInline(layoutObject()); | 732 LayoutInline* inlineFlow = toLayoutInline(layoutObject()); |
| 721 IntRect lineBox = inlineFlow->linesBoundingBox(); | 733 IntRect lineBox = inlineFlow->linesBoundingBox(); |
| 722 m_size = lineBox.size(); | 734 m_size = lineBox.size(); |
| 723 inlineBoundingBoxOffset = lineBox.location(); | 735 inlineBoundingBoxOffset = lineBox.location(); |
| (...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1237 | 1249 |
| 1238 // Remove all descendant layers from the hierarchy and add them to the new p osition. | 1250 // Remove all descendant layers from the hierarchy and add them to the new p osition. |
| 1239 for (LayoutObject* curr = layoutObject()->slowFirstChild(); curr; curr = cur r->nextSibling()) | 1251 for (LayoutObject* curr = layoutObject()->slowFirstChild(); curr; curr = cur r->nextSibling()) |
| 1240 curr->moveLayers(m_parent, this); | 1252 curr->moveLayers(m_parent, this); |
| 1241 | 1253 |
| 1242 // Clear out all the clip rects. | 1254 // Clear out all the clip rects. |
| 1243 m_clipper.clearClipRectsIncludingDescendants(); | 1255 m_clipper.clearClipRectsIncludingDescendants(); |
| 1244 } | 1256 } |
| 1245 | 1257 |
| 1246 // Returns the layer reached on the walk up towards the ancestor. | 1258 // Returns the layer reached on the walk up towards the ancestor. |
| 1247 static inline const DeprecatedPaintLayer* accumulateOffsetTowardsAncestor(const DeprecatedPaintLayer* layer, const DeprecatedPaintLayer* ancestorLayer, LayoutPo int& location) | 1259 static inline const DeprecatedPaintLayer* accumulateOffsetTowardsAncestor(const DeprecatedPaintLayer* layer, const DeprecatedPaintLayer* ancestorLayer, LayoutPo int& location, DeprecatedPaintLayer::LocationQueryBehavior behavior) |
| 1248 { | 1260 { |
| 1249 ASSERT(ancestorLayer != layer); | 1261 ASSERT(ancestorLayer != layer); |
| 1250 | 1262 |
| 1251 const LayoutBoxModelObject* layoutObject = layer->layoutObject(); | 1263 const LayoutBoxModelObject* layoutObject = layer->layoutObject(); |
| 1252 EPosition position = layoutObject->style()->position(); | 1264 EPosition position = layoutObject->style()->position(); |
| 1253 | 1265 |
| 1254 if (position == FixedPosition && (!ancestorLayer || ancestorLayer == layoutO bject->view()->layer())) { | 1266 if (position == FixedPosition && (!ancestorLayer || ancestorLayer == layoutO bject->view()->layer())) { |
| 1255 // If the fixed layer's container is the root, just add in the offset of the view. We can obtain this by calling | 1267 // If the fixed layer's container is the root, just add in the offset of the view. We can obtain this by calling |
| 1256 // localToAbsolute() on the LayoutView. | 1268 // localToAbsolute() on the LayoutView. |
| 1257 FloatPoint absPos = layoutObject->localToAbsolute(FloatPoint(), IsFixed) ; | 1269 FloatPoint absPos = layoutObject->localToAbsolute(FloatPoint(), IsFixed) ; |
| 1258 location += LayoutSize(absPos.x(), absPos.y()); | 1270 location += LayoutSize(absPos.x(), absPos.y()); |
| 1259 return ancestorLayer; | 1271 return ancestorLayer; |
| 1260 } | 1272 } |
| 1261 | 1273 |
| 1262 DeprecatedPaintLayer* parentLayer; | 1274 DeprecatedPaintLayer* parentLayer; |
| 1263 if (position == AbsolutePosition || position == FixedPosition) { | 1275 if (position == AbsolutePosition || position == FixedPosition) { |
| 1264 bool foundAncestorFirst; | 1276 bool foundAncestorFirst; |
| 1265 parentLayer = layer->enclosingPositionedAncestor(ancestorLayer, &foundAn cestorFirst); | 1277 parentLayer = layer->enclosingPositionedAncestor(ancestorLayer, &foundAn cestorFirst); |
| 1266 | 1278 |
| 1267 if (foundAncestorFirst) { | 1279 if (foundAncestorFirst) { |
| 1268 // Found ancestorLayer before the container of the out-of-flow objec t, so compute offset | 1280 // Found ancestorLayer before the container of the out-of-flow objec t, so compute offset |
| 1269 // of both relative to the container and subtract. | 1281 // of both relative to the container and subtract. |
| 1270 | 1282 |
| 1271 LayoutPoint thisCoords; | 1283 LayoutPoint thisCoords; |
| 1272 layer->convertToLayerCoords(parentLayer, thisCoords); | 1284 layer->convertToLayerCoords(parentLayer, thisCoords, behavior); |
| 1273 | 1285 |
| 1274 LayoutPoint ancestorCoords; | 1286 LayoutPoint ancestorCoords; |
| 1275 ancestorLayer->convertToLayerCoords(parentLayer, ancestorCoords); | 1287 ancestorLayer->convertToLayerCoords(parentLayer, ancestorCoords, beh avior); |
| 1276 | 1288 |
| 1277 location += (thisCoords - ancestorCoords); | 1289 location += (thisCoords - ancestorCoords); |
| 1278 return ancestorLayer; | 1290 return ancestorLayer; |
| 1279 } | 1291 } |
| 1280 } else if (layoutObject->isColumnSpanAll()) { | 1292 } else if (layoutObject->isColumnSpanAll()) { |
| 1281 LayoutBlock* multicolContainer = layoutObject->containingBlock(); | 1293 LayoutBlock* multicolContainer = layoutObject->containingBlock(); |
| 1282 ASSERT(toLayoutBlockFlow(multicolContainer)->multiColumnFlowThread()); | 1294 ASSERT(toLayoutBlockFlow(multicolContainer)->multiColumnFlowThread()); |
| 1283 parentLayer = multicolContainer->layer(); | 1295 parentLayer = multicolContainer->layer(); |
| 1284 ASSERT(parentLayer); | 1296 ASSERT(parentLayer); |
| 1285 } else { | 1297 } else { |
| 1286 parentLayer = layer->parent(); | 1298 parentLayer = layer->parent(); |
| 1287 } | 1299 } |
| 1288 | 1300 |
| 1289 if (!parentLayer) | 1301 if (!parentLayer) |
| 1290 return nullptr; | 1302 return nullptr; |
| 1291 | 1303 |
| 1292 location += layer->location(); | 1304 location += layer->location(behavior); |
|
chrishtr
2015/09/17 18:07:53
I think this introduces n^2 performance, because o
| |
| 1293 return parentLayer; | 1305 return parentLayer; |
| 1294 } | 1306 } |
| 1295 | 1307 |
| 1296 void DeprecatedPaintLayer::convertToLayerCoords(const DeprecatedPaintLayer* ance storLayer, LayoutPoint& location) const | 1308 void DeprecatedPaintLayer::convertToLayerCoords(const DeprecatedPaintLayer* ance storLayer, LayoutPoint& location, LocationQueryBehavior behavior) const |
| 1297 { | 1309 { |
| 1298 if (ancestorLayer == this) | 1310 if (ancestorLayer == this) |
| 1299 return; | 1311 return; |
| 1300 | 1312 |
| 1301 const DeprecatedPaintLayer* currLayer = this; | 1313 const DeprecatedPaintLayer* currLayer = this; |
| 1302 while (currLayer && currLayer != ancestorLayer) | 1314 while (currLayer && currLayer != ancestorLayer) |
| 1303 currLayer = accumulateOffsetTowardsAncestor(currLayer, ancestorLayer, lo cation); | 1315 currLayer = accumulateOffsetTowardsAncestor(currLayer, ancestorLayer, lo cation, behavior); |
| 1304 } | 1316 } |
| 1305 | 1317 |
| 1306 void DeprecatedPaintLayer::convertToLayerCoords(const DeprecatedPaintLayer* ance storLayer, LayoutRect& rect) const | 1318 void DeprecatedPaintLayer::convertToLayerCoords(const DeprecatedPaintLayer* ance storLayer, LayoutRect& rect) const |
| 1307 { | 1319 { |
| 1308 LayoutPoint delta; | 1320 LayoutPoint delta; |
| 1309 convertToLayerCoords(ancestorLayer, delta); | 1321 convertToLayerCoords(ancestorLayer, delta); |
| 1310 rect.moveBy(delta); | 1322 rect.moveBy(delta); |
| 1311 } | 1323 } |
| 1312 | 1324 |
| 1313 LayoutPoint DeprecatedPaintLayer::visualOffsetFromAncestor(const DeprecatedPaint Layer* ancestorLayer) const | 1325 LayoutPoint DeprecatedPaintLayer::visualOffsetFromAncestor(const DeprecatedPaint Layer* ancestorLayer) const |
| (...skipping 1397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2711 | 2723 |
| 2712 void showLayerTree(const blink::LayoutObject* layoutObject) | 2724 void showLayerTree(const blink::LayoutObject* layoutObject) |
| 2713 { | 2725 { |
| 2714 if (!layoutObject) { | 2726 if (!layoutObject) { |
| 2715 fprintf(stderr, "Cannot showLayerTree. Root is (nil)\n"); | 2727 fprintf(stderr, "Cannot showLayerTree. Root is (nil)\n"); |
| 2716 return; | 2728 return; |
| 2717 } | 2729 } |
| 2718 showLayerTree(layoutObject->enclosingLayer()); | 2730 showLayerTree(layoutObject->enclosingLayer()); |
| 2719 } | 2731 } |
| 2720 #endif | 2732 #endif |
| OLD | NEW |