diff --git a/src/java.desktop/share/classes/sun/font/FontUtilities.java b/src/java.desktop/share/classes/sun/font/FontUtilities.java index c2e3137e1b5..a14214ab751 100644 --- a/src/java.desktop/share/classes/sun/font/FontUtilities.java +++ b/src/java.desktop/share/classes/sun/font/FontUtilities.java @@ -370,17 +370,25 @@ public final class FontUtilities { } /** - * Checks whether or not the specified codepoint is whitespace which is + *

Checks whether or not the specified codepoint is whitespace which is * ignorable at the shaping stage of text rendering. These ignorable * whitespace characters should be used prior to text shaping and * rendering to determine the position of the text, but are not themselves * rendered. * + *

Includes 0x0009 (horizontal tab / TAB), 0x000A (line feed / LF), + * 0x000B (vertical tab / VT), 0x000C (form feed / FF), + * 0x000D (carriage return / CR), 0x0085 (next line / NEL), + * 0x2028 (line separator / LS), 0x2029 (paragraph separator / PS). + * * @param ch the codepoint to check * @return whether the specified codepoint is ignorable whitespace */ public static boolean isIgnorableWhitespace(int ch) { - return ch == 0x0009 || ch == 0x000a || ch == 0x000d; + return (ch >= 0x0009 && ch <= 0x000d) + || ch == 0x0085 + || ch == 0x2028 + || ch == 0x2029; } public static PlatformLogger getLogger() { diff --git a/test/jdk/java/awt/font/TextLayout/FormatCharAdvanceTest.java b/test/jdk/java/awt/font/TextLayout/FormatCharAdvanceTest.java index b37f7e02707..63cd890f1db 100644 --- a/test/jdk/java/awt/font/TextLayout/FormatCharAdvanceTest.java +++ b/test/jdk/java/awt/font/TextLayout/FormatCharAdvanceTest.java @@ -21,10 +21,11 @@ * questions. */ -/** +/* * @test - * @bug 8208377 6562489 8270265 - * @summary Confirm that format-category glyphs are not rendered or measured. + * @bug 8208377 6562489 8270265 8356803 8356812 4517298 + * @summary Confirm that default-ignorable and ignorable-whitespace + * glyphs are not rendered or measured. */ import java.awt.Color; @@ -48,9 +49,11 @@ import java.util.Map; public class FormatCharAdvanceTest { /** - *

Font created for this test which contains glyphs for 0-9, a-z, A-Z, space, and most - * characters with Unicode general category = Format (Cf); the tests will pass if these - * format glyphs and their advances are ignored during text measurement and text drawing. + *

Font created for this test which contains glyphs for 0-9, a-z, A-Z, + * some whitespace characters, and most characters with Unicode "Format" + * (Cf) general category; the tests will pass if the font glyphs and + * advances for default-ignorable and ignorable-whitespace characters + * are ignored during text measurement and text drawing. * *

The following FontForge Python script was used to generate this font: * @@ -87,9 +90,11 @@ public class FormatCharAdvanceTest { * chars = 'bcdefghijklmnopqrstuvwxyz' \ * 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' \ * '1234567890' \ - * '\u00AD\u0600\u0601\u0602\u0603\u0604\u0605\u061C\u06DD\u070F\u0890\u0891\u08E2\u180E' \ - * '\u200B\u200C\u200D\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u2060\u2061\u2062\u2063\u2064' \ - * '\u2066\u2067\u2068\u2069\u206A\u206B\u206C\u206D\u206E\u206F\uFEFF\uFFF9\uFFFA\uFFFB' \ + * '\u0009\u000A\u000B\u000C\u000D\u0085\u00AD' \ + * '\u0600\u0601\u0602\u0603\u0604\u0605\u061C\u06DD\u070F\u0890\u0891\u08E2\u180E' \ + * '\u200B\u200C\u200D\u200E\u200F\u2028\u2029\u202A\u202B\u202C\u202D\u202E\u202F' \ + * '\u2060\u2061\u2062\u2063\u2064\u2065\u2066\u2067\u2068\u2069\u206A\u206B\u206C' \ + * '\u206D\u206E\u206F\uFEFF\uFFF9\uFFFA\uFFFB' \ * '\U000110BD\U000110CD\U00013430\U00013431\U00013432\U00013433\U00013434\U00013435\U00013436' \ * '\U00013437\U00013438\U00013439\U0001343A\U0001343B\U0001343C\U0001343D\U0001343E\U0001343F' \ * '\U0001BCA0\U0001BCA1\U0001BCA2\U0001BCA3\U0001D173\U0001D174\U0001D175\U0001D176\U0001D177' \ @@ -119,12 +124,12 @@ public class FormatCharAdvanceTest { * f4.write(encoded) * */ - private static final String TTF_BYTES = "AAEAAAANAIAAAwBQRkZUTaj5NMoAABWEAAAAHE9TLzKEBfqWAAABWAAAAGBjbWFw6BKIbQAAAuQAAAMoY3Z0IABEBREAAAYMAAAABGdhc3D//wADAAAVfAAAAAhnbHlmcb+r/AAABzQAAAksaGVhZCi9kzQAAADcAAAANmhoZWEIcgJeAAABFAAAACRobXR4JX8bnAAAAbgAAAEqbG9jYam4p4gAAAYQAAABIm1heHAA1wBCAAABOAAAACBuYW1lImUC5wAAEGAAAAGJcG9zdBd/2qEAABHsAAADjwABAAAAAQAAEAez8l8PPPUACwgAAAAAAON7pHEAAAAA43ukcQBEAAACZAVVAAAACAACAAAAAAAAAAEAAAVVAAAAuAJYAAAAAAJkAAEAAAAAAAAAAAAAAAAAAAAFAAEAAACQAAgAAgAIAAIAAgAAAAEAAQAAAEAALgABAAEABAJXAZAABQAABTMFmQAAAR4FMwWZAAAD1wBmAhIAAAIABQMAAAAAAACAACADAgAAABECAKgAAAAAUGZFZACAACD//wZm/mYAuAVVAAAAAAABAAAAAADIAMgAAAAgAAEC7ABEAAAAAAKqAAACOQAAAlgAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAAAAAAAFAAAAAwAAACwAAAAEAAAA2gABAAAAAAIiAAMAAQAAACwAAwAKAAAA2gAEAK4AAAAmACAABAAGACAAOQBaAHoArQYFBhwG3QcPCJEI4hgOIA8gLiBkIG/+///7//8AAAAgADAAQQBhAK0GAAYcBt0HDwiQCOIYDiALICogYCBm/v//+f///+P/1P/N/8f/lfpD+i35bfk897z3bOhB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ACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA//8AZABkAfQAyBIGACgAAP//AGQAZAH0AMgSBgAoAAD//wBkAGQB9ADIEgYAKAAA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"; + private static final String TTF_BYTES = "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cAGQZGRkZGT//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAD//wBkAGQB9ADIEgYALAAA//8AZABkAfQAyBIGACwAAP//AGQAZAH0AMgSBgAsAAAAAAAOAK4AAQAAAAAAAAAAAAIAAQAAAAAAAQAEAA0AAQAAAAAAAgAHACIAAQAAAAAAAwAgAGwAAQAAAAAABAAEAJcAAQAAAAAABQAPALwAAQAAAAAABgAEANYAAwABBAkAAAAAAAAAAwABBAkAAQAIAAMAAwABBAkAAgAOABIAAwABBAkAAwBAACoAAwABBAkABAAIAI0AAwABBAkABQAeAJwAAwABBAkABgAIAMwAAAAAVABlAHMAdAAAVGVzdAAAUgBlAGcAdQBsAGEAcgAAUmVndWxhcgAARgBvAG4AdABGAG8AcgBnAGUAIAAyAC4AMAAgADoAIABUAGUAcwB0ACAAOgAgADMAMAAtADUALQAyADAAMgA1AABGb250Rm9yZ2UgMi4wIDogVGVzdCA6IDMwLTUtMjAyNQAAVABlAHMAdAAAVGVzdAAAVgBlAHIAcwBpAG8AbgAgADAAMAAxAC4AMAAwADAAAFZlcnNpb24gMDAxLjAwMAAAVABlAHMAdAAAVGVzdAAAAAAAAgAAAAAAAP9nAGYAAAAAAAAAAAAAAAAAAAAAAAAAAACZAAAAAQECAQMBBAEFAQYAAwATABQAFQAWABcAGAAZABoAGwAcACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0BBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZB3VuaTAwMEQHdW5pMDAwOQd1bmkwMDBBB3VuaTAwMEIHdW5pMDAwQwd1bmkwMDg1B3VuaTAwQUQHdW5pMDYwMAd1bmkwNjAxB3VuaTA2MDIHdW5pMDYwMwd1bmkwNjA0B3VuaTA2MDUHdW5pMDYxQwd1bmkwNkREB3VuaTA3MEYHdW5pMDg5MAd1bmkwODkxB3VuaTA4RTIHdW5pMTgwRQd1bmkyMDBCB3VuaTIwMEMHdW5pMjAwRAd1bmkyMDBFB3VuaTIwMEYHdW5pMjAyOAd1bmkyMDI5B3VuaTIwMkEHdW5pMjAyQgd1bmkyMDJDB3VuaTIwMkQHdW5pMjAyRQd1bmkyMDJGB3VuaTIwNjAHdW5pMjA2MQd1bmkyMDYyB3VuaTIwNjMHdW5pMjA2NAd1bmkyMDY1B3VuaTIwNjYHdW5pMjA2Nwd1bmkyMDY4B3VuaTIwNjkHdW5pMjA2QQd1bmkyMDZCB3VuaTIwNkMHdW5pMjA2RAd1bmkyMDZFB3VuaTIwNkYHdW5pRkVGRgd1bmlGRkY5B3VuaUZGRkEHdW5pRkZGQgZ1MTEwQkQGdTExMENEBnUxMzQzMAZ1MTM0MzEGdTEzNDMyBnUxMzQzMwZ1MTM0MzQGdTEzNDM1BnUxMzQzNgZ1MTM0MzcGdTEzNDM4BnUxMzQzOQZ1MTM0M0EGdTEzNDNCBnUxMzQzQwZ1MTM0M0QGdTEzNDNFBnUxMzQzRgZ1MUJDQTAGdTFCQ0ExBnUxQkNBMgZ1MUJDQTMGdTFEMTczBnUxRDE3NAZ1MUQxNzUGdTFEMTc2BnUxRDE3NwZ1MUQxNzgGdTFEMTc5BnUxRDE3QQZ1RTAwMDEGdUUwMDIwBnVFMDAyMQZ1RTAwN0UGdUUwMDdGAAAAAAAAAf//AAIAAAABAAAAAOIB6+cAAAAA5F+vtAAAAADkX6+0"; /** * Same font as above, but in PostScript Type1 (PFB) format. */ - private static final String TYPE1_BYTES = "gAHhBgAAJSFQUy1BZG9iZUZvbnQtMS4wOiBUZXN0IDAwMS4wMDAKJSVUaXRsZTogVGVzdAolVmVyc2lvbjogMDAxLjAwMAolJUNyZWF0aW9uRGF0ZTogVHVlIERlYyAxMCAwMDo0Mzo1MCAyMDI0CiUlQ3JlYXRvcjogRGFuaWVsIEdyZWRsZXIKJSAyMDI0LTEyLTEwOiBDcmVhdGVkIHdpdGggRm9udEZvcmdlIChodHRwOi8vZm9udGZvcmdlLm9yZykKJSBHZW5lcmF0ZWQgYnkgRm9udEZvcmdlIDIwMjMwMTAxIChodHRwOi8vZm9udGZvcmdlLnNmLm5ldC8pCiUlRW5kQ29tbWVudHMKCjEwIGRpY3QgYmVnaW4KL0ZvbnRUeXBlIDEgZGVmCi9Gb250TWF0cml4IFswLjAwMDQ4ODI4MSAwIDAgMC4wMDA0ODgyODEgMCAwIF1yZWFkb25seSBkZWYKL0ZvbnROYW1lIC9UZXN0IGRlZgovRm9udEJCb3ggezEwMCAxMDAgNTAwIDIwMCB9cmVhZG9ubHkgZGVmCi9QYWludFR5cGUgMCBkZWYKL0ZvbnRJbmZvIDEwIGRpY3QgZHVwIGJlZ2luCiAvdmVyc2lvbiAoMDAxLjAwMCkgcmVhZG9ubHkgZGVmCiAvTm90aWNlICgpIHJlYWRvbmx5IGRlZgogL0Z1bGxOYW1lIChUZXN0KSByZWFkb25seSBkZWYKIC9GYW1pbHlOYW1lIChUZXN0KSByZWFkb25seSBkZWYKIC9XZWlnaHQgKFJlZ3VsYXIpIHJlYWRvbmx5IGRlZgogL0ZTVHlwZSAwIGRlZgogL0l0YWxpY0FuZ2xlIDAgZGVmCiAvaXNGaXhlZFBpdGNoIGZhbHNlIGRlZgogL1VuZGVybGluZVBvc2l0aW9uIC0yMDQuOCBkZWYKIC9VbmRlcmxpbmVUaGlja25lc3MgMTAyLjQgZGVmCmVuZCByZWFkb25seSBkZWYKL0VuY29kaW5nIDI1NiBhcnJheQogMCAxIDI1NSB7IDEgaW5kZXggZXhjaCAvLm5vdGRlZiBwdXR9IGZvcgpkdXAgMzIvc3BhY2UgcHV0CmR1cCA0OC96ZXJvIHB1dApkdXAgNDkvb25lIHB1dApkdXAgNTAvdHdvIHB1dApkdXAgNTEvdGhyZWUgcHV0CmR1cCA1Mi9mb3VyIHB1dApkdXAgNTMvZml2ZSBwdXQKZHVwIDU0L3NpeCBwdXQKZHVwIDU1L3NldmVuIHB1dApkdXAgNTYvZWlnaHQgcHV0CmR1cCA1Ny9uaW5lIHB1dApkdXAgNjUvQSBwdXQKZHVwIDY2L0IgcHV0CmR1cCA2Ny9DIHB1dApkdXAgNjgvRCBwdXQKZHVwIDY5L0UgcHV0CmR1cCA3MC9GIHB1dApkdXAgNzEvRyBwdXQKZHVwIDcyL0ggcHV0CmR1cCA3My9JIHB1dApkdXAgNzQvSiBwdXQKZHVwIDc1L0sgcHV0CmR1cCA3Ni9MIHB1dApkdXAgNzcvTSBwdXQKZHVwIDc4L04gcHV0CmR1cCA3OS9PIHB1dApkdXAgODAvUCBwdXQKZHVwIDgxL1EgcHV0CmR1cCA4Mi9SIHB1dApkdXAgODMvUyBwdXQKZHVwIDg0L1QgcHV0CmR1cCA4NS9VIHB1dApkdXAgODYvViBwdXQKZHVwIDg3L1cgcHV0CmR1cCA4OC9YIHB1dApkdXAgODkvWSBwdXQKZHVwIDkwL1ogcHV0CmR1cCA5Ny9hIHB1dApkdXAgOTgvYiBwdXQKZHVwIDk5L2MgcHV0CmR1cCAxMDAvZCBwdXQKZHVwIDEwMS9lIHB1dApkdXAgMTAyL2YgcHV0CmR1cCAxMDMvZyBwdXQKZHVwIDEwNC9oIHB1dApkdXAgMTA1L2kgcHV0CmR1cCAxMDYvaiBwdXQKZHVwIDEwNy9rIHB1dApkdXAgMTA4L2wgcHV0CmR1cCAxMDkvbSBwdXQKZHVwIDExMC9uIHB1dApkdXAgMTExL28gcHV0CmR1cCAxMTIvcCBwdXQKZHVwIDExMy9xIHB1dApkdXAgMTE0L3IgcHV0CmR1cCAxMTUvcyBwdXQKZHVwIDExNi90IHB1dApkdXAgMTE3L3UgcHV0CmR1cCAxMTgvdiBwdXQKZHVwIDExOS93IHB1dApkdXAgMTIwL3ggcHV0CmR1cCAxMjEveSBwdXQKZHVwIDEyMi96IHB1dApkdXAgMTczL3VuaTAwQUQgcHV0CnJlYWRvbmx5IGRlZgpjdXJyZW50ZGljdCBlbmQKY3VycmVudGZpbGUgZWV4ZWMKgAI5FQAAdD+EE/NjbKhan/77ULS7JzAqXMCrbi+Vm/IN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LFsw/C/HgAEVAgAACjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMApjbGVhcnRvbWFyawqAAw=="; + private static final String TYPE1_BYTES = "gAFSBwAAJSFQUy1BZG9iZUZvbnQtMS4wOiBUZXN0IDAwMS4wMDAKJSVUaXRsZTogVGVzdAolVmVyc2lvbjogMDAxLjAwMAolJUNyZWF0aW9uRGF0ZTogRnJpIE1heSAzMCAyMDo1NTo0OCAyMDI1CiUlQ3JlYXRvcjogRGFuaWVsIEdyZWRsZXIKJSAyMDI1LTUtMzA6IENyZWF0ZWQgd2l0aCBGb250Rm9yZ2UgKGh0dHA6Ly9mb250Zm9yZ2Uub3JnKQolIEdlbmVyYXRlZCBieSBGb250Rm9yZ2UgMjAyMzAxMDEgKGh0dHA6Ly9mb250Zm9yZ2Uuc2YubmV0LykKJSVFbmRDb21tZW50cwoKMTAgZGljdCBiZWdpbgovRm9udFR5cGUgMSBkZWYKL0ZvbnRNYXRyaXggWzAuMDAwNDg4MjgxIDAgMCAwLjAwMDQ4ODI4MSAwIDAgXXJlYWRvbmx5IGRlZgovRm9udE5hbWUgL1Rlc3QgZGVmCi9Gb250QkJveCB7MTAwIDEwMCA1MDAgMjAwIH1yZWFkb25seSBkZWYKL1BhaW50VHlwZSAwIGRlZgovRm9udEluZm8gMTAgZGljdCBkdXAgYmVnaW4KIC92ZXJzaW9uICgwMDEuMDAwKSByZWFkb25seSBkZWYKIC9Ob3RpY2UgKCkgcmVhZG9ubHkgZGVmCiAvRnVsbE5hbWUgKFRlc3QpIHJlYWRvbmx5IGRlZgogL0ZhbWlseU5hbWUgKFRlc3QpIHJlYWRvbmx5IGRlZgogL1dlaWdodCAoUmVndWxhcikgcmVhZG9ubHkgZGVmCiAvRlNUeXBlIDAgZGVmCiAvSXRhbGljQW5nbGUgMCBkZWYKIC9pc0ZpeGVkUGl0Y2ggZmFsc2UgZGVmCiAvVW5kZXJsaW5lUG9zaXRpb24gLTIwNC44IGRlZgogL1VuZGVybGluZVRoaWNrbmVzcyAxMDIuNCBkZWYKZW5kIHJlYWRvbmx5IGRlZgovRW5jb2RpbmcgMjU2IGFycmF5CiAwIDEgMjU1IHsgMSBpbmRleCBleGNoIC8ubm90ZGVmIHB1dH0gZm9yCmR1cCA5L3VuaTAwMDkgcHV0CmR1cCAxMC91bmkwMDBBIHB1dApkdXAgMTEvdW5pMDAwQiBwdXQKZHVwIDEyL3VuaTAwMEMgcHV0CmR1cCAxMy91bmkwMDBEIHB1dApkdXAgMzIvc3BhY2UgcHV0CmR1cCA0OC96ZXJvIHB1dApkdXAgNDkvb25lIHB1dApkdXAgNTAvdHdvIHB1dApkdXAgNTEvdGhyZWUgcHV0CmR1cCA1Mi9mb3VyIHB1dApkdXAgNTMvZml2ZSBwdXQKZHVwIDU0L3NpeCBwdXQKZHVwIDU1L3NldmVuIHB1dApkdXAgNTYvZWlnaHQgcHV0CmR1cCA1Ny9uaW5lIHB1dApkdXAgNjUvQSBwdXQKZHVwIDY2L0IgcHV0CmR1cCA2Ny9DIHB1dApkdXAgNjgvRCBwdXQKZHVwIDY5L0UgcHV0CmR1cCA3MC9GIHB1dApkdXAgNzEvRyBwdXQKZHVwIDcyL0ggcHV0CmR1cCA3My9JIHB1dApkdXAgNzQvSiBwdXQKZHVwIDc1L0sgcHV0CmR1cCA3Ni9MIHB1dApkdXAgNzcvTSBwdXQKZHVwIDc4L04gcHV0CmR1cCA3OS9PIHB1dApkdXAgODAvUCBwdXQKZHVwIDgxL1EgcHV0CmR1cCA4Mi9SIHB1dApkdXAgODMvUyBwdXQKZHVwIDg0L1QgcHV0CmR1cCA4NS9VIHB1dApkdXAgODYvViBwdXQKZHVwIDg3L1cgcHV0CmR1cCA4OC9YIHB1dApkdXAgODkvWSBwdXQKZHVwIDkwL1ogcHV0CmR1cCA5Ny9hIHB1dApkdXAgOTgvYiBwdXQKZHVwIDk5L2MgcHV0CmR1cCAxMDAvZCBwdXQKZHVwIDEwMS9lIHB1dApkdXAgMTAyL2YgcHV0CmR1cCAxMDMvZyBwdXQKZHVwIDEwNC9oIHB1dApkdXAgMTA1L2kgcHV0CmR1cCAxMDYvaiBwdXQKZHVwIDEwNy9rIHB1dApkdXAgMTA4L2wgcHV0CmR1cCAxMDkvbSBwdXQKZHVwIDExMC9uIHB1dApkdXAgMTExL28gcHV0CmR1cCAxMTIvcCBwdXQKZHVwIDExMy9xIHB1dApkdXAgMTE0L3IgcHV0CmR1cCAxMTUvcyBwdXQKZHVwIDExNi90IHB1dApkdXAgMTE3L3UgcHV0CmR1cCAxMTgvdiBwdXQKZHVwIDExOS93IHB1dApkdXAgMTIwL3ggcHV0CmR1cCAxMjEveSBwdXQKZHVwIDEyMi96IHB1dApkdXAgMTMz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"; public static void main(String[] args) throws Exception { @@ -162,12 +167,20 @@ public class FormatCharAdvanceTest { } private static void testChars(BufferedImage image, Graphics2D g2d, Font font) { + testChar('\t', image, g2d, font); // horizontal tab (TAB) + testChar('\n', image, g2d, font); // line feed (LF) + testChar('\u000B', image, g2d, font); // vertical tab (VT) + testChar('\u000C', image, g2d, font); // form feed (FF) + testChar('\r', image, g2d, font); // carriage return (CR) + testChar('\u0085', image, g2d, font); // next line (NEL) testChar('\u00AD', image, g2d, font); // soft hyphen (SHY) testChar('\u200B', image, g2d, font); // zero width space (ZWSP) testChar('\u200C', image, g2d, font); // zero width non-joiner (ZWNJ) testChar('\u200D', image, g2d, font); // zero width joiner (ZWJ) testChar('\u200E', image, g2d, font); // left-to-right mark (LRM) testChar('\u200F', image, g2d, font); // right-to-left mark (RLM) + testChar('\u2028', image, g2d, font); // line separator (LS) + testChar('\u2029', image, g2d, font); // paragraph separator (PS) testChar('\u202A', image, g2d, font); // left-to-right embedding (LRE) testChar('\u202B', image, g2d, font); // right-to-left embedding (RLE) testChar('\u202C', image, g2d, font); // pop directional formatting (PDF) @@ -181,6 +194,12 @@ public class FormatCharAdvanceTest { testChar('\u2067', image, g2d, font); // right-to-left isolate (RLI) testChar('\u2068', image, g2d, font); // first strong isolate (FSI) testChar('\u2069', image, g2d, font); // pop directional isolate (PDI) + testChar('\u206A', image, g2d, font); // inhibit symmetric swapping + testChar('\u206B', image, g2d, font); // activate symmetric swapping + testChar('\u206C', image, g2d, font); // inhibit arabic form shaping + testChar('\u206D', image, g2d, font); // activate arabic form shaping + testChar('\u206E', image, g2d, font); // national digit shapes + testChar('\u206F', image, g2d, font); // nominal digit shapes testChar('\uFEFF', image, g2d, font); // zero width no-break space (ZWNBSP/BOM) } @@ -191,8 +210,9 @@ public class FormatCharAdvanceTest { int h = image.getHeight(); FontRenderContext frc = g2d.getFontRenderContext(); FontMetrics metrics = g2d.getFontMetrics(font); - String c5 = String.valueOf(c).repeat(5); + assertEqual(0, metrics.charWidth(c), "charWidth", c, font); + String c5 = String.valueOf(c).repeat(5); int ab1 = metrics.stringWidth("AB"); int ab2 = metrics.stringWidth("A" + c5 + "B"); assertEqual(ab1, ab2, "stringWidth", c, font); @@ -226,6 +246,18 @@ public class FormatCharAdvanceTest { ab2 = (int) layout2.getAdvance(); assertEqual(ab1, ab2, "getAdvance", c, font); + g2d.setColor(Color.WHITE); + g2d.fillRect(0, 0, w, h); + g2d.setColor(Color.BLACK); + layout1.draw(g2d, w / 2, h / 2); + ab1 = findTextBoundingBox(image).width; + g2d.setColor(Color.WHITE); + g2d.fillRect(0, 0, w, h); + g2d.setColor(Color.BLACK); + layout2.draw(g2d, w / 2, h / 2); + ab2 = findTextBoundingBox(image).width; + assertEqual(ab1, ab2, "TextLayout.draw", c, font); + g2d.setColor(Color.WHITE); g2d.fillRect(0, 0, w, h); g2d.setColor(Color.BLACK); diff --git a/test/jdk/java/awt/font/TextLayout/TestControls.java b/test/jdk/java/awt/font/TextLayout/TestControls.java deleted file mode 100644 index ee15038a845..00000000000 --- a/test/jdk/java/awt/font/TextLayout/TestControls.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2001, 2025, 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. - */ - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Frame; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Insets; -import java.awt.Panel; -import java.awt.ScrollPane; -import java.awt.font.FontRenderContext; -import java.awt.font.TextLayout; - -/* - * @test - * @bug 4517298 - * @summary Display special control characters using both TextLayout.draw and - * Graphics.drawString. In no case should a missing glyph appear. - * Also display the advance of the control characters, in all cases - * these should be 0. The space character is also displayed as a reference. - * Note, the character is rendered between '><' but owing to the directional - * properties of two of the characters, the second '<' is rendered as '>'. - * This is correct behavior. - * @library /java/awt/regtesthelpers - * @build PassFailJFrame - * @run main/manual TestControls - */ - -public class TestControls { - private static String fontName = Font.DIALOG; - - public static void main(String[] args) throws Exception { - final String INSTRUCTIONS = """ - A number of control characters are displayed, one per line. - Each line displays the hex value of the character, the character - between '><' as rendered by TextLayout, the character between '><' - as rendered by drawString, and the advance of the character. - The first line renders the space character, as a reference. - The following lines all render the controls. - All controls should not render (even as space) and report a zero advance. - - Pass the test if this is true. - - Note: two of the control characters have the effect of changing the '<' - following the control character so that it renders as '>'. - This is not an error."""; - - PassFailJFrame.builder() - .title("TestControls Instruction") - .instructions(INSTRUCTIONS) - .columns(45) - .testUI(TestControls::createUI) - .build() - .awaitAndCheck(); - } - - private static Frame createUI() { - Frame f = new Frame("TestControls Test UI"); - Panel panel = new ControlPanel(fontName); - ScrollPane sp = new ScrollPane(); - sp.add("Center", panel); - f.add(sp); - f.setSize(450, 400); - return f; - } - - static class ControlPanel extends Panel { - - static final char[] chars = { - (char)0x0020, (char)0x0009, - (char)0x000A, (char)0x000D, (char)0x200C, (char)0x200D, (char)0x200E, - (char)0x200F, (char)0x2028, (char)0x2029, (char)0x202A, (char)0x202B, - (char)0x202C, (char)0x202D, (char)0x202E, (char)0x206A, (char)0x206B, - (char)0x206C, (char)0x206D, (char)0x206E, (char)0x206F - }; - - ControlPanel(String fontName) { - Font font = new Font(fontName, Font.PLAIN, 24); - System.out.println("using font: " + font); - setFont(font); - setForeground(Color.BLACK); - setBackground(Color.WHITE); - } - - @Override - public Dimension getPreferredSize() { - return new Dimension(400, 750); - } - - @Override - public Dimension getMaximumSize() { - return getPreferredSize(); - } - - @Override - public void paint(Graphics g) { - Graphics2D g2d = (Graphics2D)g; - FontRenderContext frc = g2d.getFontRenderContext(); - Font font = g2d.getFont(); - FontMetrics fm = g2d.getFontMetrics(); - Insets insets = getInsets(); - - String jvmString = System.getProperty("java.version"); - String osString = System.getProperty("os.name") + " / " + - System.getProperty("os.arch") + " / " + - System.getProperty("os.version"); - - int x = insets.left + 10; - int y = insets.top; - - y += 30; - g2d.drawString("jvm: " + jvmString, x, y); - - y += 30; - g2d.drawString("os: " + osString, x, y); - - y += 30; - g2d.drawString("font: " + font.getFontName(), x, y); - - for (int i = 0; i < chars.length; ++i) { - String s = ">" + chars[i] + "<"; - x = insets.left + 10; - y += 30; - - g2d.drawString(Integer.toHexString(chars[i]), x, y); - x += 100; - - new TextLayout(s, font, frc).draw(g2d, x, y); - x += 100; - - g2d.drawString(s, x, y); - x += 100; - - g2d.drawString(Integer.toString(fm.charWidth(chars[i])), x, y); - } - } - } -}