OLD | NEW |
1 /* | 1 /* |
2 * (C) 1999 Lars Knoll (knoll@kde.org) | 2 * (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 2000 Dirk Mueller (mueller@kde.org) | 3 * (C) 2000 Dirk Mueller (mueller@kde.org) |
4 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. | 4 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. |
5 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) | 5 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) |
6 * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com) | 6 * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com) |
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 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
618 RootInlineBox& rootBox = box->root(); | 618 RootInlineBox& rootBox = box->root(); |
619 LayoutUnit top = std::min(rootBox.selectionTop(), rootBox.lineTop()); | 619 LayoutUnit top = std::min(rootBox.selectionTop(), rootBox.lineTop()); |
620 if (pointBlockDirection > top || (!blocksAreFlipped && pointBlockDirecti
on == top)) { | 620 if (pointBlockDirection > top || (!blocksAreFlipped && pointBlockDirecti
on == top)) { |
621 LayoutUnit bottom = rootBox.selectionBottom(); | 621 LayoutUnit bottom = rootBox.selectionBottom(); |
622 if (rootBox.nextRootBox()) | 622 if (rootBox.nextRootBox()) |
623 bottom = std::min(bottom, rootBox.nextRootBox()->lineTop()); | 623 bottom = std::min(bottom, rootBox.nextRootBox()->lineTop()); |
624 | 624 |
625 if (pointBlockDirection < bottom || (blocksAreFlipped && pointBlockD
irection == bottom)) { | 625 if (pointBlockDirection < bottom || (blocksAreFlipped && pointBlockD
irection == bottom)) { |
626 ShouldAffinityBeDownstream shouldAffinityBeDownstream; | 626 ShouldAffinityBeDownstream shouldAffinityBeDownstream; |
627 if (lineDirectionPointFitsInBox(pointLineDirection, box, shouldA
ffinityBeDownstream)) | 627 if (lineDirectionPointFitsInBox(pointLineDirection, box, shouldA
ffinityBeDownstream)) |
628 return createPositionWithAffinityForBoxAfterAdjustingOffsetF
orBiDi(box, box->offsetForPosition(pointLineDirection.toFloat()), shouldAffinity
BeDownstream); | 628 return createPositionWithAffinityForBoxAfterAdjustingOffsetF
orBiDi(box, box->offsetForPosition(pointLineDirection), shouldAffinityBeDownstre
am); |
629 } | 629 } |
630 } | 630 } |
631 lastBox = box; | 631 lastBox = box; |
632 } | 632 } |
633 | 633 |
634 if (lastBox) { | 634 if (lastBox) { |
635 ShouldAffinityBeDownstream shouldAffinityBeDownstream; | 635 ShouldAffinityBeDownstream shouldAffinityBeDownstream; |
636 lineDirectionPointFitsInBox(pointLineDirection, lastBox, shouldAffinityB
eDownstream); | 636 lineDirectionPointFitsInBox(pointLineDirection, lastBox, shouldAffinityB
eDownstream); |
637 return createPositionWithAffinityForBoxAfterAdjustingOffsetForBiDi(lastB
ox, lastBox->offsetForPosition(pointLineDirection.toFloat()) + lastBox->start(),
shouldAffinityBeDownstream); | 637 return createPositionWithAffinityForBoxAfterAdjustingOffsetForBiDi(lastB
ox, lastBox->offsetForPosition(pointLineDirection) + lastBox->start(), shouldAff
inityBeDownstream); |
638 } | 638 } |
639 return createPositionWithAffinity(0); | 639 return createPositionWithAffinity(0); |
640 } | 640 } |
641 | 641 |
642 LayoutRect LayoutText::localCaretRect(InlineBox* inlineBox, int caretOffset, Lay
outUnit* extraWidthToEndOfLine) | 642 LayoutRect LayoutText::localCaretRect(InlineBox* inlineBox, int caretOffset, Lay
outUnit* extraWidthToEndOfLine) |
643 { | 643 { |
644 if (!inlineBox) | 644 if (!inlineBox) |
645 return LayoutRect(); | 645 return LayoutRect(); |
646 | 646 |
647 ASSERT(inlineBox->isInlineTextBox()); | 647 ASSERT(inlineBox->isInlineTextBox()); |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
771 lastLineMaxWidth = LayoutUnit(); | 771 lastLineMaxWidth = LayoutUnit(); |
772 minWidth = LayoutUnit(); | 772 minWidth = LayoutUnit(); |
773 maxWidth = LayoutUnit(); | 773 maxWidth = LayoutUnit(); |
774 hasBreak = false; | 774 hasBreak = false; |
775 return; | 775 return; |
776 } | 776 } |
777 | 777 |
778 floatMinWidth = m_minWidth; | 778 floatMinWidth = m_minWidth; |
779 floatMaxWidth = m_maxWidth; | 779 floatMaxWidth = m_maxWidth; |
780 | 780 |
781 firstLineMinWidth = m_firstLineMinWidth; | 781 firstLineMinWidth = LayoutUnit(m_firstLineMinWidth); |
782 lastLineMinWidth = m_lastLineLineMinWidth; | 782 lastLineMinWidth = LayoutUnit(m_lastLineLineMinWidth); |
783 | 783 |
784 hasBreakableChar = m_hasBreakableChar; | 784 hasBreakableChar = m_hasBreakableChar; |
785 hasBreak = m_hasBreak; | 785 hasBreak = m_hasBreak; |
786 | 786 |
787 ASSERT(m_text); | 787 ASSERT(m_text); |
788 StringImpl& text = *m_text.impl(); | 788 StringImpl& text = *m_text.impl(); |
789 if (text[0] == spaceCharacter || (text[0] == newlineCharacter && !style()->p
reserveNewline()) || text[0] == tabulationCharacter) { | 789 if (text[0] == spaceCharacter || (text[0] == newlineCharacter && !style()->p
reserveNewline()) || text[0] == tabulationCharacter) { |
790 const Font& font = style()->font(); // FIXME: This ignores first-line. | 790 const Font& font = style()->font(); // FIXME: This ignores first-line. |
791 if (stripFrontSpaces) { | 791 if (stripFrontSpaces) { |
792 const UChar spaceChar = spaceCharacter; | 792 const UChar spaceChar = spaceCharacter; |
793 TextRun run = constructTextRun(font, &spaceChar, 1, styleRef(), dire
ction); | 793 TextRun run = constructTextRun(font, &spaceChar, 1, styleRef(), dire
ction); |
794 float spaceWidth = font.width(run); | 794 float spaceWidth = font.width(run); |
795 floatMaxWidth -= spaceWidth; | 795 floatMaxWidth -= spaceWidth; |
796 } else { | 796 } else { |
797 floatMaxWidth += font.fontDescription().wordSpacing(); | 797 floatMaxWidth += font.fontDescription().wordSpacing(); |
798 } | 798 } |
799 } | 799 } |
800 | 800 |
801 stripFrontSpaces = collapseWhiteSpace && m_hasEndWhiteSpace; | 801 stripFrontSpaces = collapseWhiteSpace && m_hasEndWhiteSpace; |
802 | 802 |
803 if (!style()->autoWrap() || floatMinWidth > floatMaxWidth) | 803 if (!style()->autoWrap() || floatMinWidth > floatMaxWidth) |
804 floatMinWidth = floatMaxWidth; | 804 floatMinWidth = floatMaxWidth; |
805 | 805 |
806 // Compute our max widths by scanning the string for newlines. | 806 // Compute our max widths by scanning the string for newlines. |
807 if (hasBreak) { | 807 if (hasBreak) { |
808 const Font& f = style()->font(); // FIXME: This ignores first-line. | 808 const Font& f = style()->font(); // FIXME: This ignores first-line. |
809 bool firstLine = true; | 809 bool firstLine = true; |
810 firstLineMaxWidth = floatMaxWidth; | 810 firstLineMaxWidth = LayoutUnit(floatMaxWidth); |
811 lastLineMaxWidth = floatMaxWidth; | 811 lastLineMaxWidth = LayoutUnit(floatMaxWidth); |
812 for (int i = 0; i < len; i++) { | 812 for (int i = 0; i < len; i++) { |
813 int linelen = 0; | 813 int linelen = 0; |
814 while (i + linelen < len && text[i + linelen] != newlineCharacter) | 814 while (i + linelen < len && text[i + linelen] != newlineCharacter) |
815 linelen++; | 815 linelen++; |
816 | 816 |
817 if (linelen) { | 817 if (linelen) { |
818 lastLineMaxWidth = widthFromFont(f, i, linelen, leadWidth, lastL
ineMaxWidth.toFloat(), direction, nullptr, nullptr); | 818 lastLineMaxWidth = LayoutUnit(widthFromFont(f, i, linelen, leadW
idth, lastLineMaxWidth.toFloat(), direction, nullptr, nullptr)); |
819 if (firstLine) { | 819 if (firstLine) { |
820 firstLine = false; | 820 firstLine = false; |
821 leadWidth = 0.f; | 821 leadWidth = 0.f; |
822 firstLineMaxWidth = lastLineMaxWidth; | 822 firstLineMaxWidth = lastLineMaxWidth; |
823 } | 823 } |
824 i += linelen; | 824 i += linelen; |
825 } else if (firstLine) { | 825 } else if (firstLine) { |
826 firstLineMaxWidth = LayoutUnit(); | 826 firstLineMaxWidth = LayoutUnit(); |
827 firstLine = false; | 827 firstLine = false; |
828 leadWidth = 0.f; | 828 leadWidth = 0.f; |
(...skipping 1046 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1875 for (InlineTextBox* box = firstTextBox(); box; box = box->nextTextBox()) { | 1875 for (InlineTextBox* box = firstTextBox(); box; box = box->nextTextBox()) { |
1876 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*box, in
validationReason); | 1876 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*box, in
validationReason); |
1877 if (box->truncation() != cNoTruncation) { | 1877 if (box->truncation() != cNoTruncation) { |
1878 if (EllipsisBox* ellipsisBox = box->root().ellipsisBox()) | 1878 if (EllipsisBox* ellipsisBox = box->root().ellipsisBox()) |
1879 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(
*ellipsisBox, invalidationReason); | 1879 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(
*ellipsisBox, invalidationReason); |
1880 } | 1880 } |
1881 } | 1881 } |
1882 } | 1882 } |
1883 | 1883 |
1884 } // namespace blink | 1884 } // namespace blink |
OLD | NEW |