From 5000186f8577a5226efecf7eef78ba0843a7062e Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Tue, 4 May 2021 22:11:15 +0200 Subject: [PATCH] Linux: enable text anti-aliasing if no Gnome or KDE Desktop properties are available (issue #218) --- CHANGELOG.md | 2 + .../java/com/formdev/flatlaf/FlatLaf.java | 46 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bc46474..9b9ba6a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,8 @@ FlatLaf Change Log - TableHeader: Moved table header column border painting from `FlatTableHeaderUI` to new border `FlatTableHeaderBorder` to improve compatibility with custom table header implementations. (issue #228) +- Linux: Enable text anti-aliasing if no Gnome or KDE Desktop properties are + available. (issue #218) - IntelliJ Themes: Added "Material Theme UI Lite / GitHub Dark" theme. - JIDE Common Layer: Improved support for `JideTabbedPane`. (PR #306) - Extras: `FlatSVGIcon` improvements: diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java index c7d85a5f..365fca90 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -32,6 +32,7 @@ import java.beans.PropertyChangeListener; import java.io.File; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; @@ -561,6 +562,8 @@ public abstract class FlatLaf defaults.put( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON ); } else if( SystemInfo.isJava_9_orLater ) { Object desktopHints = Toolkit.getDefaultToolkit().getDesktopProperty( DESKTOPFONTHINTS ); + if( desktopHints == null ) + desktopHints = fallbackAATextInfo(); if( desktopHints instanceof Map ) { @SuppressWarnings( "unchecked" ) Map hints = (Map) desktopHints; @@ -583,6 +586,8 @@ public abstract class FlatLaf Object value = Class.forName( "sun.swing.SwingUtilities2$AATextInfo" ) .getMethod( "getAATextInfo", boolean.class ) .invoke( null, true ); + if( value == null ) + value = fallbackAATextInfo(); defaults.put( key, value ); } catch( Exception ex ) { LoggingFacade.INSTANCE.logSevere( null, ex ); @@ -591,6 +596,47 @@ public abstract class FlatLaf } } + private Object fallbackAATextInfo() { + // do nothing if explicitly overridden + if( System.getProperty( "awt.useSystemAAFontSettings" ) != null ) + return null; + + Object aaHint = null; + Integer lcdContrastHint = null; + + if( SystemInfo.isLinux ) { + // see sun.awt.UNIXToolkit.getDesktopAAHints() + Toolkit toolkit = Toolkit.getDefaultToolkit(); + if( toolkit.getDesktopProperty( "gnome.Xft/Antialias" ) == null && + toolkit.getDesktopProperty( "fontconfig/Antialias" ) == null ) + { + // no Gnome or KDE Desktop properties available + // --> enable antialiasing + aaHint = RenderingHints.VALUE_TEXT_ANTIALIAS_ON; + } + } + + if( aaHint == null ) + return null; + + if( SystemInfo.isJava_9_orLater ) { + Map hints = new HashMap<>(); + hints.put( RenderingHints.KEY_TEXT_ANTIALIASING, aaHint ); + hints.put( RenderingHints.KEY_TEXT_LCD_CONTRAST, lcdContrastHint ); + return hints; + } else { + // Java 8 + try { + return Class.forName( "sun.swing.SwingUtilities2$AATextInfo" ) + .getConstructor( Object.class, Integer.class ) + .newInstance( aaHint, lcdContrastHint ); + } catch( Exception ex ) { + LoggingFacade.INSTANCE.logSevere( null, ex ); + throw new RuntimeException( ex ); + } + } + } + private void putDefaults( UIDefaults defaults, Object value, String... keys ) { for( String key : keys ) defaults.put( key, value );