OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. | 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 for (SelectionMap::iterator i = selectedObjects.begin(); i != end; ++i) | 468 for (SelectionMap::iterator i = selectedObjects.begin(); i != end; ++i) |
469 selRect.unite(i->value->absoluteSelectionRect()); | 469 selRect.unite(i->value->absoluteSelectionRect()); |
470 | 470 |
471 return pixelSnappedIntRect(selRect); | 471 return pixelSnappedIntRect(selRect); |
472 } | 472 } |
473 | 473 |
474 void RenderView::invalidatePaintForSelection() const | 474 void RenderView::invalidatePaintForSelection() const |
475 { | 475 { |
476 HashSet<RenderBlock*> processedBlocks; | 476 HashSet<RenderBlock*> processedBlocks; |
477 | 477 |
478 // For querying RenderLayer::compositingState() | |
479 // FIXME: this may be wrong. crbug.com/407416 | |
480 DisableCompositingQueryAsserts disabler; | |
481 | |
482 RenderObject* end = rendererAfterPosition(m_selectionEnd, m_selectionEndPos)
; | 478 RenderObject* end = rendererAfterPosition(m_selectionEnd, m_selectionEndPos)
; |
483 for (RenderObject* o = m_selectionStart; o && o != end; o = o->nextInPreOrde
r()) { | 479 for (RenderObject* o = m_selectionStart; o && o != end; o = o->nextInPreOrde
r()) { |
484 if (!o->canBeSelectionLeaf() && o != m_selectionStart && o != m_selectio
nEnd) | 480 if (!o->canBeSelectionLeaf() && o != m_selectionStart && o != m_selectio
nEnd) |
485 continue; | 481 continue; |
486 if (o->selectionState() == SelectionNone) | 482 if (o->selectionState() == SelectionNone) |
487 continue; | 483 continue; |
488 | 484 |
489 RenderSelectionInfo(o).invalidatePaint(); | 485 o->setShouldInvalidateSelection(); |
490 | 486 |
491 // Blocks are responsible for painting line gaps and margin gaps. They m
ust be examined as well. | 487 // Blocks are responsible for painting line gaps and margin gaps. They m
ust be examined as well. |
492 for (RenderBlock* block = o->containingBlock(); block && !block->isRende
rView(); block = block->containingBlock()) { | 488 for (RenderBlock* block = o->containingBlock(); block && !block->isRende
rView(); block = block->containingBlock()) { |
493 if (!processedBlocks.add(block).isNewEntry) | 489 if (!processedBlocks.add(block).isNewEntry) |
494 break; | 490 break; |
495 RenderSelectionInfo(block).invalidatePaint(); | 491 block->setShouldInvalidateSelection(); |
496 } | 492 } |
497 } | 493 } |
498 } | 494 } |
499 | 495 |
500 // When exploring the RenderTree looking for the nodes involved in the Selection
, sometimes it's | 496 // When exploring the RenderTree looking for the nodes involved in the Selection
, sometimes it's |
501 // required to change the traversing direction because the "start" position is b
elow the "end" one. | 497 // required to change the traversing direction because the "start" position is b
elow the "end" one. |
502 static inline RenderObject* getNextOrPrevRenderObjectBasedOnDirection(const Rend
erObject* o, const RenderObject* stop, bool& continueExploring, bool& exploringB
ackwards) | 498 static inline RenderObject* getNextOrPrevRenderObjectBasedOnDirection(const Rend
erObject* o, const RenderObject* stop, bool& continueExploring, bool& exploringB
ackwards) |
503 { | 499 { |
504 RenderObject* next; | 500 RenderObject* next; |
505 if (exploringBackwards) { | 501 if (exploringBackwards) { |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
625 cb = cb->containingBlock(); | 621 cb = cb->containingBlock(); |
626 } | 622 } |
627 } | 623 } |
628 | 624 |
629 o = getNextOrPrevRenderObjectBasedOnDirection(o, stop, continueExploring
, exploringBackwards); | 625 o = getNextOrPrevRenderObjectBasedOnDirection(o, stop, continueExploring
, exploringBackwards); |
630 } | 626 } |
631 | 627 |
632 if (!m_frameView || blockPaintInvalidationMode == PaintInvalidationNothing) | 628 if (!m_frameView || blockPaintInvalidationMode == PaintInvalidationNothing) |
633 return; | 629 return; |
634 | 630 |
635 // For querying RenderLayer::compositingState() | |
636 // FIXME: this is wrong, selection should not cause eager invalidation. crbu
g.com/407416 | |
637 DisableCompositingQueryAsserts disabler; | |
638 | |
639 // Have any of the old selected objects changed compared to the new selectio
n? | 631 // Have any of the old selected objects changed compared to the new selectio
n? |
640 for (SelectedObjectMap::iterator i = oldSelectedObjects.begin(); i != oldObj
ectsEnd; ++i) { | 632 for (SelectedObjectMap::iterator i = oldSelectedObjects.begin(); i != oldObj
ectsEnd; ++i) { |
641 RenderObject* obj = i->key; | 633 RenderObject* obj = i->key; |
642 RenderSelectionInfo* newInfo = newSelectedObjects.get(obj); | 634 RenderSelectionInfo* newInfo = newSelectedObjects.get(obj); |
643 RenderSelectionInfo* oldInfo = i->value.get(); | 635 RenderSelectionInfo* oldInfo = i->value.get(); |
644 if (!newInfo || newInfo->hasChangedFrom(*oldInfo) | 636 if (!newInfo || newInfo->hasChangedFrom(*oldInfo) |
645 || (m_selectionStart == obj && oldStartPos != m_selectionStartPos) | 637 || (m_selectionStart == obj && oldStartPos != m_selectionStartPos) |
646 || (m_selectionEnd == obj && oldEndPos != m_selectionEndPos)) { | 638 || (m_selectionEnd == obj && oldEndPos != m_selectionEndPos)) { |
647 oldInfo->invalidatePaint(); | 639 oldInfo->invalidatePaint(); |
648 if (newInfo) { | 640 if (newInfo) { |
649 newInfo->invalidatePaint(); | 641 newInfo->object()->setShouldInvalidateSelection(); |
650 newSelectedObjects.remove(obj); | 642 newSelectedObjects.remove(obj); |
651 } | 643 } |
652 } | 644 } |
653 } | 645 } |
654 | 646 |
655 // Any new objects that remain were not found in the old objects dict, and s
o they need to be updated. | 647 // Any new objects that remain were not found in the old objects dict, and s
o they need to be updated. |
656 SelectedObjectMap::iterator newObjectsEnd = newSelectedObjects.end(); | 648 SelectedObjectMap::iterator newObjectsEnd = newSelectedObjects.end(); |
657 for (SelectedObjectMap::iterator i = newSelectedObjects.begin(); i != newObj
ectsEnd; ++i) | 649 for (SelectedObjectMap::iterator i = newSelectedObjects.begin(); i != newObj
ectsEnd; ++i) |
658 i->value->invalidatePaint(); | 650 i->value->object()->setShouldInvalidateSelection(); |
659 | 651 |
660 // Have any of the old blocks changed? | 652 // Have any of the old blocks changed? |
661 SelectedBlockMap::iterator oldBlocksEnd = oldSelectedBlocks.end(); | 653 SelectedBlockMap::iterator oldBlocksEnd = oldSelectedBlocks.end(); |
662 for (SelectedBlockMap::iterator i = oldSelectedBlocks.begin(); i != oldBlock
sEnd; ++i) { | 654 for (SelectedBlockMap::iterator i = oldSelectedBlocks.begin(); i != oldBlock
sEnd; ++i) { |
663 RenderBlock* block = i->key; | 655 RenderBlock* block = i->key; |
664 RenderBlockSelectionInfo* newInfo = newSelectedBlocks.get(block); | 656 RenderBlockSelectionInfo* newInfo = newSelectedBlocks.get(block); |
665 RenderBlockSelectionInfo* oldInfo = i->value.get(); | 657 RenderBlockSelectionInfo* oldInfo = i->value.get(); |
666 if (!newInfo || newInfo->hasChangedFrom(*oldInfo)) { | 658 if (!newInfo || newInfo->hasChangedFrom(*oldInfo)) { |
667 oldInfo->invalidatePaint(); | 659 oldInfo->object()->setShouldInvalidateSelection(); |
668 if (newInfo) { | 660 if (newInfo) { |
669 newInfo->invalidatePaint(); | 661 newInfo->object()->setShouldInvalidateSelection(); |
670 newSelectedBlocks.remove(block); | 662 newSelectedBlocks.remove(block); |
671 } | 663 } |
672 } | 664 } |
673 } | 665 } |
674 | 666 |
675 // Any new blocks that remain were not found in the old blocks dict, and so
they need to be updated. | 667 // Any new blocks that remain were not found in the old blocks dict, and so
they need to be updated. |
676 SelectedBlockMap::iterator newBlocksEnd = newSelectedBlocks.end(); | 668 SelectedBlockMap::iterator newBlocksEnd = newSelectedBlocks.end(); |
677 for (SelectedBlockMap::iterator i = newSelectedBlocks.begin(); i != newBlock
sEnd; ++i) | 669 for (SelectedBlockMap::iterator i = newSelectedBlocks.begin(); i != newBlock
sEnd; ++i) |
678 i->value->invalidatePaint(); | 670 i->value->object()->setShouldInvalidateSelection(); |
679 } | 671 } |
680 | 672 |
681 void RenderView::getSelection(RenderObject*& startRenderer, int& startOffset, Re
nderObject*& endRenderer, int& endOffset) const | 673 void RenderView::getSelection(RenderObject*& startRenderer, int& startOffset, Re
nderObject*& endRenderer, int& endOffset) const |
682 { | 674 { |
683 startRenderer = m_selectionStart; | 675 startRenderer = m_selectionStart; |
684 startOffset = m_selectionStartPos; | 676 startOffset = m_selectionStartPos; |
685 endRenderer = m_selectionEnd; | 677 endRenderer = m_selectionEnd; |
686 endOffset = m_selectionEndPos; | 678 endOffset = m_selectionEndPos; |
687 } | 679 } |
688 | 680 |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
889 return viewWidth(IncludeScrollbars) / scale; | 881 return viewWidth(IncludeScrollbars) / scale; |
890 } | 882 } |
891 | 883 |
892 double RenderView::layoutViewportHeight() const | 884 double RenderView::layoutViewportHeight() const |
893 { | 885 { |
894 float scale = m_frameView ? m_frameView->frame().pageZoomFactor() : 1; | 886 float scale = m_frameView ? m_frameView->frame().pageZoomFactor() : 1; |
895 return viewHeight(IncludeScrollbars) / scale; | 887 return viewHeight(IncludeScrollbars) / scale; |
896 } | 888 } |
897 | 889 |
898 } // namespace blink | 890 } // namespace blink |
OLD | NEW |