| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) |
| 3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ight reserved. | 3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ight reserved. |
| 4 * Copyright (C) 2010 Google Inc. All rights reserved. | 4 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 5 * | 5 * |
| 6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
| 7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
| 8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
| 9 * version 2 of the License, or (at your option) any later version. | 9 * version 2 of the License, or (at your option) any later version. |
| 10 * | 10 * |
| (...skipping 2668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2679 wordMeasurement.endOffset = lBreak.m_pos; | 2679 wordMeasurement.endOffset = lBreak.m_pos; |
| 2680 } | 2680 } |
| 2681 if (lBreak.m_obj && lBreak.m_pos && lBreak.m_obj->is
Text() && toRenderText(lBreak.m_obj)->textLength() && toRenderText(lBreak.m_obj)
->characterAt(lBreak.m_pos - 1) == softHyphen && style->hyphens() != HyphensNone
) | 2681 if (lBreak.m_obj && lBreak.m_pos && lBreak.m_obj->is
Text() && toRenderText(lBreak.m_obj)->textLength() && toRenderText(lBreak.m_obj)
->characterAt(lBreak.m_pos - 1) == softHyphen && style->hyphens() != HyphensNone
) |
| 2682 m_hyphenated = true; | 2682 m_hyphenated = true; |
| 2683 if (lBreak.m_pos && lBreak.m_pos != (unsigned)wordMe
asurement.endOffset && !wordMeasurement.width) { | 2683 if (lBreak.m_pos && lBreak.m_pos != (unsigned)wordMe
asurement.endOffset && !wordMeasurement.width) { |
| 2684 if (charWidth) { | 2684 if (charWidth) { |
| 2685 wordMeasurement.endOffset = lBreak.m_pos; | 2685 wordMeasurement.endOffset = lBreak.m_pos; |
| 2686 wordMeasurement.width = charWidth; | 2686 wordMeasurement.width = charWidth; |
| 2687 } | 2687 } |
| 2688 } | 2688 } |
| 2689 goto end; // Didn't fit. Jump to the end. | 2689 // Didn't fit. Jump to the end unless there's still
an opportunity to collapse whitespace. |
| 2690 if (ignoringSpaces || !currentStyle->collapseWhiteSp
ace() || !currentCharacterIsSpace || !previousCharacterIsSpace) |
| 2691 goto end; |
| 2690 } else { | 2692 } else { |
| 2691 if (!betweenWords || (midWordBreak && !autoWrap)) | 2693 if (!betweenWords || (midWordBreak && !autoWrap)) |
| 2692 width.addUncommittedWidth(-additionalTmpW); | 2694 width.addUncommittedWidth(-additionalTmpW); |
| 2693 if (hyphenWidth) { | 2695 if (hyphenWidth) { |
| 2694 // Subtract the width of the soft hyphen out sin
ce we fit on a line. | 2696 // Subtract the width of the soft hyphen out sin
ce we fit on a line. |
| 2695 width.addUncommittedWidth(-hyphenWidth); | 2697 width.addUncommittedWidth(-hyphenWidth); |
| 2696 hyphenWidth = 0; | 2698 hyphenWidth = 0; |
| 2697 } | 2699 } |
| 2698 } | 2700 } |
| 2699 } | 2701 } |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2806 | 2808 |
| 2807 if (m_hyphenated) | 2809 if (m_hyphenated) |
| 2808 goto end; | 2810 goto end; |
| 2809 } | 2811 } |
| 2810 } else | 2812 } else |
| 2811 ASSERT_NOT_REACHED(); | 2813 ASSERT_NOT_REACHED(); |
| 2812 | 2814 |
| 2813 bool checkForBreak = autoWrap; | 2815 bool checkForBreak = autoWrap; |
| 2814 if (width.committedWidth() && !width.fitsOnLine() && lBreak.m_obj && cur
rWS == NOWRAP) | 2816 if (width.committedWidth() && !width.fitsOnLine() && lBreak.m_obj && cur
rWS == NOWRAP) |
| 2815 checkForBreak = true; | 2817 checkForBreak = true; |
| 2816 else if (next && current.m_obj->isText() && next->isText() && !next->isB
R() && (autoWrap || (next->style()->autoWrap()))) { | 2818 else if (next && current.m_obj->isText() && next->isText() && !next->isB
R() && (autoWrap || next->style()->autoWrap())) { |
| 2817 if (currentCharacterIsSpace) | 2819 if (autoWrap && currentCharacterIsSpace) |
| 2818 checkForBreak = true; | 2820 checkForBreak = true; |
| 2819 else { | 2821 else { |
| 2820 RenderText* nextText = toRenderText(next); | 2822 RenderText* nextText = toRenderText(next); |
| 2821 if (nextText->textLength()) { | 2823 if (nextText->textLength()) { |
| 2822 UChar c = nextText->characterAt(0); | 2824 UChar c = nextText->characterAt(0); |
| 2823 checkForBreak = (c == ' ' || c == '\t' || (c == '\n' && !nex
t->preservesNewline())); | |
| 2824 // If the next item on the line is text, and if we did not e
nd with | 2825 // If the next item on the line is text, and if we did not e
nd with |
| 2825 // a space, then the next text run continues our word (and s
o it needs to | 2826 // a space, then the next text run continues our word (and s
o it needs to |
| 2826 // keep adding to |tmpW|. Just update and continue. | 2827 // keep adding to the uncommitted width. Just update and con
tinue. |
| 2828 checkForBreak = !currentCharacterIsSpace && (c == ' ' || c =
= '\t' || (c == '\n' && !next->preservesNewline())); |
| 2827 } else if (nextText->isWordBreak()) | 2829 } else if (nextText->isWordBreak()) |
| 2828 checkForBreak = true; | 2830 checkForBreak = true; |
| 2829 | 2831 |
| 2830 if (!width.fitsOnLine() && !width.committedWidth()) | 2832 if (!width.fitsOnLine() && !width.committedWidth()) |
| 2831 width.fitBelowFloats(); | 2833 width.fitBelowFloats(); |
| 2832 | 2834 |
| 2833 bool canPlaceOnLine = width.fitsOnLine() || !autoWrapWasEverTrue
OnLine; | 2835 bool canPlaceOnLine = width.fitsOnLine() || !autoWrapWasEverTrue
OnLine; |
| 2834 if (canPlaceOnLine && checkForBreak) { | 2836 if (canPlaceOnLine && checkForBreak) { |
| 2835 width.commit(); | 2837 width.commit(); |
| 2836 lBreak.moveToStartOf(next); | 2838 lBreak.moveToStartOf(next); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2871 current.moveToStartOf(next); | 2873 current.moveToStartOf(next); |
| 2872 atStart = false; | 2874 atStart = false; |
| 2873 } | 2875 } |
| 2874 | 2876 |
| 2875 if (width.fitsOnLine() || lastWS == NOWRAP) | 2877 if (width.fitsOnLine() || lastWS == NOWRAP) |
| 2876 lBreak.clear(); | 2878 lBreak.clear(); |
| 2877 | 2879 |
| 2878 end: | 2880 end: |
| 2879 if (lBreak == resolver.position() && (!lBreak.m_obj || !lBreak.m_obj->isBR()
)) { | 2881 if (lBreak == resolver.position() && (!lBreak.m_obj || !lBreak.m_obj->isBR()
)) { |
| 2880 // we just add as much as possible | 2882 // we just add as much as possible |
| 2881 if (blockStyle->whiteSpace() == PRE) { | 2883 if (blockStyle->whiteSpace() == PRE && !current.m_pos) { |
| 2882 // FIXME: Don't really understand this case. | 2884 lBreak.moveTo(last, last->isText() ? last->length() : 0); |
| 2883 if (current.m_pos) { | |
| 2884 // FIXME: This should call moveTo which would clear m_nextBreaka
blePosition | |
| 2885 // this code as-is is likely wrong. | |
| 2886 lBreak.m_obj = current.m_obj; | |
| 2887 lBreak.m_pos = current.m_pos - 1; | |
| 2888 } else | |
| 2889 lBreak.moveTo(last, last->isText() ? last->length() : 0); | |
| 2890 } else if (lBreak.m_obj) { | 2885 } else if (lBreak.m_obj) { |
| 2891 // Don't ever break in the middle of a word if we can help it. | 2886 // Don't ever break in the middle of a word if we can help it. |
| 2892 // There's no room at all. We just have to be on this line, | 2887 // There's no room at all. We just have to be on this line, |
| 2893 // even though we'll spill out. | 2888 // even though we'll spill out. |
| 2894 lBreak.moveTo(current.m_obj, current.m_pos); | 2889 lBreak.moveTo(current.m_obj, current.m_pos); |
| 2895 } | 2890 } |
| 2896 } | 2891 } |
| 2897 | 2892 |
| 2898 // make sure we consume at least one char/object. | 2893 // make sure we consume at least one char/object. |
| 2899 if (lBreak == resolver.position()) | 2894 if (lBreak == resolver.position()) |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3086 lineGridBox->alignBoxesInBlockDirection(logicalHeight(), textBoxDataMap, ver
ticalPositionCache); | 3081 lineGridBox->alignBoxesInBlockDirection(logicalHeight(), textBoxDataMap, ver
ticalPositionCache); |
| 3087 | 3082 |
| 3088 setLineGridBox(lineGridBox); | 3083 setLineGridBox(lineGridBox); |
| 3089 | 3084 |
| 3090 // FIXME: If any of the characteristics of the box change compared to the ol
d one, then we need to do a deep dirtying | 3085 // FIXME: If any of the characteristics of the box change compared to the ol
d one, then we need to do a deep dirtying |
| 3091 // (similar to what happens when the page height changes). Ideally, though,
we only do this if someone is actually snapping | 3086 // (similar to what happens when the page height changes). Ideally, though,
we only do this if someone is actually snapping |
| 3092 // to this grid. | 3087 // to this grid. |
| 3093 } | 3088 } |
| 3094 | 3089 |
| 3095 } | 3090 } |
| OLD | NEW |