From 13c4facbd2a18dd3660667d3c7c91abad234d7da Mon Sep 17 00:00:00 2001 From: "mmaxfield@apple.com" Date: Tue, 18 Dec 2018 23:38:54 +0000 Subject: [PATCH] Thick overlines and line-throughs grow in the wrong direction https://bugs.webkit.org/show_bug.cgi?id=192264 Reviewed by Dean Jackson. Source/WebCore: Overlines should grow upward, and line-throughs should stay centered. Test: fast/css3-text/css3-text-decoration/text-decoration-thicknes-overline-grow-direction.html * rendering/TextDecorationPainter.cpp: (WebCore::TextDecorationPainter::paintTextDecoration): * style/InlineTextBoxStyle.cpp: (WebCore::visualOverflowForDecorations): LayoutTests: I can't figure out a way to test the line-through, so this just tests the overline. * fast/css3-text/css3-text-decoration/text-decoration-thicknes-overline-grow-direction-expected.html: Added. * fast/css3-text/css3-text-decoration/text-decoration-thicknes-overline-grow-direction.html: Added. git-svn-id: https://svn.webkit.org/repository/webkit/trunk@239357 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- LayoutTests/ChangeLog | 12 +++++++++ ...-thicknes-overline-grow-direction-expected.html | 10 +++++++ ...ecoration-thicknes-overline-grow-direction.html | 10 +++++++ Source/WebCore/ChangeLog | 16 +++++++++++ Source/WebCore/rendering/TextDecorationPainter.cpp | 7 +++-- Source/WebCore/style/InlineTextBoxStyle.cpp | 31 ++++++++++++++-------- 6 files changed, 73 insertions(+), 13 deletions(-) create mode 100644 LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-thicknes-overline-grow-direction-expected.html create mode 100644 LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-thicknes-overline-grow-direction.html diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog index 9130b17..a5ec06a 100644 --- a/LayoutTests/ChangeLog +++ b/LayoutTests/ChangeLog @@ -1,3 +1,15 @@ +2018-12-18 Myles C. Maxfield + + Thick overlines and line-throughs grow in the wrong direction + https://bugs.webkit.org/show_bug.cgi?id=192264 + + Reviewed by Dean Jackson. + + I can't figure out a way to test the line-through, so this just tests the overline. + + * fast/css3-text/css3-text-decoration/text-decoration-thicknes-overline-grow-direction-expected.html: Added. + * fast/css3-text/css3-text-decoration/text-decoration-thicknes-overline-grow-direction.html: Added. + 2018-12-18 Justin Fan [WebGPU] BindGroupLayout and Device::createBindGroupLayout diff --git a/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-thicknes-overline-grow-direction-expected.html b/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-thicknes-overline-grow-direction-expected.html new file mode 100644 index 0000000..680c6dd --- /dev/null +++ b/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-thicknes-overline-grow-direction-expected.html @@ -0,0 +1,10 @@ + + + + + + +This test makes sure that overlines grow upward. The test passes if the top line below has the default thickness. +
pppp
+ + diff --git a/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-thicknes-overline-grow-direction.html b/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-thicknes-overline-grow-direction.html new file mode 100644 index 0000000..ea3997f --- /dev/null +++ b/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-thicknes-overline-grow-direction.html @@ -0,0 +1,10 @@ + + + + + + +This test makes sure that overlines grow upward. The test passes if the top line below has the default thickness. +
pppp
+ + diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog index fefaecd..779c262 100644 --- a/Source/WebCore/ChangeLog +++ b/Source/WebCore/ChangeLog @@ -1,3 +1,19 @@ +2018-12-18 Myles C. Maxfield + + Thick overlines and line-throughs grow in the wrong direction + https://bugs.webkit.org/show_bug.cgi?id=192264 + + Reviewed by Dean Jackson. + + Overlines should grow upward, and line-throughs should stay centered. + + Test: fast/css3-text/css3-text-decoration/text-decoration-thicknes-overline-grow-direction.html + + * rendering/TextDecorationPainter.cpp: + (WebCore::TextDecorationPainter::paintTextDecoration): + * style/InlineTextBoxStyle.cpp: + (WebCore::visualOverflowForDecorations): + 2018-12-18 Ryosuke Niwa Some iOS app crash in FrameLoader::checkCompleted diff --git a/Source/WebCore/rendering/TextDecorationPainter.cpp b/Source/WebCore/rendering/TextDecorationPainter.cpp index 729cdef..7691cd0 100644 --- a/Source/WebCore/rendering/TextDecorationPainter.cpp +++ b/Source/WebCore/rendering/TextDecorationPainter.cpp @@ -296,12 +296,15 @@ void TextDecorationPainter::paintTextDecoration(const TextRun& textRun, const Fl if (m_decorations.contains(TextDecoration::Overline)) { float wavyOffset = m_styles.overlineStyle == TextDecorationStyle::Wavy ? m_wavyOffset : 0; FloatRect rect(localOrigin, FloatSize(m_width, textDecorationThickness)); - rect.move(0, -wavyOffset); + float autoTextDecorationThickness = TextDecorationThickness::createWithAuto().resolve(m_lineStyle.computedFontSize(), fontMetrics); + rect.move(0, autoTextDecorationThickness - textDecorationThickness - wavyOffset); paintDecoration(TextDecoration::Overline, m_styles.overlineStyle, m_styles.overlineColor, rect); } if (m_decorations.contains(TextDecoration::LineThrough)) { FloatRect rect(localOrigin, FloatSize(m_width, textDecorationThickness)); - rect.move(0, 2 * fontMetrics.floatAscent() / 3); + float autoTextDecorationThickness = TextDecorationThickness::createWithAuto().resolve(m_lineStyle.computedFontSize(), fontMetrics); + auto center = 2 * fontMetrics.floatAscent() / 3 + autoTextDecorationThickness / 2; + rect.move(0, center - textDecorationThickness / 2); paintDecoration(TextDecoration::LineThrough, m_styles.linethroughStyle, m_styles.linethroughColor, rect); } } while (shadow); diff --git a/Source/WebCore/style/InlineTextBoxStyle.cpp b/Source/WebCore/style/InlineTextBoxStyle.cpp index 8b8174a..bed2843 100644 --- a/Source/WebCore/style/InlineTextBoxStyle.cpp +++ b/Source/WebCore/style/InlineTextBoxStyle.cpp @@ -125,6 +125,7 @@ GlyphOverflow visualOverflowForDecorations(const RenderStyle& lineStyle, const I } // These metrics must match where underlines get drawn. + // FIXME: Share the code in TextDecorationPainter::paintTextDecoration() so we can just query it for the painted geometry. if (decoration & TextDecoration::Underline) { // Compensate for the integral ceiling in GraphicsContext::computeLineBoundsAndAntialiasingModeForText() int underlineOffset = 1; @@ -140,23 +141,31 @@ GlyphOverflow visualOverflowForDecorations(const RenderStyle& lineStyle, const I } } if (decoration & TextDecoration::Overline) { + FloatRect rect(FloatPoint(), FloatSize(1, strokeThickness)); + float autoTextDecorationThickness = TextDecorationThickness::createWithAuto().resolve(lineStyle.computedFontSize(), lineStyle.fontMetrics()); + rect.move(0, autoTextDecorationThickness - strokeThickness - wavyOffset); if (decorationStyle == TextDecorationStyle::Wavy) { - extendIntToFloat(overflowResult.bottom, -wavyOffset + wavyStrokeParameters.controlPointDistance + strokeThickness - height); - extendIntToFloat(overflowResult.top, wavyOffset + wavyStrokeParameters.controlPointDistance + strokeThickness); - } else { - extendIntToFloat(overflowResult.bottom, strokeThickness - height); - // top is untouched + FloatBoxExtent wavyExpansion; + wavyExpansion.setTop(wavyStrokeParameters.controlPointDistance); + wavyExpansion.setBottom(wavyStrokeParameters.controlPointDistance); + rect.expand(wavyExpansion); } + extendIntToFloat(overflowResult.top, -rect.y()); + extendIntToFloat(overflowResult.bottom, rect.maxY() - height); } if (decoration & TextDecoration::LineThrough) { - float baseline = lineStyle.fontMetrics().floatAscent(); + FloatRect rect(FloatPoint(), FloatSize(1, strokeThickness)); + float autoTextDecorationThickness = TextDecorationThickness::createWithAuto().resolve(lineStyle.computedFontSize(), lineStyle.fontMetrics()); + auto center = 2 * lineStyle.fontMetrics().floatAscent() / 3 + autoTextDecorationThickness / 2; + rect.move(0, center - strokeThickness / 2); if (decorationStyle == TextDecorationStyle::Wavy) { - extendIntToFloat(overflowResult.bottom, 2 * baseline / 3 + wavyStrokeParameters.controlPointDistance + strokeThickness - height); - extendIntToFloat(overflowResult.top, -(2 * baseline / 3 - wavyStrokeParameters.controlPointDistance - strokeThickness)); - } else { - extendIntToFloat(overflowResult.bottom, 2 * baseline / 3 + strokeThickness - height); - extendIntToFloat(overflowResult.top, -(2 * baseline / 3)); + FloatBoxExtent wavyExpansion; + wavyExpansion.setTop(wavyStrokeParameters.controlPointDistance); + wavyExpansion.setBottom(wavyStrokeParameters.controlPointDistance); + rect.expand(wavyExpansion); } + extendIntToFloat(overflowResult.top, -rect.y()); + extendIntToFloat(overflowResult.bottom, rect.maxY() - height); } return overflowResult; } -- 1.8.3.1