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) 2007 David Smith (catfish.man@gmail.com) | 4 * (C) 2007 David Smith (catfish.man@gmail.com) |
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.
All rights reserved. | 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.
All rights reserved. |
6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 | 386 |
387 // Take care of positioned objects. This is required as PaintInvalidationSta
te keeps a single clip rect. | 387 // Take care of positioned objects. This is required as PaintInvalidationSta
te keeps a single clip rect. |
388 if (TrackedRendererListHashSet* positionedObjects = this->positionedObjects(
)) { | 388 if (TrackedRendererListHashSet* positionedObjects = this->positionedObjects(
)) { |
389 TrackedRendererListHashSet::iterator end = positionedObjects->end(); | 389 TrackedRendererListHashSet::iterator end = positionedObjects->end(); |
390 bool establishesNewPaintInvalidationContainer = isPaintInvalidationConta
iner(); | 390 bool establishesNewPaintInvalidationContainer = isPaintInvalidationConta
iner(); |
391 const RenderLayerModelObject& newPaintInvalidationContainer = *adjustCom
positedContainerForSpecialAncestors(establishesNewPaintInvalidationContainer ? t
his : &paintInvalidationState.paintInvalidationContainer()); | 391 const RenderLayerModelObject& newPaintInvalidationContainer = *adjustCom
positedContainerForSpecialAncestors(establishesNewPaintInvalidationContainer ? t
his : &paintInvalidationState.paintInvalidationContainer()); |
392 PaintInvalidationState childPaintInvalidationState(paintInvalidationStat
e, *this, newPaintInvalidationContainer); | 392 PaintInvalidationState childPaintInvalidationState(paintInvalidationStat
e, *this, newPaintInvalidationContainer); |
393 for (TrackedRendererListHashSet::iterator it = positionedObjects->begin(
); it != end; ++it) { | 393 for (TrackedRendererListHashSet::iterator it = positionedObjects->begin(
); it != end; ++it) { |
394 RenderBox* box = *it; | 394 RenderBox* box = *it; |
395 | 395 |
396 // One of the renderers we're skipping over here may be the child's
repaint container, | 396 // One of the renderers we're skipping over here may be the child's
paint invalidation container, |
397 // so we can't pass our own repaint container along. | 397 // so we can't pass our own paint invalidation container along. |
398 const RenderLayerModelObject& repaintContainerForChild = *box->conta
inerForPaintInvalidation(); | 398 const RenderLayerModelObject& paintInvalidationContainerForChild = *
box->containerForPaintInvalidation(); |
399 | 399 |
400 // If it's a new paint invalidation container, we won't have properl
y accumulated the offset into the | 400 // If it's a new paint invalidation container, we won't have properl
y accumulated the offset into the |
401 // PaintInvalidationState. | 401 // PaintInvalidationState. |
402 // FIXME: Teach PaintInvalidationState to handle this case. crbug.co
m/371485 | 402 // FIXME: Teach PaintInvalidationState to handle this case. crbug.co
m/371485 |
403 if (&repaintContainerForChild != newPaintInvalidationContainer) { | 403 if (&paintInvalidationContainerForChild != newPaintInvalidationConta
iner) { |
404 ForceHorriblySlowRectMapping slowRectMapping(&childPaintInvalida
tionState); | 404 ForceHorriblySlowRectMapping slowRectMapping(&childPaintInvalida
tionState); |
405 PaintInvalidationState disabledPaintInvalidationState(childPaint
InvalidationState, *this, repaintContainerForChild); | 405 PaintInvalidationState disabledPaintInvalidationState(childPaint
InvalidationState, *this, paintInvalidationContainerForChild); |
406 box->invalidateTreeIfNeeded(disabledPaintInvalidationState); | 406 box->invalidateTreeIfNeeded(disabledPaintInvalidationState); |
407 continue; | 407 continue; |
408 } | 408 } |
409 | 409 |
410 // If the positioned renderer is absolutely positioned and it is ins
ide | 410 // If the positioned renderer is absolutely positioned and it is ins
ide |
411 // a relatively positioned inline element, we need to account for | 411 // a relatively positioned inline element, we need to account for |
412 // the inline elements position in PaintInvalidationState. | 412 // the inline elements position in PaintInvalidationState. |
413 if (box->style()->position() == AbsolutePosition) { | 413 if (box->style()->position() == AbsolutePosition) { |
414 RenderObject* container = box->container(&repaintContainerForChi
ld, 0); | 414 RenderObject* container = box->container(&paintInvalidationConta
inerForChild, 0); |
415 if (container->isRelPositioned() && container->isRenderInline())
{ | 415 if (container->isRelPositioned() && container->isRenderInline())
{ |
416 // FIXME: We should be able to use PaintInvalidationState fo
r this. | 416 // FIXME: We should be able to use PaintInvalidationState fo
r this. |
417 // Currently, we will place absolutely positioned elements i
nside | 417 // Currently, we will place absolutely positioned elements i
nside |
418 // relatively positioned inline blocks in the wrong location
. crbug.com/371485 | 418 // relatively positioned inline blocks in the wrong location
. crbug.com/371485 |
419 ForceHorriblySlowRectMapping slowRectMapping(&childPaintInva
lidationState); | 419 ForceHorriblySlowRectMapping slowRectMapping(&childPaintInva
lidationState); |
420 PaintInvalidationState disabledPaintInvalidationState(childP
aintInvalidationState, *this, repaintContainerForChild); | 420 PaintInvalidationState disabledPaintInvalidationState(childP
aintInvalidationState, *this, paintInvalidationContainerForChild); |
421 box->invalidateTreeIfNeeded(disabledPaintInvalidationState); | 421 box->invalidateTreeIfNeeded(disabledPaintInvalidationState); |
422 continue; | 422 continue; |
423 } | 423 } |
424 } | 424 } |
425 | 425 |
426 box->invalidateTreeIfNeeded(childPaintInvalidationState); | 426 box->invalidateTreeIfNeeded(childPaintInvalidationState); |
427 } | 427 } |
428 } | 428 } |
429 } | 429 } |
430 | 430 |
(...skipping 1080 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1511 addOverflowFromChild(positionedObject, LayoutSize(positionedObject->
x(), positionedObject->y())); | 1511 addOverflowFromChild(positionedObject, LayoutSize(positionedObject->
x(), positionedObject->y())); |
1512 } | 1512 } |
1513 } | 1513 } |
1514 | 1514 |
1515 void RenderBlock::addVisualOverflowFromTheme() | 1515 void RenderBlock::addVisualOverflowFromTheme() |
1516 { | 1516 { |
1517 if (!style()->hasAppearance()) | 1517 if (!style()->hasAppearance()) |
1518 return; | 1518 return; |
1519 | 1519 |
1520 IntRect inflatedRect = pixelSnappedBorderBoxRect(); | 1520 IntRect inflatedRect = pixelSnappedBorderBoxRect(); |
1521 RenderTheme::theme().adjustRepaintRect(this, inflatedRect); | 1521 RenderTheme::theme().adjustPaintInvalidationRect(this, inflatedRect); |
1522 addVisualOverflow(inflatedRect); | 1522 addVisualOverflow(inflatedRect); |
1523 } | 1523 } |
1524 | 1524 |
1525 bool RenderBlock::createsBlockFormattingContext() const | 1525 bool RenderBlock::createsBlockFormattingContext() const |
1526 { | 1526 { |
1527 return isInlineBlockOrInlineTable() || isFloatingOrOutOfFlowPositioned() ||
hasOverflowClip() || isFlexItemIncludingDeprecated() | 1527 return isInlineBlockOrInlineTable() || isFloatingOrOutOfFlowPositioned() ||
hasOverflowClip() || isFlexItemIncludingDeprecated() |
1528 || style()->specifiesColumns() || isRenderFlowThread() || isTableCell()
|| isTableCaption() || isFieldset() || isWritingModeRoot() || isDocumentElement(
) || style()->columnSpan(); | 1528 || style()->specifiesColumns() || isRenderFlowThread() || isTableCell()
|| isTableCaption() || isFieldset() || isWritingModeRoot() || isDocumentElement(
) || style()->columnSpan(); |
1529 } | 1529 } |
1530 | 1530 |
1531 void RenderBlock::updateBlockChildDirtyBitsBeforeLayout(bool relayoutChildren, R
enderBox* child) | 1531 void RenderBlock::updateBlockChildDirtyBitsBeforeLayout(bool relayoutChildren, R
enderBox* child) |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1576 // Check if we need to do a full layout. | 1576 // Check if we need to do a full layout. |
1577 if (normalChildNeedsLayout() || selfNeedsLayout()) | 1577 if (normalChildNeedsLayout() || selfNeedsLayout()) |
1578 return false; | 1578 return false; |
1579 | 1579 |
1580 // Check that we actually need to do a simplified layout. | 1580 // Check that we actually need to do a simplified layout. |
1581 if (!posChildNeedsLayout() && !(needsSimplifiedNormalFlowLayout() || needsPo
sitionedMovementLayout())) | 1581 if (!posChildNeedsLayout() && !(needsSimplifiedNormalFlowLayout() || needsPo
sitionedMovementLayout())) |
1582 return false; | 1582 return false; |
1583 | 1583 |
1584 | 1584 |
1585 { | 1585 { |
1586 // LayoutState needs this deliberate scope to pop before repaint | 1586 // LayoutState needs this deliberate scope to pop before paint invalidat
ion. |
1587 LayoutState state(*this, locationOffset()); | 1587 LayoutState state(*this, locationOffset()); |
1588 | 1588 |
1589 if (needsPositionedMovementLayout() && !tryLayoutDoingPositionedMovement
Only()) | 1589 if (needsPositionedMovementLayout() && !tryLayoutDoingPositionedMovement
Only()) |
1590 return false; | 1590 return false; |
1591 | 1591 |
1592 TextAutosizer::LayoutScope textAutosizerLayoutScope(this); | 1592 TextAutosizer::LayoutScope textAutosizerLayoutScope(this); |
1593 | 1593 |
1594 // Lay out positioned descendants or objects that just need to recompute
overflow. | 1594 // Lay out positioned descendants or objects that just need to recompute
overflow. |
1595 if (needsSimplifiedNormalFlowLayout()) | 1595 if (needsSimplifiedNormalFlowLayout()) |
1596 simplifiedNormalFlowLayout(); | 1596 simplifiedNormalFlowLayout(); |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1956 currLogicalTopOffset += blockDelta; | 1956 currLogicalTopOffset += blockDelta; |
1957 else | 1957 else |
1958 currLogicalTopOffset -= blockDelta; | 1958 currLogicalTopOffset -= blockDelta; |
1959 } | 1959 } |
1960 } | 1960 } |
1961 | 1961 |
1962 void RenderBlock::paintContents(PaintInfo& paintInfo, const LayoutPoint& paintOf
fset) | 1962 void RenderBlock::paintContents(PaintInfo& paintInfo, const LayoutPoint& paintOf
fset) |
1963 { | 1963 { |
1964 // Avoid painting descendants of the root element when stylesheets haven't l
oaded. This eliminates FOUC. | 1964 // Avoid painting descendants of the root element when stylesheets haven't l
oaded. This eliminates FOUC. |
1965 // It's ok not to draw, because later on, when all the stylesheets do load,
styleResolverChanged() on the Document | 1965 // It's ok not to draw, because later on, when all the stylesheets do load,
styleResolverChanged() on the Document |
1966 // will do a full repaint. | 1966 // will do a full paint invalidation. |
1967 if (document().didLayoutWithPendingStylesheets() && !isRenderView()) | 1967 if (document().didLayoutWithPendingStylesheets() && !isRenderView()) |
1968 return; | 1968 return; |
1969 | 1969 |
1970 if (childrenInline()) | 1970 if (childrenInline()) |
1971 m_lineBoxes.paint(this, paintInfo, paintOffset); | 1971 m_lineBoxes.paint(this, paintInfo, paintOffset); |
1972 else { | 1972 else { |
1973 PaintPhase newPhase = (paintInfo.phase == PaintPhaseChildOutlines) ? Pai
ntPhaseOutline : paintInfo.phase; | 1973 PaintPhase newPhase = (paintInfo.phase == PaintPhaseChildOutlines) ? Pai
ntPhaseOutline : paintInfo.phase; |
1974 newPhase = (newPhase == PaintPhaseChildBlockBackgrounds) ? PaintPhaseChi
ldBlockBackground : newPhase; | 1974 newPhase = (newPhase == PaintPhaseChildBlockBackgrounds) ? PaintPhaseChi
ldBlockBackground : newPhase; |
1975 | 1975 |
1976 // We don't paint our own background, but we do let the kids paint their
backgrounds. | 1976 // We don't paint our own background, but we do let the kids paint their
backgrounds. |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2254 | 2254 |
2255 if (view() && view()->selectionStart()) { | 2255 if (view() && view()->selectionStart()) { |
2256 Node* startElement = view()->selectionStart()->node(); | 2256 Node* startElement = view()->selectionStart()->node(); |
2257 if (startElement && startElement->rootEditableElement() == node()) | 2257 if (startElement && startElement->rootEditableElement() == node()) |
2258 return true; | 2258 return true; |
2259 } | 2259 } |
2260 | 2260 |
2261 return false; | 2261 return false; |
2262 } | 2262 } |
2263 | 2263 |
2264 GapRects RenderBlock::selectionGapRectsForRepaint(const RenderLayerModelObject*
repaintContainer) | 2264 GapRects RenderBlock::selectionGapRectsForPaintInvalidation(const RenderLayerMod
elObject* paintInvalidationContainer) |
2265 { | 2265 { |
2266 ASSERT(!needsLayout()); | 2266 ASSERT(!needsLayout()); |
2267 | 2267 |
2268 if (!shouldPaintSelectionGaps()) | 2268 if (!shouldPaintSelectionGaps()) |
2269 return GapRects(); | 2269 return GapRects(); |
2270 | 2270 |
2271 TransformState transformState(TransformState::ApplyTransformDirection, Float
Point()); | 2271 TransformState transformState(TransformState::ApplyTransformDirection, Float
Point()); |
2272 mapLocalToContainer(repaintContainer, transformState, ApplyContainerFlip | U
seTransforms); | 2272 mapLocalToContainer(paintInvalidationContainer, transformState, ApplyContain
erFlip | UseTransforms); |
2273 LayoutPoint offsetFromRepaintContainer = roundedLayoutPoint(transformState.m
appedPoint()); | 2273 LayoutPoint offsetFromPaintInvalidationContainer = roundedLayoutPoint(transf
ormState.mappedPoint()); |
2274 | 2274 |
2275 if (hasOverflowClip()) | 2275 if (hasOverflowClip()) |
2276 offsetFromRepaintContainer -= scrolledContentOffset(); | 2276 offsetFromPaintInvalidationContainer -= scrolledContentOffset(); |
2277 | 2277 |
2278 LayoutUnit lastTop = 0; | 2278 LayoutUnit lastTop = 0; |
2279 LayoutUnit lastLeft = logicalLeftSelectionOffset(this, lastTop); | 2279 LayoutUnit lastLeft = logicalLeftSelectionOffset(this, lastTop); |
2280 LayoutUnit lastRight = logicalRightSelectionOffset(this, lastTop); | 2280 LayoutUnit lastRight = logicalRightSelectionOffset(this, lastTop); |
2281 | 2281 |
2282 return selectionGaps(this, offsetFromRepaintContainer, IntSize(), lastTop, l
astLeft, lastRight); | 2282 return selectionGaps(this, offsetFromPaintInvalidationContainer, IntSize(),
lastTop, lastLeft, lastRight); |
2283 } | 2283 } |
2284 | 2284 |
2285 void RenderBlock::paintSelection(PaintInfo& paintInfo, const LayoutPoint& paintO
ffset) | 2285 void RenderBlock::paintSelection(PaintInfo& paintInfo, const LayoutPoint& paintO
ffset) |
2286 { | 2286 { |
2287 if (shouldPaintSelectionGaps() && paintInfo.phase == PaintPhaseForeground) { | 2287 if (shouldPaintSelectionGaps() && paintInfo.phase == PaintPhaseForeground) { |
2288 LayoutUnit lastTop = 0; | 2288 LayoutUnit lastTop = 0; |
2289 LayoutUnit lastLeft = logicalLeftSelectionOffset(this, lastTop); | 2289 LayoutUnit lastLeft = logicalLeftSelectionOffset(this, lastTop); |
2290 LayoutUnit lastRight = logicalRightSelectionOffset(this, lastTop); | 2290 LayoutUnit lastRight = logicalRightSelectionOffset(this, lastTop); |
2291 GraphicsContextStateSaver stateSaver(*paintInfo.context); | 2291 GraphicsContextStateSaver stateSaver(*paintInfo.context); |
2292 | 2292 |
(...skipping 1196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3489 | 3489 |
3490 LayoutUnit startOffset = std::max(isHorizontal ? r.y() : r.x(), beforeBorder
Padding); | 3490 LayoutUnit startOffset = std::max(isHorizontal ? r.y() : r.x(), beforeBorder
Padding); |
3491 LayoutUnit endOffset = std::max(std::min<LayoutUnit>(isHorizontal ? r.maxY()
: r.maxX(), beforeBorderPadding + colCount * colHeight), beforeBorderPadding); | 3491 LayoutUnit endOffset = std::max(std::min<LayoutUnit>(isHorizontal ? r.maxY()
: r.maxX(), beforeBorderPadding + colCount * colHeight), beforeBorderPadding); |
3492 | 3492 |
3493 // FIXME: Can overflow on fast/block/float/float-not-removed-from-next-sibli
ng4.html, see https://bugs.webkit.org/show_bug.cgi?id=68744 | 3493 // FIXME: Can overflow on fast/block/float/float-not-removed-from-next-sibli
ng4.html, see https://bugs.webkit.org/show_bug.cgi?id=68744 |
3494 unsigned startColumn = (startOffset - beforeBorderPadding) / colHeight; | 3494 unsigned startColumn = (startOffset - beforeBorderPadding) / colHeight; |
3495 unsigned endColumn = (endOffset - beforeBorderPadding) / colHeight; | 3495 unsigned endColumn = (endOffset - beforeBorderPadding) / colHeight; |
3496 | 3496 |
3497 if (startColumn == endColumn) { | 3497 if (startColumn == endColumn) { |
3498 // The rect is fully contained within one column. Adjust for our offsets | 3498 // The rect is fully contained within one column. Adjust for our offsets |
3499 // and repaint only that portion. | 3499 // and issue paint invalidations only that portion. |
3500 LayoutUnit logicalLeftOffset = logicalLeftOffsetForContent(); | 3500 LayoutUnit logicalLeftOffset = logicalLeftOffsetForContent(); |
3501 LayoutRect colRect = columnRectAt(colInfo, startColumn); | 3501 LayoutRect colRect = columnRectAt(colInfo, startColumn); |
3502 LayoutRect repaintRect = r; | 3502 LayoutRect paintInvalidationRect = r; |
3503 | 3503 |
3504 if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) { | 3504 if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) { |
3505 if (isHorizontal) | 3505 if (isHorizontal) |
3506 repaintRect.move(colRect.x() - logicalLeftOffset, - static_cast<
int>(startColumn) * colHeight); | 3506 paintInvalidationRect.move(colRect.x() - logicalLeftOffset, - st
atic_cast<int>(startColumn) * colHeight); |
3507 else | 3507 else |
3508 repaintRect.move(- static_cast<int>(startColumn) * colHeight, co
lRect.y() - logicalLeftOffset); | 3508 paintInvalidationRect.move(- static_cast<int>(startColumn) * col
Height, colRect.y() - logicalLeftOffset); |
3509 } else { | 3509 } else { |
3510 if (isHorizontal) | 3510 if (isHorizontal) |
3511 repaintRect.move(0, colRect.y() - startColumn * colHeight - befo
reBorderPadding); | 3511 paintInvalidationRect.move(0, colRect.y() - startColumn * colHei
ght - beforeBorderPadding); |
3512 else | 3512 else |
3513 repaintRect.move(colRect.x() - startColumn * colHeight - beforeB
orderPadding, 0); | 3513 paintInvalidationRect.move(colRect.x() - startColumn * colHeight
- beforeBorderPadding, 0); |
3514 } | 3514 } |
3515 repaintRect.intersect(colRect); | 3515 paintInvalidationRect.intersect(colRect); |
3516 result.unite(repaintRect); | 3516 result.unite(paintInvalidationRect); |
3517 } else { | 3517 } else { |
3518 // We span multiple columns. We can just unite the start and end column
to get the final | 3518 // We span multiple columns. We can just unite the start and end column
to get the final |
3519 // repaint rect. | 3519 // paint invalidation rect. |
3520 result.unite(columnRectAt(colInfo, startColumn)); | 3520 result.unite(columnRectAt(colInfo, startColumn)); |
3521 result.unite(columnRectAt(colInfo, endColumn)); | 3521 result.unite(columnRectAt(colInfo, endColumn)); |
3522 } | 3522 } |
3523 | 3523 |
3524 r = result; | 3524 r = result; |
3525 } | 3525 } |
3526 | 3526 |
3527 LayoutPoint RenderBlock::flipForWritingModeIncludingColumns(const LayoutPoint& p
oint) const | 3527 LayoutPoint RenderBlock::flipForWritingModeIncludingColumns(const LayoutPoint& p
oint) const |
3528 { | 3528 { |
3529 ASSERT(hasColumns()); | 3529 ASSERT(hasColumns()); |
(...skipping 1318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4848 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render
Object* obj) const | 4848 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render
Object* obj) const |
4849 { | 4849 { |
4850 showRenderObject(); | 4850 showRenderObject(); |
4851 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) | 4851 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) |
4852 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); | 4852 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); |
4853 } | 4853 } |
4854 | 4854 |
4855 #endif | 4855 #endif |
4856 | 4856 |
4857 } // namespace blink | 4857 } // namespace blink |
OLD | NEW |