Hello all,

We have seen changes in the appearance of text drawn by java.awt.Graphics2D 
when *both* fractional metrics and text antialiasing hints are enabled, between 
OracleJDK 1.8.0_202 and OpenJDK 11.0.1.
The differences affects text in many fonts and multiple sizes.
In the example given here (Arial Plain, size 48), the text becomes noticeably 
taller & thinner in Java 11 (not just pixel diffs).

The OS is Windows 10 1709.  Scaling set to 100%.  Screen resolution 1920x1080, 
also seen on a different monitor at 2560x1440.
I tried various combinations of -Dsun.java2d.dpiaware with no change in the 
outcome.
I also tried setting FREETYPE_PROPERTIES=truetype:interpreter-version=35 & 
again couldn't see a change in the behaviour.

Here is a code snippet demonstrating the problem:

       protected void paintComponent(Graphics g) {
            // Java 11 text looks significantly different when *both* 
Fractional Text Metrics and Text antialiasing hints are on
            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, 
RenderingHints.VALUE_FRACTIONALMETRICS_ON);
            g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            g2d.setFont(new Font("Arial Plain", Font.PLAIN, 48));
            g2d.drawString(TEXT, 0, 200);
        }

Here is the full test case:

package demo;

import javax.swing.*;
import java.awt.*;
import java.lang.reflect.InvocationTargetException;

public class RenderingHintsFontDiffDemo extends JFrame {

    private static final String TEXT = "THE QUICK BROWN FOX JUMPS OVER THE LAZY 
DOG";
    private static final int FRAME_WIDTH = 800;
    private static final int FRAME_HEIGHT = 600;

    private RenderingHintsFontDiffDemo() {
        super(buildTitle());
        add(new DrawingComponent(), BorderLayout.CENTER);
        pack();
    }

    private static class DrawingComponent extends JComponent {

        @Override
        protected void paintComponent(Graphics g) {
            // Java 11 text looks noticeably different when *both* Fractional 
Text Metrics and Text antialiasing hints are on
            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, 
RenderingHints.VALUE_FRACTIONALMETRICS_ON);
            g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            g2d.setFont(new Font("Arial Plain", Font.PLAIN, 48));
            g2d.drawString(TEXT, 0, 200);
        }
    }

    private static String buildTitle() {
        return "RenderingHintsFontDiffDemo - " + property("java.version") + " " 
+ property("sun.java2d.dpiaware") + " FREETYPE_PROPERTIES=" + 
System.getenv("FREETYPE_PROPERTIES");
    }

    private static String property(String s) {
        return s + "=" + System.getProperty(s);
    }

    private static void showFrame() {
        RenderingHintsFontDiffDemo demo = new RenderingHintsFontDiffDemo();
        demo.setSize(new Dimension(FRAME_WIDTH, FRAME_HEIGHT));
        demo.setVisible(true);
        demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) throws InvocationTargetException, 
InterruptedException, ClassNotFoundException, UnsupportedLookAndFeelException, 
InstantiationException, IllegalAccessException {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.invokeAndWait(RenderingHintsFontDiffDemo::showFrame);
    }

}


Thanks
--
Jacob Tredinnick




Reply via email to