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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 #include "core/paint/PaintLayer.h" | 51 #include "core/paint/PaintLayer.h" |
52 #include "wtf/PtrUtil.h" | 52 #include "wtf/PtrUtil.h" |
53 #include <memory> | 53 #include <memory> |
54 | 54 |
55 namespace blink { | 55 namespace blink { |
56 | 56 |
57 bool LayoutBlockFlow::s_canPropagateFloatIntoSibling = false; | 57 bool LayoutBlockFlow::s_canPropagateFloatIntoSibling = false; |
58 | 58 |
59 struct SameSizeAsLayoutBlockFlow : public LayoutBlock { | 59 struct SameSizeAsLayoutBlockFlow : public LayoutBlock { |
60 LineBoxList lineBoxes; | 60 LineBoxList lineBoxes; |
61 LayoutUnit m_paintInvalidationLogicalTopAndBottom[2]; | |
62 void* pointers[2]; | 61 void* pointers[2]; |
63 }; | 62 }; |
64 | 63 |
65 static_assert(sizeof(LayoutBlockFlow) == sizeof(SameSizeAsLayoutBlockFlow), "Lay
outBlockFlow should stay small"); | 64 static_assert(sizeof(LayoutBlockFlow) == sizeof(SameSizeAsLayoutBlockFlow), "Lay
outBlockFlow should stay small"); |
66 | 65 |
67 struct SameSizeAsMarginInfo { | 66 struct SameSizeAsMarginInfo { |
68 uint16_t bitfields; | 67 uint16_t bitfields; |
69 LayoutUnit margins[2]; | 68 LayoutUnit margins[2]; |
70 }; | 69 }; |
71 | 70 |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 done = layoutBlockFlow(relayoutChildren, pageLogicalHeight, layoutScope)
; | 389 done = layoutBlockFlow(relayoutChildren, pageLogicalHeight, layoutScope)
; |
391 | 390 |
392 LayoutView* layoutView = view(); | 391 LayoutView* layoutView = view(); |
393 if (layoutView->layoutState()->pageLogicalHeight()) | 392 if (layoutView->layoutState()->pageLogicalHeight()) |
394 setPageLogicalOffset(layoutView->layoutState()->pageLogicalOffset(*this,
logicalTop())); | 393 setPageLogicalOffset(layoutView->layoutState()->pageLogicalOffset(*this,
logicalTop())); |
395 | 394 |
396 updateLayerTransformAfterLayout(); | 395 updateLayerTransformAfterLayout(); |
397 | 396 |
398 updateAfterLayout(); | 397 updateAfterLayout(); |
399 | 398 |
400 if (m_paintInvalidationLogicalTop != m_paintInvalidationLogicalBottom) { | |
401 bool hasVisibleContent = style()->visibility() == VISIBLE; | |
402 if (!hasVisibleContent) { | |
403 PaintLayer* layer = enclosingLayer(); | |
404 layer->updateDescendantDependentFlags(); | |
405 hasVisibleContent = layer->hasVisibleContent(); | |
406 } | |
407 if (hasVisibleContent) | |
408 setShouldInvalidateOverflowForPaint(); | |
409 } | |
410 | |
411 if (isHTMLDialogElement(node()) && isOutOfFlowPositioned()) | 399 if (isHTMLDialogElement(node()) && isOutOfFlowPositioned()) |
412 positionDialog(); | 400 positionDialog(); |
413 | 401 |
414 clearNeedsLayout(); | 402 clearNeedsLayout(); |
415 m_isSelfCollapsing = checkIfIsSelfCollapsingBlock(); | 403 m_isSelfCollapsing = checkIfIsSelfCollapsingBlock(); |
416 } | 404 } |
417 | 405 |
418 inline bool LayoutBlockFlow::layoutBlockFlow(bool relayoutChildren, LayoutUnit &
pageLogicalHeight, SubtreeLayoutScope& layoutScope) | 406 inline bool LayoutBlockFlow::layoutBlockFlow(bool relayoutChildren, LayoutUnit &
pageLogicalHeight, SubtreeLayoutScope& layoutScope) |
419 { | 407 { |
420 LayoutUnit oldLeft = logicalLeft(); | 408 LayoutUnit oldLeft = logicalLeft(); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 // [1] https://drafts.csswg.org/css-break/#possible-breaks | 448 // [1] https://drafts.csswg.org/css-break/#possible-breaks |
461 setBreakBefore(LayoutBlock::breakBefore()); | 449 setBreakBefore(LayoutBlock::breakBefore()); |
462 setBreakAfter(LayoutBlock::breakAfter()); | 450 setBreakAfter(LayoutBlock::breakAfter()); |
463 } | 451 } |
464 | 452 |
465 LayoutUnit beforeEdge = borderBefore() + paddingBefore(); | 453 LayoutUnit beforeEdge = borderBefore() + paddingBefore(); |
466 LayoutUnit afterEdge = borderAfter() + paddingAfter() + scrollbarLogicalHeig
ht(); | 454 LayoutUnit afterEdge = borderAfter() + paddingAfter() + scrollbarLogicalHeig
ht(); |
467 LayoutUnit previousHeight = logicalHeight(); | 455 LayoutUnit previousHeight = logicalHeight(); |
468 setLogicalHeight(beforeEdge); | 456 setLogicalHeight(beforeEdge); |
469 | 457 |
470 m_paintInvalidationLogicalTop = LayoutUnit(); | |
471 m_paintInvalidationLogicalBottom = LayoutUnit(); | |
472 if (!firstChild() && !isAnonymousBlock()) | 458 if (!firstChild() && !isAnonymousBlock()) |
473 setChildrenInline(true); | 459 setChildrenInline(true); |
474 | 460 |
475 TextAutosizer::LayoutScope textAutosizerLayoutScope(this, &layoutScope); | 461 TextAutosizer::LayoutScope textAutosizerLayoutScope(this, &layoutScope); |
476 | 462 |
477 bool preferredLogicalWidthsWereDirty = preferredLogicalWidthsDirty(); | 463 bool preferredLogicalWidthsWereDirty = preferredLogicalWidthsDirty(); |
478 | 464 |
479 // Reset the flag here instead of in layoutInlineChildren() in case that | 465 // Reset the flag here instead of in layoutInlineChildren() in case that |
480 // all inline children are removed from this block. | 466 // all inline children are removed from this block. |
481 setContainsInlineWithOutlineAndContinuation(false); | 467 setContainsInlineWithOutlineAndContinuation(false); |
482 if (childrenInline()) | 468 if (childrenInline()) |
483 layoutInlineChildren(relayoutChildren, m_paintInvalidationLogicalTop, m_
paintInvalidationLogicalBottom, afterEdge); | 469 layoutInlineChildren(relayoutChildren, afterEdge); |
484 else | 470 else |
485 layoutBlockChildren(relayoutChildren, layoutScope, beforeEdge, afterEdge
); | 471 layoutBlockChildren(relayoutChildren, layoutScope, beforeEdge, afterEdge
); |
486 | 472 |
487 bool preferredLogicalWidthsBecameDirty = !preferredLogicalWidthsWereDirty &&
preferredLogicalWidthsDirty(); | 473 bool preferredLogicalWidthsBecameDirty = !preferredLogicalWidthsWereDirty &&
preferredLogicalWidthsDirty(); |
488 if (preferredLogicalWidthsBecameDirty) | 474 if (preferredLogicalWidthsBecameDirty) |
489 return false; | 475 return false; |
490 | 476 |
491 // Expand our intrinsic height to encompass floats. | 477 // Expand our intrinsic height to encompass floats. |
492 if (lowestFloatLogicalBottom() > (logicalHeight() - afterEdge) && createsNew
FormattingContext()) | 478 if (lowestFloatLogicalBottom() > (logicalHeight() - afterEdge) && createsNew
FormattingContext()) |
493 setLogicalHeight(lowestFloatLogicalBottom() + afterEdge); | 479 setLogicalHeight(lowestFloatLogicalBottom() + afterEdge); |
(...skipping 2288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2782 && !floatingObject.layoutObject()->hasSelfPaintingLayer() | 2768 && !floatingObject.layoutObject()->hasSelfPaintingLayer() |
2783 && (floatingObject.shouldPaint() || (paintAllDescendants && floating
Object.layoutObject()->isDescendantOf(this)))) { | 2769 && (floatingObject.shouldPaint() || (paintAllDescendants && floating
Object.layoutObject()->isDescendantOf(this)))) { |
2784 | 2770 |
2785 LayoutBox* floatingLayoutBox = floatingObject.layoutObject(); | 2771 LayoutBox* floatingLayoutBox = floatingObject.layoutObject(); |
2786 floatingLayoutBox->setShouldDoFullPaintInvalidation(); | 2772 floatingLayoutBox->setShouldDoFullPaintInvalidation(); |
2787 floatingLayoutBox->invalidatePaintForOverhangingFloats(false); | 2773 floatingLayoutBox->invalidatePaintForOverhangingFloats(false); |
2788 } | 2774 } |
2789 } | 2775 } |
2790 } | 2776 } |
2791 | 2777 |
2792 void LayoutBlockFlow::invalidatePaintForOverflow() | |
2793 { | |
2794 // FIXME: We could tighten up the left and right invalidation points if we l
et layoutInlineChildren fill them in based off the particular lines | |
2795 // it had to lay out. We wouldn't need the hasOverflowClip() hack in that ca
se either. | |
2796 LayoutUnit paintInvalidationLogicalLeft = logicalLeftVisualOverflow(); | |
2797 LayoutUnit paintInvalidationLogicalRight = logicalRightVisualOverflow(); | |
2798 if (hasOverflowClip()) { | |
2799 // 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. | |
2800 // 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. | |
2801 // layoutInlineChildren should be patched to compute the entire paint in
validation rect. | |
2802 paintInvalidationLogicalLeft = std::min(paintInvalidationLogicalLeft, lo
gicalLeftLayoutOverflow()); | |
2803 paintInvalidationLogicalRight = std::max(paintInvalidationLogicalRight,
logicalRightLayoutOverflow()); | |
2804 } | |
2805 | |
2806 LayoutRect paintInvalidationRect; | |
2807 if (isHorizontalWritingMode()) | |
2808 paintInvalidationRect = LayoutRect(paintInvalidationLogicalLeft, m_paint
InvalidationLogicalTop, paintInvalidationLogicalRight - paintInvalidationLogical
Left, m_paintInvalidationLogicalBottom - m_paintInvalidationLogicalTop); | |
2809 else | |
2810 paintInvalidationRect = LayoutRect(m_paintInvalidationLogicalTop, paintI
nvalidationLogicalLeft, m_paintInvalidationLogicalBottom - m_paintInvalidationLo
gicalTop, paintInvalidationLogicalRight - paintInvalidationLogicalLeft); | |
2811 | |
2812 if (hasOverflowClip()) { | |
2813 // Adjust the paint invalidation rect for scroll offset | |
2814 paintInvalidationRect.move(-scrolledContentOffset()); | |
2815 | |
2816 // Don't allow this rect to spill out of our overflow box. | |
2817 paintInvalidationRect.intersect(LayoutRect(LayoutPoint(), size())); | |
2818 } | |
2819 | |
2820 // Make sure the rect is still non-empty after intersecting for overflow abo
ve | |
2821 if (!paintInvalidationRect.isEmpty()) { | |
2822 // Hits in media/event-attributes.html | |
2823 DisableCompositingQueryAsserts disabler; | |
2824 | |
2825 invalidatePaintRectangle(paintInvalidationRect); // We need to do a part
ial paint invalidation of our content. | |
2826 if (hasReflection()) | |
2827 invalidatePaintRectangle(reflectedRect(paintInvalidationRect)); | |
2828 } | |
2829 | |
2830 m_paintInvalidationLogicalTop = LayoutUnit(); | |
2831 m_paintInvalidationLogicalBottom = LayoutUnit(); | |
2832 } | |
2833 | |
2834 void LayoutBlockFlow::invalidateDisplayItemClients(PaintInvalidationReason inval
idationReason) const | 2778 void LayoutBlockFlow::invalidateDisplayItemClients(PaintInvalidationReason inval
idationReason) const |
2835 { | 2779 { |
2836 LayoutBlock::invalidateDisplayItemClients(invalidationReason); | 2780 LayoutBlock::invalidateDisplayItemClients(invalidationReason); |
2837 | 2781 |
2838 // If the block is a continuation or containing block of an inline continuat
ion, invalidate the | 2782 // If the block is a continuation or containing block of an inline continuat
ion, invalidate the |
2839 // start object of the continuations if it has focus ring because change of
continuation may change | 2783 // start object of the continuations if it has focus ring because change of
continuation may change |
2840 // the shape of the focus ring. | 2784 // the shape of the focus ring. |
2841 if (!isAnonymous()) | 2785 if (!isAnonymous()) |
2842 return; | 2786 return; |
2843 | 2787 |
(...skipping 987 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3831 if (!rect.isEmpty()) | 3775 if (!rect.isEmpty()) |
3832 rects.append(rect); | 3776 rects.append(rect); |
3833 } | 3777 } |
3834 } | 3778 } |
3835 | 3779 |
3836 if (inlineElementContinuation) | 3780 if (inlineElementContinuation) |
3837 inlineElementContinuation->addOutlineRects(rects, additionalOffset + (in
lineElementContinuation->containingBlock()->location() - location()), includeBlo
ckOverflows); | 3781 inlineElementContinuation->addOutlineRects(rects, additionalOffset + (in
lineElementContinuation->containingBlock()->location() - location()), includeBlo
ckOverflows); |
3838 } | 3782 } |
3839 | 3783 |
3840 } // namespace blink | 3784 } // namespace blink |
OLD | NEW |