Index: Source/core/rendering/InlineTextBox.cpp |
diff --git a/Source/core/rendering/InlineTextBox.cpp b/Source/core/rendering/InlineTextBox.cpp |
index eddf89d029d025d0773351a28179902fa7d271b8..29f3200b70f10f7f0f6ca246a4c3b1a49dea286d 100644 |
--- a/Source/core/rendering/InlineTextBox.cpp |
+++ b/Source/core/rendering/InlineTextBox.cpp |
@@ -756,7 +756,7 @@ void InlineTextBox::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset, |
updateGraphicsContext(context, textFillColor, textStrokeColor, textStrokeWidth); |
if (combinedText) |
context->concatCTM(rotation(boxRect, Clockwise)); |
- paintDecoration(context, boxOrigin, textDecorations, styleToUse->textDecorationStyle(), textShadow); |
+ paintDecoration(context, boxOrigin, textDecorations, textShadow); |
if (combinedText) |
context->concatCTM(rotation(boxRect, Counterclockwise)); |
} |
@@ -1061,7 +1061,17 @@ static void strokeWavyTextDecoration(GraphicsContext* context, FloatPoint& p1, F |
context->strokePath(path); |
} |
-void InlineTextBox::paintDecoration(GraphicsContext* context, const FloatPoint& boxOrigin, TextDecoration deco, TextDecorationStyle decorationStyle, const ShadowList* shadowList) |
+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); |
+} |
+ |
+void InlineTextBox::paintDecoration(GraphicsContext* context, const FloatPoint& boxOrigin, TextDecoration deco, const ShadowList* shadowList) |
{ |
GraphicsContextStateSaver stateSaver(*context); |
@@ -1078,15 +1088,16 @@ void InlineTextBox::paintDecoration(GraphicsContext* context, const FloatPoint& |
} |
// Get the text decoration colors. |
- Color underline(Color::transparent), overline(Color::transparent), linethrough(Color::transparent); |
- renderer().getTextDecorationColors(deco, underline, overline, linethrough, true); |
+ RenderObject::AppliedTextDecoration underline, overline, linethrough; |
+ |
+ renderer().getTextDecorations(deco, underline, overline, linethrough, true); |
if (isFirstLineStyle()) |
- renderer().getTextDecorationColors(deco, underline, overline, linethrough, true, true); |
+ renderer().getTextDecorations(deco, underline, overline, linethrough, true, true); |
// Use a special function for underlines to get the positioning exactly right. |
bool isPrinting = textRenderer().document().printing(); |
- bool linesAreOpaque = !isPrinting && (!(deco & TextDecorationUnderline) || underline.alpha() == 255) && (!(deco & TextDecorationOverline) || overline.alpha() == 255) && (!(deco & TextDecorationLineThrough) || linethrough.alpha() == 255); |
+ bool linesAreOpaque = !isPrinting && (!(deco & TextDecorationUnderline) || underline.color.alpha() == 255) && (!(deco & TextDecorationOverline) || overline.color.alpha() == 255) && (!(deco & TextDecorationLineThrough) || linethrough.color.alpha() == 255); |
RenderStyle* styleToUse = renderer().style(isFirstLineStyle()); |
int baseline = styleToUse->fontMetrics().ascent(); |
@@ -1103,16 +1114,8 @@ void InlineTextBox::paintDecoration(GraphicsContext* context, const FloatPoint& |
context->setStrokeThickness(textDecorationThickness); |
- switch (decorationStyle) { |
- case TextDecorationStyleDotted: |
- case TextDecorationStyleDashed: |
- context->setShouldAntialias(RenderBoxModelObject::shouldAntialiasLines(context)); |
- break; |
- case TextDecorationStyleSolid: |
- case TextDecorationStyleDouble: |
- case TextDecorationStyleWavy: |
- break; |
- } |
+ bool antialiasDecoration = shouldSetDecorationAntialias(overline.style, underline.style, linethrough.style) |
+ && RenderBoxModelObject::shouldAntialiasLines(context); |
float extraOffset = 0; |
if (!linesAreOpaque && shadowCount > 1) { |
@@ -1148,52 +1151,69 @@ void InlineTextBox::paintDecoration(GraphicsContext* context, const FloatPoint& |
// Offset between lines - always non-zero, so lines never cross each other. |
float doubleOffset = textDecorationThickness + 1.f; |
- context->setStrokeStyle(textDecorationStyleToStrokeStyle(decorationStyle)); |
+ |
if (deco & TextDecorationUnderline) { |
- context->setStrokeColor(underline); |
+ context->setStrokeStyle(textDecorationStyleToStrokeStyle(underline.style)); |
+ context->setStrokeColor(underline.color); |
const int underlineOffset = computeUnderlineOffset(styleToUse->textUnderlinePosition(), styleToUse->fontMetrics(), this, textDecorationThickness); |
- switch (decorationStyle) { |
+ switch (underline.style) { |
case TextDecorationStyleWavy: { |
FloatPoint start(localOrigin.x(), localOrigin.y() + underlineOffset + doubleOffset); |
FloatPoint end(localOrigin.x() + width, localOrigin.y() + underlineOffset + doubleOffset); |
strokeWavyTextDecoration(context, start, end, textDecorationThickness); |
break; |
} |
+ case TextDecorationStyleDotted: |
+ case TextDecorationStyleDashed: |
+ context->setShouldAntialias(antialiasDecoration); |
+ // Fall through |
+ case TextDecorationStyleDouble: |
+ context->drawLineForText(FloatPoint(localOrigin.x(), localOrigin.y() + underlineOffset + doubleOffset), width, isPrinting); |
+ // Fall through |
default: |
context->drawLineForText(FloatPoint(localOrigin.x(), localOrigin.y() + underlineOffset), width, isPrinting); |
- |
- if (decorationStyle == TextDecorationStyleDouble) |
- context->drawLineForText(FloatPoint(localOrigin.x(), localOrigin.y() + underlineOffset + doubleOffset), width, isPrinting); |
} |
} |
if (deco & TextDecorationOverline) { |
- context->setStrokeColor(overline); |
- switch (decorationStyle) { |
+ context->setStrokeStyle(textDecorationStyleToStrokeStyle(overline.style)); |
+ context->setStrokeColor(overline.color); |
+ switch (overline.style) { |
case TextDecorationStyleWavy: { |
FloatPoint start(localOrigin.x(), localOrigin.y() - doubleOffset); |
FloatPoint end(localOrigin.x() + width, localOrigin.y() - doubleOffset); |
strokeWavyTextDecoration(context, start, end, textDecorationThickness); |
break; |
} |
+ case TextDecorationStyleDotted: |
+ case TextDecorationStyleDashed: |
+ context->setShouldAntialias(antialiasDecoration); |
+ // Fall through |
+ case TextDecorationStyleDouble: |
+ context->drawLineForText(FloatPoint(localOrigin.x(), localOrigin.y() - doubleOffset), width, isPrinting); |
+ // Fall through |
default: |
context->drawLineForText(localOrigin, width, isPrinting); |
- if (decorationStyle == TextDecorationStyleDouble) |
- context->drawLineForText(FloatPoint(localOrigin.x(), localOrigin.y() - doubleOffset), width, isPrinting); |
} |
} |
if (deco & TextDecorationLineThrough) { |
- context->setStrokeColor(linethrough); |
- switch (decorationStyle) { |
+ context->setStrokeStyle(textDecorationStyleToStrokeStyle(linethrough.style)); |
+ context->setStrokeColor(linethrough.color); |
+ switch (linethrough.style) { |
case TextDecorationStyleWavy: { |
FloatPoint start(localOrigin.x(), localOrigin.y() + 2 * baseline / 3); |
FloatPoint end(localOrigin.x() + width, localOrigin.y() + 2 * baseline / 3); |
strokeWavyTextDecoration(context, start, end, textDecorationThickness); |
break; |
} |
+ case TextDecorationStyleDotted: |
+ case TextDecorationStyleDashed: |
+ context->setShouldAntialias(antialiasDecoration); |
+ // Fall through |
+ case TextDecorationStyleDouble: |
+ context->drawLineForText(FloatPoint(localOrigin.x(), localOrigin.y() + doubleOffset + 2 * baseline / 3), width, isPrinting); |
+ // Fall through |
default: |
context->drawLineForText(FloatPoint(localOrigin.x(), localOrigin.y() + 2 * baseline / 3), width, isPrinting); |
- if (decorationStyle == TextDecorationStyleDouble) |
- context->drawLineForText(FloatPoint(localOrigin.x(), localOrigin.y() + doubleOffset + 2 * baseline / 3), width, isPrinting); |
} |
} |
} |