Revert "Paint text decoration shadows using a DropShadowPaintFilter"
This reverts commit ae39a61beac6ee25c2bf3bbfac66b663f97bf9e4.
Reason for revert: Related tests started failing on fuchsia: https://ci.chromium.org/p/chromium/builders/ci/fuchsia-x64-rel/735
Original change's description:
> Paint text decoration shadows using a DropShadowPaintFilter
>
> When applying a text-decoration with text-decoration-skip-ink enabled,
> along with a text-shadow,
> to text containing descenders, like lowercase g,
> the text decoration shadow still gets rendered around
> the skipped text decoration line
> resulting in an unsightly White-Out like effect.
>
> The reason this is observed is because the current implementation
> uses a SkDrawLooper to draw the shadow,
> which applies the shadow to the whole line
> including the clipped out region
> where the text decoration would intercept a glyph,
> rendering shadows above and below the clipped out region.
>
> The proposed fix is to paint the text decoration shadows using
> a DropShadowPaintFilter via GraphicsContext::BeginLayer
> instead of using a SkDrawLooper.
>
> R=pdr
>
> Fixed: 1081616
> Bug: 671438
> Change-Id: I9da5dc2a7e4b5ace9212ebd65a931da0ebff5baa
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3988926
> Commit-Queue: Traian Captan <tcaptan@chromium.org>
> Reviewed-by: Philip Rogers <pdr@chromium.org>
> Cr-Commit-Position: refs/heads/main@{#1066011}
Bug: 671438
Change-Id: Ie89244230b48bcc64d544ab00210bd3b882ddf78
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3995218
Commit-Queue: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Auto-Submit: Kevin McNee <mcnee@chromium.org>
Owners-Override: Kevin McNee <mcnee@google.com>
Cr-Commit-Position: refs/heads/main@{#1066134}
diff --git a/third_party/blink/renderer/core/paint/ng/ng_text_combine_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_text_combine_painter.cc
index 14bc17da..a111d7e 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_text_combine_painter.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_text_combine_painter.cc
@@ -105,10 +105,10 @@
const NGTextDecorationOffset decoration_offset(style_, style_);
- // Paint underline and overline text decorations
- PaintUnderOrOverLineDecorations(NGTextFragmentPaintInfo{}, decoration_offset,
- decoration_info, ~TextDecorationLine::kNone,
- paint_info, text_style);
+ // Paint text decorations except line through
+ PaintDecorationsExceptLineThrough(
+ NGTextFragmentPaintInfo{}, decoration_offset, decoration_info,
+ ~TextDecorationLine::kNone, paint_info, text_style);
// Paint line through if needed
PaintDecorationsOnlyLineThrough(decoration_info, paint_info, text_style);
diff --git a/third_party/blink/renderer/core/paint/ng/ng_text_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_text_painter.cc
index 897d917..61a51b5 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_text_painter.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_text_painter.cc
@@ -285,7 +285,7 @@
decoration_info, lines_to_paint,
paint_info, text_style);
} else {
- NGTextPainterBase::PaintUnderOrOverLineDecorations(
+ NGTextPainterBase::PaintDecorationsExceptLineThrough(
fragment_paint_info, decoration_offset, decoration_info, lines_to_paint,
paint_info, text_style, nullptr);
}
@@ -508,7 +508,7 @@
if (SetupPaintForSvgText(state, graphics_context_, style_to_paint,
SvgPaintMode::kTextDecoration, *resource_mode,
flags)) {
- NGTextPainterBase::PaintUnderOrOverLineDecorations(
+ NGTextPainterBase::PaintDecorationsExceptLineThrough(
fragment_paint_info, decoration_offset, decoration_info,
lines_to_paint, paint_info, text_style, &flags);
}
diff --git a/third_party/blink/renderer/core/paint/ng/ng_text_painter_base.cc b/third_party/blink/renderer/core/paint/ng/ng_text_painter_base.cc
index afecde7..2066804 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_text_painter_base.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_text_painter_base.cc
@@ -22,12 +22,12 @@
namespace blink {
-// We have two functions to paint text decorations, because we should paint
+// We have two functions to paint text decoations, because we should paint
// text and decorations in following order:
-// 1. Paint underline or overline text decorations
+// 1. Paint text decorations except line through
// 2. Paint text
-// 3. Paint line through
-void NGTextPainterBase::PaintUnderOrOverLineDecorations(
+// 3. Paint line throguh
+void NGTextPainterBase::PaintDecorationsExceptLineThrough(
const NGTextFragmentPaintInfo& fragment_paint_info,
const TextDecorationOffsetBase& decoration_offset,
TextDecorationInfo& decoration_info,
@@ -44,72 +44,8 @@
GraphicsContext& context = paint_info.context;
GraphicsContextStateSaver state_saver(context);
+ UpdateGraphicsContext(context, text_style, state_saver);
- // Updating Graphics Context for text only (kTextProperOnly),
- // instead of the default text and shadows (kBothShadowsAndTextProper),
- // because shadows will be painted by
- // NGTextPainterBase::PaintUnderOrOverLineDecorationShadows.
- UpdateGraphicsContext(context, text_style, state_saver,
- ShadowMode::kTextProperOnly);
-
- PaintUnderOrOverLineDecorationShadows(fragment_paint_info, decoration_offset,
- decoration_info, lines_to_paint, flags,
- text_style, context);
-
- PaintUnderOrOverLineDecorations(fragment_paint_info, decoration_offset,
- decoration_info, lines_to_paint, flags,
- context);
-}
-
-void NGTextPainterBase::PaintUnderOrOverLineDecorationShadows(
- const NGTextFragmentPaintInfo& fragment_paint_info,
- const TextDecorationOffsetBase& decoration_offset,
- TextDecorationInfo& decoration_info,
- TextDecorationLine lines_to_paint,
- const cc::PaintFlags* flags,
- const TextPaintStyle& text_style,
- GraphicsContext& context) {
- if (text_style.shadow == nullptr)
- return;
-
- const ShadowList* shadow_list = text_style.shadow.get();
- if (shadow_list == nullptr)
- return;
-
- for (const auto& shadow : shadow_list->Shadows()) {
- const Color& color = shadow.GetColor().Resolve(text_style.current_color,
- text_style.color_scheme);
- // Detect when there's no effective shadow.
- if (color.IsTransparent())
- continue;
-
- const gfx::Vector2dF& offset = shadow.Location().OffsetFromOrigin();
-
- float blur = shadow.Blur();
- DCHECK_GE(blur, 0);
- const auto sigma = BlurRadiusToStdDev(blur);
-
- context.BeginLayer(
- 1.0f, SkBlendMode::kSrcOver, nullptr, kColorFilterNone,
- sk_make_sp<DropShadowPaintFilter>(
- offset.x(), offset.y(), sigma, sigma, color.toSkColor4f(),
- DropShadowPaintFilter::ShadowMode::kDrawShadowOnly, nullptr));
-
- PaintUnderOrOverLineDecorations(fragment_paint_info, decoration_offset,
- decoration_info, lines_to_paint, flags,
- context);
-
- context.EndLayer();
- }
-}
-
-void NGTextPainterBase::PaintUnderOrOverLineDecorations(
- const NGTextFragmentPaintInfo& fragment_paint_info,
- const TextDecorationOffsetBase& decoration_offset,
- TextDecorationInfo& decoration_info,
- TextDecorationLine lines_to_paint,
- const cc::PaintFlags* flags,
- GraphicsContext& context) {
for (wtf_size_t i = 0; i < decoration_info.AppliedDecorationCount(); i++) {
decoration_info.SetDecorationIndex(i);
context.SetStrokeThickness(decoration_info.ResolvedThickness());
diff --git a/third_party/blink/renderer/core/paint/ng/ng_text_painter_base.h b/third_party/blink/renderer/core/paint/ng/ng_text_painter_base.h
index 5208b3e..3c13cb1 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_text_painter_base.h
+++ b/third_party/blink/renderer/core/paint/ng/ng_text_painter_base.h
@@ -45,12 +45,12 @@
~NGTextPainterBase() = default;
protected:
- // We have two functions to paint text decorations, because we should paint
+ // We have two functions to paint text decoations, because we should paint
// text and decorations in following order:
- // 1. Paint underline or overline text decorations
+ // 1. Paint text decorations except line through
// 2. Paint text
- // 3. Paint line through text decoration
- void PaintUnderOrOverLineDecorations(
+ // 3. Paint line through
+ void PaintDecorationsExceptLineThrough(
const NGTextFragmentPaintInfo& fragment_paint_info,
const TextDecorationOffsetBase& decoration_offset,
TextDecorationInfo& decoration_info,
@@ -59,12 +59,6 @@
const TextPaintStyle& text_style,
const cc::PaintFlags* flags = nullptr);
- virtual void ClipDecorationsStripe(const NGTextFragmentPaintInfo&,
- float upper,
- float stripe_width,
- float dilation) = 0;
-
- private:
void PaintDecorationUnderOrOverLine(
const NGTextFragmentPaintInfo& fragment_paint_info,
GraphicsContext& context,
@@ -72,22 +66,10 @@
TextDecorationLine line,
const cc::PaintFlags* flags = nullptr);
- void PaintUnderOrOverLineDecorationShadows(
- const NGTextFragmentPaintInfo& fragment_paint_info,
- const TextDecorationOffsetBase& decoration_offset,
- TextDecorationInfo& decoration_info,
- TextDecorationLine lines_to_paint,
- const cc::PaintFlags* flags,
- const TextPaintStyle& text_style,
- GraphicsContext& context);
-
- void PaintUnderOrOverLineDecorations(
- const NGTextFragmentPaintInfo& fragment_paint_info,
- const TextDecorationOffsetBase& decoration_offset,
- TextDecorationInfo& decoration_info,
- TextDecorationLine lines_to_paint,
- const cc::PaintFlags* flags,
- GraphicsContext& context);
+ virtual void ClipDecorationsStripe(const NGTextFragmentPaintInfo&,
+ float upper,
+ float stripe_width,
+ float dilation) = 0;
};
} // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/color.h b/third_party/blink/renderer/platform/graphics/color.h
index 6bc8bf16..00978ee6 100644
--- a/third_party/blink/renderer/platform/graphics/color.h
+++ b/third_party/blink/renderer/platform/graphics/color.h
@@ -252,12 +252,9 @@
bool SetFromString(const String&);
bool SetNamedColor(const String&);
- // Returns true if the color is not opaque.
+ // Return true if the color is not opaque.
bool HasAlpha() const { return Alpha() < 255; }
- // Returns true if the color is transparent.
- bool IsTransparent() const { return Alpha() == 0; }
-
// Access the color as though it were created using rgba syntax. This will
// clamp all colors to an 8-bit sRGB representation. All callers of these
// functions should be audited. The function Rgb(), despite the name, does
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/shadow-multiple-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/shadow-multiple-expected.png
deleted file mode 100644
index 98c30647..0000000
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/shadow-multiple-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/stroking-decorations-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/stroking-decorations-expected.png
deleted file mode 100644
index 1ce47d45..0000000
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/stroking-decorations-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/writing-mode/english-lr-text-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/fast/writing-mode/english-lr-text-expected.png
deleted file mode 100644
index 5a864bc..0000000
--- a/third_party/blink/web_tests/flag-specific/highdpi/fast/writing-mode/english-lr-text-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/writing-mode/english-lr-text-expected.png b/third_party/blink/web_tests/platform/linux/fast/writing-mode/english-lr-text-expected.png
index 963778b..5a864bc 100644
--- a/third_party/blink/web_tests/platform/linux/fast/writing-mode/english-lr-text-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/writing-mode/english-lr-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/ietestcenter/css3/text/textshadow-002-expected.png b/third_party/blink/web_tests/platform/linux/ietestcenter/css3/text/textshadow-002-expected.png
index ce9e65e..cbbf441 100644
--- a/third_party/blink/web_tests/platform/linux/ietestcenter/css3/text/textshadow-002-expected.png
+++ b/third_party/blink/web_tests/platform/linux/ietestcenter/css3/text/textshadow-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/shadow-multiple-expected.png
index cabdfa8f..98c30647 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/shadow-multiple-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/shadow-multiple-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/stroking-decorations-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/stroking-decorations-expected.png
index ed35105..1ce47d45 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/stroking-decorations-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/stroking-decorations-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/stroking-decorations-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/stroking-decorations-expected.png
index 8a20ce0..ff1e445e 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/stroking-decorations-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/stroking-decorations-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/shadow-multiple-expected.png
deleted file mode 100644
index 575d2b5..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/shadow-multiple-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/paint/invalidation/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/paint/invalidation/shadow-multiple-expected.png
deleted file mode 100644
index 575d2b5..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/paint/invalidation/shadow-multiple-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/writing-mode/english-lr-text-expected.png b/third_party/blink/web_tests/platform/mac/fast/writing-mode/english-lr-text-expected.png
index 2035c2b..2c1a028 100644
--- a/third_party/blink/web_tests/platform/mac/fast/writing-mode/english-lr-text-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/writing-mode/english-lr-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/ietestcenter/css3/text/textshadow-002-expected.png b/third_party/blink/web_tests/platform/mac/ietestcenter/css3/text/textshadow-002-expected.png
index f5d1059..44ec0ed 100644
--- a/third_party/blink/web_tests/platform/mac/ietestcenter/css3/text/textshadow-002-expected.png
+++ b/third_party/blink/web_tests/platform/mac/ietestcenter/css3/text/textshadow-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/shadow-multiple-expected.png
index 4876e755b3..44789bb7 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/shadow-multiple-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/shadow-multiple-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/text-antialias/stroking-decorations-expected.png b/third_party/blink/web_tests/platform/mac/virtual/text-antialias/stroking-decorations-expected.png
index d6589be3..70c851f6 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/text-antialias/stroking-decorations-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/text-antialias/stroking-decorations-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/writing-mode/english-lr-text-expected.png b/third_party/blink/web_tests/platform/win/fast/writing-mode/english-lr-text-expected.png
index 53ed456..cf160afd 100644
--- a/third_party/blink/web_tests/platform/win/fast/writing-mode/english-lr-text-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/writing-mode/english-lr-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/ietestcenter/css3/text/textshadow-002-expected.png b/third_party/blink/web_tests/platform/win/ietestcenter/css3/text/textshadow-002-expected.png
index 57ddf1d..f8aa958 100644
--- a/third_party/blink/web_tests/platform/win/ietestcenter/css3/text/textshadow-002-expected.png
+++ b/third_party/blink/web_tests/platform/win/ietestcenter/css3/text/textshadow-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/shadow-multiple-expected.png
index fa2baf5..16410b0 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/shadow-multiple-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/shadow-multiple-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/stroking-decorations-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/stroking-decorations-expected.png
index 85afa7d..a60df6b1 100644
--- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/stroking-decorations-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/stroking-decorations-expected.png
Binary files differ