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 1395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1406 if (respectOverflowClip == IgnoreOverflowClip) | 1406 if (respectOverflowClip == IgnoreOverflowClip) |
1407 paginationClipRectsContext.setIgnoreOverflowClip(); | 1407 paginationClipRectsContext.setIgnoreOverflowClip(); |
1408 LayoutRect layerBoundsInFlowThread; | 1408 LayoutRect layerBoundsInFlowThread; |
1409 ClipRect backgroundRectInFlowThread; | 1409 ClipRect backgroundRectInFlowThread; |
1410 ClipRect foregroundRectInFlowThread; | 1410 ClipRect foregroundRectInFlowThread; |
1411 ClipRect outlineRectInFlowThread; | 1411 ClipRect outlineRectInFlowThread; |
1412 clipper().calculateRects(paginationClipRectsContext, LayoutRect(LayoutRect::
infiniteIntRect()), layerBoundsInFlowThread, backgroundRectInFlowThread, foregro
undRectInFlowThread, | 1412 clipper().calculateRects(paginationClipRectsContext, LayoutRect(LayoutRect::
infiniteIntRect()), layerBoundsInFlowThread, backgroundRectInFlowThread, foregro
undRectInFlowThread, |
1413 outlineRectInFlowThread, &offsetWithinPaginatedLayer); | 1413 outlineRectInFlowThread, &offsetWithinPaginatedLayer); |
1414 | 1414 |
1415 // Take our bounding box within the flow thread and clip it. | 1415 // Take our bounding box within the flow thread and clip it. |
1416 LayoutRect layerBoundingBoxInFlowThread = layerBoundingBox ? *layerBoundingB
ox : physicalBoundingBox(enclosingPaginationLayer(), &offsetWithinPaginatedLayer
); | 1416 LayoutRect layerBoundingBoxInFlowThread = layerBoundingBox ? *layerBoundingB
ox : physicalBoundingBox(offsetWithinPaginatedLayer); |
1417 layerBoundingBoxInFlowThread.intersect(backgroundRectInFlowThread.rect()); | 1417 layerBoundingBoxInFlowThread.intersect(backgroundRectInFlowThread.rect()); |
1418 | 1418 |
1419 // Make the dirty rect relative to the fragmentation context (multicol conta
iner, etc.). | 1419 // Make the dirty rect relative to the fragmentation context (multicol conta
iner, etc.). |
1420 LayoutFlowThread* enclosingFlowThread = toLayoutFlowThread(enclosingPaginati
onLayer()->layoutObject()); | 1420 LayoutFlowThread* enclosingFlowThread = toLayoutFlowThread(enclosingPaginati
onLayer()->layoutObject()); |
1421 LayoutPoint offsetOfPaginationLayerFromRoot; // Visual offset from the root
layer to the nearest fragmentation context. | 1421 LayoutPoint offsetOfPaginationLayerFromRoot; // Visual offset from the root
layer to the nearest fragmentation context. |
1422 bool rootLayerIsInsidePaginationLayer = rootLayer->enclosingPaginationLayer(
) == enclosingPaginationLayer(); | 1422 bool rootLayerIsInsidePaginationLayer = rootLayer->enclosingPaginationLayer(
) == enclosingPaginationLayer(); |
1423 if (rootLayerIsInsidePaginationLayer) { | 1423 if (rootLayerIsInsidePaginationLayer) { |
1424 // The root layer is in the same fragmentation context as this layer, so
we need to look | 1424 // The root layer is in the same fragmentation context as this layer, so
we need to look |
1425 // inside it and subtract the offset between the fragmentation context a
nd the root layer. | 1425 // inside it and subtract the offset between the fragmentation context a
nd the root layer. |
1426 offsetOfPaginationLayerFromRoot = -rootLayer->visualOffsetFromAncestor(e
nclosingPaginationLayer()); | 1426 offsetOfPaginationLayerFromRoot = -rootLayer->visualOffsetFromAncestor(e
nclosingPaginationLayer()); |
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2023 // FIXME: it would be more accurate to return !blockSelectionGapsBounds().is
Empty(), but this is impossible | 2023 // FIXME: it would be more accurate to return !blockSelectionGapsBounds().is
Empty(), but this is impossible |
2024 // at the moment because it causes invalid queries to layout-dependent code
(crbug.com/372802). | 2024 // at the moment because it causes invalid queries to layout-dependent code
(crbug.com/372802). |
2025 // ASSERT(layoutObject()->document().lifecycle().state() >= DocumentLifecycl
e::LayoutClean); | 2025 // ASSERT(layoutObject()->document().lifecycle().state() >= DocumentLifecycl
e::LayoutClean); |
2026 | 2026 |
2027 if (!layoutObject()->isLayoutBlock()) | 2027 if (!layoutObject()->isLayoutBlock()) |
2028 return false; | 2028 return false; |
2029 | 2029 |
2030 return toLayoutBlock(layoutObject())->shouldPaintSelectionGaps(); | 2030 return toLayoutBlock(layoutObject())->shouldPaintSelectionGaps(); |
2031 } | 2031 } |
2032 | 2032 |
2033 bool DeprecatedPaintLayer::intersectsDamageRect(const LayoutRect& layerBounds, c
onst LayoutRect& damageRect, const DeprecatedPaintLayer* rootLayer, const Layout
Point* offsetFromRoot) const | 2033 bool DeprecatedPaintLayer::intersectsDamageRect(const LayoutRect& layerBounds, c
onst LayoutRect& damageRect, const LayoutPoint& offsetFromRoot) const |
2034 { | 2034 { |
2035 // Always examine the canvas and the root. | 2035 // Always examine the canvas and the root. |
2036 // FIXME: Could eliminate the isDocumentElement() check if we fix background
painting so that the LayoutView | 2036 // FIXME: Could eliminate the isDocumentElement() check if we fix background
painting so that the LayoutView |
2037 // paints the root's background. | 2037 // paints the root's background. |
2038 if (isRootLayer() || layoutObject()->isDocumentElement()) | 2038 if (isRootLayer() || layoutObject()->isDocumentElement()) |
2039 return true; | 2039 return true; |
2040 | 2040 |
2041 // If we aren't an inline flow, and our layer bounds do intersect the damage
rect, then we | 2041 // If we aren't an inline flow, and our layer bounds do intersect the damage
rect, then we |
2042 // can go ahead and return true. | 2042 // can go ahead and return true. |
2043 LayoutView* view = layoutObject()->view(); | 2043 LayoutView* view = layoutObject()->view(); |
2044 ASSERT(view); | 2044 ASSERT(view); |
2045 if (view && !layoutObject()->isLayoutInline()) { | 2045 if (view && !layoutObject()->isLayoutInline()) { |
2046 if (layerBounds.intersects(damageRect)) | 2046 if (layerBounds.intersects(damageRect)) |
2047 return true; | 2047 return true; |
2048 } | 2048 } |
2049 | 2049 |
2050 // Otherwise we need to compute the bounding box of this single layer and se
e if it intersects | 2050 // Otherwise we need to compute the bounding box of this single layer and se
e if it intersects |
2051 // the damage rect. | 2051 // the damage rect. |
2052 return physicalBoundingBox(rootLayer, offsetFromRoot).intersects(damageRect)
; | 2052 return physicalBoundingBox(offsetFromRoot).intersects(damageRect); |
2053 } | 2053 } |
2054 | 2054 |
2055 LayoutRect DeprecatedPaintLayer::logicalBoundingBox() const | 2055 LayoutRect DeprecatedPaintLayer::logicalBoundingBox() const |
2056 { | 2056 { |
2057 // There are three special cases we need to consider. | 2057 // There are three special cases we need to consider. |
2058 // (1) Inline Flows. For inline flows we will create a bounding box that fu
lly encompasses all of the lines occupied by the | 2058 // (1) Inline Flows. For inline flows we will create a bounding box that fu
lly encompasses all of the lines occupied by the |
2059 // inline. In other words, if some <span> wraps to three lines, we'll creat
e a bounding box that fully encloses the | 2059 // inline. In other words, if some <span> wraps to three lines, we'll creat
e a bounding box that fully encloses the |
2060 // line boxes of all three lines (including overflow on those lines). | 2060 // line boxes of all three lines (including overflow on those lines). |
2061 // (2) Left/Top Overflow. The width/height of layers already includes right
/bottom overflow. However, in the case of left/top | 2061 // (2) Left/Top Overflow. The width/height of layers already includes right
/bottom overflow. However, in the case of left/top |
2062 // overflow, we have to create a bounding box that will extend to include th
is overflow. | 2062 // overflow, we have to create a bounding box that will extend to include th
is overflow. |
(...skipping 28 matching lines...) Expand all Loading... |
2091 static inline LayoutRect flippedLogicalBoundingBox(LayoutRect boundingBox, Layou
tObject* layoutObjects) | 2091 static inline LayoutRect flippedLogicalBoundingBox(LayoutRect boundingBox, Layou
tObject* layoutObjects) |
2092 { | 2092 { |
2093 LayoutRect result = boundingBox; | 2093 LayoutRect result = boundingBox; |
2094 if (layoutObjects->isBox()) | 2094 if (layoutObjects->isBox()) |
2095 toLayoutBox(layoutObjects)->flipForWritingMode(result); | 2095 toLayoutBox(layoutObjects)->flipForWritingMode(result); |
2096 else | 2096 else |
2097 layoutObjects->containingBlock()->flipForWritingMode(result); | 2097 layoutObjects->containingBlock()->flipForWritingMode(result); |
2098 return result; | 2098 return result; |
2099 } | 2099 } |
2100 | 2100 |
2101 LayoutRect DeprecatedPaintLayer::physicalBoundingBox(const DeprecatedPaintLayer*
ancestorLayer, const LayoutPoint* offsetFromRoot) const | 2101 LayoutRect DeprecatedPaintLayer::physicalBoundingBox(const DeprecatedPaintLayer*
ancestorLayer) const |
| 2102 { |
| 2103 LayoutPoint offsetFromRoot; |
| 2104 convertToLayerCoords(ancestorLayer, offsetFromRoot); |
| 2105 return physicalBoundingBox(offsetFromRoot); |
| 2106 } |
| 2107 |
| 2108 LayoutRect DeprecatedPaintLayer::physicalBoundingBox(const LayoutPoint& offsetFr
omRoot) const |
2102 { | 2109 { |
2103 LayoutRect result = flippedLogicalBoundingBox(logicalBoundingBox(), layoutOb
ject()); | 2110 LayoutRect result = flippedLogicalBoundingBox(logicalBoundingBox(), layoutOb
ject()); |
2104 if (offsetFromRoot) | 2111 result.moveBy(offsetFromRoot); |
2105 result.moveBy(*offsetFromRoot); | |
2106 else | |
2107 convertToLayerCoords(ancestorLayer, result); | |
2108 return result; | 2112 return result; |
2109 } | 2113 } |
2110 | 2114 |
2111 LayoutRect DeprecatedPaintLayer::fragmentsBoundingBox(const DeprecatedPaintLayer
* ancestorLayer) const | 2115 LayoutRect DeprecatedPaintLayer::fragmentsBoundingBox(const DeprecatedPaintLayer
* ancestorLayer) const |
2112 { | 2116 { |
2113 if (!enclosingPaginationLayer()) | 2117 if (!enclosingPaginationLayer()) |
2114 return physicalBoundingBox(ancestorLayer); | 2118 return physicalBoundingBox(ancestorLayer); |
2115 | 2119 |
2116 LayoutRect result = flippedLogicalBoundingBox(logicalBoundingBox(), layoutOb
ject()); | 2120 LayoutRect result = flippedLogicalBoundingBox(logicalBoundingBox(), layoutOb
ject()); |
2117 convertFromFlowThreadToVisualBoundingBoxInAncestor(this, ancestorLayer, resu
lt); | 2121 convertFromFlowThreadToVisualBoundingBoxInAncestor(this, ancestorLayer, resu
lt); |
(...skipping 24 matching lines...) Expand all Loading... |
2142 // because those Layers don't paint into the graphics layer | 2146 // because those Layers don't paint into the graphics layer |
2143 // for this Layer. For example, the bounds of squashed Layers | 2147 // for this Layer. For example, the bounds of squashed Layers |
2144 // will be included in the computation of the appropriate squashing | 2148 // will be included in the computation of the appropriate squashing |
2145 // GraphicsLayer. | 2149 // GraphicsLayer. |
2146 if (node->layer()->compositingState() != NotComposited) | 2150 if (node->layer()->compositingState() != NotComposited) |
2147 continue; | 2151 continue; |
2148 result.unite(node->layer()->boundingBoxForCompositing(ancestorLayer)); | 2152 result.unite(node->layer()->boundingBoxForCompositing(ancestorLayer)); |
2149 } | 2153 } |
2150 } | 2154 } |
2151 | 2155 |
2152 LayoutRect DeprecatedPaintLayer::physicalBoundingBoxIncludingReflectionAndStacki
ngChildren(const DeprecatedPaintLayer* ancestorLayer, const LayoutPoint& offsetF
romRoot) const | 2156 LayoutRect DeprecatedPaintLayer::physicalBoundingBoxIncludingReflectionAndStacki
ngChildren(const LayoutPoint& offsetFromRoot) const |
2153 { | 2157 { |
2154 LayoutPoint origin; | 2158 LayoutRect result = physicalBoundingBox(LayoutPoint()); |
2155 LayoutRect result = physicalBoundingBox(ancestorLayer, &origin); | |
2156 | 2159 |
2157 const_cast<DeprecatedPaintLayer*>(this)->stackingNode()->updateLayerListsIfN
eeded(); | 2160 const_cast<DeprecatedPaintLayer*>(this)->stackingNode()->updateLayerListsIfN
eeded(); |
2158 | 2161 |
2159 expandRectForReflectionAndStackingChildren(this, result); | 2162 expandRectForReflectionAndStackingChildren(this, result); |
2160 | 2163 |
2161 result.moveBy(offsetFromRoot); | 2164 result.moveBy(offsetFromRoot); |
2162 return result; | 2165 return result; |
2163 } | 2166 } |
2164 | 2167 |
2165 LayoutRect DeprecatedPaintLayer::boundingBoxForCompositing(const DeprecatedPaint
Layer* ancestorLayer, CalculateBoundsOptions options) const | 2168 LayoutRect DeprecatedPaintLayer::boundingBoxForCompositing(const DeprecatedPaint
Layer* ancestorLayer, CalculateBoundsOptions options) const |
(...skipping 14 matching lines...) Expand all Loading... |
2180 | 2183 |
2181 // The layer created for the LayoutFlowThread is just a helper for painting
and hit-testing, | 2184 // The layer created for the LayoutFlowThread is just a helper for painting
and hit-testing, |
2182 // and should not contribute to the bounding box. The LayoutMultiColumnSets
will contribute | 2185 // and should not contribute to the bounding box. The LayoutMultiColumnSets
will contribute |
2183 // the correct size for the layout content of the multicol container. | 2186 // the correct size for the layout content of the multicol container. |
2184 if (layoutObject()->isLayoutFlowThread()) | 2187 if (layoutObject()->isLayoutFlowThread()) |
2185 return LayoutRect(); | 2188 return LayoutRect(); |
2186 | 2189 |
2187 LayoutRect result = clipper().localClipRect(); | 2190 LayoutRect result = clipper().localClipRect(); |
2188 // TODO(chrishtr): avoid converting to IntRect and back. | 2191 // TODO(chrishtr): avoid converting to IntRect and back. |
2189 if (result == LayoutRect(LayoutRect::infiniteIntRect())) { | 2192 if (result == LayoutRect(LayoutRect::infiniteIntRect())) { |
2190 LayoutPoint origin; | 2193 result = physicalBoundingBox(LayoutPoint()); |
2191 result = physicalBoundingBox(ancestorLayer, &origin); | |
2192 | 2194 |
2193 const_cast<DeprecatedPaintLayer*>(this)->stackingNode()->updateLayerList
sIfNeeded(); | 2195 const_cast<DeprecatedPaintLayer*>(this)->stackingNode()->updateLayerList
sIfNeeded(); |
2194 | 2196 |
2195 // Reflections are implemented with Layers that hang off of the reflecte
d layer. However, | 2197 // Reflections are implemented with Layers that hang off of the reflecte
d layer. However, |
2196 // the reflection layer subtree does not include the subtree of the pare
nt Layer, so | 2198 // the reflection layer subtree does not include the subtree of the pare
nt Layer, so |
2197 // a recursive computation of stacking children yields no results. This
breaks cases when there are stacking | 2199 // a recursive computation of stacking children yields no results. This
breaks cases when there are stacking |
2198 // children of the parent, that need to be included in reflected composi
ted bounds. | 2200 // children of the parent, that need to be included in reflected composi
ted bounds. |
2199 // Fix this by including composited bounds of stacking children of the r
eflected Layer. | 2201 // Fix this by including composited bounds of stacking children of the r
eflected Layer. |
2200 if (hasCompositedDeprecatedPaintLayerMapping() && parent() && parent()->
reflectionInfo() && parent()->reflectionInfo()->reflectionLayer() == this) | 2202 if (hasCompositedDeprecatedPaintLayerMapping() && parent() && parent()->
reflectionInfo() && parent()->reflectionInfo()->reflectionLayer() == this) |
2201 expandRectForReflectionAndStackingChildren(parent(), result); | 2203 expandRectForReflectionAndStackingChildren(parent(), result); |
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2740 | 2742 |
2741 void showLayerTree(const blink::LayoutObject* layoutObject) | 2743 void showLayerTree(const blink::LayoutObject* layoutObject) |
2742 { | 2744 { |
2743 if (!layoutObject) { | 2745 if (!layoutObject) { |
2744 fprintf(stderr, "Cannot showLayerTree. Root is (nil)\n"); | 2746 fprintf(stderr, "Cannot showLayerTree. Root is (nil)\n"); |
2745 return; | 2747 return; |
2746 } | 2748 } |
2747 showLayerTree(layoutObject->enclosingLayer()); | 2749 showLayerTree(layoutObject->enclosingLayer()); |
2748 } | 2750 } |
2749 #endif | 2751 #endif |
OLD | NEW |