Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(211)

Unified Diff: third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp

Issue 1328283005: Add support for multiple text decorations with same line positioning (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
+ }
}
}

Powered by Google App Engine
This is Rietveld 408576698