Chromium Code Reviews| 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 214b94d9c4492fef748cec7780949bf1e33dc5f7..ba77896b8f00fc96c43942d332d176b9974323a6 100644 |
| --- a/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp |
| +++ b/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp |
| @@ -15,6 +15,7 @@ |
| #include "core/layout/line/InlineTextBox.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" |
| @@ -284,14 +285,14 @@ void InlineTextBoxPainter::paint(const PaintInfo& paintInfo, |
| } |
| // Paint decorations |
| - TextDecoration textDecorations = styleToUse.textDecorationsInEffect(); |
| - if (textDecorations != TextDecorationNone && !paintSelectedTextOnly) { |
| + if (styleToUse.textDecorationsInEffect() != TextDecorationNone && |
| + !paintSelectedTextOnly) { |
| GraphicsContextStateSaver stateSaver(context, false); |
| 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)); |
| @@ -721,17 +722,15 @@ static int computeUnderlineOffset(const TextUnderlinePosition underlinePosition, |
| return fontMetrics.ascent() + gap; |
| } |
| -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 bool shouldSetDecorationAntialias( |
| + const Vector<AppliedTextDecoration>& decorations) { |
| + for (const AppliedTextDecoration& decoration : decorations) { |
| + TextDecorationStyle decorationStyle = decoration.style(); |
| + if (decorationStyle == TextDecorationStyleDotted || |
| + decorationStyle == TextDecorationStyleDashed) |
| + return true; |
| + } |
| + return false; |
| } |
| static StrokeStyle textDecorationStyleToStrokeStyle( |
| @@ -885,20 +884,19 @@ static void strokeWavyTextDecoration(GraphicsContext& context, |
| context.strokePath(path); |
| } |
| -static void paintAppliedDecoration( |
| - GraphicsContext& context, |
| - FloatPoint start, |
| - float width, |
| - float doubleOffset, |
| - int wavyOffsetFactor, |
| - LayoutObject::AppliedTextDecoration decoration, |
| - float thickness, |
| - bool antialiasDecoration, |
| - bool isPrinting) { |
| - context.setStrokeStyle(textDecorationStyleToStrokeStyle(decoration.style)); |
| - context.setStrokeColor(decoration.color); |
| - |
| - switch (decoration.style) { |
| +static void paintAppliedDecoration(GraphicsContext& context, |
| + FloatPoint start, |
| + float width, |
| + float doubleOffset, |
| + int wavyOffsetFactor, |
| + AppliedTextDecoration decoration, |
| + float thickness, |
| + bool antialiasDecoration, |
| + bool isPrinting) { |
| + context.setStrokeStyle(textDecorationStyleToStrokeStyle(decoration.style())); |
| + context.setStrokeColor(decoration.color()); |
| + |
| + switch (decoration.style()) { |
| case TextDecorationStyleWavy: |
| strokeWavyTextDecoration( |
| context, start + FloatPoint(0, doubleOffset * wavyOffsetFactor), |
| @@ -912,15 +910,16 @@ static void paintAppliedDecoration( |
| 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; |
| @@ -945,18 +944,10 @@ void InlineTextBoxPainter::paintDecoration(const PaintInfo& paintInfo, |
| localOrigin.move(m_inlineTextBox.logicalWidth() - width, LayoutUnit()); |
| } |
| - // Get the text decoration colors. |
| - LayoutObject::AppliedTextDecoration underline, overline, linethrough; |
| - LayoutObject& textBoxLayoutObject = inlineLayoutObject(); |
| - 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 = inlineLayoutObject(); |
| const ComputedStyle& styleToUse = |
| textBoxLayoutObject.styleRef(m_inlineTextBox.isFirstLineStyle()); |
| const SimpleFontData* fontData = styleToUse.font().primaryFont(); |
| @@ -982,32 +973,34 @@ void InlineTextBoxPainter::paintDecoration(const PaintInfo& paintInfo, |
| context.setStrokeThickness(textDecorationThickness); |
| - bool antialiasDecoration = shouldSetDecorationAntialias( |
| - overline.style, underline.style, linethrough.style); |
| + bool antialiasDecoration = shouldSetDecorationAntialias(decorations); |
| // Offset between lines - always non-zero, so lines never cross each other. |
| float doubleOffset = textDecorationThickness + 1.f; |
| - if ((deco & TextDecorationUnderline) && fontData) { |
|
Timothy Loh
2016/11/17 15:09:42
I don't think you meant to drop the fontData check
|
| - const int underlineOffset = computeUnderlineOffset( |
| - styleToUse.getTextUnderlinePosition(), fontData->getFontMetrics(), |
| - &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) { |
| + TextDecoration lines = decoration.lines(); |
| + if (lines & TextDecorationUnderline) { |
| + const int underlineOffset = computeUnderlineOffset( |
| + styleToUse.getTextUnderlinePosition(), fontData->getFontMetrics(), |
| + &m_inlineTextBox, textDecorationThickness); |
| + paintAppliedDecoration( |
| + context, FloatPoint(localOrigin) + FloatPoint(0, underlineOffset), |
| + width.toFloat(), doubleOffset, 1, decoration, textDecorationThickness, |
| + antialiasDecoration, isPrinting); |
| + } |
| + if (lines & TextDecorationOverline) { |
| + paintAppliedDecoration( |
| + context, FloatPoint(localOrigin), width.toFloat(), -doubleOffset, 1, |
| + decoration, textDecorationThickness, antialiasDecoration, isPrinting); |
| + } |
| + if (lines & TextDecorationLineThrough) { |
| + const float lineThroughOffset = 2 * baseline / 3; |
| + paintAppliedDecoration( |
| + context, FloatPoint(localOrigin) + FloatPoint(0, lineThroughOffset), |
| + width.toFloat(), doubleOffset, 0, decoration, textDecorationThickness, |
| + antialiasDecoration, isPrinting); |
| + } |
| } |
| } |