Title: [233441] trunk/Source/WebCore
- Revision
- 233441
- Author
- [email protected]
- Date
- 2018-07-02 15:27:42 -0700 (Mon, 02 Jul 2018)
Log Message
Refactor InlineTextBox::emphasisMarkExistsAndIsAbove()
<https://webkit.org/b/187204>
Reviewed by Darin Adler.
No new tests since there is no change in behavior.
Refactor emphasisMarkExistsAndIsAbove() to return a
std::optional<bool> instead of returning a bool and taking a
std::optional<bool> argument. The state returned is now:
- std::nullopt => emphasis mark doesn't exist or is suppressed.
- false => emphasis mark exists and is not suppressed, but is not above.
- true => emphasis mark exists and is not suppressed, and is above.
* rendering/InlineFlowBox.cpp:
(WebCore::InlineFlowBox::placeBoxesInBlockDirection):
(WebCore::InlineFlowBox::addTextBoxVisualOverflow):
(WebCore::InlineFlowBox::computeOverAnnotationAdjustment const):
(WebCore::InlineFlowBox::computeUnderAnnotationAdjustment const):
- Update for refactored method. Remove some redundant checks
for TextEmphasisMark::None that already happen in
emphasisMarkExistsAndIsAbove().
* rendering/InlineTextBox.cpp:
(WebCore::emphasisPositionHasNeitherLeftNorRight): Delete.
- Replaced by an OptionSet<TextEmphasisPosition>.
(WebCore::InlineTextBox::emphasisMarkExistsAndIsAbove const):
- Refactor as described above.
(WebCore::InlineTextBox::paintMarkedTextForeground):
- Update for refactored method.
* rendering/InlineTextBox.h:
(WebCore::InlineTextBox::emphasisMarkExistsAndIsAbove const):
- Update for new method signature.
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (233440 => 233441)
--- trunk/Source/WebCore/ChangeLog 2018-07-02 22:20:46 UTC (rev 233440)
+++ trunk/Source/WebCore/ChangeLog 2018-07-02 22:27:42 UTC (rev 233441)
@@ -1,3 +1,38 @@
+2018-07-02 David Kilzer <[email protected]>
+
+ Refactor InlineTextBox::emphasisMarkExistsAndIsAbove()
+ <https://webkit.org/b/187204>
+
+ Reviewed by Darin Adler.
+
+ No new tests since there is no change in behavior.
+
+ Refactor emphasisMarkExistsAndIsAbove() to return a
+ std::optional<bool> instead of returning a bool and taking a
+ std::optional<bool> argument. The state returned is now:
+ - std::nullopt => emphasis mark doesn't exist or is suppressed.
+ - false => emphasis mark exists and is not suppressed, but is not above.
+ - true => emphasis mark exists and is not suppressed, and is above.
+
+ * rendering/InlineFlowBox.cpp:
+ (WebCore::InlineFlowBox::placeBoxesInBlockDirection):
+ (WebCore::InlineFlowBox::addTextBoxVisualOverflow):
+ (WebCore::InlineFlowBox::computeOverAnnotationAdjustment const):
+ (WebCore::InlineFlowBox::computeUnderAnnotationAdjustment const):
+ - Update for refactored method. Remove some redundant checks
+ for TextEmphasisMark::None that already happen in
+ emphasisMarkExistsAndIsAbove().
+ * rendering/InlineTextBox.cpp:
+ (WebCore::emphasisPositionHasNeitherLeftNorRight): Delete.
+ - Replaced by an OptionSet<TextEmphasisPosition>.
+ (WebCore::InlineTextBox::emphasisMarkExistsAndIsAbove const):
+ - Refactor as described above.
+ (WebCore::InlineTextBox::paintMarkedTextForeground):
+ - Update for refactored method.
+ * rendering/InlineTextBox.h:
+ (WebCore::InlineTextBox::emphasisMarkExistsAndIsAbove const):
+ - Update for new method signature.
+
2018-07-02 Megan Gardner <[email protected]>
Enable copy paste on iOS apps for Mac
Modified: trunk/Source/WebCore/rendering/InlineFlowBox.cpp (233440 => 233441)
--- trunk/Source/WebCore/rendering/InlineFlowBox.cpp 2018-07-02 22:20:46 UTC (rev 233440)
+++ trunk/Source/WebCore/rendering/InlineFlowBox.cpp 2018-07-02 22:27:42 UTC (rev 233441)
@@ -698,9 +698,8 @@
}
}
if (is<InlineTextBox>(*child)) {
- std::optional<bool> emphasisMarkIsAbove;
- if (downcast<InlineTextBox>(*child).emphasisMarkExistsAndIsAbove(childLineStyle, emphasisMarkIsAbove)) {
- if (emphasisMarkIsAbove && (*emphasisMarkIsAbove != childLineStyle.isFlippedLinesWritingMode()))
+ if (std::optional<bool> markExistsAndIsAbove = downcast<InlineTextBox>(*child).emphasisMarkExistsAndIsAbove(childLineStyle)) {
+ if (*markExistsAndIsAbove != childLineStyle.isFlippedLinesWritingMode())
hasAnnotationsBefore = true;
else
hasAnnotationsAfter = true;
@@ -894,10 +893,9 @@
int leftGlyphOverflow = -strokeOverflow - leftGlyphEdge;
int rightGlyphOverflow = strokeOverflow + rightGlyphEdge;
- std::optional<bool> emphasisMarkIsAbove;
- if (lineStyle.textEmphasisMark() != TextEmphasisMark::None && textBox.emphasisMarkExistsAndIsAbove(lineStyle, emphasisMarkIsAbove)) {
+ if (std::optional<bool> markExistsAndIsAbove = textBox.emphasisMarkExistsAndIsAbove(lineStyle)) {
int emphasisMarkHeight = lineStyle.fontCascade().emphasisMarkHeight(lineStyle.textEmphasisMarkString());
- if (emphasisMarkIsAbove && (*emphasisMarkIsAbove == !lineStyle.isFlippedLinesWritingMode()))
+ if (*markExistsAndIsAbove == !lineStyle.isFlippedLinesWritingMode())
topGlyphOverflow = std::min(topGlyphOverflow, -emphasisMarkHeight);
else
bottomGlyphOverflow = std::max(bottomGlyphOverflow, emphasisMarkHeight);
@@ -1575,8 +1573,8 @@
if (is<InlineTextBox>(*child)) {
const RenderStyle& childLineStyle = child->lineStyle();
- std::optional<bool> emphasisMarkIsAbove;
- if (childLineStyle.textEmphasisMark() != TextEmphasisMark::None && downcast<InlineTextBox>(*child).emphasisMarkExistsAndIsAbove(childLineStyle, emphasisMarkIsAbove) && emphasisMarkIsAbove && *emphasisMarkIsAbove) {
+ std::optional<bool> markExistsAndIsAbove = downcast<InlineTextBox>(*child).emphasisMarkExistsAndIsAbove(childLineStyle);
+ if (markExistsAndIsAbove && *markExistsAndIsAbove) {
if (!childLineStyle.isFlippedLinesWritingMode()) {
int topOfEmphasisMark = child->logicalTop() - childLineStyle.fontCascade().emphasisMarkHeight(childLineStyle.textEmphasisMarkString());
result = std::max(result, allowedPosition - topOfEmphasisMark);
@@ -1623,9 +1621,8 @@
if (is<InlineTextBox>(*child)) {
const RenderStyle& childLineStyle = child->lineStyle();
- std::optional<bool> emphasisMarkIsAbove;
- downcast<InlineTextBox>(*child).emphasisMarkExistsAndIsAbove(childLineStyle, emphasisMarkIsAbove);
- if (childLineStyle.textEmphasisMark() != TextEmphasisMark::None && emphasisMarkIsAbove && !*emphasisMarkIsAbove) {
+ std::optional<bool> markExistsAndIsAbove = downcast<InlineTextBox>(*child).emphasisMarkExistsAndIsAbove(childLineStyle);
+ if (markExistsAndIsAbove && !*markExistsAndIsAbove) {
if (!childLineStyle.isFlippedLinesWritingMode()) {
LayoutUnit bottomOfEmphasisMark = child->logicalBottom() + childLineStyle.fontCascade().emphasisMarkHeight(childLineStyle.textEmphasisMarkString());
result = std::max(result, bottomOfEmphasisMark - allowedPosition);
Modified: trunk/Source/WebCore/rendering/InlineTextBox.cpp (233440 => 233441)
--- trunk/Source/WebCore/rendering/InlineTextBox.cpp 2018-07-02 22:20:46 UTC (rev 233440)
+++ trunk/Source/WebCore/rendering/InlineTextBox.cpp 2018-07-02 22:27:42 UTC (rev 233441)
@@ -353,43 +353,45 @@
return false;
}
-static inline bool emphasisPositionHasNeitherLeftNorRight(OptionSet<TextEmphasisPosition> emphasisPosition)
+std::optional<bool> InlineTextBox::emphasisMarkExistsAndIsAbove(const RenderStyle& style) const
{
- return !(emphasisPosition & TextEmphasisPosition::Left) && !(emphasisPosition & TextEmphasisPosition::Right);
-}
-
-bool InlineTextBox::emphasisMarkExistsAndIsAbove(const RenderStyle& style, std::optional<bool>& above) const
-{
// This function returns true if there are text emphasis marks and they are suppressed by ruby text.
if (style.textEmphasisMark() == TextEmphasisMark::None)
- return false;
+ return std::nullopt;
+ const OptionSet<TextEmphasisPosition> horizontalMask { TextEmphasisPosition::Left, TextEmphasisPosition::Right };
+
auto emphasisPosition = style.textEmphasisPosition();
+ auto emphasisPositionHorizontalValue = emphasisPosition & horizontalMask;
ASSERT(!((emphasisPosition & TextEmphasisPosition::Over) && (emphasisPosition & TextEmphasisPosition::Under)));
- ASSERT(!((emphasisPosition & TextEmphasisPosition::Left) && (emphasisPosition & TextEmphasisPosition::Right)));
-
- if (emphasisPositionHasNeitherLeftNorRight(emphasisPosition))
- above = emphasisPosition.contains(TextEmphasisPosition::Over);
+ ASSERT(emphasisPositionHorizontalValue != horizontalMask);
+
+ bool isAbove = false;
+ if (!emphasisPositionHorizontalValue)
+ isAbove = emphasisPosition.contains(TextEmphasisPosition::Over);
else if (style.isHorizontalWritingMode())
- above = emphasisPosition.contains(TextEmphasisPosition::Over);
+ isAbove = emphasisPosition.contains(TextEmphasisPosition::Over);
else
- above = emphasisPosition.contains(TextEmphasisPosition::Right);
-
+ isAbove = emphasisPositionHorizontalValue == TextEmphasisPosition::Right;
+
if ((style.isHorizontalWritingMode() && (emphasisPosition & TextEmphasisPosition::Under))
|| (!style.isHorizontalWritingMode() && (emphasisPosition & TextEmphasisPosition::Left)))
- return true; // Ruby text is always over, so it cannot suppress emphasis marks under.
+ return isAbove; // Ruby text is always over, so it cannot suppress emphasis marks under.
RenderBlock* containingBlock = renderer().containingBlock();
if (!containingBlock->isRubyBase())
- return true; // This text is not inside a ruby base, so it does not have ruby text over it.
+ return isAbove; // This text is not inside a ruby base, so it does not have ruby text over it.
if (!is<RenderRubyRun>(*containingBlock->parent()))
- return true; // Cannot get the ruby text.
+ return isAbove; // Cannot get the ruby text.
RenderRubyText* rubyText = downcast<RenderRubyRun>(*containingBlock->parent()).rubyText();
// The emphasis marks over are suppressed only if there is a ruby text box and it not empty.
- return !rubyText || !rubyText->hasLines();
+ if (rubyText && rubyText->hasLines())
+ return std::nullopt;
+
+ return isAbove;
}
struct InlineTextBox::MarkedTextStyle {
@@ -1012,11 +1014,10 @@
const RenderStyle& lineStyle = this->lineStyle();
float emphasisMarkOffset = 0;
- std::optional<bool> emphasisMarkAbove;
- bool hasTextEmphasis = emphasisMarkExistsAndIsAbove(lineStyle, emphasisMarkAbove);
- const AtomicString& emphasisMark = hasTextEmphasis ? lineStyle.textEmphasisMarkString() : nullAtom();
+ std::optional<bool> markExistsAndIsAbove = emphasisMarkExistsAndIsAbove(lineStyle);
+ const AtomicString& emphasisMark = markExistsAndIsAbove ? lineStyle.textEmphasisMarkString() : nullAtom();
if (!emphasisMark.isEmpty())
- emphasisMarkOffset = (emphasisMarkAbove && *emphasisMarkAbove) ? -font.fontMetrics().ascent() - font.emphasisMarkDescent(emphasisMark) : font.fontMetrics().descent() + font.emphasisMarkAscent(emphasisMark);
+ emphasisMarkOffset = *markExistsAndIsAbove ? -font.fontMetrics().ascent() - font.emphasisMarkDescent(emphasisMark) : font.fontMetrics().descent() + font.emphasisMarkAscent(emphasisMark);
TextPainter textPainter { context };
textPainter.setFont(font);
Modified: trunk/Source/WebCore/rendering/InlineTextBox.h (233440 => 233441)
--- trunk/Source/WebCore/rendering/InlineTextBox.h 2018-07-02 22:20:46 UTC (rev 233440)
+++ trunk/Source/WebCore/rendering/InlineTextBox.h 2018-07-02 22:27:42 UTC (rev 233441)
@@ -87,7 +87,7 @@
int baselinePosition(FontBaseline) const final;
LayoutUnit lineHeight() const final;
- bool emphasisMarkExistsAndIsAbove(const RenderStyle&, std::optional<bool>& isAbove) const;
+ std::optional<bool> emphasisMarkExistsAndIsAbove(const RenderStyle&) const;
LayoutRect logicalOverflowRect() const;
void setLogicalOverflowRect(const LayoutRect&);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes