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

Reply via email to