WebKit Bugzilla
Attachment 341667 Details for
Bug 185976
: Improve the performance of determining character boundaries in ComplexTextController
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
WIP
bug-185976-20180531093046.patch (text/plain), 63.71 KB, created by
Myles C. Maxfield
on 2018-05-31 09:30:47 PDT
(
hide
)
Description:
WIP
Filename:
MIME Type:
Creator:
Myles C. Maxfield
Created:
2018-05-31 09:30:47 PDT
Size:
63.71 KB
patch
obsolete
>Subversion Revision: 232252 >diff --git a/Source/WTF/ChangeLog b/Source/WTF/ChangeLog >index 025b985e7ead2e0c2eec313c3dc7757480237b98..0c97ec2b4391fc1be8f80c46ed8bc398b468f7d3 100644 >--- a/Source/WTF/ChangeLog >+++ b/Source/WTF/ChangeLog >@@ -1,3 +1,19 @@ >+2018-05-31 Myles C. Maxfield <mmaxfield@apple.com> >+ >+ Improve the performance of determining character boundaries in ComplexTextController >+ https://bugs.webkit.org/show_bug.cgi?id=185976 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * wtf/spi/cf/CFStringSPI.h: >+ * wtf/text/TextBreakIterator.cpp: >+ (WTF::mapModeToBackingIterator): >+ * wtf/text/TextBreakIterator.h: >+ * wtf/text/cf/TextBreakIteratorCF.h: >+ (WTF::TextBreakIteratorCF::TextBreakIteratorCF): >+ * wtf/text/mac/TextBreakIteratorInternalICUMac.mm: >+ (WTF::mapModeToBackingIterator): >+ > 2018-05-27 Yusuke Suzuki <utatane.tea@gmail.com> > > [WTF] Add clz32 / clz64 for MSVC >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index c097e127830359c7ba176f3fbc2a8ed5185e0006..4dbc713e742d2c642ec1131767602236798c1308 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,20 @@ >+2018-05-31 Myles C. Maxfield <mmaxfield@apple.com> >+ >+ Improve the performance of determining character boundaries in ComplexTextController >+ https://bugs.webkit.org/show_bug.cgi?id=185976 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ No new tests (OOPS!). >+ >+ * platform/graphics/ComplexTextController.cpp: >+ (WebCore::advanceByCombiningCharacterSequence): >+ (WebCore::ComplexTextController::collectComplexTextRuns): >+ * platform/graphics/Font.cpp: >+ (WebCore::createAndFillGlyphPage): >+ * platform/graphics/mac/GlyphPageMac.cpp: >+ (WebCore::GlyphPage::fill): >+ > 2018-05-28 Zalan Bujtas <zalan@apple.com> > > Unreviewed build fix. >diff --git a/Source/WTF/wtf/spi/cf/CFStringSPI.h b/Source/WTF/wtf/spi/cf/CFStringSPI.h >index aae98dba4288f8a5c547152b2a7f7fdab05c7a2a..bdd8bf50e70f38b44d576290d173497dcffb73e2 100644 >--- a/Source/WTF/wtf/spi/cf/CFStringSPI.h >+++ b/Source/WTF/wtf/spi/cf/CFStringSPI.h >@@ -38,6 +38,7 @@ extern "C" { > > typedef CF_ENUM(CFIndex, CFStringCharacterClusterType) > { >+ kCFStringGraphemeCluster = 1, > kCFStringComposedCharacterCluster = 2, > kCFStringCursorMovementCluster = 3, > kCFStringBackwardDeletionCluster = 4 >diff --git a/Source/WTF/wtf/text/TextBreakIterator.cpp b/Source/WTF/wtf/text/TextBreakIterator.cpp >index 5b88b44578e47d823fb5888235d10103d0d5f46f..bacce11f0bd256c45755a12642bbd25c14164122 100644 >--- a/Source/WTF/wtf/text/TextBreakIterator.cpp >+++ b/Source/WTF/wtf/text/TextBreakIterator.cpp >@@ -44,6 +44,8 @@ static Variant<TextBreakIteratorICU, TextBreakIteratorPlatform> mapModeToBacking > return TextBreakIteratorICU(string, TextBreakIteratorICU::Mode::Character, locale.string().utf8().data()); > case TextBreakIterator::Mode::Delete: > return TextBreakIteratorICU(string, TextBreakIteratorICU::Mode::Character, locale.string().utf8().data()); >+ case TextBreakIterator::Mode::GraphemeCluster: >+ return TextBreakIteratorICU(string, TextBreakIteratorICU::Mode::Character, locale.string().utf8().data()); > default: > ASSERT_NOT_REACHED(); > return TextBreakIteratorICU(string, TextBreakIteratorICU::Mode::Character, locale.string().utf8().data()); >diff --git a/Source/WTF/wtf/text/TextBreakIterator.h b/Source/WTF/wtf/text/TextBreakIterator.h >index 392329de231ee83bb3ff380bcc83ef24d14290c1..7231fbcea917563e81155af81443326b460d707a 100644 >--- a/Source/WTF/wtf/text/TextBreakIterator.h >+++ b/Source/WTF/wtf/text/TextBreakIterator.h >@@ -47,7 +47,8 @@ public: > enum class Mode { > Line, > Caret, >- Delete >+ Delete, >+ GraphemeCluster, > }; > > TextBreakIterator() = delete; >diff --git a/Source/WTF/wtf/text/cf/TextBreakIteratorCF.h b/Source/WTF/wtf/text/cf/TextBreakIteratorCF.h >index 27e50bce5075f9ddadc4fdb9b192f6e834065e66..a17666908791e98322fbce7259b87fa98e691963 100644 >--- a/Source/WTF/wtf/text/cf/TextBreakIteratorCF.h >+++ b/Source/WTF/wtf/text/cf/TextBreakIteratorCF.h >@@ -29,7 +29,8 @@ class TextBreakIteratorCF { > public: > enum class Mode { > Caret, >- Delete >+ Delete, >+ GraphemeCluster, > }; > > TextBreakIteratorCF(StringView string, Mode mode) >@@ -42,6 +43,9 @@ public: > case Mode::Delete: > m_type = kCFStringBackwardDeletionCluster; > break; >+ case Mode::GraphemeCluster: >+ m_type = kCFStringGraphemeCluster; >+ break; > } > } > >diff --git a/Source/WTF/wtf/text/mac/TextBreakIteratorInternalICUMac.mm b/Source/WTF/wtf/text/mac/TextBreakIteratorInternalICUMac.mm >index 0cac4c9c56f364f885e77aac1528abb58a11cac0..e3d208d196d44b3f711986936d648a5f9d6fa773 100644 >--- a/Source/WTF/wtf/text/mac/TextBreakIteratorInternalICUMac.mm >+++ b/Source/WTF/wtf/text/mac/TextBreakIteratorInternalICUMac.mm >@@ -35,6 +35,8 @@ static Variant<TextBreakIteratorICU, TextBreakIteratorPlatform> mapModeToBacking > return TextBreakIteratorCF(string, TextBreakIteratorCF::Mode::Caret); > case TextBreakIterator::Mode::Delete: > return TextBreakIteratorCF(string, TextBreakIteratorCF::Mode::Delete); >+ case TextBreakIterator::Mode::GraphemeCluster: >+ return TextBreakIteratorCF(string, TextBreakIteratorCF::Mode::GraphemeCluster); > } > } > >diff --git a/Source/WebCore/platform/graphics/ComplexTextController.cpp b/Source/WebCore/platform/graphics/ComplexTextController.cpp >index f9f18a80fbd97ed33d2d609c3094ea5e15762649..26e8a8c593285ccf081b0e11707eb46fe765c0a2 100644 >--- a/Source/WebCore/platform/graphics/ComplexTextController.cpp >+++ b/Source/WebCore/platform/graphics/ComplexTextController.cpp >@@ -262,51 +262,14 @@ unsigned ComplexTextController::offsetForPosition(float h, bool includePartialGl > return 0; > } > >-// FIXME: We should consider reimplementing this function using ICU to advance by grapheme. >-// The current implementation only considers explicitly emoji sequences and emoji variations. >-static bool advanceByCombiningCharacterSequence(const UChar*& iterator, const UChar* end, UChar32& baseCharacter, unsigned& markCount) >+static const UChar* advanceByCombiningCharacterSequence(const UChar* iterator, const UChar* end, const AtomicString& locale, UChar32& baseCharacter, unsigned& numberOfCodeUnitsAfterBaseCharacter) > { >- ASSERT(iterator < end); >- >- markCount = 0; >- >- unsigned i = 0; >- unsigned remainingCharacters = end - iterator; >- U16_NEXT(iterator, i, remainingCharacters, baseCharacter); >- iterator = iterator + i; >- if (U_IS_SURROGATE(baseCharacter)) >- return false; >- >- // Consume marks. >- bool sawEmojiGroupCandidate = isEmojiGroupCandidate(baseCharacter); >- bool sawJoiner = false; >- while (iterator < end) { >- UChar32 nextCharacter; >- unsigned markLength = 0; >- bool shouldContinue = false; >- ASSERT(end >= iterator); >- U16_NEXT(iterator, markLength, static_cast<unsigned>(end - iterator), nextCharacter); >- >- if (isVariationSelector(nextCharacter) || isEmojiFitzpatrickModifier(nextCharacter)) >- shouldContinue = true; >- >- if (sawJoiner && isEmojiGroupCandidate(nextCharacter)) >- shouldContinue = true; >- >- sawJoiner = false; >- if (sawEmojiGroupCandidate && nextCharacter == zeroWidthJoiner) { >- sawJoiner = true; >- shouldContinue = true; >- } >- >- if (!shouldContinue && !(U_GET_GC_MASK(nextCharacter) & U_GC_M_MASK)) >- break; >- >- markCount += markLength; >- iterator += markLength; >- } >- >- return true; >+ CachedTextBreakIterator textBreakIterator(StringView(iterator, end - iterator), TextBreakIterator::Mode::GraphemeCluster, locale); >+ auto clusterLength = textBreakIterator.following(0).value_or(end - iterator); >+ unsigned offset = 0; >+ U16_NEXT(iterator, offset, clusterLength, baseCharacter); >+ numberOfCodeUnitsAfterBaseCharacter = (end - iterator) - offset; >+ return iterator + clusterLength; > } > > // FIXME: Capitalization is language-dependent and context-dependent and should operate on grapheme clusters instead of codepoints. >@@ -367,9 +330,10 @@ void ComplexTextController::collectComplexTextRuns() > const Font* synthesizedFont = nullptr; > const Font* smallSynthesizedFont = nullptr; > >- unsigned markCount; >+ unsigned numberOfCodeUnitsAfterBaseCharacter; > UChar32 baseCharacter; >- if (!advanceByCombiningCharacterSequence(curr, end, baseCharacter, markCount)) >+ curr = advanceByCombiningCharacterSequence(curr, end, m_font.fontDescription().locale(), baseCharacter, numberOfCodeUnitsAfterBaseCharacter); >+ if (U_IS_SURROGATE(baseCharacter)) > return; > > nextFont = m_font.fontForCombiningCharacterSequence(cp, curr - cp); >@@ -394,14 +358,15 @@ void ComplexTextController::collectComplexTextRuns() > isSmallCaps = nextIsSmallCaps; > unsigned index = curr - cp; > >- if (!advanceByCombiningCharacterSequence(curr, end, baseCharacter, markCount)) >+ curr = advanceByCombiningCharacterSequence(curr, end, m_font.fontDescription().locale(), baseCharacter, numberOfCodeUnitsAfterBaseCharacter); >+ if (U_IS_SURROGATE(baseCharacter)) > return; > > if (synthesizedFont) { > if (auto capitalizedBase = capitalized(baseCharacter)) { > unsigned characterIndex = index; > U16_APPEND_UNSAFE(m_smallCapsBuffer, characterIndex, capitalizedBase.value()); >- for (unsigned i = 0; i < markCount; ++i) >+ for (unsigned i = 0; i < numberOfCodeUnitsAfterBaseCharacter; ++i) > m_smallCapsBuffer[i + characterIndex] = cp[i + characterIndex]; > nextIsSmallCaps = true; > } else { >diff --git a/Source/WebCore/platform/graphics/Font.cpp b/Source/WebCore/platform/graphics/Font.cpp >index 2cdae74e29fed09e169e31cab2d56db76ea30d80..5f27b157f6c93cf1dfafc0ba601c792b8f13010a 100644 >--- a/Source/WebCore/platform/graphics/Font.cpp >+++ b/Source/WebCore/platform/graphics/Font.cpp >@@ -173,41 +173,14 @@ static RefPtr<GlyphPage> createAndFillGlyphPage(unsigned pageNumber, const Font& > for (unsigned i = 0; i < bufferLength; i++) > buffer[i] = start + i; > >- // Code points 0x0 - 0x20 and 0x7F - 0xA0 are control character and shouldn't render. Map them to ZERO WIDTH SPACE. >- auto overwriteCodePoints = [&](unsigned minimum, unsigned maximum, UChar newCodePoint) { >- unsigned begin = std::max(start, minimum); >- unsigned complete = std::min(end, maximum); >- for (unsigned i = begin; i < complete; ++i) >- buffer[i - start] = newCodePoint; >- }; >- > auto overwriteCodePoint = [&](UChar codePoint, UChar newCodePoint) { > if (codePoint >= start && codePoint < end) > buffer[codePoint - start] = newCodePoint; > }; > >- overwriteCodePoints(0x0, 0x20, zeroWidthSpace); >- overwriteCodePoints(0x7F, 0xA0, zeroWidthSpace); >- overwriteCodePoint(softHyphen, zeroWidthSpace); > overwriteCodePoint('\n', space); > overwriteCodePoint('\t', space); > overwriteCodePoint(noBreakSpace, space); >- overwriteCodePoint(narrowNoBreakSpace, zeroWidthSpace); >- overwriteCodePoint(leftToRightMark, zeroWidthSpace); >- overwriteCodePoint(rightToLeftMark, zeroWidthSpace); >- overwriteCodePoint(leftToRightEmbed, zeroWidthSpace); >- overwriteCodePoint(rightToLeftEmbed, zeroWidthSpace); >- overwriteCodePoint(leftToRightOverride, zeroWidthSpace); >- overwriteCodePoint(rightToLeftOverride, zeroWidthSpace); >- overwriteCodePoint(leftToRightIsolate, zeroWidthSpace); >- overwriteCodePoint(rightToLeftIsolate, zeroWidthSpace); >- overwriteCodePoint(zeroWidthNonJoiner, zeroWidthSpace); >- overwriteCodePoint(zeroWidthJoiner, zeroWidthSpace); >- overwriteCodePoint(popDirectionalFormatting, zeroWidthSpace); >- overwriteCodePoint(popDirectionalIsolate, zeroWidthSpace); >- overwriteCodePoint(firstStrongIsolate, zeroWidthSpace); >- overwriteCodePoint(objectReplacementCharacter, zeroWidthSpace); >- overwriteCodePoint(zeroWidthNoBreakSpace, zeroWidthSpace); > } else { > bufferLength = glyphPageSize * 2; > for (unsigned i = 0; i < glyphPageSize; i++) { >diff --git a/Source/WebCore/platform/graphics/mac/GlyphPageMac.cpp b/Source/WebCore/platform/graphics/mac/GlyphPageMac.cpp >index 0e7e600ed3dd10661664ca22ad6c19747013271a..d0bb89a2f94ed8a9681d71727802e56869a873ad 100644 >--- a/Source/WebCore/platform/graphics/mac/GlyphPageMac.cpp >+++ b/Source/WebCore/platform/graphics/mac/GlyphPageMac.cpp >@@ -60,6 +60,37 @@ bool GlyphPage::fill(UChar* buffer, unsigned bufferLength) > else > CTFontGetGlyphsForCharacters(font.platformData().ctFont(), buffer, glyphs.data(), bufferLength); > >+ // Marks certain glyphs as supported by the font, but as not participating in shaping and not rendering visibly. >+ if (bufferLength == GlyphPage::size) { >+ for (unsigned i = 0; i < bufferLength; ++i) { >+ switch (buffer[i]) { >+ case softHyphen: >+ case narrowNoBreakSpace: >+ case leftToRightMark: >+ case rightToLeftMark: >+ case leftToRightEmbed: >+ case rightToLeftEmbed: >+ case leftToRightOverride: >+ case rightToLeftOverride: >+ case leftToRightIsolate: >+ case rightToLeftIsolate: >+ case zeroWidthNonJoiner: >+ case zeroWidthJoiner: >+ case popDirectionalFormatting: >+ case popDirectionalIsolate: >+ case firstStrongIsolate: >+ case objectReplacementCharacter: >+ case zeroWidthNoBreakSpace: >+ glyphs[i] = 0xFFFF; >+ break; >+ default: >+ if (buffer[i] < 0x20 || (buffer[i] >= 0x7F && buffer[i] < 0xA0)) >+ glyphs[i] = 0xFFFF; >+ break; >+ } >+ } >+ } >+ > bool haveGlyphs = false; > for (unsigned i = 0; i < GlyphPage::size; ++i) { > if (glyphs[i * glyphStep]) { >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index a18e553979ef3b07851aa5836a7222b9f4d58297..120b95883815610b15314a722d0ae0f9f4964aff 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,13 @@ >+2018-05-31 Myles C. Maxfield <mmaxfield@apple.com> >+ >+ Improve the performance of determining character boundaries in ComplexTextController >+ https://bugs.webkit.org/show_bug.cgi?id=185976 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * platform/mac/fast/text/format-control-expected.png: >+ * platform/mac/fast/text/format-control-expected.txt: >+ > 2018-05-28 Claudio Saavedra <csaavedra@igalia.com> > > [GTK][WPE] AppCache test gardening >diff --git a/LayoutTests/platform/mac/fast/text/format-control-expected.png b/LayoutTests/platform/mac/fast/text/format-control-expected.png >index 89e4be67e9c3473f3ae471a29c973db84ab0b568..8e43db0d31d7de8366ed5f4b82f1a93c5c4b19b5 100644 >GIT binary patch >literal 29244 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 >Pr$tW;{HVnho?ZPficy>u > >literal 26483 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 > >diff --git a/LayoutTests/platform/mac/fast/text/format-control-expected.txt b/LayoutTests/platform/mac/fast/text/format-control-expected.txt >index 42237bc0cde527ed3c3581c6f8fb1c3aaeb159eb..76db2adb3435237c67eb54011aea6289d2140e52 100644 >--- a/LayoutTests/platform/mac/fast/text/format-control-expected.txt >+++ b/LayoutTests/platform/mac/fast/text/format-control-expected.txt >@@ -11,18 +11,18 @@ layer at (0,0) size 800x600 > RenderText {#text} at (0,0) size 279x46 > text run at (0,0) width 279: "fi fl ff ffi ffl fl f i" > RenderBlock {P} at (0,86) size 784x46 >- RenderText {#text} at (0,0) size 290x46 >- text run at (0,0) width 290: "f\x{200C}i f\x{200C}l f\x{200C}f f\x{200C}f\x{200C}i f\x{200C}f\x{200C}l f\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}l f\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C} \x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C} \x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C} \x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}i" >+ RenderText {#text} at (0,0) size 279x46 >+ text run at (0,0) width 279: "f\x{200C}i f\x{200C}l f\x{200C}f f\x{200C}f\x{200C}i f\x{200C}f\x{200C}l f\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}l f\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C} \x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C} \x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C} \x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}i" > RenderBlock {P} at (0,172) size 784x46 >- RenderText {#text} at (0,0) size 290x46 >- text run at (0,0) width 290: "f\x{200D}i f\x{200D}l f\x{200D}f f\x{200D}f\x{200D}i f\x{200D}f\x{200D}l f\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}l f\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D} \x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D} \x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D} \x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}i" >+ RenderText {#text} at (0,0) size 279x46 >+ text run at (0,0) width 279: "f\x{200D}i f\x{200D}l f\x{200D}f f\x{200D}f\x{200D}i f\x{200D}f\x{200D}l f\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}l f\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D} \x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D} \x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D} \x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}i" > RenderBlock {DIV} at (0,316) size 784x221 > RenderBlock {P} at (0,0) size 784x47 > RenderText {#text} at (0,1) size 288x45 > text run at (0,1) width 288: "fi fl ff ffi ffl fl f i" > RenderBlock {P} at (0,87) size 784x47 >- RenderText {#text} at (0,1) size 290x45 >- text run at (0,1) width 290: "f\x{200C}i f\x{200C}l f\x{200C}f f\x{200C}f\x{200C}i f\x{200C}f\x{200C}l f\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}l f\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C} \x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C} \x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C} \x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}i" >+ RenderText {#text} at (0,1) size 288x45 >+ text run at (0,1) width 288: "f\x{200C}i f\x{200C}l f\x{200C}f f\x{200C}f\x{200C}i f\x{200C}f\x{200C}l f\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}l f\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C} \x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C} \x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C} \x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}\x{200C}i" > RenderBlock {P} at (0,174) size 784x47 >- RenderText {#text} at (0,1) size 290x45 >- text run at (0,1) width 290: "f\x{200D}i f\x{200D}l f\x{200D}f f\x{200D}f\x{200D}i f\x{200D}f\x{200D}l f\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}l f\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D} \x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D} \x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D} \x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}i" >+ RenderText {#text} at (0,1) size 288x45 >+ text run at (0,1) width 288: "f\x{200D}i f\x{200D}l f\x{200D}f f\x{200D}f\x{200D}i f\x{200D}f\x{200D}l f\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}l f\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D} \x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D} \x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D} \x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}\x{200D}i" >diff --git a/PerformanceTests/ChangeLog b/PerformanceTests/ChangeLog >index 08272909dff577af10b9bdc6de47b5294aafa0ab..7f15c118afc990c1750d136eb2a136b7c1348ba5 100644 >--- a/PerformanceTests/ChangeLog >+++ b/PerformanceTests/ChangeLog >@@ -1,3 +1,12 @@ >+2018-05-31 Myles C. Maxfield <mmaxfield@apple.com> >+ >+ Improve the performance of determining character boundaries in ComplexTextController >+ https://bugs.webkit.org/show_bug.cgi?id=185976 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * Layout/ComplexCharacterFallback.html: Added. >+ > 2018-05-25 Myles C. Maxfield <mmaxfield@apple.com> > > Improve the performance of Font::canRenderCombiningCharacterSequence() >diff --git a/PerformanceTests/Layout/ComplexCharacterFallback.html b/PerformanceTests/Layout/ComplexCharacterFallback.html >new file mode 100644 >index 0000000000000000000000000000000000000000..e87fe877c3a8077a25b3267e008853721782372d >--- /dev/null >+++ b/PerformanceTests/Layout/ComplexCharacterFallback.html >@@ -0,0 +1,34 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta charset="utf-8"> >+<script src="../resources/runner.js"></script> >+</head> >+<body> >+<div id="target" style="width: 300px; display: none;"></div> >+<script> >+var target = document.getElementById("target"); >+var style = target.style; >+ >+var s = ""; >+for (var i = 0; i < 100; ++i) { >+ s = s + "\u0C1C\u0C4D\u0C1E\u200C\u0C3E"; >+} >+ >+ >+function test() { >+ if (window.internals) >+ window.internals.invalidateFontCache(); >+ >+ style.display = "block"; >+ target.offsetLeft; >+ target.textContent = s; >+ target.offsetLeft; >+ target.textContent = ""; >+ style.display = "none"; >+} >+ >+PerfTestRunner.measureRunsPerSecond({ run: test }); >+</script> >+</body> >+</html>
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 185976
:
341258
|
341259
|
341261
|
341263
|
341265
|
341370
|
341375
|
341379
|
341380
|
341387
|
341622
|
341630
|
341632
|
341634
|
341635
|
341667
|
341670
|
341671
|
341675
|
341718