diff options
Diffstat (limited to 'test/java/awt/font')
4 files changed, 317 insertions, 0 deletions
diff --git a/test/java/awt/font/GlyphVector/GlyphVectorOutline.java b/test/java/awt/font/GlyphVector/GlyphVectorOutline.java new file mode 100644 index 0000000000..5680f7bc42 --- /dev/null +++ b/test/java/awt/font/GlyphVector/GlyphVectorOutline.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2014 Google Inc. 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. + */ + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.font.FontRenderContext; +import java.awt.font.GlyphVector; +import java.awt.font.LineBreakMeasurer; +import java.awt.font.TextAttribute; +import java.awt.font.TextLayout; +import java.awt.image.BufferedImage; +import java.io.File; +import java.text.AttributedString; + +import javax.imageio.ImageIO; + +/** + * Manual test for: + * JDK-8057986: freetype code to get glyph outline does not handle initial control point properly + * + * Manual repro recipe: + * (cd test/java/awt/font/GlyphVector/ && javac GlyphVectorOutline.java && wget -q -O/tmp/msgothic.ttc https://browserlinux-jp.googlecode.com/files/msgothic.ttc && java GlyphVectorOutline /tmp/msgothic.ttc /tmp/katakana.png) + * + * Then examine the two rendered Japanese characters in the png file. + * + * Renders text to a PNG by + * 1. using the native Graphics2D#drawGlyphVector implementation + * 2. filling in the result of GlyphVector#getOutline + * + * Should be the same but is different for some CJK characters + * (e.g. Katakana character \u30AF). + * + * @author ikopylov@google.com (Igor Kopylov) + */ +public class GlyphVectorOutline { + public static void main(String[] args) throws Exception { + if (args.length != 2) { + throw new Error("Usage: java GlyphVectorOutline fontfile outputfile"); + } + writeImage(new File(args[0]), + new File(args[1]), + "\u30AF"); + } + + public static void writeImage(File fontFile, File outputFile, String value) throws Exception { + BufferedImage image = new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB); + Graphics2D g = image.createGraphics(); + g.setColor(Color.WHITE); + g.fillRect(0, 0, image.getWidth(), image.getHeight()); + g.setColor(Color.BLACK); + + Font font = Font.createFont(Font.TRUETYPE_FONT, fontFile); + font = font.deriveFont(Font.PLAIN, 72f); + FontRenderContext frc = new FontRenderContext(null, false, false); + GlyphVector gv = font.createGlyphVector(frc, value); + g.drawGlyphVector(gv, 10, 80); + g.fill(gv.getOutline(10, 180)); + ImageIO.write(image, "png", outputFile); + } + + private static void drawString(Graphics2D g, Font font, String value, float x, float y) { + AttributedString str = new AttributedString(value); + str.addAttribute(TextAttribute.FOREGROUND, Color.BLACK); + str.addAttribute(TextAttribute.FONT, font); + FontRenderContext frc = new FontRenderContext(null, true, true); + TextLayout layout = new LineBreakMeasurer(str.getIterator(), frc).nextLayout(Integer.MAX_VALUE); + layout.draw(g, x, y); + } +} diff --git a/test/java/awt/font/Rotate/RotatedFontMetricsTest.java b/test/java/awt/font/Rotate/RotatedFontMetricsTest.java new file mode 100644 index 0000000000..b4d9d2c9d9 --- /dev/null +++ b/test/java/awt/font/Rotate/RotatedFontMetricsTest.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018, 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 RotatedFontMetricsTest + * @bug 8139178 + * @summary This test verifies that rotation does not affect font metrics. + * @run main RotatedFontMetricsTest + */ + +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; + +public class RotatedFontMetricsTest { + static final int FONT_SIZE = Integer.getInteger("font.size", 20); + + public static void main(String ... args) { + Font font = new Font(Font.DIALOG, Font.PLAIN, FONT_SIZE); + Graphics2D g2d = createGraphics(); + + FontMetrics ref = null; + RuntimeException failure = null; + for (int a = 0; a < 360; a += 15) { + Graphics2D g = (Graphics2D)g2d.create(); + g.rotate(Math.toRadians(a)); + FontMetrics m = g.getFontMetrics(font); + g.dispose(); + + boolean status = true; + if (ref == null) { + ref = m; + } else { + status = ref.getAscent() == m.getAscent() && + ref.getDescent() == m.getDescent() && + ref.getLeading() == m.getLeading() && + ref.getMaxAdvance() == m.getMaxAdvance(); + } + + System.out.printf("Metrics a%d, d%d, l%d, m%d (%d) %s\n", + m.getAscent(), m.getDescent(), m.getLeading(), m.getMaxAdvance(), + (int)a, status ? "OK" : "FAIL"); + + if (!status && failure == null) { + failure = new RuntimeException("Font metrics differ for angle " + a); + } + } + if (failure != null) { + throw failure; + } + System.out.println("done"); + } + + private static Graphics2D createGraphics() { + BufferedImage dst = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB); + return dst.createGraphics(); + } +} diff --git a/test/java/awt/font/TextLayout/HangulShapingTest.java b/test/java/awt/font/TextLayout/HangulShapingTest.java new file mode 100644 index 0000000000..2febfad3db --- /dev/null +++ b/test/java/awt/font/TextLayout/HangulShapingTest.java @@ -0,0 +1,72 @@ +// Copyright 2019 Azul Systems, Inc. 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 Azul Systems, 385 Moffett Park Drive, Suite 115, Sunnyvale, +// CA 94089 USA or visit www.azul.com if you need additional information or +// have any questions. + +import java.awt.Font; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; + +/* + * @test + * @bug 8215210 + * @summary Downport of prr's fix to a certain ICU wrong condition breaking some Hangul shaping + * @run main/othervm -Dsun.font.layoutengine=icu HangulShapingTest + */ +public class HangulShapingTest { + public static void main(String args[]) { + if (!System.getProperty("os.name").startsWith("Mac")) { + return; + } + + // images of the strings as drawn should be identical + String beforeString = "\u1100\u1161 \u1102\u1161"; + String afterString = "\uAC00 \uB098"; + int w = 100, h = 100; + + BufferedImage bi1 = drawit(w, h, beforeString); + BufferedImage bi2 = drawit(w, h, afterString); + + boolean same = true; + for (int x = 0; x < w; x++) { + for (int y = 0; y < h; y++) { + int c1 = bi1.getRGB(x, y); + int c2 = bi2.getRGB(x, y); + same &= (c1 == c2); + } + if (!same) { + break; + } + } + if (!same) { + throw new RuntimeException("Images differ"); + } + } + private static BufferedImage drawit(int w, int h, String toDraw) { + BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); + Graphics2D biGraphics = bi.createGraphics(); + biGraphics.setColor(Color.white); + biGraphics.fillRect(0, 0, w, h); + biGraphics.setColor(Color.black); + Font font = new Font("Dialog", Font.PLAIN, 20); + biGraphics.setFont(font); + biGraphics.drawString(toDraw, 10, 40); + return bi; + } +} diff --git a/test/java/awt/font/TextLayout/HebrewIsRTLTest.java b/test/java/awt/font/TextLayout/HebrewIsRTLTest.java new file mode 100644 index 0000000000..1ced41de18 --- /dev/null +++ b/test/java/awt/font/TextLayout/HebrewIsRTLTest.java @@ -0,0 +1,75 @@ +// Copyright 2019 Azul Systems, Inc. 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 Azul Systems, 385 Moffett Park Drive, Suite 115, Sunnyvale, +// CA 94089 USA or visit www.azul.com if you need additional information or +// have any questions. + +import java.awt.Font; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; + +/* + * @test + * @summary Fix to 8215210 should not break RTL with AAT fonts. + * @run main/othervm -Dsun.font.layoutengine=icu HebrewIsRTLTest + */ +public class HebrewIsRTLTest { + static final String hebrewString = "\u05E9\u059E\u05E9\u0595\u05E9\u05A9\u05E9\u0592\u05E9\u0599\u05E9\u059E\u05E9\u0595\u05E9\u05A9\u05E9\u0592\u05E9\u0599 . \u05E9\u0599\u05E9\u05A1\u05E9\u0595\u05E9\u0593"; + public static void main(String args[]) { + if (!System.getProperty("os.name").startsWith("Mac")) { + return; + } + + // calculate text size + BufferedImage biMetrics = new BufferedImage(1000, 1000, BufferedImage.TYPE_INT_RGB); + Graphics2D biMetricsGraphics = biMetrics.createGraphics(); + Font font = new Font("TimesRoman", Font.PLAIN, 40); + biMetricsGraphics.setFont(font); + int width = biMetricsGraphics.getFontMetrics().stringWidth(hebrewString); + int height = biMetricsGraphics.getFontMetrics().getHeight(); + + // create minimal image + BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics2D biGraphics = bi.createGraphics(); + biGraphics.setColor(Color.white); + biGraphics.fillRect(0, 0, width, height); + biGraphics.setColor(Color.black); + biGraphics.setFont(font); + biGraphics.drawString(hebrewString, 0, height); + + int y = bi.getHeight() / 2; + int x; + int rgb, rgbLeftCount = 0, rgbRightCount = 0; + + for (x = 0; x < bi.getWidth()/2; x++) { + rgb = bi.getRGB(x, y); + if (rgb == Color.BLACK.getRGB()) { + rgbLeftCount++; + } + } + for (x = bi.getWidth()/2 + 1; x < bi.getWidth(); x++) { + rgb = bi.getRGB(x, y); + if (rgb == Color.BLACK.getRGB()) { + rgbRightCount++; + } + } + if (rgbLeftCount > rgbRightCount) { + throw new RuntimeException("Hebrew text seems drawn LTR"); + } + } +} |