aboutsummaryrefslogtreecommitdiff
path: root/test/java/awt/font
diff options
context:
space:
mode:
Diffstat (limited to 'test/java/awt/font')
-rw-r--r--test/java/awt/font/GlyphVector/GlyphVectorOutline.java91
-rw-r--r--test/java/awt/font/Rotate/RotatedFontMetricsTest.java79
-rw-r--r--test/java/awt/font/TextLayout/HangulShapingTest.java72
-rw-r--r--test/java/awt/font/TextLayout/HebrewIsRTLTest.java75
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");
+ }
+ }
+}