Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8231556

Wrong font ligatures used when 2 versions of same font used

XMLWordPrintable

    • 2d
    • b07
    • x86_64
    • windows_7

        ADDITIONAL SYSTEM INFORMATION :
        openjdk version "13" 2019-09-17
        OpenJDK Runtime Environment (build 13+33)
        OpenJDK 64-Bit Server VM (build 13+33, mixed mode, sharing)

        Microsoft Windows [Version 6.1.7601]


        A DESCRIPTION OF THE PROBLEM :
        We are using two versions of the open source DejaVu Sans font (2.34 and 2.35). If we draw text using version 2.34, and then draw text using version 2.35 with ligatures enabled, the ligatures seem to reference the wrong glyphs.

        REGRESSION : Last worked in version 8

        STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
        Execute the attached source code. The code expects DejaVu Sans 2.34 and DejaVu Sans 2.35 to be available on the classpath; they can be downloaded here: https://sourceforge.net/projects/dejavu/files/dejavu/

        EXPECTED VERSUS ACTUAL BEHAVIOR :
        EXPECTED -
        The output PNG contains three lines of text, with the third line of text using ligatures to join the "ffi":

        foo
        affinity
        affinity

        ACTUAL -
        In the third line of text, the "ffi" is replaced with Arabic characters (I think).

        ---------- BEGIN SOURCE ----------
        import java.awt.Color;
        import java.awt.Font;
        import java.awt.Graphics2D;
        import java.awt.RenderingHints;
        import java.awt.font.TextAttribute;
        import java.awt.image.BufferedImage;
        import java.io.File;
        import java.util.Map;

        import javax.imageio.ImageIO;

        public class FontTest {

            public static void main(String... args) throws Exception {

                Font dejaVuSans234 = Font.createFont(Font.TRUETYPE_FONT, FontTest.class.getResourceAsStream("DejaVuSans-2.34.ttf")).deriveFont(160f);
                Font dejaVuSans235 = Font.createFont(Font.TRUETYPE_FONT, FontTest.class.getResourceAsStream("DejaVuSans-2.35.ttf")).deriveFont(160f);
                Font dejaVuSans235WithLigatures = dejaVuSans235.deriveFont(Map.of(TextAttribute.LIGATURES, TextAttribute.LIGATURES_ON));

                BufferedImage img = new BufferedImage(700, 700, BufferedImage.TYPE_INT_ARGB);
                Graphics2D g2d = img.createGraphics();
                g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g2d.setColor(Color.WHITE);
                g2d.fillRect(0, 0, img.getWidth(), img.getHeight());
                g2d.setColor(Color.BLACK);

                g2d.setFont(dejaVuSans234);
                g2d.drawString("foo", 30, 200);

                g2d.setFont(dejaVuSans235);
                g2d.drawString("affinity", 30, 400);

                g2d.setFont(dejaVuSans235WithLigatures);
                g2d.drawString("affinity", 30, 600);

                g2d.dispose();

                ImageIO.write(img, "png", new File("fonts.png"));
            }

        }
        ---------- END SOURCE ----------

        CUSTOMER SUBMITTED WORKAROUND :
        Be very careful about font conflicts, or do not enable ligatures.

        FREQUENCY : always


              prr Philip Race
              webbuggrp Webbug Group
              Votes:
              0 Vote for this issue
              Watchers:
              8 Start watching this issue

                Created:
                Updated:
                Resolved: