--- old/make/data/fontconfig/windows.fontconfig.properties 2019-09-25 20:09:41.287686300 +0100 +++ new/make/data/fontconfig/windows.fontconfig.properties 2019-09-25 20:09:39.610957000 +0100 @@ -1,6 +1,6 @@ # # -# Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -48,6 +48,7 @@ allfonts.telugu=Gautami allfonts.khmer=Khmer UI allfonts.mongolian=Mongolian Baiti +allfonts.myanmar=Myanmar Text allfonts.dingbats=Wingdings allfonts.symbol=Symbol allfonts.symbols=Segoe UI Symbol @@ -251,7 +252,8 @@ chinese-ms950,chinese-hkscs,chinese-ms936,chinese-gb18030,\ japanese,korean,chinese-ms950-extb,chinese-ms936-extb,\ georgian,devanagari,bengali,gujarati,gurmukhi,kannada,\ - malayalam,oriya,sinhala,tamil,telugu,thai,khmer,mongolian + malayalam,oriya,sinhala,tamil,telugu,thai,khmer,mongolian,\ + myanmar # Exclusion Ranges @@ -318,6 +320,7 @@ filename.DokChampa=dokchamp.ttf filename.Khmer_UI=KhmerUI.ttf filename.Mongolian_Baiti=monbaiti.ttf +filename.Myanmar_Text=mmrtext.ttf filename.Symbol=SYMBOL.TTF filename.Wingdings=WINGDING.TTF --- old/src/java.desktop/share/classes/sun/font/FontUtilities.java 2019-09-25 20:09:57.279193400 +0100 +++ new/src/java.desktop/share/classes/sun/font/FontUtilities.java 2019-09-25 20:09:54.216715700 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -266,6 +266,9 @@ else if (code <= 0x0fff) { // U+0F00 - U+0FFF Tibetan return true; } + else if (code < 0x10A0) { // U+1000 - U+109F Myanmar + return true; + } else if (code < 0x1100) { return false; } --- /dev/null 2019-09-25 20:10:14.000000000 +0100 +++ new/test/jdk/java/awt/font/Fallback/MyanmarFallbackTest.java 2019-09-25 20:10:11.012285400 +0100 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8223558 + * @summary Verifies Dialog logical font falls back to "Myanmar Text" + * @requires (os.family == "windows") + */ + +import java.awt.Font; +import java.awt.GraphicsEnvironment; +import java.util.Arrays; + +public class MyanmarFallbackTest { + + public static void main(String[] args) { + if (!System.getProperty("os.name").toLowerCase().contains("windows")) { + System.err.println("This test is for Windows only"); + return; + } + + String[] fontFamilyNames = GraphicsEnvironment + .getLocalGraphicsEnvironment() + .getAvailableFontFamilyNames(); + if (Arrays.stream(fontFamilyNames) + .noneMatch("Myanmar Text"::equals)) { + System.err.println("Myanmar Text font is not installed"); + return; + } + + Font dialog = new Font(Font.DIALOG, Font.PLAIN, 12); + if (-1 != dialog.canDisplayUpTo("\u1000\u103C")) { + throw new RuntimeException("Cannot display Myanmar characters"); + } + } +} --- /dev/null 2019-09-25 20:10:24.000000000 +0100 +++ new/test/jdk/java/awt/font/TextLayout/MyanmarTextTest.java 2019-09-25 20:10:21.445727300 +0100 @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8223558 + * @key headful + * @summary Verifies that Myanmar script is rendered correctly: + * two characters combined into one glyph + * @run main MyanmarTextTest + */ + +import java.awt.Font; +import java.awt.GraphicsEnvironment; +import java.util.Arrays; +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.WindowConstants; +import javax.swing.plaf.TextUI; +import javax.swing.text.BadLocationException; +import javax.swing.text.Position; + +public class MyanmarTextTest { + private static final String TEXT = "\u1000\u103C"; + + private static final String FONT_WINDOWS = "Myanmar Text"; + private static final String FONT_LINUX = "Padauk"; + private static final String FONT_MACOS = "Myanmar MN"; + + private static final String FONT_NAME = selectFontName(); + + private final JFrame frame; + private final JTextField myanmarTF; + + private static volatile MyanmarTextTest mtt; + + public static void main(String[] args) throws Exception { + if (FONT_NAME == null) { + System.err.println("Unsupported OS: exiting"); + return; + } + if (!fontExists()) { + System.err.println("Required font is not installed: " + FONT_NAME); + return; + } + + try { + SwingUtilities.invokeAndWait(MyanmarTextTest::createUI); + SwingUtilities.invokeAndWait(mtt::checkPositions); + } finally { + SwingUtilities.invokeAndWait(mtt::dispose); + } + } + + private static void createUI() { + mtt = new MyanmarTextTest(); + mtt.show(); + } + + private MyanmarTextTest() { + frame = new JFrame("Myanmar Text"); + frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + + myanmarTF = new JTextField(TEXT); + myanmarTF.setFont(new Font(FONT_NAME, Font.PLAIN, 40)); + + JPanel main = new JPanel(); + main.setLayout(new BoxLayout(main, BoxLayout.Y_AXIS)); + main.add(myanmarTF); + + main.setBorder(BorderFactory.createEmptyBorder(7, 7, 7, 7)); + + frame.getContentPane().add(main); + } + + private void show() { + frame.pack(); + frame.setLocationByPlatform(true); + frame.setVisible(true); + } + + private void dispose() { + frame.dispose(); + } + + private void checkPositions() { + final TextUI ui = myanmarTF.getUI(); + final Position.Bias[] biasRet = new Position.Bias[1]; + try { + if (2 != ui.getNextVisualPositionFrom(myanmarTF, 0, + Position.Bias.Forward, SwingConstants.EAST, biasRet)) { + throw new RuntimeException("For 0, next position should be 2"); + } + if (2 != ui.getNextVisualPositionFrom(myanmarTF, 1, + Position.Bias.Forward, SwingConstants.EAST, biasRet)) { + throw new RuntimeException("For 1, next position should be 2"); + } + if (0 != ui.getNextVisualPositionFrom(myanmarTF, 2, + Position.Bias.Forward, SwingConstants.WEST, biasRet)) { + throw new RuntimeException("For 2, prev position should be 0"); + } + } catch (BadLocationException e) { + throw new RuntimeException(e); + } + } + + private static String selectFontName() { + String osName = System.getProperty("os.name").toLowerCase(); + if (osName.contains("windows")) { + return FONT_WINDOWS; + } else if (osName.contains("linux")) { + return FONT_LINUX; + } else if (osName.contains("mac")) { + return FONT_MACOS; + } else { + return null; + } + } + + private static boolean fontExists() { + String[] fontFamilyNames = GraphicsEnvironment + .getLocalGraphicsEnvironment() + .getAvailableFontFamilyNames(); + return Arrays.asList(fontFamilyNames).contains(FONT_NAME); + } +}