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 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
439 | 439 |
440 void RenderBlock::markPositionedObjectsForLayout() | 440 void RenderBlock::markPositionedObjectsForLayout() |
441 { | 441 { |
442 if (TrackedRendererListHashSet* positionedDescendants = positionedObjects())
{ | 442 if (TrackedRendererListHashSet* positionedDescendants = positionedObjects())
{ |
443 TrackedRendererListHashSet::iterator end = positionedDescendants->end(); | 443 TrackedRendererListHashSet::iterator end = positionedDescendants->end(); |
444 for (TrackedRendererListHashSet::iterator it = positionedDescendants->be
gin(); it != end; ++it) | 444 for (TrackedRendererListHashSet::iterator it = positionedDescendants->be
gin(); it != end; ++it) |
445 (*it)->setChildNeedsLayout(); | 445 (*it)->setChildNeedsLayout(); |
446 } | 446 } |
447 } | 447 } |
448 | 448 |
449 void RenderBlock::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset) | 449 void RenderBlock::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset, Ve
ctor<RenderBox*>& layers) |
450 { | 450 { |
451 LayoutPoint adjustedPaintOffset = paintOffset + location(); | 451 LayoutPoint adjustedPaintOffset = paintOffset + location(); |
452 | 452 |
453 LayoutRect overflowBox; | 453 LayoutRect overflowBox; |
454 // Check if we need to do anything at all. | 454 // Check if we need to do anything at all. |
455 // FIXME: Could eliminate the isDocumentElement() check if we fix background
painting so that the RenderView | 455 // FIXME: Could eliminate the isDocumentElement() check if we fix background
painting so that the RenderView |
456 // paints the root's background. | 456 // paints the root's background. |
457 if (!isDocumentElement()) { | 457 if (!isDocumentElement()) { |
458 overflowBox = visualOverflowRect(); | 458 overflowBox = visualOverflowRect(); |
459 overflowBox.moveBy(adjustedPaintOffset); | 459 overflowBox.moveBy(adjustedPaintOffset); |
460 if (!overflowBox.intersects(paintInfo.rect)) | 460 if (!overflowBox.intersects(paintInfo.rect)) |
461 return; | 461 return; |
462 } | 462 } |
463 | 463 |
464 // There are some cases where not all clipped visual overflow is accounted f
or. | 464 // There are some cases where not all clipped visual overflow is accounted f
or. |
465 // FIXME: reduce the number of such cases. | 465 // FIXME: reduce the number of such cases. |
466 ContentsClipBehavior contentsClipBehavior = ForceContentsClip; | 466 ContentsClipBehavior contentsClipBehavior = ForceContentsClip; |
467 if (hasOverflowClip() && !shouldPaintSelectionGaps() && !hasCaret()) | 467 if (hasOverflowClip() && !shouldPaintSelectionGaps() && !hasCaret()) |
468 contentsClipBehavior = SkipContentsClipIfPossible; | 468 contentsClipBehavior = SkipContentsClipIfPossible; |
469 | 469 |
470 bool pushedClip = pushContentsClip(paintInfo, adjustedPaintOffset, contentsC
lipBehavior); | 470 bool pushedClip = pushContentsClip(paintInfo, adjustedPaintOffset, contentsC
lipBehavior); |
471 paintObject(paintInfo, adjustedPaintOffset); | 471 paintObject(paintInfo, adjustedPaintOffset, layers); |
472 if (pushedClip) | 472 if (pushedClip) |
473 popContentsClip(paintInfo, adjustedPaintOffset); | 473 popContentsClip(paintInfo, adjustedPaintOffset); |
474 } | 474 } |
475 | 475 |
476 void RenderBlock::paintChildren(PaintInfo& paintInfo, const LayoutPoint& paintOf
fset) | 476 void RenderBlock::paintChildren(PaintInfo& paintInfo, const LayoutPoint& paintOf
fset, Vector<RenderBox*>& layers) |
477 { | 477 { |
478 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo
x()) { | 478 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo
x()) { |
479 if (!child->hasSelfPaintingLayer()) | 479 if (child->hasSelfPaintingLayer()) |
480 child->paint(paintInfo, paintOffset); | 480 layers.append(child); |
| 481 else |
| 482 child->paint(paintInfo, paintOffset, layers); |
481 } | 483 } |
482 } | 484 } |
483 | 485 |
484 static inline bool hasCursorCaret(const FrameSelection& selection, const RenderB
lock* block) | 486 static inline bool hasCursorCaret(const FrameSelection& selection, const RenderB
lock* block) |
485 { | 487 { |
486 return selection.caretRenderer() == block && selection.hasEditableStyle(); | 488 return selection.caretRenderer() == block && selection.hasEditableStyle(); |
487 } | 489 } |
488 | 490 |
489 static inline bool hasDragCaret(const DragCaretController& dragCaretController,
const RenderBlock* block) | 491 static inline bool hasDragCaret(const DragCaretController& dragCaretController,
const RenderBlock* block) |
490 { | 492 { |
(...skipping 12 matching lines...) Expand all Loading... |
503 if (hasCursorCaret(selection, this)) { | 505 if (hasCursorCaret(selection, this)) { |
504 selection.paintCaret(paintInfo.context, paintOffset, paintInfo.rect); | 506 selection.paintCaret(paintInfo.context, paintOffset, paintInfo.rect); |
505 } | 507 } |
506 | 508 |
507 DragCaretController& dragCaretController = frame()->page()->dragCaretControl
ler(); | 509 DragCaretController& dragCaretController = frame()->page()->dragCaretControl
ler(); |
508 if (hasDragCaret(dragCaretController, this)) { | 510 if (hasDragCaret(dragCaretController, this)) { |
509 dragCaretController.paintDragCaret(frame(), paintInfo.context, paintOffs
et, paintInfo.rect); | 511 dragCaretController.paintDragCaret(frame(), paintInfo.context, paintOffs
et, paintInfo.rect); |
510 } | 512 } |
511 } | 513 } |
512 | 514 |
513 void RenderBlock::paintObject(PaintInfo& paintInfo, const LayoutPoint& paintOffs
et) | 515 void RenderBlock::paintObject(PaintInfo& paintInfo, const LayoutPoint& paintOffs
et, Vector<RenderBox*>& layers) |
514 { | 516 { |
515 if (hasBoxDecorationBackground()) | 517 if (hasBoxDecorationBackground()) |
516 paintBoxDecorationBackground(paintInfo, paintOffset); | 518 paintBoxDecorationBackground(paintInfo, paintOffset); |
517 | 519 |
518 paintChildren(paintInfo, paintOffset); | 520 paintChildren(paintInfo, paintOffset, layers); |
519 paintSelection(paintInfo, paintOffset); // Fill in gaps in selection on line
s and between blocks. | 521 paintSelection(paintInfo, paintOffset); // Fill in gaps in selection on line
s and between blocks. |
520 | 522 |
521 if (style()->hasOutline() && !style()->outlineStyleIsAuto()) | 523 if (style()->hasOutline() && !style()->outlineStyleIsAuto()) |
522 paintOutline(paintInfo, LayoutRect(paintOffset, size())); | 524 paintOutline(paintInfo, LayoutRect(paintOffset, size())); |
523 | 525 |
524 paintCarets(paintInfo, paintOffset); | 526 paintCarets(paintInfo, paintOffset); |
525 } | 527 } |
526 | 528 |
527 bool RenderBlock::shouldPaintSelectionGaps() const | 529 bool RenderBlock::shouldPaintSelectionGaps() const |
528 { | 530 { |
(...skipping 1240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1769 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render
Object* obj) const | 1771 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render
Object* obj) const |
1770 { | 1772 { |
1771 showRenderObject(); | 1773 showRenderObject(); |
1772 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) | 1774 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) |
1773 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); | 1775 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); |
1774 } | 1776 } |
1775 | 1777 |
1776 #endif | 1778 #endif |
1777 | 1779 |
1778 } // namespace blink | 1780 } // namespace blink |
OLD | NEW |