| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) | 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) |
| 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) | 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) |
| 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. | 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. |
| 7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. | 7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. |
| 8 * | 8 * |
| 9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
| 10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 } | 141 } |
| 142 | 142 |
| 143 void RenderBox::styleWillChange(StyleDifference diff, const RenderStyle& newStyl
e) | 143 void RenderBox::styleWillChange(StyleDifference diff, const RenderStyle& newStyl
e) |
| 144 { | 144 { |
| 145 RenderStyle* oldStyle = style(); | 145 RenderStyle* oldStyle = style(); |
| 146 if (oldStyle) { | 146 if (oldStyle) { |
| 147 // The background of the root element or the body element could propagat
e up to | 147 // The background of the root element or the body element could propagat
e up to |
| 148 // the canvas. Just dirty the entire canvas when our style changes subs
tantially. | 148 // the canvas. Just dirty the entire canvas when our style changes subs
tantially. |
| 149 if ((diff.needsRepaint() || diff.needsLayout()) && node() | 149 if ((diff.needsRepaint() || diff.needsLayout()) && node() |
| 150 && (isHTMLHtmlElement(*node()) || isHTMLBodyElement(*node()))) { | 150 && (isHTMLHtmlElement(*node()) || isHTMLBodyElement(*node()))) { |
| 151 view()->repaint(); | 151 view()->paintInvalidationForWholeRenderer(); |
| 152 | 152 |
| 153 if (oldStyle->hasEntirelyFixedBackground() != newStyle.hasEntirelyFi
xedBackground()) | 153 if (oldStyle->hasEntirelyFixedBackground() != newStyle.hasEntirelyFi
xedBackground()) |
| 154 view()->compositor()->setNeedsUpdateFixedBackground(); | 154 view()->compositor()->setNeedsUpdateFixedBackground(); |
| 155 } | 155 } |
| 156 | 156 |
| 157 // When a layout hint happens and an object's position style changes, we
have to do a layout | 157 // When a layout hint happens and an object's position style changes, we
have to do a layout |
| 158 // to dirty the render tree using the old position value now. | 158 // to dirty the render tree using the old position value now. |
| 159 if (diff.needsFullLayout() && parent() && oldStyle->position() != newSty
le.position()) { | 159 if (diff.needsFullLayout() && parent() && oldStyle->position() != newSty
le.position()) { |
| 160 markContainingBlocksForLayout(); | 160 markContainingBlocksForLayout(); |
| 161 if (oldStyle->position() == StaticPosition) | 161 if (oldStyle->position() == StaticPosition) |
| 162 repaint(); | 162 paintInvalidationForWholeRenderer(); |
| 163 else if (newStyle.hasOutOfFlowPosition()) | 163 else if (newStyle.hasOutOfFlowPosition()) |
| 164 parent()->setChildNeedsLayout(); | 164 parent()->setChildNeedsLayout(); |
| 165 if (isFloating() && !isOutOfFlowPositioned() && newStyle.hasOutOfFlo
wPosition()) | 165 if (isFloating() && !isOutOfFlowPositioned() && newStyle.hasOutOfFlo
wPosition()) |
| 166 removeFloatingOrPositionedChildFromBlockLists(); | 166 removeFloatingOrPositionedChildFromBlockLists(); |
| 167 } | 167 } |
| 168 // FIXME: This branch runs when !oldStyle, which means that layout was never
called | 168 // FIXME: This branch runs when !oldStyle, which means that layout was never
called |
| 169 // so what's the point in invalidating the whole view that we never painted? | 169 // so what's the point in invalidating the whole view that we never painted? |
| 170 } else if (isBody()) | 170 } else if (isBody()) { |
| 171 view()->repaint(); | 171 view()->paintInvalidationForWholeRenderer(); |
| 172 } |
| 172 | 173 |
| 173 RenderBoxModelObject::styleWillChange(diff, newStyle); | 174 RenderBoxModelObject::styleWillChange(diff, newStyle); |
| 174 } | 175 } |
| 175 | 176 |
| 176 void RenderBox::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle
) | 177 void RenderBox::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle
) |
| 177 { | 178 { |
| 178 // Horizontal writing mode definition is updated in RenderBoxModelObject::up
dateFromStyle, | 179 // Horizontal writing mode definition is updated in RenderBoxModelObject::up
dateFromStyle, |
| 179 // (as part of the RenderBoxModelObject::styleDidChange call below). So, we
can safely cache the horizontal | 180 // (as part of the RenderBoxModelObject::styleDidChange call below). So, we
can safely cache the horizontal |
| 180 // writing mode value before style change here. | 181 // writing mode value before style change here. |
| 181 bool oldHorizontalWritingMode = isHorizontalWritingMode(); | 182 bool oldHorizontalWritingMode = isHorizontalWritingMode(); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 | 286 |
| 286 bool boxHasOverflowClip = false; | 287 bool boxHasOverflowClip = false; |
| 287 if (!styleToUse->isOverflowVisible() && isRenderBlock() && !isViewObject) { | 288 if (!styleToUse->isOverflowVisible() && isRenderBlock() && !isViewObject) { |
| 288 // If overflow has been propagated to the viewport, it has no effect her
e. | 289 // If overflow has been propagated to the viewport, it has no effect her
e. |
| 289 if (node() != document().viewportDefiningElement()) { | 290 if (node() != document().viewportDefiningElement()) { |
| 290 boxHasOverflowClip = true; | 291 boxHasOverflowClip = true; |
| 291 if (!hasOverflowClip()) { | 292 if (!hasOverflowClip()) { |
| 292 // If we are getting an overflow clip, preemptively erase any ov
erflowing content. | 293 // If we are getting an overflow clip, preemptively erase any ov
erflowing content. |
| 293 // FIXME: This should probably consult RenderOverflow. | 294 // FIXME: This should probably consult RenderOverflow. |
| 294 if (!RuntimeEnabledFeatures::repaintAfterLayoutEnabled()) | 295 if (!RuntimeEnabledFeatures::repaintAfterLayoutEnabled()) |
| 295 repaint(); | 296 paintInvalidationForWholeRenderer(); |
| 296 } | 297 } |
| 297 } | 298 } |
| 298 } | 299 } |
| 299 | 300 |
| 300 if (RuntimeEnabledFeatures::repaintAfterLayoutEnabled() && (boxHasOverflowCl
ip != hasOverflowClip())) { | 301 if (RuntimeEnabledFeatures::repaintAfterLayoutEnabled() && (boxHasOverflowCl
ip != hasOverflowClip())) { |
| 301 // FIXME: This shouldn't be required if we tracked the visual overflow | 302 // FIXME: This shouldn't be required if we tracked the visual overflow |
| 302 // generated by positioned children or self painting layers. crbug.com/3
45403 | 303 // generated by positioned children or self painting layers. crbug.com/3
45403 |
| 303 for (RenderObject* child = slowFirstChild(); child; child = child->nextS
ibling()) | 304 for (RenderObject* child = slowFirstChild(); child; child = child->nextS
ibling()) |
| 304 child->setShouldDoFullPaintInvalidationIfSelfPaintingLayer(true); | 305 child->setShouldDoFullPaintInvalidationIfSelfPaintingLayer(true); |
| 305 } | 306 } |
| (...skipping 1188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1494 | 1495 |
| 1495 void RenderBox::imageChanged(WrappedImagePtr image, const IntRect*) | 1496 void RenderBox::imageChanged(WrappedImagePtr image, const IntRect*) |
| 1496 { | 1497 { |
| 1497 if (!parent()) | 1498 if (!parent()) |
| 1498 return; | 1499 return; |
| 1499 | 1500 |
| 1500 AllowPaintInvalidationScope scoper(frameView()); | 1501 AllowPaintInvalidationScope scoper(frameView()); |
| 1501 | 1502 |
| 1502 if ((style()->borderImage().image() && style()->borderImage().image()->data(
) == image) || | 1503 if ((style()->borderImage().image() && style()->borderImage().image()->data(
) == image) || |
| 1503 (style()->maskBoxImage().image() && style()->maskBoxImage().image()->dat
a() == image)) { | 1504 (style()->maskBoxImage().image() && style()->maskBoxImage().image()->dat
a() == image)) { |
| 1504 repaint(); | 1505 paintInvalidationForWholeRenderer(); |
| 1505 return; | 1506 return; |
| 1506 } | 1507 } |
| 1507 | 1508 |
| 1508 ShapeValue* shapeOutsideValue = style()->shapeOutside(); | 1509 ShapeValue* shapeOutsideValue = style()->shapeOutside(); |
| 1509 if (!frameView()->isInPerformLayout() && isFloating() && shapeOutsideValue &
& shapeOutsideValue->image() && shapeOutsideValue->image()->data() == image) { | 1510 if (!frameView()->isInPerformLayout() && isFloating() && shapeOutsideValue &
& shapeOutsideValue->image() && shapeOutsideValue->image()->data() == image) { |
| 1510 ShapeOutsideInfo::ensureInfo(*this).markShapeAsDirty(); | 1511 ShapeOutsideInfo::ensureInfo(*this).markShapeAsDirty(); |
| 1511 markShapeOutsideDependentsForLayout(); | 1512 markShapeOutsideDependentsForLayout(); |
| 1512 } | 1513 } |
| 1513 | 1514 |
| 1514 bool didFullRepaint = repaintLayerRectsForImage(image, style()->backgroundLa
yers(), true); | 1515 bool didFullRepaint = repaintLayerRectsForImage(image, style()->backgroundLa
yers(), true); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1550 layerRenderer = this; | 1551 layerRenderer = this; |
| 1551 rendererRect = borderBoxRect(); | 1552 rendererRect = borderBoxRect(); |
| 1552 } | 1553 } |
| 1553 } | 1554 } |
| 1554 | 1555 |
| 1555 BackgroundImageGeometry geometry; | 1556 BackgroundImageGeometry geometry; |
| 1556 layerRenderer->calculateBackgroundImageGeometry(0, curLayer, rendere
rRect, geometry); | 1557 layerRenderer->calculateBackgroundImageGeometry(0, curLayer, rendere
rRect, geometry); |
| 1557 if (geometry.hasNonLocalGeometry()) { | 1558 if (geometry.hasNonLocalGeometry()) { |
| 1558 // Rather than incur the costs of computing the paintContainer f
or renderers with fixed backgrounds | 1559 // Rather than incur the costs of computing the paintContainer f
or renderers with fixed backgrounds |
| 1559 // in order to get the right destRect, just repaint the entire r
enderer. | 1560 // in order to get the right destRect, just repaint the entire r
enderer. |
| 1560 layerRenderer->repaint(); | 1561 layerRenderer->paintInvalidationForWholeRenderer(); |
| 1561 return true; | 1562 return true; |
| 1562 } | 1563 } |
| 1563 | 1564 |
| 1564 layerRenderer->repaintRectangle(geometry.destRect()); | 1565 layerRenderer->invalidatePaintRectangle(geometry.destRect()); |
| 1565 if (geometry.destRect() == rendererRect) | 1566 if (geometry.destRect() == rendererRect) |
| 1566 return true; | 1567 return true; |
| 1567 } | 1568 } |
| 1568 } | 1569 } |
| 1569 return false; | 1570 return false; |
| 1570 } | 1571 } |
| 1571 | 1572 |
| 1572 void RenderBox::invalidateTreeAfterLayout(const RenderLayerModelObject& paintInv
alidationContainer) | 1573 void RenderBox::invalidateTreeAfterLayout(const RenderLayerModelObject& paintInv
alidationContainer) |
| 1573 { | 1574 { |
| 1574 // FIXME: Currently only using this logic for RenderBox and its ilk. Ideally
, RenderBlockFlows with | 1575 // FIXME: Currently only using this logic for RenderBox and its ilk. Ideally
, RenderBlockFlows with |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1605 | 1606 |
| 1606 if ((onlyNeededPositionedMovementLayout() && compositingState() != PaintsInt
oOwnBacking) | 1607 if ((onlyNeededPositionedMovementLayout() && compositingState() != PaintsInt
oOwnBacking) |
| 1607 || (shouldDoFullPaintInvalidationIfSelfPaintingLayer() | 1608 || (shouldDoFullPaintInvalidationIfSelfPaintingLayer() |
| 1608 && hasLayer() | 1609 && hasLayer() |
| 1609 && layer()->isSelfPaintingLayer())) { | 1610 && layer()->isSelfPaintingLayer())) { |
| 1610 setShouldDoFullPaintInvalidationAfterLayout(true); | 1611 setShouldDoFullPaintInvalidationAfterLayout(true); |
| 1611 } | 1612 } |
| 1612 | 1613 |
| 1613 const LayoutRect& newPaintInvalidationRect = previousPaintInvalidationRect()
; | 1614 const LayoutRect& newPaintInvalidationRect = previousPaintInvalidationRect()
; |
| 1614 const LayoutPoint& newPositionFromPaintInvalidationContainer = previousPosit
ionFromPaintInvalidationContainer(); | 1615 const LayoutPoint& newPositionFromPaintInvalidationContainer = previousPosit
ionFromPaintInvalidationContainer(); |
| 1615 bool didFullPaintInvalidation = repaintAfterLayoutIfNeeded(&newPaintInvalida
tionContainer, | 1616 bool didFullPaintInvalidation = invalidatePaintAfterLayoutIfNeeded(&newPaint
InvalidationContainer, |
| 1616 shouldDoFullPaintInvalidationAfterLayout(), oldPaintInvalidationRect, ol
dPositionFromPaintInvalidationContainer, | 1617 shouldDoFullPaintInvalidationAfterLayout(), oldPaintInvalidationRect, ol
dPositionFromPaintInvalidationContainer, |
| 1617 &newPaintInvalidationRect, &newPositionFromPaintInvalidationContainer); | 1618 &newPaintInvalidationRect, &newPositionFromPaintInvalidationContainer); |
| 1618 | 1619 |
| 1619 if (!didFullPaintInvalidation) | 1620 if (!didFullPaintInvalidation) |
| 1620 repaintOverflowIfNeeded(); | 1621 invalidatePaintForOverflowIfNeeded(); |
| 1621 | 1622 |
| 1622 // Issue paint invalidations for any scrollbars if there is a scrollable are
a for this renderer. | 1623 // Issue paint invalidations for any scrollbars if there is a scrollable are
a for this renderer. |
| 1623 if (enclosingLayer()) { | 1624 if (enclosingLayer()) { |
| 1624 if (RenderLayerScrollableArea* area = enclosingLayer()->scrollableArea()
) { | 1625 if (RenderLayerScrollableArea* area = enclosingLayer()->scrollableArea()
) { |
| 1625 if (area->hasVerticalBarDamage()) | 1626 if (area->hasVerticalBarDamage()) |
| 1626 repaintRectangle(area->verticalBarDamage()); | 1627 invalidatePaintRectangle(area->verticalBarDamage()); |
| 1627 if (area->hasHorizontalBarDamage()) | 1628 if (area->hasHorizontalBarDamage()) |
| 1628 repaintRectangle(area->horizontalBarDamage()); | 1629 invalidatePaintRectangle(area->horizontalBarDamage()); |
| 1629 area->resetScrollbarDamage(); | 1630 area->resetScrollbarDamage(); |
| 1630 } | 1631 } |
| 1631 } | 1632 } |
| 1632 | 1633 |
| 1633 // FIXME: LayoutState should be enabled for other paint invalidation contain
ers than the RenderView. crbug.com/363834 | 1634 // FIXME: LayoutState should be enabled for other paint invalidation contain
ers than the RenderView. crbug.com/363834 |
| 1634 if (establishesNewPaintInvalidationContainer && !isRenderView()) { | 1635 if (establishesNewPaintInvalidationContainer && !isRenderView()) { |
| 1635 LayoutStateDisabler disabler(*this); | 1636 LayoutStateDisabler disabler(*this); |
| 1636 RenderObject::invalidateTreeAfterLayout(newPaintInvalidationContainer); | 1637 RenderObject::invalidateTreeAfterLayout(newPaintInvalidationContainer); |
| 1637 } else { | 1638 } else { |
| 1638 // FIXME: This concept of a tree walking state for fast lookups should b
e generalized away from | 1639 // FIXME: This concept of a tree walking state for fast lookups should b
e generalized away from |
| (...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2117 o->mapRectToRepaintBacking(repaintContainer, rect, fixed); | 2118 o->mapRectToRepaintBacking(repaintContainer, rect, fixed); |
| 2118 } | 2119 } |
| 2119 | 2120 |
| 2120 void RenderBox::repaintDuringLayoutIfMoved(const LayoutRect& oldRect) | 2121 void RenderBox::repaintDuringLayoutIfMoved(const LayoutRect& oldRect) |
| 2121 { | 2122 { |
| 2122 if (oldRect.location() != m_frameRect.location()) { | 2123 if (oldRect.location() != m_frameRect.location()) { |
| 2123 LayoutRect newRect = m_frameRect; | 2124 LayoutRect newRect = m_frameRect; |
| 2124 // The child moved. Invalidate the object's old and new positions. We
have to do this | 2125 // The child moved. Invalidate the object's old and new positions. We
have to do this |
| 2125 // since the object may not have gotten a layout. | 2126 // since the object may not have gotten a layout. |
| 2126 m_frameRect = oldRect; | 2127 m_frameRect = oldRect; |
| 2127 repaint(); | 2128 paintInvalidationForWholeRenderer(); |
| 2128 repaintOverhangingFloats(true); | 2129 repaintOverhangingFloats(true); |
| 2129 m_frameRect = newRect; | 2130 m_frameRect = newRect; |
| 2130 repaint(); | 2131 paintInvalidationForWholeRenderer(); |
| 2131 repaintOverhangingFloats(true); | 2132 repaintOverhangingFloats(true); |
| 2132 } | 2133 } |
| 2133 } | 2134 } |
| 2134 | 2135 |
| 2135 void RenderBox::repaintOverhangingFloats(bool) | 2136 void RenderBox::repaintOverhangingFloats(bool) |
| 2136 { | 2137 { |
| 2137 } | 2138 } |
| 2138 | 2139 |
| 2139 void RenderBox::updateLogicalWidth() | 2140 void RenderBox::updateLogicalWidth() |
| 2140 { | 2141 { |
| (...skipping 2554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4695 return 0; | 4696 return 0; |
| 4696 | 4697 |
| 4697 if (!layoutState && !flowThreadContainingBlock()) | 4698 if (!layoutState && !flowThreadContainingBlock()) |
| 4698 return 0; | 4699 return 0; |
| 4699 | 4700 |
| 4700 RenderBlock* containerBlock = containingBlock(); | 4701 RenderBlock* containerBlock = containingBlock(); |
| 4701 return containerBlock->offsetFromLogicalTopOfFirstPage() + logicalTop(); | 4702 return containerBlock->offsetFromLogicalTopOfFirstPage() + logicalTop(); |
| 4702 } | 4703 } |
| 4703 | 4704 |
| 4704 } // namespace WebCore | 4705 } // namespace WebCore |
| OLD | NEW |