| Index: third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp
|
| diff --git a/third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp b/third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp
|
| index 5493a27944cb97c14560ce0faae5cec51ec3e539..f813347b85cce652662f1f1a2eaadc35f60fc2a0 100644
|
| --- a/third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp
|
| +++ b/third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp
|
| @@ -30,77 +30,66 @@ void BoxPaintInvalidator::boxWillBeDestroyed(const LayoutBox& box) {
|
| previousBoxSizesMap().remove(&box);
|
| }
|
|
|
| -bool BoxPaintInvalidator::incrementallyInvalidatePaint() {
|
| - bool result = ObjectPaintInvalidatorWithContext(m_box, m_context)
|
| - .incrementallyInvalidatePaint();
|
| -
|
| - bool hasBoxDecorations = m_box.styleRef().hasBoxDecorations();
|
| - if (!m_box.styleRef().hasBackground() && !hasBoxDecorations)
|
| - return result;
|
| -
|
| - const LayoutRect& oldBounds = m_context.oldBounds;
|
| - const LayoutRect& newBounds = m_context.newBounds;
|
| -
|
| - LayoutSize oldBorderBoxSize = computePreviousBorderBoxSize(oldBounds.size());
|
| - LayoutSize newBorderBoxSize = m_box.size();
|
| +static LayoutRect computeRightDelta(const LayoutPoint& location,
|
| + const LayoutSize& oldSize,
|
| + const LayoutSize& newSize,
|
| + int extraWidth) {
|
| + LayoutUnit delta = newSize.width() - oldSize.width();
|
| + if (delta > 0) {
|
| + return LayoutRect(location.x() + oldSize.width() - extraWidth, location.y(),
|
| + delta + extraWidth, newSize.height());
|
| + }
|
| + if (delta < 0) {
|
| + return LayoutRect(location.x() + newSize.width() - extraWidth, location.y(),
|
| + -delta + extraWidth, oldSize.height());
|
| + }
|
| + return LayoutRect();
|
| +}
|
|
|
| - // If border m_box size didn't change,
|
| - // ObjectPaintInvalidatorWithContext::incrementallyInvalidatePaint() is good.
|
| - if (oldBorderBoxSize == newBorderBoxSize)
|
| - return result;
|
| -
|
| - // If size of the paint invalidation rect equals to size of border box,
|
| - // ObjectPaintInvalidatorWithContext::incrementallyInvalidatePaint()
|
| - // is good for boxes having background without box decorations.
|
| - DCHECK(
|
| - oldBounds.location() ==
|
| - newBounds.location()); // Otherwise we won't do incremental invalidation.
|
| - if (!hasBoxDecorations && m_context.newLocation == newBounds.location() &&
|
| - oldBorderBoxSize == oldBounds.size() &&
|
| - newBorderBoxSize == newBounds.size())
|
| - return result;
|
| -
|
| - // Invalidate the right delta part and the right border of the old or new
|
| - // m_box which has smaller width.
|
| - if (LayoutUnit deltaWidth =
|
| - (oldBorderBoxSize.width() - newBorderBoxSize.width()).abs()) {
|
| - LayoutUnit smallerWidth =
|
| - std::min(oldBorderBoxSize.width(), newBorderBoxSize.width());
|
| - LayoutUnit borderTopRightRadiusWidth = valueForLength(
|
| - m_box.styleRef().borderTopRightRadius().width(), smallerWidth);
|
| - LayoutUnit borderBottomRightRadiusWidth = valueForLength(
|
| - m_box.styleRef().borderBottomRightRadius().width(), smallerWidth);
|
| - LayoutUnit borderWidth = std::max(
|
| - LayoutUnit(m_box.borderRight()),
|
| - std::max(borderTopRightRadiusWidth, borderBottomRightRadiusWidth));
|
| - LayoutRect rightDeltaRect(
|
| - m_context.newLocation.x() + smallerWidth - borderWidth,
|
| - m_context.newLocation.y(), deltaWidth + borderWidth,
|
| - std::max(oldBorderBoxSize.height(), newBorderBoxSize.height()));
|
| - invalidatePaintRectClippedByOldAndNewBounds(rightDeltaRect);
|
| +static LayoutRect computeBottomDelta(const LayoutPoint& location,
|
| + const LayoutSize& oldSize,
|
| + const LayoutSize& newSize,
|
| + int extraHeight) {
|
| + LayoutUnit delta = newSize.height() - oldSize.height();
|
| + if (delta > 0) {
|
| + return LayoutRect(location.x(),
|
| + location.y() + oldSize.height() - extraHeight,
|
| + newSize.width(), delta + extraHeight);
|
| }
|
| + if (delta < 0) {
|
| + return LayoutRect(location.x(),
|
| + location.y() + newSize.height() - extraHeight,
|
| + oldSize.width(), -delta + extraHeight);
|
| + }
|
| + return LayoutRect();
|
| +}
|
|
|
| - // Invalidate the bottom delta part and the bottom border of the old or new
|
| - // m_box which has smaller height.
|
| - if (LayoutUnit deltaHeight =
|
| - (oldBorderBoxSize.height() - newBorderBoxSize.height()).abs()) {
|
| - LayoutUnit smallerHeight =
|
| - std::min(oldBorderBoxSize.height(), newBorderBoxSize.height());
|
| - LayoutUnit borderBottomLeftRadiusHeight = valueForLength(
|
| - m_box.styleRef().borderBottomLeftRadius().height(), smallerHeight);
|
| - LayoutUnit borderBottomRightRadiusHeight = valueForLength(
|
| - m_box.styleRef().borderBottomRightRadius().height(), smallerHeight);
|
| - LayoutUnit borderHeight = std::max(
|
| - LayoutUnit(m_box.borderBottom()),
|
| - std::max(borderBottomLeftRadiusHeight, borderBottomRightRadiusHeight));
|
| - LayoutRect bottomDeltaRect(
|
| - m_context.newLocation.x(),
|
| - m_context.newLocation.y() + smallerHeight - borderHeight,
|
| - std::max(oldBorderBoxSize.width(), newBorderBoxSize.width()),
|
| - deltaHeight + borderHeight);
|
| - invalidatePaintRectClippedByOldAndNewBounds(bottomDeltaRect);
|
| +bool BoxPaintInvalidator::incrementallyInvalidatePaint() {
|
| + DCHECK(m_context.oldBounds.location() == m_context.newBounds.location());
|
| + LayoutRect rightDelta = computeRightDelta(m_context.newBounds.location(),
|
| + m_context.oldBounds.size(),
|
| + m_context.newBounds.size(), 0);
|
| + LayoutRect bottomDelta = computeBottomDelta(m_context.newBounds.location(),
|
| + m_context.oldBounds.size(),
|
| + m_context.newBounds.size(), 0);
|
| +
|
| + if (m_box.styleRef().hasBorder() || m_box.styleRef().hasBackground()) {
|
| + LayoutSize oldBorderBoxSize =
|
| + computePreviousBorderBoxSize(m_context.oldBounds.size());
|
| + LayoutSize newBorderBoxSize = m_box.size();
|
| + DCHECK(m_context.oldLocation == m_context.newLocation);
|
| + rightDelta.unite(computeRightDelta(m_context.newLocation, oldBorderBoxSize,
|
| + newBorderBoxSize, m_box.borderRight()));
|
| + bottomDelta.unite(computeBottomDelta(m_context.newLocation,
|
| + oldBorderBoxSize, newBorderBoxSize,
|
| + m_box.borderBottom()));
|
| }
|
|
|
| + if (rightDelta.isEmpty() && bottomDelta.isEmpty())
|
| + return false;
|
| +
|
| + invalidatePaintRectClippedByOldAndNewBounds(rightDelta);
|
| + invalidatePaintRectClippedByOldAndNewBounds(bottomDelta);
|
| return true;
|
| }
|
|
|
| @@ -190,9 +179,6 @@ PaintInvalidationReason BoxPaintInvalidator::computePaintInvalidationReason() {
|
| }
|
|
|
| if (!style.hasBackground() && !style.hasBoxDecorations()) {
|
| - // We could let incremental invalidation cover non-composited scrollbars,
|
| - // but just do a full invalidation because incremental invalidation will go
|
| - // away with slimming paint.
|
| if (reason == PaintInvalidationIncremental &&
|
| m_context.oldBounds != m_context.newBounds &&
|
| m_box.hasNonCompositedScrollbars())
|
| @@ -221,16 +207,8 @@ PaintInvalidationReason BoxPaintInvalidator::computePaintInvalidationReason() {
|
| style.hasFilterInducingProperty() || style.resize() != RESIZE_NONE)
|
| return PaintInvalidationBorderBoxChange;
|
|
|
| - if (style.hasBorderRadius()) {
|
| - // If a border-radius exists and width/height is smaller than radius
|
| - // width/height, we need to fully invalidate to cover the changed radius.
|
| - FloatRoundedRect oldRoundedRect = style.getRoundedBorderFor(
|
| - LayoutRect(LayoutPoint(0, 0), oldBorderBoxSize));
|
| - FloatRoundedRect newRoundedRect = style.getRoundedBorderFor(
|
| - LayoutRect(LayoutPoint(0, 0), newBorderBoxSize));
|
| - if (oldRoundedRect.getRadii() != newRoundedRect.getRadii())
|
| - return PaintInvalidationBorderBoxChange;
|
| - }
|
| + if (style.hasBorderRadius())
|
| + return PaintInvalidationBorderBoxChange;
|
|
|
| if (oldBorderBoxSize.width() != newBorderBoxSize.width() &&
|
| m_box.mustInvalidateBackgroundOrBorderPaintOnWidthChange())
|
| @@ -251,9 +229,9 @@ PaintInvalidationReason BoxPaintInvalidator::invalidatePaintIfNeeded() {
|
| } else {
|
| reason = PaintInvalidationNone;
|
| }
|
| - // Though we have done our own version of incremental invalidation, we still
|
| - // need to call ObjectPaintInvalidator with PaintInvalidationNone to do any
|
| - // other required operations.
|
| + // Though we have done incremental invalidation, we still need to call
|
| + // ObjectPaintInvalidator with PaintInvalidationNone to do any other
|
| + // required operations.
|
| reason = std::max(
|
| reason,
|
| ObjectPaintInvalidatorWithContext(m_box, m_context)
|
|
|