Skip to content

Commit

Permalink
[IFC][hanging punctuation] Add punctuation/stop/comma utility functio…
Browse files Browse the repository at this point in the history
…ns to TextUtil

https://bugs.webkit.org/show_bug.cgi?id=249543

Reviewed by Antti Koivisto.

This is in preparation for supporting "hanging-punctuation" property.
(Line builder/breaker is going to use these functions to check if the candidate content
has any hangable leading/trailing characters -as they should not be taken into account for line content fit).

* Source/WebCore/layout/formattingContexts/inline/text/TextUtil.cpp:
(WebCore::Layout::TextUtil::hangablePunctuationStartWidth):
(WebCore::Layout::TextUtil::hangablePunctuationEndWidth):
(WebCore::Layout::TextUtil::hangableStopOrCommaEndWidth):
* Source/WebCore/layout/formattingContexts/inline/text/TextUtil.h:

Canonical link: https://commits.webkit.org/258064@main
  • Loading branch information
alanbaradlay committed Dec 18, 2022
1 parent df8eda6 commit f561d98
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 0 deletions.
37 changes: 37 additions & 0 deletions Source/WebCore/layout/formattingContexts/inline/text/TextUtil.cpp
Expand Up @@ -432,6 +432,43 @@ TextRun TextUtil::ellipsisTextRun(bool isHorizontal)
return TextRun { verticalEllipsisStr->string() };
}

float TextUtil::hangablePunctuationStartWidth(const InlineTextItem& inlineTextItem, const RenderStyle& style)
{
ASSERT(inlineTextItem.length());
auto startPosition = inlineTextItem.start();
auto leadingCharacter = inlineTextItem.inlineTextBox().content()[startPosition];
auto isHangablePunctuationAtLineStart = U_GET_GC_MASK(leadingCharacter) & (U_GC_PS_MASK | U_GC_PI_MASK | U_GC_PF_MASK);
if (!isHangablePunctuationAtLineStart)
return { };
return width(inlineTextItem, style.fontCascade(), startPosition, startPosition + 1, { });
}

float TextUtil::hangablePunctuationEndWidth(const InlineTextItem& inlineTextItem, const RenderStyle& style)
{
ASSERT(inlineTextItem.length());
auto endPosition = inlineTextItem.end();
auto trailingCharacter = inlineTextItem.inlineTextBox().content()[endPosition];
auto isHangablePunctuationAtLineEnd = U_GET_GC_MASK(trailingCharacter) & (U_GC_PE_MASK | U_GC_PI_MASK | U_GC_PF_MASK);
if (!isHangablePunctuationAtLineEnd)
return { };
return width(inlineTextItem, style.fontCascade(), endPosition, endPosition + 1, { });
}

float TextUtil::hangableStopOrCommaEndWidth(const InlineTextItem& inlineTextItem, const RenderStyle& style)
{
auto endPosition = inlineTextItem.end();
auto trailingCharacter = inlineTextItem.inlineTextBox().content()[endPosition];
auto isHangableStopOrComma = trailingCharacter == 0x002C
|| trailingCharacter == 0x002E || trailingCharacter == 0x060C
|| trailingCharacter == 0x06D4 || trailingCharacter == 0x3001
|| trailingCharacter == 0x3002 || trailingCharacter == 0xFF0C
|| trailingCharacter == 0xFF0E || trailingCharacter == 0xFE50
|| trailingCharacter == 0xFE51 || trailingCharacter == 0xFE52
|| trailingCharacter == 0xFF61 || trailingCharacter == 0xFF64;
if (!isHangableStopOrComma)
return { };
return width(inlineTextItem, style.fontCascade(), endPosition, endPosition + 1, { });
}

}
}
Expand Up @@ -81,6 +81,11 @@ class TextUtil {
static size_t firstUserPerceivedCharacterLength(const InlineTextItem&);
static size_t firstUserPerceivedCharacterLength(const InlineTextBox&, size_t startPosition, size_t length);
static TextDirection directionForTextContent(StringView);

static float hangablePunctuationStartWidth(const InlineTextItem&, const RenderStyle&);
static float hangablePunctuationEndWidth(const InlineTextItem&, const RenderStyle&);
static float hangableStopOrCommaEndWidth(const InlineTextItem&, const RenderStyle&);

};

}
Expand Down

0 comments on commit f561d98

Please sign in to comment.