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 93f9734e459da0dc61afa2238c8b540bfbc99bd9..a56649e65b1088a5d10bf200d5d03f142fc763d3 100644 |
| --- a/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp |
| +++ b/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp |
| @@ -19,6 +19,7 @@ |
| #include "core/paint/BoxPainter.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" |
| @@ -233,7 +234,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)); |
| } |
| @@ -540,11 +541,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; |
| @@ -692,12 +688,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; |
| @@ -708,12 +704,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; |
| @@ -730,12 +726,6 @@ 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; |
| - m_inlineTextBox.layoutObject().getTextDecorations(deco, underline, overline, linethrough, true); |
| - if (m_inlineTextBox.isFirstLineStyle()) |
| - m_inlineTextBox.layoutObject().getTextDecorations(deco, underline, overline, linethrough, true, true); |
| - |
| // Use a special function for underlines to get the positioning exactly right. |
| bool isPrinting = paintInfo.isPrinting(); |
| @@ -753,21 +743,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 auto& 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 auto& decoration : decorations) { |
|
Timothy Loh
2015/10/01 01:51:43
let's write out the type here and everywhere else
sashab
2015/10/02 02:45:41
Done.
|
| + 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); |
| + } |
| } |
| } |