Index: Source/core/rendering/EllipsisBox.cpp |
diff --git a/Source/core/rendering/EllipsisBox.cpp b/Source/core/rendering/EllipsisBox.cpp |
index 9d49989f46eabfaeaa849de044d9025b853bb039..cdd315c503344abca7a1e9948297b541e661c4c8 100644 |
--- a/Source/core/rendering/EllipsisBox.cpp |
+++ b/Source/core/rendering/EllipsisBox.cpp |
@@ -21,6 +21,7 @@ |
#include "core/rendering/EllipsisBox.h" |
#include "core/dom/Document.h" |
+#include "core/platform/graphics/DrawLooper.h" |
#include "core/platform/graphics/Font.h" |
#include "core/platform/graphics/GraphicsContextStateSaver.h" |
#include "core/platform/graphics/TextRun.h" |
@@ -29,6 +30,8 @@ |
#include "core/rendering/PaintInfo.h" |
#include "core/rendering/RenderBlock.h" |
#include "core/rendering/RootInlineBox.h" |
+#include "core/rendering/style/ShadowData.h" |
+#include "wtf/Vector.h" |
#include <algorithm> |
@@ -53,8 +56,29 @@ void EllipsisBox::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset, La |
actualTextColor = foreground; |
} |
- // FIXME: Why is this always LTR? Fix by passing correct text run flags below. |
const ShadowData* shadow = style->textShadow(); |
+ bool hasShadow = !!shadow; |
+ if (hasShadow) { |
+ // FIXME: it would be better if we could get the shadows top-to-bottom from the style. |
+ Vector<const ShadowData*, 4> shadows; |
+ do { |
+ shadows.append(shadow); |
+ } while (shadow = shadow->next()); |
+ |
+ DrawLooper drawLooper; |
+ drawLooper.addUnmodifiedContent(); |
+ for (int i = shadows.size() - 1; i >= 0; i--) { |
+ shadow = shadows[i]; |
+ int shadowX = isHorizontal() ? shadow->x() : shadow->y(); |
+ int shadowY = isHorizontal() ? shadow->y() : -shadow->x(); |
+ FloatSize offset(shadowX, shadowY); |
+ drawLooper.addShadow(offset, shadow->blur(), shadow->color(), |
+ DrawLooper::ShadowRespectsTransforms, DrawLooper::ShadowIgnoresAlpha); |
+ } |
+ context->setDrawLooper(drawLooper); |
+ } |
+ |
+ // FIXME: Why is this always LTR? Fix by passing correct text run flags below. |
FloatPoint boxOrigin(paintOffset); |
boxOrigin.move(x(), y()); |
FloatRect boxRect(boxOrigin, LayoutSize(logicalWidth(), logicalHeight())); |
@@ -62,47 +86,15 @@ void EllipsisBox::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset, La |
TextRun textRun = RenderBlock::constructTextRun(renderer(), font, m_str, style, TextRun::AllowTrailingExpansion); |
TextRunPaintInfo textRunPaintInfo(textRun); |
textRunPaintInfo.bounds = FloatRect(boxOrigin, FloatSize(logicalWidth(), logicalHeight())); |
- |
- bool opaque = actualTextColor.alpha() == 255; |
- if (!opaque) |
- context->setFillColor(Color::black, style->colorSpace()); |
- else |
- context->setFillColor(actualTextColor, style->colorSpace()); |
- |
- do { |
- IntSize extraOffset; |
- if (shadow) { |
- FloatSize shadowOffset(shadow->x(), shadow->y()); |
- if (shadow->next() || !opaque) { |
- FloatRect shadowRect(boxRect); |
- shadowRect.inflate(shadow->blur()); |
- shadowRect.move(shadowOffset); |
- context->save(); |
- context->clip(shadowRect); |
- extraOffset = IntSize(0, 2 * boxRect.height() + std::max(0.0f, shadowOffset.height()) + shadow->blur()); |
- shadowOffset -= extraOffset; |
- } |
- context->setShadow(shadowOffset, shadow->blur(), shadow->color(), style->colorSpace()); |
- } else if (!opaque) |
- context->setFillColor(actualTextColor, style->colorSpace()); |
- |
- context->drawText(font, textRunPaintInfo, textOrigin + extraOffset); |
- |
- if (!shadow) |
- break; |
- |
- if (shadow->next() || !opaque) |
- context->restore(); |
- else |
- context->clearShadow(); |
- |
- shadow = shadow->next(); |
- } while (shadow || !opaque); |
+ context->drawText(font, textRunPaintInfo, textOrigin); |
// Restore the regular fill color. |
if (textColor != context->fillColor()) |
context->setFillColor(textColor, style->colorSpace()); |
+ if (hasShadow) |
+ context->clearDrawLooper(); |
+ |
paintMarkupBox(paintInfo, paintOffset, lineTop, lineBottom, style); |
} |