12011-02-24 Ned Holbrook <nholbrook@apple.com>
2
3 Reviewed by NOBODY (OOPS!).
4
5 Minimize calls to ubrk_setText()
6 https://bugs.webkit.org/show_bug.cgi?id=54912
7 <rdar://problem/9032774>
8
9 Avoid calling ubrk_setText() once per call to isBreakable() by using a LazyLineBreakIterator, which defers
10 break iterator creation until needed. This requires replacing the global line break iterator primitive with a
11 version that can be nested, since in some cases two iterators may need to be outstanding. In particular,
12 layoutInlineChildren() may indirectly call computePreferredLogicalWidths() and each may need an iterator.
13 In a test with a paragraph of Japanese text, this reduced the number of ubrk_setText() calls from 164 to 1.
14
15 * platform/text/TextBreakIterator.h: Add LazyLineBreakIterator.
16 (WebCore::LazyLineBreakIterator::LazyLineBreakIterator):
17 (WebCore::LazyLineBreakIterator::~LazyLineBreakIterator):
18 (WebCore::LazyLineBreakIterator::string):
19 (WebCore::LazyLineBreakIterator::length):
20 (WebCore::LazyLineBreakIterator::get):
21 (WebCore::LazyLineBreakIterator::reset):
22 * platform/text/TextBreakIteratorICU.cpp: Replace lineBreakIterator() primitive with acquireLineBreakIterator()/releaseLineBreakIterator().
23 (WebCore::acquireLineBreakIterator):
24 (WebCore::releaseLineBreakIterator):
25 * platform/text/brew/TextBreakIteratorBrew.cpp: Ditto.
26 (WebCore::acquireLineBreakIterator):
27 (WebCore::releaseLineBreakIterator):
28 * platform/text/gtk/TextBreakIteratorGtk.cpp: Ditto.
29 (WebCore::acquireLineBreakIterator):
30 (WebCore::releaseLineBreakIterator):
31 * platform/text/qt/TextBreakIteratorQt.cpp: Ditto.
32 (WebCore::acquireLineBreakIterator):
33 (WebCore::releaseLineBreakIterator):
34 * platform/text/wince/TextBreakIteratorWinCE.cpp: Ditto.
35 (WebCore::acquireLineBreakIterator):
36 (WebCore::releaseLineBreakIterator):
37 * rendering/RenderBlock.h:
38 * rendering/RenderBlockLineLayout.cpp:
39 (WebCore::RenderBlock::layoutInlineChildren): Pass a mapping of RenderText to LazyLineBreakIterator from one call of findNextLineBreak() to the next.
40 (WebCore::RenderBlock::findNextLineBreak): Use said mapping, resetting LazyLineBreakIterator for any newly-encountered RenderText.
41 * rendering/RenderText.cpp: Use a local LazyLineBreakIterator.
42 (WebCore::RenderText::computePreferredLogicalWidths):
43 * rendering/break_lines.cpp: Accept LazyLineBreakIterator rather than UniChar buffer.
44 (WebCore::nextBreakablePosition):
45 * rendering/break_lines.h: Accept LazyLineBreakIterator rather than UniChar buffer.
46 (WebCore::isBreakable):
47