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

Unified Diff: Source/core/rendering/EllipsisBox.cpp

Issue 15137009: Refactor shadow rendering logic. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: merge upstream changes Created 7 years, 7 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
« no previous file with comments | « Source/core/platform/graphics/GraphicsContextState.h ('k') | Source/core/rendering/InlineTextBox.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/EllipsisBox.cpp
diff --git a/Source/core/rendering/EllipsisBox.cpp b/Source/core/rendering/EllipsisBox.cpp
index e42366390ddebae0f2cd9d3acc3460ab679c3de4..7793c80b1f2026e66a568a1991b44f0f2b9eeeb9 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,8 +30,8 @@
#include "core/rendering/PaintInfo.h"
#include "core/rendering/RenderBlock.h"
#include "core/rendering/RootInlineBox.h"
-
-#include <algorithm>
+#include "core/rendering/style/ShadowData.h"
+#include "wtf/Vector.h"
namespace WebCore {
@@ -50,11 +51,32 @@ void EllipsisBox::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset, La
// Select the correct color for painting the text.
Color foreground = paintInfo.forceBlackText() ? Color::black : renderer()->selectionForegroundColor();
if (foreground.isValid() && foreground != styleTextColor)
- textColor = foreground;
+ context->setFillColor(foreground, style->colorSpace());
}
- // 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 +84,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 = boxRect;
-
- bool opaque = textColor.alpha() == 255;
- if (!opaque)
- context->setFillColor(Color::black, style->colorSpace());
- else
- context->setFillColor(textColor, 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(textColor, 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 (styleTextColor != context->fillColor())
context->setFillColor(styleTextColor, style->colorSpace());
+ if (hasShadow)
+ context->clearDrawLooper();
+
paintMarkupBox(paintInfo, paintOffset, lineTop, lineBottom, style);
}
« no previous file with comments | « Source/core/platform/graphics/GraphicsContextState.h ('k') | Source/core/rendering/InlineTextBox.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698