--- /dev/null 2018-05-31 15:13:06.000000000 -0700 +++ new/test/jdk/java/awt/font/TextLayout/VariationSelectorTest.java 2018-05-31 15:13:05.000000000 -0700 @@ -0,0 +1,64 @@ +/* @test + * @summary Verify two identical 'a's are rendered + * @bug 8187100 + * @ignore Requires a special font installed. + */ +import javax.swing.JFrame; +import javax.swing.JComponent; +import javax.swing.SwingUtilities; +import javax.swing.WindowConstants; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.font.FontRenderContext; +import java.awt.font.GlyphVector; + +public class VariationSelectorTest { + // A font supporting Unicode variation selectors is required + private static final Font FONT = new Font("DejaVu Sans", Font.PLAIN, 12); + + public static void main(String[] args) { + final String fontName = FONT.getFontName(); + if (!fontName.equals("DejaVuSans")) { + System.err.println("*** Warning: Font DejaVuSans not installed."); + System.err.println("*** Using font: " + fontName); + } + SwingUtilities.invokeLater(() -> { + JFrame frame = new JFrame(); + frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + frame.add(new MyComponent()); + frame.setSize(200, 200); + frame.setVisible(true); + frame.setLocationRelativeTo(null); + }); + } + + private static class MyComponent extends JComponent { + @Override + protected void paintComponent(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + FontRenderContext frc = g2d.getFontRenderContext(); + String text = "a"; + GlyphVector gv = FONT.layoutGlyphVector( + frc, text.toCharArray(), 0, text.length(), + Font.LAYOUT_LEFT_TO_RIGHT); + System.out.println("'a'=" + gv.getNumGlyphs()); + g2d.drawString("=" + gv.getNumGlyphs() + " ('a')", 100, 50); + g2d.drawGlyphVector(gv, 80, 50); + String text2 = "a\ufe00"; + GlyphVector gv2 = FONT.layoutGlyphVector( + frc, text2.toCharArray(), 0, text2.length(), + Font.LAYOUT_LEFT_TO_RIGHT); + g2d.drawGlyphVector(gv2, 80, 100); + System.out.println("'a'+VS=" + gv2.getNumGlyphs()); + g2d.drawString("=" + gv2.getNumGlyphs() + " ('a'+VS)", 100, 100); + if ((gv.getNumGlyphs() == 1) && (gv2.getNumGlyphs() == 1)) { + System.out.println("PASS"); + g2d.drawString("PASS", 10, 15); + } else { + System.err.println("FAIL"); + g2d.drawString("FAIL", 10, 15); + } + } + } +}