Source/WebCore/platform/text/TextBreakIterator.h

@@namespace WebCore {
2828
2929 class TextBreakIterator;
3030
31  // Note: The returned iterator is good only until you get another iterator.
 31 // Note: The returned iterator is good only until you get another iterator, with the exception of acquireLineBreakIterator.
3232
3333 // Iterates over "extended grapheme clusters", as defined in UAX #29.
3434 // Note that platform implementations may be less sophisticated - e.g. ICU prior to

@@namespace WebCore {
4343 TextBreakIterator* cursorMovementIterator(const UChar*, int length);
4444
4545 TextBreakIterator* wordBreakIterator(const UChar*, int length);
46  TextBreakIterator* lineBreakIterator(const UChar*, int length);
 46 TextBreakIterator* acquireLineBreakIterator(const UChar*, int length);
 47 void releaseLineBreakIterator(TextBreakIterator*);
4748 TextBreakIterator* sentenceBreakIterator(const UChar*, int length);
4849
4950 int textBreakFirst(TextBreakIterator*);

@@namespace WebCore {
5758
5859 const int TextBreakDone = -1;
5960
 61class LazyLineBreakIterator {
 62public:
 63 LazyLineBreakIterator(const UChar* string, int length)
 64 : m_string(string)
 65 , m_length(length)
 66 , m_iterator(0)
 67 { }
 68
 69 ~LazyLineBreakIterator()
 70 {
 71 if (m_iterator)
 72 releaseLineBreakIterator(m_iterator);
 73 }
 74
 75 const UChar* string() const { return m_string; }
 76 int length() const { return m_length; }
 77
 78 TextBreakIterator* get()
 79 {
 80 if (!m_iterator)
 81 m_iterator = acquireLineBreakIterator(m_string, m_length);
 82 return m_iterator;
 83 }
 84 void reset(const UChar* string, int length)
 85 {
 86 if (m_iterator)
 87 releaseLineBreakIterator(m_iterator);
 88
 89 m_string = string;
 90 m_length = length;
 91 m_iterator = 0;
 92 }
 93
 94private:
 95 const UChar* m_string;
 96 int m_length;
 97 TextBreakIterator* m_iterator;
 98};
 99
60100}
61101
62102#endif
78428

Source/WebCore/platform/text/TextBreakIteratorICU.cpp

2727#include <unicode/ubrk.h>
2828#include <wtf/Assertions.h>
2929
 30using namespace std;
 31
3032namespace WebCore {
3133
3234static TextBreakIterator* setUpIterator(bool& createdIterator, TextBreakIterator*& iterator,

@@TextBreakIterator* wordBreakIterator(con
6870 staticWordBreakIterator, UBRK_WORD, string, length);
6971}
7072
71 TextBreakIterator* lineBreakIterator(const UChar* string, int length)
 73static bool createdLineBreakIterator = false;
 74static TextBreakIterator* staticLineBreakIterator;
 75
 76TextBreakIterator* acquireLineBreakIterator(const UChar* string, int length)
 77{
 78 TextBreakIterator* lineBreakIterator = 0;
 79 if (!createdLineBreakIterator || staticLineBreakIterator) {
 80 setUpIterator(createdLineBreakIterator,
 81 staticLineBreakIterator, UBRK_LINE, string, length);
 82 swap(staticLineBreakIterator, lineBreakIterator);
 83 }
 84
 85 if (!lineBreakIterator) {
 86 bool createdNewLineBreakIterator = false;
 87 setUpIterator(createdNewLineBreakIterator, lineBreakIterator, UBRK_LINE, string, length);
 88 }
 89
 90 return lineBreakIterator;
 91}
 92
 93void releaseLineBreakIterator(TextBreakIterator* iterator)
7294{
73  static bool createdLineBreakIterator = false;
74  static TextBreakIterator* staticLineBreakIterator;
75  return setUpIterator(createdLineBreakIterator,
76  staticLineBreakIterator, UBRK_LINE, string, length);
 95 ASSERT(createdLineBreakIterator);
 96 ASSERT(iterator);
 97
 98 if (!staticLineBreakIterator)
 99 staticLineBreakIterator = iterator;
 100 else
 101 ubrk_close(reinterpret_cast<UBreakIterator*>(iterator));
77102}
78103
79104TextBreakIterator* sentenceBreakIterator(const UChar* string, int length)
78428

Source/WebCore/rendering/RenderBlockLineLayout.cpp

@@InlineIterator RenderBlock::findNextLine
17221722 midWordBreak = w + wrapW + charWidth > width;
17231723 }
17241724
1725  bool betweenWords = c == '\n' || (currWS != PRE && !atStart && isBreakable(str, pos, strlen, nextBreakable, breakNBSP) && (style->hyphens() != HyphensNone || (pos && str[pos - 1] != softHyphen)));
 1725 bool betweenWords = c == '\n' || (currWS != PRE && !atStart && isBreakable(t->lineBreakIterator(), pos, nextBreakable, breakNBSP) && (style->hyphens() != HyphensNone || (pos && str[pos - 1] != softHyphen)));
17261726
17271727 if (betweenWords || midWordBreak) {
17281728 bool stoppedIgnoringSpaces = false;
78428

Source/WebCore/rendering/RenderText.cpp

@@RenderText::RenderText(Node* node, PassR
9696 : RenderObject(node)
9797 , m_minWidth(-1)
9898 , m_text(str)
 99 , m_lineBreakIterator(m_text.characters(), m_text.length())
99100 , m_firstTextBox(0)
100101 , m_lastTextBox(0)
101102 , m_maxWidth(-1)

@@void RenderText::computePreferredLogical
803804 continue;
804805 }
805806
806  bool hasBreak = breakAll || isBreakable(txt, i, len, nextBreakable, breakNBSP);
 807 bool hasBreak = breakAll || isBreakable(m_lineBreakIterator, i, nextBreakable, breakNBSP);
807808 bool betweenWords = true;
808809 int j = i;
809810 while (c != '\n' && !isSpaceAccordingToStyle(c, style()) && c != '\t' && c != softHyphen) {

@@void RenderText::computePreferredLogical
811812 if (j == len)
812813 break;
813814 c = txt[j];
814  if (isBreakable(txt, j, len, nextBreakable, breakNBSP))
 815 if (isBreakable(m_lineBreakIterator, j, nextBreakable, breakNBSP))
815816 break;
816817 if (breakAll) {
817818 betweenWords = false;

@@void RenderText::setTextInternal(PassRef
11371138 ASSERT(m_text);
11381139 ASSERT(!isBR() || (textLength() == 1 && m_text[0] == '\n'));
11391140
 1141 m_lineBreakIterator.reset(m_text.characters(), m_text.length());
11401142 m_isAllASCII = m_text.containsOnlyASCII();
11411143}
11421144
78428

Source/WebCore/rendering/RenderText.h

2424#define RenderText_h
2525
2626#include "RenderObject.h"
 27#include "TextBreakIterator.h"
2728#include <wtf/Forward.h>
2829
2930namespace WebCore {

@@public:
6970
7071 const UChar* characters() const { return m_text.characters(); }
7172 unsigned textLength() const { return m_text.length(); } // non virtual implementation of length()
 73 LazyLineBreakIterator& lineBreakIterator() { return m_lineBreakIterator; }
7274 void positionLineBox(InlineBox*);
7375
7476 virtual unsigned width(unsigned from, unsigned len, const Font&, int xPos, HashSet<const SimpleFontData*>* fallbackFonts = 0, GlyphOverflow* = 0) const;

@@private:
157159 int m_minWidth; // here to minimize padding in 64-bit.
158160
159161 String m_text;
 162 LazyLineBreakIterator m_lineBreakIterator;
160163
161164 InlineTextBox* m_firstTextBox;
162165 InlineTextBox* m_lastTextBox;
78428

Source/WebCore/rendering/break_lines.cpp

@@static inline TextBreakLocatorRef lineBr
154154}
155155#endif
156156
157 int nextBreakablePosition(const UChar* str, int pos, int len, bool treatNoBreakSpaceAsBreak)
 157int nextBreakablePosition(LazyLineBreakIterator& lazyBreakIterator, int pos, bool treatNoBreakSpaceAsBreak)
158158{
159 #if !PLATFORM(MAC) || !defined(BUILDING_ON_TIGER)
160  TextBreakIterator* breakIterator = 0;
161 #endif
 159 const UChar* str = lazyBreakIterator.string();
 160 int len = lazyBreakIterator.length();
162161 int nextBreak = -1;
163162
164163 UChar lastCh = pos > 0 ? str[pos - 1] : 0;

@@int nextBreakablePosition(const UChar* s
171170 if (needsLineBreakIterator(ch) || needsLineBreakIterator(lastCh)) {
172171 if (nextBreak < i && i) {
173172#if !PLATFORM(MAC) || !defined(BUILDING_ON_TIGER)
174  if (!breakIterator)
175  breakIterator = lineBreakIterator(str, len);
 173 TextBreakIterator* breakIterator = lazyBreakIterator.get();
176174 if (breakIterator)
177175 nextBreak = textBreakFollowing(breakIterator, i - 1);
178176#else
78428

Source/WebCore/rendering/break_lines.h

2525
2626namespace WebCore {
2727
28  int nextBreakablePosition(const UChar*, int pos, int len, bool breakNBSP = false);
 28class LazyLineBreakIterator;
2929
30  inline bool isBreakable(const UChar* str, int pos, int len, int& nextBreakable, bool breakNBSP = false)
31  {
32  if (pos > nextBreakable)
33  nextBreakable = nextBreakablePosition(str, pos, len, breakNBSP);
34  return pos == nextBreakable;
35  }
 30int nextBreakablePosition(LazyLineBreakIterator&, int pos, bool breakNBSP = false);
 31
 32inline bool isBreakable(LazyLineBreakIterator& lazyBreakIterator, int pos, int& nextBreakable, bool breakNBSP = false)
 33{
 34 if (pos > nextBreakable)
 35 nextBreakable = nextBreakablePosition(lazyBreakIterator, pos, breakNBSP);
 36 return pos == nextBreakable;
 37}
3638
3739} // namespace WebCore
3840
78428