WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
bug-176844-20170913091250.patch (text/plain), 41.33 KB, created by
Daniel Bates
on 2017-09-13 09:12:50 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Daniel Bates
Created:
2017-09-13 09:12:50 PDT
Size:
41.33 KB
patch
obsolete
>Subversion Revision: 221956 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 5eee35df345f988f48cce9027c1fd03a7e0766e2..4cbeac40ae5ffe006abe54627ccf87382bd3b485 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,71 @@ >+2017-09-13 Daniel Bates <dabates@apple.com> >+ >+ Use OptionSet<TextDecoration> instead of bitmask >+ https://bugs.webkit.org/show_bug.cgi?id=176844 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Use an OptionSet to represent a set of text decorations instead of a >+ bitmask. Unlike the latter, an OptionSet preserves type safety (it can >+ only contain values of type TextDecoration) and makes it explicit to >+ a reader that we are passing around a set of text decorations as opposed >+ to a single text decoration value. >+ >+ No functionality changed. So, no new tests. >+ >+ * accessibility/AccessibilityRenderObject.cpp: >+ (WebCore::AccessibilityRenderObject::hasPlainText const): >+ (WebCore::AccessibilityRenderObject::hasUnderline const): >+ * accessibility/ios/WebAccessibilityObjectWrapperIOS.mm: >+ (AXAttributeStringSetStyle): >+ * accessibility/mac/WebAccessibilityObjectWrapperMac.mm: >+ (AXAttributeStringSetStyle): >+ * css/CSSComputedStyleDeclaration.cpp: >+ (WebCore::renderTextDecorationFlagsToCSSValue): >+ * css/StyleBuilderConverter.h: >+ (WebCore::StyleBuilderConverter::convertTextDecoration): >+ * editing/cocoa/EditorCocoa.mm: >+ (WebCore::Editor::getTextDecorationAttributesRespectingTypingStyle const): >+ * editing/cocoa/HTMLConverter.mm: >+ (WebCore::editingAttributedStringFromRange): >+ * rendering/InlineFlowBox.cpp: >+ (WebCore::InlineFlowBox::maxLogicalBottomForTextDecorationLine const): >+ (WebCore::InlineFlowBox::minLogicalTopForTextDecorationLine const): >+ * rendering/InlineTextBox.cpp: >+ (WebCore::InlineTextBox::paint): >+ (WebCore::InlineTextBox::paintDecoration): >+ * rendering/InlineTextBox.h: >+ * rendering/RenderBlockLineLayout.cpp: >+ (WebCore::setLogicalWidthForTextRun): >+ * rendering/RenderElement.cpp: >+ (WebCore::RenderElement::enclosingRendererWithTextDecoration const): >+ * rendering/SimpleLineLayout.cpp: >+ (WebCore::SimpleLineLayout::canUseForStyle): >+ * rendering/SimpleLineLayoutFunctions.cpp: >+ (WebCore::SimpleLineLayout::paintFlow): >+ * rendering/TextDecorationPainter.cpp: >+ (WebCore::TextDecorationPainter::TextDecorationPainter): >+ (WebCore::TextDecorationPainter::paintTextDecoration): >+ (WebCore::collectStylesForRenderer): >+ (WebCore::TextDecorationPainter::stylesForRenderer): >+ * rendering/TextDecorationPainter.h: >+ * rendering/TextPaintStyle.cpp: >+ (WebCore::computeTextPaintStyle): >+ * rendering/style/RenderStyle.cpp: >+ * rendering/style/RenderStyle.h: >+ (WebCore::RenderStyle::textDecorationsInEffect const): >+ (WebCore::RenderStyle::textDecoration const): >+ (WebCore::RenderStyle::addToTextDecorationsInEffect): >+ (WebCore::RenderStyle::setTextDecorationsInEffect): >+ (WebCore::RenderStyle::setTextDecoration): >+ * rendering/style/RenderStyleConstants.h: >+ * rendering/svg/SVGInlineTextBox.cpp: >+ (WebCore::SVGInlineTextBox::paint): >+ (WebCore::findRendererDefininingTextDecoration): >+ (WebCore::SVGInlineTextBox::paintDecoration): >+ * style/InlineTextBoxStyle.cpp: >+ (WebCore::visualOverflowForDecorations): >+ > 2017-09-12 Wenson Hsieh <wenson_hsieh@apple.com> > > [iOS DnD] Support DataTransfer.getData and DataTransfer.setData when dragging or dropping >diff --git a/Source/WebCore/accessibility/AccessibilityRenderObject.cpp b/Source/WebCore/accessibility/AccessibilityRenderObject.cpp >index d2de1f3629309e5d68a9b751deba28d7555aede8..551555977ff2d301c086cc5eb1a4b8a43b895d9f 100644 >--- a/Source/WebCore/accessibility/AccessibilityRenderObject.cpp >+++ b/Source/WebCore/accessibility/AccessibilityRenderObject.cpp >@@ -3540,7 +3540,7 @@ bool AccessibilityRenderObject::hasPlainText() const > > return style.fontDescription().weight() == normalWeightValue() > && style.fontDescription().italic() == normalItalicValue() >- && style.textDecorationsInEffect() == TextDecorationNone; >+ && style.textDecorationsInEffect().isEmpty(); > } > > bool AccessibilityRenderObject::hasSameFont(RenderObject* renderer) const >@@ -3572,7 +3572,7 @@ bool AccessibilityRenderObject::hasUnderline() const > if (!m_renderer) > return false; > >- return m_renderer->style().textDecorationsInEffect() & TextDecorationUnderline; >+ return m_renderer->style().textDecorationsInEffect().contains(TextDecorationUnderline); > } > > String AccessibilityRenderObject::nameForMSAA() const >diff --git a/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm b/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm >index 5feb354e38d92ce39bcbd6d0cdd413a1ebd9df3f..ff36a2fa05c7ffee104bc5a2520f6f39b8cd0d40 100644 >--- a/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm >+++ b/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm >@@ -59,6 +59,7 @@ > #import "WAKWindow.h" > #import "WebCoreThread.h" > #import "VisibleUnits.h" >+#import <wtf/OptionSet.h> > > #import <CoreText/CoreText.h> > >@@ -2148,8 +2149,8 @@ static void AXAttributeStringSetStyle(NSMutableAttributedString* attrString, Ren > // set basic font info > AXAttributeStringSetFont(attrString, style.fontCascade().primaryFont().getCTFont(), range); > >- int decor = style.textDecorationsInEffect(); >- if (decor & TextDecorationUnderline) >+ OptionSet<TextDecoration> decorations = style.textDecorationsInEffect(); >+ if (decorations.contains(TextDecorationUnderline)) > AXAttributeStringSetNumber(attrString, UIAccessibilityTokenUnderline, @YES, range); > } > >diff --git a/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm b/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm >index dcf747ed6ca16bce2d1f55f7fb9c53b2501711e5..1503138353689439bbf7d7c5d5ca9e5fd89bb2a1 100644 >--- a/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm >+++ b/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm >@@ -868,27 +868,27 @@ static void AXAttributeStringSetStyle(NSMutableAttributedString* attrString, Ren > [attrString removeAttribute:NSAccessibilityShadowTextAttribute range:range]; > > // set underline and strikethrough >- int decor = style.textDecorationsInEffect(); >- if ((decor & TextDecorationUnderline) == 0) { >+ OptionSet<TextDecoration> decorations = style.textDecorationsInEffect(); >+ if (!decorations.contains(TextDecorationUnderline)) { > [attrString removeAttribute:NSAccessibilityUnderlineTextAttribute range:range]; > [attrString removeAttribute:NSAccessibilityUnderlineColorTextAttribute range:range]; > } > >- if ((decor & TextDecorationLineThrough) == 0) { >+ if (!decorations.contains(TextDecorationLineThrough)) { > [attrString removeAttribute:NSAccessibilityStrikethroughTextAttribute range:range]; > [attrString removeAttribute:NSAccessibilityStrikethroughColorTextAttribute range:range]; > } > >- if ((decor & (TextDecorationUnderline | TextDecorationLineThrough)) != 0) { >+ if (decorations.contains(TextDecorationUnderline) || decorations.contains(TextDecorationLineThrough)) { > // FIXME: Should the underline style be reported here? >- auto decorationStyles = TextDecorationPainter::stylesForRenderer(*renderer, decor); >+ auto decorationStyles = TextDecorationPainter::stylesForRenderer(*renderer, decorations); > >- if ((decor & TextDecorationUnderline) != 0) { >+ if (decorations.contains(TextDecorationUnderline)) { > AXAttributeStringSetNumber(attrString, NSAccessibilityUnderlineTextAttribute, @YES, range); > AXAttributeStringSetColor(attrString, NSAccessibilityUnderlineColorTextAttribute, nsColor(decorationStyles.underlineColor), range); > } > >- if ((decor & TextDecorationLineThrough) != 0) { >+ if (decorations.contains(TextDecorationLineThrough)) { > AXAttributeStringSetNumber(attrString, NSAccessibilityStrikethroughTextAttribute, @YES, range); > AXAttributeStringSetColor(attrString, NSAccessibilityStrikethroughColorTextAttribute, nsColor(decorationStyles.linethroughColor), range); > } >diff --git a/Source/WebCore/css/CSSComputedStyleDeclaration.cpp b/Source/WebCore/css/CSSComputedStyleDeclaration.cpp >index 01f2428d60992fe4f940b300e3e6468dbc6ba0ad..90d7ad7236823e2312798ff36ad8b1f08219917b 100644 >--- a/Source/WebCore/css/CSSComputedStyleDeclaration.cpp >+++ b/Source/WebCore/css/CSSComputedStyleDeclaration.cpp >@@ -75,6 +75,7 @@ > #include "WebKitFontFamilyNames.h" > #include "WillChangeData.h" > #include <wtf/NeverDestroyed.h> >+#include <wtf/OptionSet.h> > #include <wtf/text/StringBuilder.h> > > #include "CSSGridLineNamesValue.h" >@@ -1760,19 +1761,19 @@ static Ref<CSSPrimitiveValue> valueForFamily(const AtomicString& family) > return CSSValuePool::singleton().createFontFamilyValue(family); > } > >-static Ref<CSSValue> renderTextDecorationFlagsToCSSValue(int textDecoration) >+static Ref<CSSValue> renderTextDecorationFlagsToCSSValue(const OptionSet<TextDecoration>& textDecorations) > { > auto& cssValuePool = CSSValuePool::singleton(); > // Blink value is ignored. > auto list = CSSValueList::createSpaceSeparated(); >- if (textDecoration & TextDecorationUnderline) >+ if (textDecorations.contains(TextDecorationUnderline)) > list->append(cssValuePool.createIdentifierValue(CSSValueUnderline)); >- if (textDecoration & TextDecorationOverline) >+ if (textDecorations.contains(TextDecorationOverline)) > list->append(cssValuePool.createIdentifierValue(CSSValueOverline)); >- if (textDecoration & TextDecorationLineThrough) >+ if (textDecorations.contains(TextDecorationLineThrough)) > list->append(cssValuePool.createIdentifierValue(CSSValueLineThrough)); > #if ENABLE(LETTERPRESS) >- if (textDecoration & TextDecorationLetterpress) >+ if (textDecorations.contains(TextDecorationLetterpress)) > list->append(cssValuePool.createIdentifierValue(CSSValueWebkitLetterpress)); > #endif > >diff --git a/Source/WebCore/css/StyleBuilderConverter.h b/Source/WebCore/css/StyleBuilderConverter.h >index be05fe19c3702155256adf57719fdb9ee4b7f4e6..ed42a78d8e6aae135866037a704dc0fa43b8d700 100644 >--- a/Source/WebCore/css/StyleBuilderConverter.h >+++ b/Source/WebCore/css/StyleBuilderConverter.h >@@ -53,6 +53,7 @@ > #include "StyleResolver.h" > #include "StyleScrollSnapPoints.h" > #include "TransformFunctions.h" >+#include <wtf/OptionSet.h> > #include <wtf/Optional.h> > > namespace WebCore { >@@ -69,7 +70,7 @@ public: > static float convertSpacing(StyleResolver&, const CSSValue&); > static LengthSize convertRadius(StyleResolver&, const CSSValue&); > static LengthPoint convertObjectPosition(StyleResolver&, const CSSValue&); >- static TextDecoration convertTextDecoration(StyleResolver&, const CSSValue&); >+ static OptionSet<TextDecoration> convertTextDecoration(StyleResolver&, const CSSValue&); > template<typename T> static T convertNumber(StyleResolver&, const CSSValue&); > template<typename T> static T convertNumberOrAuto(StyleResolver&, const CSSValue&); > static short convertWebkitHyphenateLimitLines(StyleResolver&, const CSSValue&); >@@ -387,12 +388,12 @@ inline LengthPoint StyleBuilderConverter::convertObjectPosition(StyleResolver& s > return LengthPoint(lengthX, lengthY); > } > >-inline TextDecoration StyleBuilderConverter::convertTextDecoration(StyleResolver&, const CSSValue& value) >+inline OptionSet<TextDecoration> StyleBuilderConverter::convertTextDecoration(StyleResolver&, const CSSValue& value) > { >- TextDecoration result = RenderStyle::initialTextDecoration(); >+ OptionSet<TextDecoration> result { RenderStyle::initialTextDecoration() }; > if (is<CSSValueList>(value)) { > for (auto& currentValue : downcast<CSSValueList>(value)) >- result |= downcast<CSSPrimitiveValue>(currentValue.get()); >+ result |= static_cast<TextDecoration>(downcast<CSSPrimitiveValue>(currentValue.get())); > } > return result; > } >diff --git a/Source/WebCore/editing/cocoa/EditorCocoa.mm b/Source/WebCore/editing/cocoa/EditorCocoa.mm >index 7d1c2e97830c42c695e646f75daf0d6e335d5c07..7e816e78ae223d6ae395d83c04aa039e109674c9 100644 >--- a/Source/WebCore/editing/cocoa/EditorCocoa.mm >+++ b/Source/WebCore/editing/cocoa/EditorCocoa.mm >@@ -78,10 +78,10 @@ void Editor::getTextDecorationAttributesRespectingTypingStyle(const RenderStyle& > [result setObject:@(NSUnderlineStyleSingle) forKey:NSUnderlineStyleAttributeName]; > } > } else { >- int decoration = style.textDecorationsInEffect(); >- if (decoration & TextDecorationLineThrough) >+ OptionSet<TextDecoration> decorations = style.textDecorationsInEffect(); >+ if (decorations.contains(TextDecorationLineThrough)) > [result setObject:@(NSUnderlineStyleSingle) forKey:NSStrikethroughStyleAttributeName]; >- if (decoration & TextDecorationUnderline) >+ if (decorations.contains(TextDecorationUnderline)) > [result setObject:@(NSUnderlineStyleSingle) forKey:NSUnderlineStyleAttributeName]; > } > } >diff --git a/Source/WebCore/editing/cocoa/HTMLConverter.mm b/Source/WebCore/editing/cocoa/HTMLConverter.mm >index bc5f29c5fe06c136529bdfd8880da06d4845b05a..a1a5b63bbdc891c583b06d79a0b45cb181a3a141 100644 >--- a/Source/WebCore/editing/cocoa/HTMLConverter.mm >+++ b/Source/WebCore/editing/cocoa/HTMLConverter.mm >@@ -2509,9 +2509,9 @@ NSAttributedString *editingAttributedStringFromRange(Range& range, IncludeImages > if (!renderer) > continue; > const RenderStyle& style = renderer->style(); >- if (style.textDecorationsInEffect() & TextDecorationUnderline) >+ if (style.textDecorationsInEffect().contains(TextDecorationUnderline)) > [attrs.get() setObject:[NSNumber numberWithInteger:NSUnderlineStyleSingle] forKey:NSUnderlineStyleAttributeName]; >- if (style.textDecorationsInEffect() & TextDecorationLineThrough) >+ if (style.textDecorationsInEffect().contains(TextDecorationLineThrough)) > [attrs.get() setObject:[NSNumber numberWithInteger:NSUnderlineStyleSingle] forKey:NSStrikethroughStyleAttributeName]; > if (auto font = style.fontCascade().primaryFont().getCTFont()) > [attrs.get() setObject:toNSFont(font) forKey:NSFontAttributeName]; >diff --git a/Source/WebCore/rendering/InlineFlowBox.cpp b/Source/WebCore/rendering/InlineFlowBox.cpp >index 38a0d406d37195c377eb630faa23e7cbf11ff70b..9f77d2516da63eb6296559483566a41f46dcce9b 100644 >--- a/Source/WebCore/rendering/InlineFlowBox.cpp >+++ b/Source/WebCore/rendering/InlineFlowBox.cpp >@@ -747,7 +747,7 @@ void InlineFlowBox::maxLogicalBottomForTextDecorationLine(float& maxLogicalBotto > if (child->renderer().isOutOfFlowPositioned()) > continue; // Positioned placeholders don't affect calculations. > >- if (!(child->lineStyle().textDecorationsInEffect() & textDecoration)) >+ if (!child->lineStyle().textDecorationsInEffect().contains(textDecoration)) > continue; // If the text decoration isn't in effect on the child, then it must be outside of |decorationRenderer|'s hierarchy. > > if (decorationRenderer && decorationRenderer->isRenderInline() && !isAncestorAndWithinBlock(downcast<RenderInline>(*decorationRenderer), &child->renderer())) >@@ -768,7 +768,7 @@ void InlineFlowBox::minLogicalTopForTextDecorationLine(float& minLogicalTop, con > if (child->renderer().isOutOfFlowPositioned()) > continue; // Positioned placeholders don't affect calculations. > >- if (!(child->lineStyle().textDecorationsInEffect() & textDecoration)) >+ if (!child->lineStyle().textDecorationsInEffect().contains(textDecoration)) > continue; // If the text decoration isn't in effect on the child, then it must be outside of |decorationRenderer|'s hierarchy. > > if (decorationRenderer && decorationRenderer->isRenderInline() && !isAncestorAndWithinBlock(downcast<RenderInline>(*decorationRenderer), &child->renderer())) >diff --git a/Source/WebCore/rendering/InlineTextBox.cpp b/Source/WebCore/rendering/InlineTextBox.cpp >index 575fa06ade60c5013aee451b7e43a91d30f2fd5b..8b712c78d29774c46d7dd6d808f1cc2d438cb758 100644 >--- a/Source/WebCore/rendering/InlineTextBox.cpp >+++ b/Source/WebCore/rendering/InlineTextBox.cpp >@@ -49,6 +49,7 @@ > #include "TextPaintStyle.h" > #include "TextPainter.h" > #include <stdio.h> >+#include <wtf/OptionSet.h> > #include <wtf/text/CString.h> > #include <wtf/text/TextStream.h> > >@@ -580,8 +581,8 @@ void InlineTextBox::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset, > textPainter.paint(textRun, length, boxRect, textOrigin, selectionStart, selectionEnd, paintSelectedTextOnly, paintSelectedTextSeparately, paintNonSelectedTextOnly); > > // Paint decorations >- TextDecoration textDecorations = lineStyle.textDecorationsInEffect(); >- if (textDecorations != TextDecorationNone && paintInfo.phase != PaintPhaseSelection) { >+ OptionSet<TextDecoration> textDecorations = lineStyle.textDecorationsInEffect(); >+ if (!textDecorations.isEmpty() && paintInfo.phase != PaintPhaseSelection) { > FloatRect textDecorationSelectionClipOutRect; > if ((paintInfo.paintBehavior & PaintBehaviorExcludeSelection) && selectionStart < selectionEnd && selectionEnd <= length) { > textDecorationSelectionClipOutRect = logicalOverflowRect(); >@@ -741,7 +742,7 @@ static inline void mirrorRTLSegment(float logicalWidth, TextDirection direction, > } > > void InlineTextBox::paintDecoration(GraphicsContext& context, const FontCascade& font, RenderCombineText* combinedText, const TextRun& textRun, const FloatPoint& textOrigin, >- const FloatRect& boxRect, TextDecoration decoration, TextPaintStyle textPaintStyle, const ShadowData* shadow, const FloatRect& clipOutRect) >+ const FloatRect& boxRect, const OptionSet<TextDecoration>& decoration, TextPaintStyle textPaintStyle, const ShadowData* shadow, const FloatRect& clipOutRect) > { > if (m_truncation == cFullTruncation) > return; >diff --git a/Source/WebCore/rendering/InlineTextBox.h b/Source/WebCore/rendering/InlineTextBox.h >index 2274dc77e03699da06a9f91e35ed3727aca55d3b..bde76a9ae61a4e350c3ea077a02b6e39d090b970 100644 >--- a/Source/WebCore/rendering/InlineTextBox.h >+++ b/Source/WebCore/rendering/InlineTextBox.h >@@ -25,6 +25,7 @@ > #include "InlineBox.h" > #include "RenderText.h" > #include "TextRun.h" >+#include <wtf/Forward.h> > > namespace WebCore { > >@@ -159,7 +160,7 @@ protected: > > private: > void paintDecoration(GraphicsContext&, const FontCascade&, RenderCombineText*, const TextRun&, const FloatPoint& textOrigin, const FloatRect& boxRect, >- TextDecoration, TextPaintStyle, const ShadowData*, const FloatRect& clipOutRect); >+ const OptionSet<TextDecoration>&, TextPaintStyle, const ShadowData*, const FloatRect& clipOutRect); > void paintSelection(GraphicsContext&, const FloatPoint& boxOrigin, const RenderStyle&, const FontCascade&, const Color& textColor); > void paintDocumentMarker(GraphicsContext&, const FloatPoint& boxOrigin, RenderedDocumentMarker&, const RenderStyle&, const FontCascade&); > void paintTextMatchMarker(GraphicsContext&, const FloatPoint& boxOrigin, RenderedDocumentMarker&, const RenderStyle&, const FontCascade&); >diff --git a/Source/WebCore/rendering/RenderBlockLineLayout.cpp b/Source/WebCore/rendering/RenderBlockLineLayout.cpp >index bfdddbbf972fc9ef270daba2767b38537863c060..ab21d5acb9cd5b4de8424e07a9ddbb6021f799c3 100644 >--- a/Source/WebCore/rendering/RenderBlockLineLayout.cpp >+++ b/Source/WebCore/rendering/RenderBlockLineLayout.cpp >@@ -536,7 +536,7 @@ static inline void setLogicalWidthForTextRun(RootInlineBox* lineBox, BidiRun* ru > } > > // Include text decoration visual overflow as part of the glyph overflow. >- if (renderer.style().textDecorationsInEffect() != TextDecorationNone) >+ if (!renderer.style().textDecorationsInEffect().isEmpty()) > glyphOverflow.extendTo(visualOverflowForDecorations(run->box()->lineStyle(), downcast<InlineTextBox>(run->box()))); > > if (!glyphOverflow.isEmpty()) { >diff --git a/Source/WebCore/rendering/RenderElement.cpp b/Source/WebCore/rendering/RenderElement.cpp >index 1bec90eec6ef96aed1fed374ac08700ec6a21358..da612851a5853995d1d3cb5dee93a79f567a0763 100644 >--- a/Source/WebCore/rendering/RenderElement.cpp >+++ b/Source/WebCore/rendering/RenderElement.cpp >@@ -1774,7 +1774,7 @@ const RenderElement* RenderElement::enclosingRendererWithTextDecoration(TextDeco > return nullptr; > > const RenderStyle& styleToUse = firstLine ? current->firstLineStyle() : current->style(); >- if (styleToUse.textDecoration() & textDecoration) >+ if (styleToUse.textDecoration().contains(textDecoration)) > return current; > current = current->parent(); > } while (current && (!current->element() || (!is<HTMLAnchorElement>(*current->element()) && !current->element()->hasTagName(HTMLNames::fontTag)))); >diff --git a/Source/WebCore/rendering/SimpleLineLayout.cpp b/Source/WebCore/rendering/SimpleLineLayout.cpp >index d6b9878e26707c5fff9a32e3d1fad518298bec84..600d39922fb9b3d6bc45aaf4d169912b1e1b6502 100644 >--- a/Source/WebCore/rendering/SimpleLineLayout.cpp >+++ b/Source/WebCore/rendering/SimpleLineLayout.cpp >@@ -198,7 +198,7 @@ static AvoidanceReasonFlags canUseForStyle(const RenderStyle& style, IncludeReas > AvoidanceReasonFlags reasons = { }; > if (style.textOverflow()) > SET_REASON_AND_RETURN_IF_NEEDED(FlowHasTextOverflow, reasons, includeReasons); >- if ((style.textDecorationsInEffect() & TextDecorationUnderline) && style.textUnderlinePosition() == TextUnderlinePositionUnder) >+ if (style.textDecorationsInEffect().contains(TextDecorationUnderline) && style.textUnderlinePosition() == TextUnderlinePositionUnder) > SET_REASON_AND_RETURN_IF_NEEDED(FlowHasUnsupportedUnderlineDecoration, reasons, includeReasons); > // Non-visible overflow should be pretty easy to support. > if (style.overflowX() != OVISIBLE || style.overflowY() != OVISIBLE) >diff --git a/Source/WebCore/rendering/SimpleLineLayoutFunctions.cpp b/Source/WebCore/rendering/SimpleLineLayoutFunctions.cpp >index 06b61cc7565f1b9d27e0ff2508ac0628637dc632..4b296751fe34bb6a149833abf1692915cc30d44a 100644 >--- a/Source/WebCore/rendering/SimpleLineLayoutFunctions.cpp >+++ b/Source/WebCore/rendering/SimpleLineLayoutFunctions.cpp >@@ -90,7 +90,7 @@ void paintFlow(const RenderBlockFlow& flow, const Layout& layout, PaintInfo& pai > } > > std::optional<TextDecorationPainter> textDecorationPainter; >- if (style.textDecorationsInEffect() != TextDecorationNone) { >+ if (!style.textDecorationsInEffect().isEmpty()) { > const RenderText* textRenderer = childrenOfType<RenderText>(flow).first(); > if (textRenderer) { > textDecorationPainter.emplace(paintInfo.context(), style.textDecorationsInEffect(), *textRenderer, false); >diff --git a/Source/WebCore/rendering/TextDecorationPainter.cpp b/Source/WebCore/rendering/TextDecorationPainter.cpp >index cc8acd0742ab568f5798e3e5e006f799000847df..040e837fc2978271355462e0078155c603b7a6b2 100644 >--- a/Source/WebCore/rendering/TextDecorationPainter.cpp >+++ b/Source/WebCore/rendering/TextDecorationPainter.cpp >@@ -241,7 +241,7 @@ static StrokeStyle textDecorationStyleToStrokeStyle(TextDecorationStyle decorati > return strokeStyle; > } > >-TextDecorationPainter::TextDecorationPainter(GraphicsContext& context, TextDecoration decoration, const RenderText& renderer, bool isFirstLine) >+TextDecorationPainter::TextDecorationPainter(GraphicsContext& context, const OptionSet<TextDecoration>& decoration, const RenderText& renderer, bool isFirstLine) > : m_context(context) > , m_decoration(decoration) > , m_wavyOffset(wavyOffsetFromDecoration()) >@@ -286,9 +286,9 @@ void TextDecorationPainter::paintTextDecoration(const TextRun& textRun, const Fl > }; > > bool linesAreOpaque = !m_isPrinting >- && (!(m_decoration & TextDecorationUnderline) || m_styles.underlineColor.isOpaque()) >- && (!(m_decoration & TextDecorationOverline) || m_styles.overlineColor.isOpaque()) >- && (!(m_decoration & TextDecorationLineThrough) || m_styles.linethroughColor.isOpaque()); >+ && (!m_decoration.contains(TextDecorationUnderline) || m_styles.underlineColor.isOpaque()) >+ && (!m_decoration.contains(TextDecorationOverline) || m_styles.overlineColor.isOpaque()) >+ && (!m_decoration.contains(TextDecorationLineThrough) || m_styles.linethroughColor.isOpaque()); > > int extraOffset = 0; > bool clipping = !linesAreOpaque && m_shadow && m_shadow->next(); >@@ -325,20 +325,20 @@ void TextDecorationPainter::paintTextDecoration(const TextRun& textRun, const Fl > } > > // These decorations should match the visual overflows computed in visualOverflowForDecorations() >- if (m_decoration & TextDecorationUnderline) { >+ if (m_decoration.contains(TextDecorationUnderline)) { > const int offset = computeUnderlineOffset(m_lineStyle.textUnderlinePosition(), m_lineStyle.fontMetrics(), m_inlineTextBox, textDecorationThickness); > int wavyOffset = m_styles.underlineStyle == TextDecorationStyleWavy ? m_wavyOffset : 0; > FloatPoint start = localOrigin + FloatSize(0, offset + wavyOffset); > FloatPoint end = localOrigin + FloatSize(m_width, offset + wavyOffset); > paintDecoration(TextDecorationUnderline, m_styles.underlineStyle, m_styles.underlineColor, start, end, offset); > } >- if (m_decoration & TextDecorationOverline) { >+ if (m_decoration.contains(TextDecorationOverline)) { > int wavyOffset = m_styles.overlineStyle == TextDecorationStyleWavy ? m_wavyOffset : 0; > FloatPoint start = localOrigin - FloatSize(0, wavyOffset); > FloatPoint end = localOrigin + FloatSize(m_width, -wavyOffset); > paintDecoration(TextDecorationOverline, m_styles.overlineStyle, m_styles.overlineColor, start, end, 0); > } >- if (m_decoration & TextDecorationLineThrough) { >+ if (m_decoration.contains(TextDecorationLineThrough)) { > FloatPoint start = localOrigin + FloatSize(0, 2 * m_baseline / 3); > FloatPoint end = localOrigin + FloatSize(m_width, 2 * m_baseline / 3); > paintDecoration(TextDecorationLineThrough, m_styles.linethroughStyle, m_styles.linethroughColor, start, end, 0); >@@ -367,29 +367,27 @@ static Color decorationColor(const RenderStyle& style) > return style.visitedDependentColor(CSSPropertyWebkitTextFillColor); > } > >-static void collectStylesForRenderer(TextDecorationPainter::Styles& result, const RenderObject& renderer, unsigned requestedDecorations, bool firstLineStyle) >+static void collectStylesForRenderer(TextDecorationPainter::Styles& result, const RenderObject& renderer, OptionSet<TextDecoration> remainingDecorations, bool firstLineStyle) > { >- unsigned remainingDecoration = requestedDecorations; >- auto extractDecorations = [&] (const RenderStyle& style, unsigned decorations) { >+ auto extractDecorations = [&] (const RenderStyle& style, const OptionSet<TextDecoration>& decorations) { > auto color = decorationColor(style); > auto decorationStyle = style.textDecorationStyle(); > >- if (decorations & TextDecorationUnderline) { >- remainingDecoration &= ~TextDecorationUnderline; >+ if (decorations.contains(TextDecorationUnderline)) { >+ remainingDecorations -= TextDecorationUnderline; > result.underlineColor = color; > result.underlineStyle = decorationStyle; > } >- if (decorations & TextDecorationOverline) { >- remainingDecoration &= ~TextDecorationOverline; >+ if (decorations.contains(TextDecorationOverline)) { >+ remainingDecorations -= TextDecorationOverline; > result.overlineColor = color; > result.overlineStyle = decorationStyle; > } >- if (decorations & TextDecorationLineThrough) { >- remainingDecoration &= ~TextDecorationLineThrough; >+ if (decorations.contains(TextDecorationLineThrough)) { >+ remainingDecorations -= TextDecorationLineThrough; > result.linethroughColor = color; > result.linethroughStyle = decorationStyle; > } >- > }; > > auto* current = &renderer; >@@ -404,19 +402,19 @@ static void collectStylesForRenderer(TextDecorationPainter::Styles& result, cons > if (current && current->isAnonymousBlock() && downcast<RenderBlock>(*current).continuation()) > current = downcast<RenderBlock>(*current).continuation(); > >- if (!remainingDecoration) >+ if (remainingDecorations.isEmpty()) > break; > > } while (current && !is<HTMLAnchorElement>(current->node()) && !is<HTMLFontElement>(current->node())); > > // If we bailed out, use the element we bailed out at (typically a <font> or <a> element). >- if (remainingDecoration && current) { >+ if (!remainingDecorations.isEmpty() && current) { > auto& style = firstLineStyle ? current->firstLineStyle() : current->style(); >- extractDecorations(style, remainingDecoration); >+ extractDecorations(style, remainingDecorations); > } > } > >-auto TextDecorationPainter::stylesForRenderer(const RenderObject& renderer, unsigned requestedDecorations, bool firstLineStyle) -> Styles >+auto TextDecorationPainter::stylesForRenderer(const RenderObject& renderer, const OptionSet<TextDecoration>& requestedDecorations, bool firstLineStyle) -> Styles > { > Styles result; > collectStylesForRenderer(result, renderer, requestedDecorations, false); >diff --git a/Source/WebCore/rendering/TextDecorationPainter.h b/Source/WebCore/rendering/TextDecorationPainter.h >index 6e2ca8d5480ceb7e3ccc0b1f7b6cf137cc57587f..48caea880fbf0e3b1ed2e03c1bc8eeb58c4dc91c 100644 >--- a/Source/WebCore/rendering/TextDecorationPainter.h >+++ b/Source/WebCore/rendering/TextDecorationPainter.h >@@ -25,6 +25,7 @@ > #include "Color.h" > #include "FloatPoint.h" > #include "RenderStyleConstants.h" >+#include <wtf/OptionSet.h> > > namespace WebCore { > >@@ -40,7 +41,7 @@ class TextRun; > > class TextDecorationPainter { > public: >- TextDecorationPainter(GraphicsContext&, TextDecoration, const RenderText&, bool isFirstLine); >+ TextDecorationPainter(GraphicsContext&, const OptionSet<TextDecoration>&, const RenderText&, bool isFirstLine); > > void setInlineTextBox(const InlineTextBox* inlineTextBox) { m_inlineTextBox = inlineTextBox; } > void setFont(const FontCascade& font) { m_font = &font; } >@@ -59,11 +60,11 @@ public: > TextDecorationStyle overlineStyle; > TextDecorationStyle linethroughStyle; > }; >- static Styles stylesForRenderer(const RenderObject&, unsigned requestedDecorations, bool firstLineStyle = false); >+ static Styles stylesForRenderer(const RenderObject&, OptionSet<TextDecoration>, bool firstLineStyle = false); > > private: > GraphicsContext& m_context; >- TextDecoration m_decoration; >+ OptionSet<TextDecoration> m_decoration; > int m_wavyOffset { 0 }; > bool m_isPrinting { false }; > float m_width { 0 }; >diff --git a/Source/WebCore/rendering/TextPaintStyle.cpp b/Source/WebCore/rendering/TextPaintStyle.cpp >index b0ab8f54e43d89d5fd7c6738b4308f31c4ce2da7..627ddc0244385ec79126be1fa46ccde578964bde 100644 >--- a/Source/WebCore/rendering/TextPaintStyle.cpp >+++ b/Source/WebCore/rendering/TextPaintStyle.cpp >@@ -69,7 +69,7 @@ TextPaintStyle computeTextPaintStyle(const Frame& frame, const RenderStyle& line > TextPaintStyle paintStyle; > > #if ENABLE(LETTERPRESS) >- paintStyle.useLetterpressEffect = lineStyle.textDecorationsInEffect() & TextDecorationLetterpress; >+ paintStyle.useLetterpressEffect = lineStyle.textDecorationsInEffect().contains(TextDecorationLetterpress); > #endif > auto viewportSize = frame.view() ? frame.view()->size() : IntSize(); > paintStyle.strokeWidth = lineStyle.computedStrokeWidth(viewportSize); >diff --git a/Source/WebCore/rendering/style/RenderStyle.cpp b/Source/WebCore/rendering/style/RenderStyle.cpp >index 92cd8b7799abd2506c52cf373945f9a47eecefe4..cab8e9ece49c9ac68c0eb21dfc236e1aea501dc7 100644 >--- a/Source/WebCore/rendering/style/RenderStyle.cpp >+++ b/Source/WebCore/rendering/style/RenderStyle.cpp >@@ -48,7 +48,6 @@ > #include "WillChangeData.h" > #include <wtf/MathExtras.h> > #include <wtf/PointerComparison.h> >-#include <wtf/StdLibExtras.h> > #include <algorithm> > > #if ENABLE(TEXT_AUTOSIZING) >diff --git a/Source/WebCore/rendering/style/RenderStyle.h b/Source/WebCore/rendering/style/RenderStyle.h >index 1c14905ce9e2c73e5e2f5edf3eb8a71119cc01cd..d4010497b8d9b665431b950667f4ffe6d53bdf8f 100644 >--- a/Source/WebCore/rendering/style/RenderStyle.h >+++ b/Source/WebCore/rendering/style/RenderStyle.h >@@ -68,6 +68,7 @@ > #include <memory> > #include <wtf/Forward.h> > #include <wtf/NeverDestroyed.h> >+#include <wtf/OptionSet.h> > #include <wtf/StdLibExtras.h> > #include <wtf/Vector.h> > >@@ -361,8 +362,11 @@ public: > const Length& textIndent() const { return m_rareInheritedData->indent; } > ETextAlign textAlign() const { return static_cast<ETextAlign>(m_inheritedFlags.textAlign); } > ETextTransform textTransform() const { return static_cast<ETextTransform>(m_inheritedFlags.textTransform); } >- TextDecoration textDecorationsInEffect() const { return static_cast<TextDecoration>(m_inheritedFlags.textDecorations); } >- TextDecoration textDecoration() const { return static_cast<TextDecoration>(m_visualData->textDecoration); } >+ >+ OptionSet<TextDecoration> textDecorationsInEffect() const { return static_cast<TextDecoration>(m_inheritedFlags.textDecorations); } >+ // FIXME: Rename to textDecorations(). >+ OptionSet<TextDecoration> textDecoration() const { return static_cast<TextDecoration>(m_visualData->textDecoration); } >+ > TextDecorationStyle textDecorationStyle() const { return static_cast<TextDecorationStyle>(m_rareNonInheritedData->textDecorationStyle); } > TextDecorationSkip textDecorationSkip() const { return static_cast<TextDecorationSkip>(m_rareInheritedData->textDecorationSkip); } > TextUnderlinePosition textUnderlinePosition() const { return static_cast<TextUnderlinePosition>(m_rareInheritedData->textUnderlinePosition); } >@@ -913,9 +917,9 @@ public: > void setTextIndent(Length&& length) { SET_VAR(m_rareInheritedData, indent, WTFMove(length)); } > void setTextAlign(ETextAlign v) { m_inheritedFlags.textAlign = v; } > void setTextTransform(ETextTransform v) { m_inheritedFlags.textTransform = v; } >- void addToTextDecorationsInEffect(TextDecoration v) { m_inheritedFlags.textDecorations |= v; } >- void setTextDecorationsInEffect(TextDecoration v) { m_inheritedFlags.textDecorations = v; } >- void setTextDecoration(TextDecoration v) { SET_VAR(m_visualData, textDecoration, v); } >+ void addToTextDecorationsInEffect(const OptionSet<TextDecoration>& v) { m_inheritedFlags.textDecorations |= v.toRaw(); } >+ void setTextDecorationsInEffect(const OptionSet<TextDecoration>& v) { m_inheritedFlags.textDecorations = v.toRaw(); } >+ void setTextDecoration(const OptionSet<TextDecoration>& v) { SET_VAR(m_visualData, textDecoration, v.toRaw()); } > void setTextDecorationStyle(TextDecorationStyle v) { SET_VAR(m_rareNonInheritedData, textDecorationStyle, v); } > void setTextDecorationSkip(TextDecorationSkip skip) { SET_VAR(m_rareInheritedData, textDecorationSkip, skip); } > void setTextUnderlinePosition(TextUnderlinePosition v) { SET_VAR(m_rareInheritedData, textUnderlinePosition, v); } >diff --git a/Source/WebCore/rendering/style/RenderStyleConstants.h b/Source/WebCore/rendering/style/RenderStyleConstants.h >index d21b80c41d3cc8525ba2727cc90adc4190bcac5a..9edee15c2d0e61c7e27e40a8201876e6f4c74386 100644 >--- a/Source/WebCore/rendering/style/RenderStyleConstants.h >+++ b/Source/WebCore/rendering/style/RenderStyleConstants.h >@@ -438,8 +438,6 @@ enum TextDecoration { > TextDecorationLetterpress = 0x10, > #endif > }; >-inline TextDecoration operator| (TextDecoration a, TextDecoration b) { return TextDecoration(int(a) | int(b)); } >-inline TextDecoration& operator|= (TextDecoration& a, TextDecoration b) { return a = a | b; } > > enum TextDecorationStyle { > TextDecorationStyleSolid, >diff --git a/Source/WebCore/rendering/svg/SVGInlineTextBox.cpp b/Source/WebCore/rendering/svg/SVGInlineTextBox.cpp >index 68a929c7c23f41b2c8250e94d07b80707896fbdc..d1751e82e59fdc507fd5be5c961719e1deb98f34 100644 >--- a/Source/WebCore/rendering/svg/SVGInlineTextBox.cpp >+++ b/Source/WebCore/rendering/svg/SVGInlineTextBox.cpp >@@ -36,6 +36,7 @@ > #include "SVGResourcesCache.h" > #include "SVGRootInlineBox.h" > #include "TextPainter.h" >+#include <wtf/OptionSet.h> > > namespace WebCore { > >@@ -291,10 +292,10 @@ void SVGInlineTextBox::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffse > paintInfo.context().concatCTM(fragmentTransform); > > // Spec: All text decorations except line-through should be drawn before the text is filled and stroked; thus, the text is rendered on top of these decorations. >- int decorations = style.textDecorationsInEffect(); >- if (decorations & TextDecorationUnderline) >+ OptionSet<TextDecoration> decorations = style.textDecorationsInEffect(); >+ if (decorations.contains(TextDecorationUnderline)) > paintDecoration(paintInfo.context(), TextDecorationUnderline, fragment); >- if (decorations & TextDecorationOverline) >+ if (decorations.contains(TextDecorationOverline)) > paintDecoration(paintInfo.context(), TextDecorationOverline, fragment); > > auto paintOrder = RenderStyle::paintTypesForPaintOrder(style.paintOrder()); >@@ -320,7 +321,7 @@ void SVGInlineTextBox::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffse > } > > // Spec: Line-through should be drawn after the text is filled and stroked; thus, the line-through is rendered on top of the text. >- if (decorations & TextDecorationLineThrough) >+ if (decorations.contains(TextDecorationLineThrough)) > paintDecoration(paintInfo.context(), TextDecorationLineThrough, fragment); > > setPaintingResourceMode(RenderSVGResourceMode::ApplyToDefault); >@@ -462,7 +463,7 @@ static inline RenderBoxModelObject& findRendererDefininingTextDecoration(InlineF > while (parentBox) { > renderer = &parentBox->renderer(); > >- if (renderer->style().textDecoration() != TextDecorationNone) >+ if (!renderer->style().textDecoration().isEmpty()) > break; > > parentBox = parentBox->parent(); >@@ -474,7 +475,7 @@ static inline RenderBoxModelObject& findRendererDefininingTextDecoration(InlineF > > void SVGInlineTextBox::paintDecoration(GraphicsContext& context, TextDecoration decoration, const SVGTextFragment& fragment) > { >- if (renderer().style().textDecorationsInEffect() == TextDecorationNone) >+ if (renderer().style().textDecorationsInEffect().isEmpty()) > return; > > // Find out which render style defined the text-decoration, as its fill/stroke properties have to be used for drawing instead of ours. >diff --git a/Source/WebCore/style/InlineTextBoxStyle.cpp b/Source/WebCore/style/InlineTextBoxStyle.cpp >index 80d21d88da67318b5676662336293e0efe49a631..f8617e5c5ff20abef62e7f583f7ef3cdbe7b49be 100644 >--- a/Source/WebCore/style/InlineTextBoxStyle.cpp >+++ b/Source/WebCore/style/InlineTextBoxStyle.cpp >@@ -106,8 +106,8 @@ GlyphOverflow visualOverflowForDecorations(const RenderStyle& lineStyle, const I > { > ASSERT(!inlineTextBox || inlineTextBox->lineStyle() == lineStyle); > >- TextDecoration decoration = lineStyle.textDecorationsInEffect(); >- if (decoration == TextDecorationNone) >+ OptionSet<TextDecoration> decorations = lineStyle.textDecorationsInEffect(); >+ if (decorations.isEmpty()) > return GlyphOverflow(); > > float strokeThickness = textDecorationStrokeThickness(lineStyle.computedFontPixelSize()); >@@ -127,7 +127,7 @@ GlyphOverflow visualOverflowForDecorations(const RenderStyle& lineStyle, const I > } > > // These metrics must match where underlines get drawn. >- if (decoration & TextDecorationUnderline) { >+ if (decorations.contains(TextDecorationUnderline)) { > // Compensate for the integral ceiling in GraphicsContext::computeLineBoundsAndAntialiasingModeForText() > int underlineOffset = 1; > underlineOffset += computeUnderlineOffset(lineStyle.textUnderlinePosition(), lineStyle.fontMetrics(), inlineTextBox, strokeThickness); >@@ -139,7 +139,7 @@ GlyphOverflow visualOverflowForDecorations(const RenderStyle& lineStyle, const I > extendIntToFloat(overflowResult.top, -underlineOffset); > } > } >- if (decoration & TextDecorationOverline) { >+ if (decorations.contains(TextDecorationOverline)) { > if (decorationStyle == TextDecorationStyleWavy) { > extendIntToFloat(overflowResult.bottom, -wavyOffset + controlPointDistance + strokeThickness - height); > extendIntToFloat(overflowResult.top, wavyOffset + controlPointDistance + strokeThickness); >@@ -148,7 +148,7 @@ GlyphOverflow visualOverflowForDecorations(const RenderStyle& lineStyle, const I > // top is untouched > } > } >- if (decoration & TextDecorationLineThrough) { >+ if (decorations.contains(TextDecorationLineThrough)) { > float baseline = lineStyle.fontMetrics().floatAscent(); > if (decorationStyle == TextDecorationStyleWavy) { > extendIntToFloat(overflowResult.bottom, 2 * baseline / 3 + controlPointDistance + strokeThickness - height);
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 176844
:
320643
|
320644
|
320648
|
320659