Title: [252947] trunk/Source/WebCore
- Revision
- 252947
- Author
- za...@apple.com
- Date
- 2019-11-29 10:34:16 -0800 (Fri, 29 Nov 2019)
Log Message
[LFC][IFC] Add support for simple hyphenation
https://bugs.webkit.org/show_bug.cgi?id=204706
<rdar://problem/57533803>
Reviewed by Antti Koivisto.
This is just -webkit-hyphens: auto, no limit-before/after/lines support yet.
* layout/Verification.cpp:
(WebCore::Layout::LayoutContext::verifyAndOutputMismatchingLayoutTree):
* layout/inlineformatting/InlineLineBreaker.cpp:
(WebCore::Layout::LineBreaker::tryBreakingTextRun const):
* layout/inlineformatting/text/TextUtil.cpp:
(WebCore::Layout::TextUtil::split):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (252946 => 252947)
--- trunk/Source/WebCore/ChangeLog 2019-11-29 18:20:45 UTC (rev 252946)
+++ trunk/Source/WebCore/ChangeLog 2019-11-29 18:34:16 UTC (rev 252947)
@@ -1,3 +1,20 @@
+2019-11-29 Zalan Bujtas <za...@apple.com>
+
+ [LFC][IFC] Add support for simple hyphenation
+ https://bugs.webkit.org/show_bug.cgi?id=204706
+ <rdar://problem/57533803>
+
+ Reviewed by Antti Koivisto.
+
+ This is just -webkit-hyphens: auto, no limit-before/after/lines support yet.
+
+ * layout/Verification.cpp:
+ (WebCore::Layout::LayoutContext::verifyAndOutputMismatchingLayoutTree):
+ * layout/inlineformatting/InlineLineBreaker.cpp:
+ (WebCore::Layout::LineBreaker::tryBreakingTextRun const):
+ * layout/inlineformatting/text/TextUtil.cpp:
+ (WebCore::Layout::TextUtil::split):
+
2019-11-27 Antoine Quint <grao...@apple.com>
[Web Animations] Enable WebAnimationsCSSIntegrationEnabled by default
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp (252946 => 252947)
--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp 2019-11-29 18:20:45 UTC (rev 252946)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp 2019-11-29 18:34:16 UTC (rev 252947)
@@ -28,6 +28,7 @@
#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
+#include "FontCascade.h"
#include "Hyphenation.h"
#include "InlineItem.h"
#include "InlineTextItem.h"
@@ -130,7 +131,8 @@
Optional<LineBreaker::SplitLengthAndWidth> LineBreaker::tryBreakingTextRun(const Content::Run& overflowRun, LayoutUnit availableWidth) const
{
ASSERT(overflowRun.inlineItem.isText());
- auto breakWords = overflowRun.inlineItem.style().wordBreak();
+ auto& style = overflowRun.inlineItem.style();
+ auto breakWords = style.wordBreak();
if (breakWords == WordBreak::KeepAll)
return { };
auto& inlineTextItem = downcast<InlineTextItem>(overflowRun.inlineItem);
@@ -139,8 +141,26 @@
auto splitData = TextUtil::split(inlineTextItem.layoutBox(), inlineTextItem.start(), inlineTextItem.length(), overflowRun.logicalWidth, availableWidth, { });
return SplitLengthAndWidth { splitData.length, splitData.logicalWidth };
}
- // FIXME: Find first soft wrap opportunity (e.g. hyphenation)
- return { };
+ // Find the hyphen position as follows:
+ // 1. Split the text by taking the hyphen width into account
+ // 2. Find the last hyphen position before the split position
+ if (style.hyphens() != Hyphens::Auto || !canHyphenate(style.locale()))
+ return { };
+
+ auto& fontCascade = style.fontCascade();
+ // FIXME: We might want to cache the hyphen width.
+ auto hyphenWidth = LayoutUnit { fontCascade.width(TextRun { StringView { style.hyphenString() } }) };
+ auto availableWidthExcludingHyphen = availableWidth - hyphenWidth;
+ if (availableWidthExcludingHyphen <= 0 || !enoughWidthForHyphenation(availableWidthExcludingHyphen, fontCascade.pixelSize()))
+ return { };
+
+ auto splitData = TextUtil::split(inlineTextItem.layoutBox(), inlineTextItem.start(), inlineTextItem.length(), overflowRun.logicalWidth, availableWidthExcludingHyphen, { });
+ auto textContent = inlineTextItem.layoutBox().textContext()->content;
+ auto hyphenBefore = inlineTextItem.start() + splitData.length;
+ unsigned hyphenLocation = lastHyphenLocation(StringView(textContent).substring(inlineTextItem.start(), inlineTextItem.length()), hyphenBefore, style.locale());
+ if (!hyphenLocation)
+ return { };
+ return SplitLengthAndWidth { hyphenLocation, TextUtil::width(inlineTextItem.layoutBox(), inlineTextItem.start(), hyphenLocation) };
}
bool LineBreaker::Content::isAtContentBoundary(const InlineItem& inlineItem, const Content& content)
Modified: trunk/Source/WebCore/layout/inlineformatting/text/TextUtil.cpp (252946 => 252947)
--- trunk/Source/WebCore/layout/inlineformatting/text/TextUtil.cpp 2019-11-29 18:20:45 UTC (rev 252946)
+++ trunk/Source/WebCore/layout/inlineformatting/text/TextUtil.cpp 2019-11-29 18:34:16 UTC (rev 252947)
@@ -95,7 +95,6 @@
TextUtil::SplitData TextUtil::split(const Box& inlineBox, unsigned startPosition, unsigned length, LayoutUnit textWidth, LayoutUnit availableWidth, LayoutUnit contentLogicalLeft)
{
- // FIXME This should take hypens into account.
ASSERT(availableWidth >= 0);
auto left = startPosition;
// Pathological case of (extremely)long string and narrow lines.
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes