| Index: third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp
|
| diff --git a/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp b/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp
|
| index 66b33ff6c2d2ac3eb76fb25cffebc4528bcc0695..e89b7dd718eb7fce0cb545c78a64c40eee36d50d 100644
|
| --- a/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp
|
| +++ b/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp
|
| @@ -20,6 +20,7 @@
|
| #include "core/paint/LineLayoutPaintShim.h"
|
| #include "core/paint/PaintInfo.h"
|
| #include "core/paint/TextPainter.h"
|
| +#include "core/style/AppliedTextDecoration.h"
|
| #include "platform/graphics/GraphicsContextStateSaver.h"
|
| #include "platform/graphics/paint/DrawingRecorder.h"
|
| #include "wtf/Optional.h"
|
| @@ -235,7 +236,7 @@ void InlineTextBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoint&
|
| TextPainter::updateGraphicsContext(context, textStyle, m_inlineTextBox.isHorizontal(), stateSaver);
|
| if (combinedText)
|
| context->concatCTM(TextPainter::rotation(boxRect, TextPainter::Clockwise));
|
| - paintDecoration(paintInfo, boxOrigin, textDecorations);
|
| + paintDecorations(paintInfo, boxOrigin, styleToUse.appliedTextDecorations());
|
| if (combinedText)
|
| context->concatCTM(TextPainter::rotation(boxRect, TextPainter::Counterclockwise));
|
| }
|
| @@ -542,11 +543,6 @@ static bool shouldSetDecorationAntialias(TextDecorationStyle decorationStyle)
|
| return decorationStyle == TextDecorationStyleDotted || decorationStyle == TextDecorationStyleDashed;
|
| }
|
|
|
| -static bool shouldSetDecorationAntialias(TextDecorationStyle underline, TextDecorationStyle overline, TextDecorationStyle linethrough)
|
| -{
|
| - return shouldSetDecorationAntialias(underline) || shouldSetDecorationAntialias(overline) || shouldSetDecorationAntialias(linethrough);
|
| -}
|
| -
|
| static StrokeStyle textDecorationStyleToStrokeStyle(TextDecorationStyle decorationStyle)
|
| {
|
| StrokeStyle strokeStyle = SolidStroke;
|
| @@ -694,12 +690,12 @@ static void strokeWavyTextDecoration(GraphicsContext* context, FloatPoint p1, Fl
|
| }
|
|
|
| static void paintAppliedDecoration(GraphicsContext* context, FloatPoint start, float width, float doubleOffset, int wavyOffsetFactor,
|
| - LayoutObject::AppliedTextDecoration decoration, float thickness, bool antialiasDecoration, bool isPrinting)
|
| + AppliedTextDecoration decoration, float thickness, bool antialiasDecoration, bool isPrinting)
|
| {
|
| - context->setStrokeStyle(textDecorationStyleToStrokeStyle(decoration.style));
|
| - context->setStrokeColor(decoration.color);
|
| + context->setStrokeStyle(textDecorationStyleToStrokeStyle(decoration.style()));
|
| + context->setStrokeColor(decoration.color());
|
|
|
| - switch (decoration.style) {
|
| + switch (decoration.style()) {
|
| case TextDecorationStyleWavy:
|
| strokeWavyTextDecoration(context, start + FloatPoint(0, doubleOffset * wavyOffsetFactor), start + FloatPoint(width, doubleOffset * wavyOffsetFactor), thickness);
|
| break;
|
| @@ -710,12 +706,12 @@ static void paintAppliedDecoration(GraphicsContext* context, FloatPoint start, f
|
| default:
|
| context->drawLineForText(FloatPoint(start), width, isPrinting);
|
|
|
| - if (decoration.style == TextDecorationStyleDouble)
|
| + if (decoration.style() == TextDecorationStyleDouble)
|
| context->drawLineForText(start + FloatPoint(0, doubleOffset), width, isPrinting);
|
| }
|
| }
|
|
|
| -void InlineTextBoxPainter::paintDecoration(const PaintInfo& paintInfo, const LayoutPoint& boxOrigin, TextDecoration deco)
|
| +void InlineTextBoxPainter::paintDecorations(const PaintInfo& paintInfo, const LayoutPoint& boxOrigin, const Vector<AppliedTextDecoration>& decorations)
|
| {
|
| if (m_inlineTextBox.truncation() == cFullTruncation)
|
| return;
|
| @@ -732,16 +728,10 @@ void InlineTextBoxPainter::paintDecoration(const PaintInfo& paintInfo, const Lay
|
| localOrigin.move(m_inlineTextBox.logicalWidth() - width, 0);
|
| }
|
|
|
| - // Get the text decoration colors.
|
| - LayoutObject::AppliedTextDecoration underline, overline, linethrough;
|
| - LayoutObject& textBoxLayoutObject = *LineLayoutPaintShim::layoutObjectFrom(m_inlineTextBox.lineLayoutItem());
|
| - textBoxLayoutObject.getTextDecorations(deco, underline, overline, linethrough, true);
|
| - if (m_inlineTextBox.isFirstLineStyle())
|
| - textBoxLayoutObject.getTextDecorations(deco, underline, overline, linethrough, true, true);
|
| -
|
| // Use a special function for underlines to get the positioning exactly right.
|
| bool isPrinting = paintInfo.isPrinting();
|
|
|
| + LayoutObject& textBoxLayoutObject = *LineLayoutPaintShim::layoutObjectFrom(m_inlineTextBox.lineLayoutItem());
|
| const ComputedStyle& styleToUse = textBoxLayoutObject.styleRef(m_inlineTextBox.isFirstLineStyle());
|
| float baseline = styleToUse.fontMetrics().ascent();
|
|
|
| @@ -756,21 +746,25 @@ void InlineTextBoxPainter::paintDecoration(const PaintInfo& paintInfo, const Lay
|
|
|
| context->setStrokeThickness(textDecorationThickness);
|
|
|
| - bool antialiasDecoration = shouldSetDecorationAntialias(overline.style, underline.style, linethrough.style);
|
| + bool antialiasDecoration = false;
|
| + for (const AppliedTextDecoration& decoration : decorations)
|
| + antialiasDecoration |= shouldSetDecorationAntialias(decoration.style());
|
|
|
| // Offset between lines - always non-zero, so lines never cross each other.
|
| float doubleOffset = textDecorationThickness + 1.f;
|
|
|
| - if (deco & TextDecorationUnderline) {
|
| - const int underlineOffset = computeUnderlineOffset(styleToUse.textUnderlinePosition(), styleToUse.fontMetrics(), &m_inlineTextBox, textDecorationThickness);
|
| - paintAppliedDecoration(context, FloatPoint(localOrigin) + FloatPoint(0, underlineOffset), width.toFloat(), doubleOffset, 1, underline, textDecorationThickness, antialiasDecoration, isPrinting);
|
| - }
|
| - if (deco & TextDecorationOverline) {
|
| - paintAppliedDecoration(context, FloatPoint(localOrigin), width.toFloat(), -doubleOffset, 1, overline, textDecorationThickness, antialiasDecoration, isPrinting);
|
| - }
|
| - if (deco & TextDecorationLineThrough) {
|
| - const float lineThroughOffset = 2 * baseline / 3;
|
| - paintAppliedDecoration(context, FloatPoint(localOrigin) + FloatPoint(0, lineThroughOffset), width.toFloat(), doubleOffset, 0, linethrough, textDecorationThickness, antialiasDecoration, isPrinting);
|
| + for (const AppliedTextDecoration& decoration : decorations) {
|
| + if (decoration.lines() & TextDecorationUnderline) {
|
| + const int underlineOffset = computeUnderlineOffset(styleToUse.textUnderlinePosition(), styleToUse.fontMetrics(), &m_inlineTextBox, textDecorationThickness);
|
| + paintAppliedDecoration(context, FloatPoint(localOrigin) + FloatPoint(0, underlineOffset), width.toFloat(), doubleOffset, 1, decoration, textDecorationThickness, antialiasDecoration, isPrinting);
|
| + }
|
| + if (decoration.lines() & TextDecorationOverline) {
|
| + paintAppliedDecoration(context, FloatPoint(localOrigin), width.toFloat(), -doubleOffset, 1, decoration, textDecorationThickness, antialiasDecoration, isPrinting);
|
| + }
|
| + if (decoration.lines() & TextDecorationLineThrough) {
|
| + const float lineThroughOffset = 2 * baseline / 3;
|
| + paintAppliedDecoration(context, FloatPoint(localOrigin) + FloatPoint(0, lineThroughOffset), width.toFloat(), doubleOffset, 0, decoration, textDecorationThickness, antialiasDecoration, isPrinting);
|
| + }
|
| }
|
| }
|
|
|
|
|