From dd8411913e87fa6b65458e40db0d221f2552af8a Mon Sep 17 00:00:00 2001 From: Anton Tarasov Date: Thu, 21 Jun 2018 20:16:46 +0300 Subject: [PATCH] IDEA-192438 [followup] Underline is always bold underline The thickness value provided by FontMetrics may be too small for large fonts (like 24px). In order to avoid too thin lines, the thickness is limited from the bottom now. --- .../intellij/ui/paint/EffectPainter2D.java | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ui/paint/EffectPainter2D.java b/platform/platform-api/src/com/intellij/ui/paint/EffectPainter2D.java index 35305a21d3ec..b40332027373 100644 --- a/platform/platform-api/src/com/intellij/ui/paint/EffectPainter2D.java +++ b/platform/platform-api/src/com/intellij/ui/paint/EffectPainter2D.java @@ -2,10 +2,13 @@ package com.intellij.ui.paint; import com.intellij.openapi.util.registry.Registry; +import com.intellij.ui.paint.PaintUtil.RoundingMode; import com.intellij.util.JBHiDPIScaledImage; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.WavePainter2D; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.TestOnly; import java.awt.*; import java.awt.font.LineMetrics; @@ -136,9 +139,9 @@ public enum EffectPainter2D implements RegionPainter2D { else { if (font == null) font = g.getFont(); LineMetrics metrics = font.getLineMetrics("", g.getFontRenderContext()); - double devPixel = PaintUtil.devPixel(g); double offset = PaintUtil.alignToInt(-metrics.getStrikethroughOffset(), g); - double thickness = PaintUtil.alignToInt(Math.max(devPixel, metrics.getStrikethroughThickness()), g); + @SuppressWarnings("TestOnlyProblems") + double thickness = PaintUtil.alignToInt(maybeScaleFontMetricsThickness(metrics.getStrikethroughThickness(), g, font), g); drawLine(g, x, y - offset, width, thickness, this); } } @@ -149,17 +152,22 @@ public enum EffectPainter2D implements RegionPainter2D { return height > 7 && Registry.is("ide.text.effect.new.scale") ? height / 2 : 3; } + @SuppressWarnings("TestOnlyProblems") private static void paintUnderline(Graphics2D g, double x, double y, double width, double height, Font font, double thickness, EffectPainter2D painter) { if (width > 0 && height > 0) { if (Registry.is("ide.text.effect.new.metrics")) { if (font == null) font = g.getFont(); LineMetrics metrics = font.getLineMetrics("", g.getFontRenderContext()); double devPixel = PaintUtil.devPixel(g); - thickness = PaintUtil.alignToInt(Math.max(thickness, thickness * metrics.getUnderlineThickness()), g); - double offset = Math.min(height - thickness, Math.max(devPixel, metrics.getUnderlineOffset())); + double underlineThickness = maybeScaleFontMetricsThickness(metrics.getUnderlineThickness(), g, font); + double underlineOffset = Math.max(devPixel, metrics.getUnderlineOffset()); + + thickness = PaintUtil.alignToInt(thickness * underlineThickness, g); + double offset = Math.min(height - thickness, underlineOffset); + if (offset < devPixel) { offset = height > 3 * devPixel ? devPixel : 0; - thickness = PaintUtil.alignToInt(height - offset, g); + thickness = PaintUtil.alignToInt(Math.min(thickness, height - offset), g); } else { offset = PaintUtil.alignToInt(offset, g); @@ -180,6 +188,12 @@ public enum EffectPainter2D implements RegionPainter2D { } } + @TestOnly + public static double maybeScaleFontMetricsThickness(double fontMetricsThickness, @NotNull Graphics2D g, @NotNull Font font) { + double minValue = PaintUtil.alignToInt(JBUI.getFontScale(font.getSize2D()), g, RoundingMode.ROUND_FLOOR_BIAS); + return Math.max(fontMetricsThickness, minValue); + } + private static void drawLineCentered(Graphics2D g, double x, double y, double width, double height, double thickness, EffectPainter2D painter) { double offset = height - thickness; if (offset > 0) {