Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(288)

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp

Issue 2087513003: Remove LayoutBlockFlow overflow invalidation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: NeedsRebaseline Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutBlockFlow.h ('k') | third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698