| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google 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 are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 RenderView* renderView = view(); | 362 RenderView* renderView = view(); |
| 363 if (renderView->layoutState()->pageLogicalHeight()) | 363 if (renderView->layoutState()->pageLogicalHeight()) |
| 364 setPageLogicalOffset(renderView->layoutState()->pageLogicalOffset(*this,
logicalTop())); | 364 setPageLogicalOffset(renderView->layoutState()->pageLogicalOffset(*this,
logicalTop())); |
| 365 | 365 |
| 366 updateLayerTransformAfterLayout(); | 366 updateLayerTransformAfterLayout(); |
| 367 | 367 |
| 368 // Update our scroll information if we're overflow:auto/scroll/hidden now th
at we know if | 368 // Update our scroll information if we're overflow:auto/scroll/hidden now th
at we know if |
| 369 // we overflow or not. | 369 // we overflow or not. |
| 370 updateScrollInfoAfterLayout(); | 370 updateScrollInfoAfterLayout(); |
| 371 | 371 |
| 372 if (m_repaintLogicalTop != m_repaintLogicalBottom) { | 372 if (m_paintInvalidationLogicalTop != m_paintInvalidationLogicalBottom) { |
| 373 bool hasVisibleContent = style()->visibility() == VISIBLE; | 373 bool hasVisibleContent = style()->visibility() == VISIBLE; |
| 374 if (!hasVisibleContent) { | 374 if (!hasVisibleContent) { |
| 375 RenderLayer* layer = enclosingLayer(); | 375 RenderLayer* layer = enclosingLayer(); |
| 376 layer->updateDescendantDependentFlags(); | 376 layer->updateDescendantDependentFlags(); |
| 377 hasVisibleContent = layer->hasVisibleContent(); | 377 hasVisibleContent = layer->hasVisibleContent(); |
| 378 } | 378 } |
| 379 if (hasVisibleContent) | 379 if (hasVisibleContent) |
| 380 setShouldInvalidateOverflowForPaint(true); | 380 setShouldInvalidateOverflowForPaint(true); |
| 381 } | 381 } |
| 382 | 382 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 414 setHasMarginBeforeQuirk(style()->hasMarginBeforeQuirk()); | 414 setHasMarginBeforeQuirk(style()->hasMarginBeforeQuirk()); |
| 415 setHasMarginAfterQuirk(style()->hasMarginAfterQuirk()); | 415 setHasMarginAfterQuirk(style()->hasMarginAfterQuirk()); |
| 416 setPaginationStrut(0); | 416 setPaginationStrut(0); |
| 417 } | 417 } |
| 418 | 418 |
| 419 LayoutUnit beforeEdge = borderBefore() + paddingBefore(); | 419 LayoutUnit beforeEdge = borderBefore() + paddingBefore(); |
| 420 LayoutUnit afterEdge = borderAfter() + paddingAfter() + scrollbarLogicalHeig
ht(); | 420 LayoutUnit afterEdge = borderAfter() + paddingAfter() + scrollbarLogicalHeig
ht(); |
| 421 LayoutUnit previousHeight = logicalHeight(); | 421 LayoutUnit previousHeight = logicalHeight(); |
| 422 setLogicalHeight(beforeEdge); | 422 setLogicalHeight(beforeEdge); |
| 423 | 423 |
| 424 m_repaintLogicalTop = 0; | 424 m_paintInvalidationLogicalTop = 0; |
| 425 m_repaintLogicalBottom = 0; | 425 m_paintInvalidationLogicalBottom = 0; |
| 426 if (!firstChild() && !isAnonymousBlock()) | 426 if (!firstChild() && !isAnonymousBlock()) |
| 427 setChildrenInline(true); | 427 setChildrenInline(true); |
| 428 | 428 |
| 429 TextAutosizer::LayoutScope textAutosizerLayoutScope(this); | 429 TextAutosizer::LayoutScope textAutosizerLayoutScope(this); |
| 430 | 430 |
| 431 if (childrenInline()) | 431 if (childrenInline()) |
| 432 layoutInlineChildren(relayoutChildren, m_repaintLogicalTop, m_repaintLog
icalBottom, afterEdge); | 432 layoutInlineChildren(relayoutChildren, m_paintInvalidationLogicalTop, m_
paintInvalidationLogicalBottom, afterEdge); |
| 433 else | 433 else |
| 434 layoutBlockChildren(relayoutChildren, layoutScope, beforeEdge, afterEdge
); | 434 layoutBlockChildren(relayoutChildren, layoutScope, beforeEdge, afterEdge
); |
| 435 | 435 |
| 436 // Expand our intrinsic height to encompass floats. | 436 // Expand our intrinsic height to encompass floats. |
| 437 if (lowestFloatLogicalBottom() > (logicalHeight() - afterEdge) && createsBlo
ckFormattingContext()) | 437 if (lowestFloatLogicalBottom() > (logicalHeight() - afterEdge) && createsBlo
ckFormattingContext()) |
| 438 setLogicalHeight(lowestFloatLogicalBottom() + afterEdge); | 438 setLogicalHeight(lowestFloatLogicalBottom() + afterEdge); |
| 439 | 439 |
| 440 if (RenderMultiColumnFlowThread* flowThread = multiColumnFlowThread()) { | 440 if (RenderMultiColumnFlowThread* flowThread = multiColumnFlowThread()) { |
| 441 if (flowThread->recalculateColumnHeights()) { | 441 if (flowThread->recalculateColumnHeights()) { |
| 442 setChildNeedsLayout(MarkOnlyThis); | 442 setChildNeedsLayout(MarkOnlyThis); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 541 | 541 |
| 542 // The child is a normal flow object. Compute the margins we will use for co
llapsing now. | 542 // The child is a normal flow object. Compute the margins we will use for co
llapsing now. |
| 543 child->computeAndSetBlockDirectionMargins(this); | 543 child->computeAndSetBlockDirectionMargins(this); |
| 544 | 544 |
| 545 // Try to guess our correct logical top position. In most cases this guess w
ill | 545 // Try to guess our correct logical top position. In most cases this guess w
ill |
| 546 // be correct. Only if we're wrong (when we compute the real logical top pos
ition) | 546 // be correct. Only if we're wrong (when we compute the real logical top pos
ition) |
| 547 // will we have to potentially relayout. | 547 // will we have to potentially relayout. |
| 548 LayoutUnit estimateWithoutPagination; | 548 LayoutUnit estimateWithoutPagination; |
| 549 LayoutUnit logicalTopEstimate = estimateLogicalTopPosition(child, marginInfo
, estimateWithoutPagination); | 549 LayoutUnit logicalTopEstimate = estimateLogicalTopPosition(child, marginInfo
, estimateWithoutPagination); |
| 550 | 550 |
| 551 // Cache our old rect so that we can dirty the proper repaint rects if the c
hild moves. | 551 // Cache our old rect so that we can dirty the proper paint invalidation rec
ts if the child moves. |
| 552 LayoutRect oldRect = child->frameRect(); | 552 LayoutRect oldRect = child->frameRect(); |
| 553 LayoutUnit oldLogicalTop = logicalTopForChild(child); | 553 LayoutUnit oldLogicalTop = logicalTopForChild(child); |
| 554 | 554 |
| 555 // Go ahead and position the child as though it didn't collapse with the top
. | 555 // Go ahead and position the child as though it didn't collapse with the top
. |
| 556 setLogicalTopForChild(child, logicalTopEstimate); | 556 setLogicalTopForChild(child, logicalTopEstimate); |
| 557 | 557 |
| 558 RenderBlockFlow* childRenderBlockFlow = child->isRenderBlockFlow() ? toRende
rBlockFlow(child) : 0; | 558 RenderBlockFlow* childRenderBlockFlow = child->isRenderBlockFlow() ? toRende
rBlockFlow(child) : 0; |
| 559 bool markDescendantsWithFloats = false; | 559 bool markDescendantsWithFloats = false; |
| 560 if (logicalTopEstimate != oldLogicalTop && childRenderBlockFlow && !childRen
derBlockFlow->avoidsFloats() && childRenderBlockFlow->containsFloats()) { | 560 if (logicalTopEstimate != oldLogicalTop && childRenderBlockFlow && !childRen
derBlockFlow->avoidsFloats() && childRenderBlockFlow->containsFloats()) { |
| 561 markDescendantsWithFloats = true; | 561 markDescendantsWithFloats = true; |
| (...skipping 1479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2041 continue; | 2041 continue; |
| 2042 | 2042 |
| 2043 toBlockFlow->m_floatingObjects->add(floatingObject->unsafeClone()); | 2043 toBlockFlow->m_floatingObjects->add(floatingObject->unsafeClone()); |
| 2044 } | 2044 } |
| 2045 } | 2045 } |
| 2046 | 2046 |
| 2047 } | 2047 } |
| 2048 | 2048 |
| 2049 void RenderBlockFlow::invalidatePaintForOverhangingFloats(bool paintAllDescendan
ts) | 2049 void RenderBlockFlow::invalidatePaintForOverhangingFloats(bool paintAllDescendan
ts) |
| 2050 { | 2050 { |
| 2051 // Repaint any overhanging floats (if we know we're the one to paint them). | 2051 // Invalidate paint of any overhanging floats (if we know we're the one to p
aint them). |
| 2052 // Otherwise, bail out. | 2052 // Otherwise, bail out. |
| 2053 if (!hasOverhangingFloats()) | 2053 if (!hasOverhangingFloats()) |
| 2054 return; | 2054 return; |
| 2055 | 2055 |
| 2056 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); | 2056 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); |
| 2057 FloatingObjectSetIterator end = floatingObjectSet.end(); | 2057 FloatingObjectSetIterator end = floatingObjectSet.end(); |
| 2058 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++
it) { | 2058 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++
it) { |
| 2059 FloatingObject* floatingObject = it->get(); | 2059 FloatingObject* floatingObject = it->get(); |
| 2060 // Only repaint the object if it is overhanging, is not in its own layer
, and | 2060 // Only issue paint invaldiations for the object if it is overhanging, i
s not in its own layer, and |
| 2061 // is our responsibility to paint (m_shouldPaint is set). When paintAllD
escendants is true, the latter | 2061 // is our responsibility to paint (m_shouldPaint is set). When paintAllD
escendants is true, the latter |
| 2062 // condition is replaced with being a descendant of us. | 2062 // condition is replaced with being a descendant of us. |
| 2063 if (logicalBottomForFloat(floatingObject) > logicalHeight() | 2063 if (logicalBottomForFloat(floatingObject) > logicalHeight() |
| 2064 && !floatingObject->renderer()->hasSelfPaintingLayer() | 2064 && !floatingObject->renderer()->hasSelfPaintingLayer() |
| 2065 && (floatingObject->shouldPaint() || (paintAllDescendants && floatin
gObject->renderer()->isDescendantOf(this)))) { | 2065 && (floatingObject->shouldPaint() || (paintAllDescendants && floatin
gObject->renderer()->isDescendantOf(this)))) { |
| 2066 | 2066 |
| 2067 RenderBox* floatingRenderer = floatingObject->renderer(); | 2067 RenderBox* floatingRenderer = floatingObject->renderer(); |
| 2068 floatingRenderer->setShouldDoFullPaintInvalidation(true); | 2068 floatingRenderer->setShouldDoFullPaintInvalidation(true); |
| 2069 floatingRenderer->invalidatePaintForOverhangingFloats(false); | 2069 floatingRenderer->invalidatePaintForOverhangingFloats(false); |
| 2070 } | 2070 } |
| 2071 } | 2071 } |
| 2072 } | 2072 } |
| 2073 | 2073 |
| 2074 void RenderBlockFlow::invalidatePaintForOverflow() | 2074 void RenderBlockFlow::invalidatePaintForOverflow() |
| 2075 { | 2075 { |
| 2076 // FIXME: We could tighten up the left and right invalidation points if we l
et layoutInlineChildren fill them in based off the particular lines | 2076 // FIXME: We could tighten up the left and right invalidation points if we l
et layoutInlineChildren fill them in based off the particular lines |
| 2077 // it had to lay out. We wouldn't need the hasOverflowClip() hack in that ca
se either. | 2077 // it had to lay out. We wouldn't need the hasOverflowClip() hack in that ca
se either. |
| 2078 LayoutUnit repaintLogicalLeft = logicalLeftVisualOverflow(); | 2078 LayoutUnit paintInvalidationLogicalLeft = logicalLeftVisualOverflow(); |
| 2079 LayoutUnit repaintLogicalRight = logicalRightVisualOverflow(); | 2079 LayoutUnit paintInvalidationLogicalRight = logicalRightVisualOverflow(); |
| 2080 if (hasOverflowClip()) { | 2080 if (hasOverflowClip()) { |
| 2081 // If we have clipped overflow, we should use layout overflow as well, s
ince visual overflow from lines didn't propagate to our block's overflow. | 2081 // If we have clipped overflow, we should use layout overflow as well, s
ince visual overflow from lines didn't propagate to our block's overflow. |
| 2082 // Note the old code did this as well but even for overflow:visible. The
addition of hasOverflowClip() at least tightens up the hack a bit. | 2082 // Note the old code did this as well but even for overflow:visible. The
addition of hasOverflowClip() at least tightens up the hack a bit. |
| 2083 // layoutInlineChildren should be patched to compute the entire repaint
rect. | 2083 // layoutInlineChildren should be patched to compute the entire paint in
validation rect. |
| 2084 repaintLogicalLeft = std::min(repaintLogicalLeft, logicalLeftLayoutOverf
low()); | 2084 paintInvalidationLogicalLeft = std::min(paintInvalidationLogicalLeft, lo
gicalLeftLayoutOverflow()); |
| 2085 repaintLogicalRight = std::max(repaintLogicalRight, logicalRightLayoutOv
erflow()); | 2085 paintInvalidationLogicalRight = std::max(paintInvalidationLogicalRight,
logicalRightLayoutOverflow()); |
| 2086 } | 2086 } |
| 2087 | 2087 |
| 2088 LayoutRect repaintRect; | 2088 LayoutRect paintInvalidationRect; |
| 2089 if (isHorizontalWritingMode()) | 2089 if (isHorizontalWritingMode()) |
| 2090 repaintRect = LayoutRect(repaintLogicalLeft, m_repaintLogicalTop, repain
tLogicalRight - repaintLogicalLeft, m_repaintLogicalBottom - m_repaintLogicalTop
); | 2090 paintInvalidationRect = LayoutRect(paintInvalidationLogicalLeft, m_paint
InvalidationLogicalTop, paintInvalidationLogicalRight - paintInvalidationLogical
Left, m_paintInvalidationLogicalBottom - m_paintInvalidationLogicalTop); |
| 2091 else | 2091 else |
| 2092 repaintRect = LayoutRect(m_repaintLogicalTop, repaintLogicalLeft, m_repa
intLogicalBottom - m_repaintLogicalTop, repaintLogicalRight - repaintLogicalLeft
); | 2092 paintInvalidationRect = LayoutRect(m_paintInvalidationLogicalTop, paintI
nvalidationLogicalLeft, m_paintInvalidationLogicalBottom - m_paintInvalidationLo
gicalTop, paintInvalidationLogicalRight - paintInvalidationLogicalLeft); |
| 2093 | 2093 |
| 2094 // The repaint rect may be split across columns, in which case adjustRectFor
Columns() will return the union. | 2094 // The paint invalidation rect may be split across columns, in which case ad
justRectForColumns() will return the union. |
| 2095 adjustRectForColumns(repaintRect); | 2095 adjustRectForColumns(paintInvalidationRect); |
| 2096 | 2096 |
| 2097 if (hasOverflowClip()) { | 2097 if (hasOverflowClip()) { |
| 2098 // Adjust repaint rect for scroll offset | 2098 // Adjust the paint invalidation rect for scroll offset |
| 2099 repaintRect.move(-scrolledContentOffset()); | 2099 paintInvalidationRect.move(-scrolledContentOffset()); |
| 2100 | 2100 |
| 2101 // Don't allow this rect to spill out of our overflow box. | 2101 // Don't allow this rect to spill out of our overflow box. |
| 2102 repaintRect.intersect(LayoutRect(LayoutPoint(), size())); | 2102 paintInvalidationRect.intersect(LayoutRect(LayoutPoint(), size())); |
| 2103 } | 2103 } |
| 2104 | 2104 |
| 2105 // Make sure the rect is still non-empty after intersecting for overflow abo
ve | 2105 // Make sure the rect is still non-empty after intersecting for overflow abo
ve |
| 2106 if (!repaintRect.isEmpty()) { | 2106 if (!paintInvalidationRect.isEmpty()) { |
| 2107 // Hits in media/event-attributes.html | 2107 // Hits in media/event-attributes.html |
| 2108 DisableCompositingQueryAsserts disabler; | 2108 DisableCompositingQueryAsserts disabler; |
| 2109 | 2109 |
| 2110 invalidatePaintRectangle(repaintRect); // We need to do a partial repain
t of our content. | 2110 invalidatePaintRectangle(paintInvalidationRect); // We need to do a part
ial paint invalidation of our content. |
| 2111 if (hasReflection()) | 2111 if (hasReflection()) |
| 2112 invalidatePaintRectangle(reflectedRect(repaintRect)); | 2112 invalidatePaintRectangle(reflectedRect(paintInvalidationRect)); |
| 2113 } | 2113 } |
| 2114 | 2114 |
| 2115 m_repaintLogicalTop = 0; | 2115 m_paintInvalidationLogicalTop = 0; |
| 2116 m_repaintLogicalBottom = 0; | 2116 m_paintInvalidationLogicalBottom = 0; |
| 2117 } | 2117 } |
| 2118 | 2118 |
| 2119 void RenderBlockFlow::paintFloats(PaintInfo& paintInfo, const LayoutPoint& paint
Offset, bool preservePhase) | 2119 void RenderBlockFlow::paintFloats(PaintInfo& paintInfo, const LayoutPoint& paint
Offset, bool preservePhase) |
| 2120 { | 2120 { |
| 2121 if (!m_floatingObjects) | 2121 if (!m_floatingObjects) |
| 2122 return; | 2122 return; |
| 2123 | 2123 |
| 2124 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); | 2124 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); |
| 2125 FloatingObjectSetIterator end = floatingObjectSet.end(); | 2125 FloatingObjectSetIterator end = floatingObjectSet.end(); |
| 2126 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++
it) { | 2126 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++
it) { |
| (...skipping 798 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2925 RenderBlockFlow::RenderBlockFlowRareData& RenderBlockFlow::ensureRareData() | 2925 RenderBlockFlow::RenderBlockFlowRareData& RenderBlockFlow::ensureRareData() |
| 2926 { | 2926 { |
| 2927 if (m_rareData) | 2927 if (m_rareData) |
| 2928 return *m_rareData; | 2928 return *m_rareData; |
| 2929 | 2929 |
| 2930 m_rareData = adoptPtrWillBeNoop(new RenderBlockFlowRareData(this)); | 2930 m_rareData = adoptPtrWillBeNoop(new RenderBlockFlowRareData(this)); |
| 2931 return *m_rareData; | 2931 return *m_rareData; |
| 2932 } | 2932 } |
| 2933 | 2933 |
| 2934 } // namespace blink | 2934 } // namespace blink |
| OLD | NEW |