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 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 return; | 313 return; |
314 | 314 |
315 RenderBox* positionedObject; | 315 RenderBox* positionedObject; |
316 TrackedRendererListHashSet::iterator end = positionedDescendants->end(); | 316 TrackedRendererListHashSet::iterator end = positionedDescendants->end(); |
317 for (TrackedRendererListHashSet::iterator it = positionedDescendants->begin(
); it != end; ++it) { | 317 for (TrackedRendererListHashSet::iterator it = positionedDescendants->begin(
); it != end; ++it) { |
318 positionedObject = *it; | 318 positionedObject = *it; |
319 addOverflowFromChild(positionedObject, LayoutSize(positionedObject->x(),
positionedObject->y())); | 319 addOverflowFromChild(positionedObject, LayoutSize(positionedObject->x(),
positionedObject->y())); |
320 } | 320 } |
321 } | 321 } |
322 | 322 |
323 bool RenderBlock::createsBlockFormattingContext() const | |
324 { | |
325 return isInlineBlock() || isFloatingOrOutOfFlowPositioned() || hasOverflowCl
ip() || isFlexItem() || isDocumentElement(); | |
326 } | |
327 | |
328 void RenderBlock::updateBlockChildDirtyBitsBeforeLayout(bool relayoutChildren, R
enderBox* child) | 323 void RenderBlock::updateBlockChildDirtyBitsBeforeLayout(bool relayoutChildren, R
enderBox* child) |
329 { | 324 { |
330 // FIXME: Technically percentage height objects only need a relayout if thei
r percentage isn't going to be turned into | 325 // FIXME: Technically percentage height objects only need a relayout if thei
r percentage isn't going to be turned into |
331 // an auto value. Add a method to determine this, so that we can avoid the r
elayout. | 326 // an auto value. Add a method to determine this, so that we can avoid the r
elayout. |
332 if (relayoutChildren || (child->hasRelativeLogicalHeight() && !isRenderView(
))) | 327 if (relayoutChildren || (child->hasRelativeLogicalHeight() && !isRenderView(
))) |
333 child->setChildNeedsLayout(MarkOnlyThis); | 328 child->setChildNeedsLayout(MarkOnlyThis); |
334 | 329 |
335 // If relayoutChildren is set and the child has percentage padding or an emb
edded content box, we also need to invalidate the childs pref widths. | 330 // If relayoutChildren is set and the child has percentage padding or an emb
edded content box, we also need to invalidate the childs pref widths. |
336 if (relayoutChildren && child->needsPreferredWidthsRecalculation()) | 331 if (relayoutChildren && child->needsPreferredWidthsRecalculation()) |
337 child->setPreferredLogicalWidthsDirty(MarkOnlyThis); | 332 child->setPreferredLogicalWidthsDirty(MarkOnlyThis); |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
439 TrackedRendererListHashSet::iterator end = positionedDescendants->end(); | 434 TrackedRendererListHashSet::iterator end = positionedDescendants->end(); |
440 for (TrackedRendererListHashSet::iterator it = positionedDescendants->be
gin(); it != end; ++it) | 435 for (TrackedRendererListHashSet::iterator it = positionedDescendants->be
gin(); it != end; ++it) |
441 (*it)->setChildNeedsLayout(); | 436 (*it)->setChildNeedsLayout(); |
442 } | 437 } |
443 } | 438 } |
444 | 439 |
445 void RenderBlock::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset, Ve
ctor<RenderBox*>& layers) | 440 void RenderBlock::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset, Ve
ctor<RenderBox*>& layers) |
446 { | 441 { |
447 LayoutPoint adjustedPaintOffset = paintOffset + location(); | 442 LayoutPoint adjustedPaintOffset = paintOffset + location(); |
448 | 443 |
449 LayoutRect overflowBox; | 444 LayoutRect overflowBox = visualOverflowRect(); |
450 // Check if we need to do anything at all. | 445 overflowBox.moveBy(adjustedPaintOffset); |
451 // FIXME: Could eliminate the isDocumentElement() check if we fix background
painting so that the RenderView | 446 if (!overflowBox.intersects(paintInfo.rect)) |
452 // paints the root's background. | 447 return; |
453 if (!isDocumentElement()) { | |
454 overflowBox = visualOverflowRect(); | |
455 overflowBox.moveBy(adjustedPaintOffset); | |
456 if (!overflowBox.intersects(paintInfo.rect)) | |
457 return; | |
458 } | |
459 | 448 |
460 // There are some cases where not all clipped visual overflow is accounted f
or. | 449 // There are some cases where not all clipped visual overflow is accounted f
or. |
461 // FIXME: reduce the number of such cases. | 450 // FIXME: reduce the number of such cases. |
462 ContentsClipBehavior contentsClipBehavior = ForceContentsClip; | 451 ContentsClipBehavior contentsClipBehavior = ForceContentsClip; |
463 if (hasOverflowClip() && !shouldPaintSelectionGaps() && !hasCaret()) | 452 if (hasOverflowClip() && !shouldPaintSelectionGaps() && !hasCaret()) |
464 contentsClipBehavior = SkipContentsClipIfPossible; | 453 contentsClipBehavior = SkipContentsClipIfPossible; |
465 | 454 |
466 bool pushedClip = pushContentsClip(paintInfo, adjustedPaintOffset, contentsC
lipBehavior); | 455 bool pushedClip = pushContentsClip(paintInfo, adjustedPaintOffset, contentsC
lipBehavior); |
467 paintObject(paintInfo, adjustedPaintOffset, layers); | 456 paintObject(paintInfo, adjustedPaintOffset, layers); |
468 if (pushedClip) | 457 if (pushedClip) |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
524 | 513 |
525 bool RenderBlock::shouldPaintSelectionGaps() const | 514 bool RenderBlock::shouldPaintSelectionGaps() const |
526 { | 515 { |
527 return selectionState() != SelectionNone && isSelectionRoot(); | 516 return selectionState() != SelectionNone && isSelectionRoot(); |
528 } | 517 } |
529 | 518 |
530 bool RenderBlock::isSelectionRoot() const | 519 bool RenderBlock::isSelectionRoot() const |
531 { | 520 { |
532 ASSERT(node() || isAnonymous()); | 521 ASSERT(node() || isAnonymous()); |
533 | 522 |
534 if (isDocumentElement() || hasOverflowClip() | 523 if (node() && node()->parentNode() == document()) |
| 524 return true; |
| 525 |
| 526 if (hasOverflowClip() |
535 || isPositioned() | 527 || isPositioned() |
536 || isInlineBlock() | 528 || isInlineBlock() |
537 || hasTransform() | 529 || hasTransform() |
538 || isFlexItem()) | 530 || isFlexItem()) |
539 return true; | 531 return true; |
540 | 532 |
541 if (view() && view()->selectionStart()) { | 533 if (view() && view()->selectionStart()) { |
542 Node* startElement = view()->selectionStart()->node(); | 534 Node* startElement = view()->selectionStart()->node(); |
543 if (startElement && startElement->rootEditableElement() == node()) | 535 if (startElement && startElement->rootEditableElement() == node()) |
544 return true; | 536 return true; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
596 GapRects RenderBlock::selectionGaps(RenderBlock* rootBlock, const LayoutPoint& r
ootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, | 588 GapRects RenderBlock::selectionGaps(RenderBlock* rootBlock, const LayoutPoint& r
ootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, |
597 LayoutUnit& lastLogicalTop, LayoutUnit& last
LogicalLeft, LayoutUnit& lastLogicalRight, const PaintInfo* paintInfo) | 589 LayoutUnit& lastLogicalTop, LayoutUnit& last
LogicalLeft, LayoutUnit& lastLogicalRight, const PaintInfo* paintInfo) |
598 { | 590 { |
599 // IMPORTANT: Callers of this method that intend for painting to happen need
to do a save/restore. | 591 // IMPORTANT: Callers of this method that intend for painting to happen need
to do a save/restore. |
600 // Clip out floating and positioned objects when painting selection gaps. | 592 // Clip out floating and positioned objects when painting selection gaps. |
601 if (paintInfo) { | 593 if (paintInfo) { |
602 // Note that we don't clip out overflow for positioned objects. We just
stick to the border box. | 594 // Note that we don't clip out overflow for positioned objects. We just
stick to the border box. |
603 LayoutRect blockRect(offsetFromRootBlock.width(), offsetFromRootBlock.he
ight(), width(), height()); | 595 LayoutRect blockRect(offsetFromRootBlock.width(), offsetFromRootBlock.he
ight(), width(), height()); |
604 blockRect.moveBy(rootBlockPhysicalPosition); | 596 blockRect.moveBy(rootBlockPhysicalPosition); |
605 clipOutPositionedObjects(paintInfo, blockRect.location(), positionedObje
cts()); | 597 clipOutPositionedObjects(paintInfo, blockRect.location(), positionedObje
cts()); |
606 if (isDocumentElement()) // The <body> must make sure to examine its con
tainingBlock's positioned objects. | |
607 for (RenderBlock* cb = containingBlock(); cb && !cb->isRenderView();
cb = cb->containingBlock()) | |
608 clipOutPositionedObjects(paintInfo, LayoutPoint(cb->x(), cb->y()
), cb->positionedObjects()); | |
609 } | 598 } |
610 | 599 |
611 // FIXME: overflow: auto/scroll regions need more math here, since painting
in the border box is different from painting in the padding box (one is scrolled
, the other is | 600 // FIXME: overflow: auto/scroll regions need more math here, since painting
in the border box is different from painting in the padding box (one is scrolled
, the other is |
612 // fixed). | 601 // fixed). |
613 GapRects result; | 602 GapRects result; |
614 if (!isRenderBlockFlow()) // FIXME: Make multi-column selection gap filling
work someday. | 603 if (!isRenderBlockFlow()) // FIXME: Make multi-column selection gap filling
work someday. |
615 return result; | 604 return result; |
616 | 605 |
617 if (hasTransform()) { | 606 if (hasTransform()) { |
618 // FIXME: We should learn how to gap fill multiple columns and transform
s eventually. | 607 // FIXME: We should learn how to gap fill multiple columns and transform
s eventually. |
(...skipping 1142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1761 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render
Object* obj) const | 1750 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render
Object* obj) const |
1762 { | 1751 { |
1763 showRenderObject(); | 1752 showRenderObject(); |
1764 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) | 1753 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) |
1765 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); | 1754 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); |
1766 } | 1755 } |
1767 | 1756 |
1768 #endif | 1757 #endif |
1769 | 1758 |
1770 } // namespace blink | 1759 } // namespace blink |
OLD | NEW |