diff --git a/src/java/org/apache/fop/fonts/Font.java b/src/java/org/apache/fop/fonts/Font.java index 6cfaf892d..ca387840a 100644 --- a/src/java/org/apache/fop/fonts/Font.java +++ b/src/java/org/apache/fop/fonts/Font.java @@ -193,6 +193,30 @@ public int getKernValue(char ch1, char ch2) { return 0; } + /** + * Returns the amount of kerning between two characters. + * + * The value returned measures in pt. So it is already adjusted for font size. + * + * @param ch1 first character + * @param ch2 second character + * @return the distance to adjust for kerning, 0 if there's no kerning + */ + public int getKernValue(int ch1, int ch2) { + // TODO !BMP + if ( ch1 > 0x10000 ) { + return 0; + } else if ( ( ch1 >= 0xD800 ) && ( ch1 <= 0xE000 ) ) { + return 0; + } else if ( ch2 > 0x10000 ) { + return 0; + } else if ( ( ch2 >= 0xD800 ) && ( ch2 <= 0xE000 ) ) { + return 0; + } else { + return getKernValue ( (char) ch1, (char) ch2 ); + } + } + /** * Returns the width of a character * @param charnum character to look up @@ -269,7 +293,7 @@ public String toString() { * This also performs some guessing on widths on various * versions of space that might not exists in the font. * @param c character to inspect - * @return the width of the character + * @return the width of the character or -1 if no width available */ public int getCharWidth(char c) { int width; @@ -333,6 +357,23 @@ public int getCharWidth(char c) { return width; } + /** + * Helper method for getting the width of a unicode char + * from the current fontstate. + * This also performs some guessing on widths on various + * versions of space that might not exists in the font. + * @param c character to inspect + * @return the width of the character or -1 if no width available + */ + public int getCharWidth(int c) { + if ( c < 0x10000 ) { + return getCharWidth ( (char) c ); + } else { + // TODO !BMP + return -1; + } + } + /** * Calculates the word width. * @param word text to get width for diff --git a/src/java/org/apache/fop/fonts/Glyphs.java b/src/java/org/apache/fop/fonts/Glyphs.java deleted file mode 100644 index dfc44675b..000000000 --- a/src/java/org/apache/fop/fonts/Glyphs.java +++ /dev/null @@ -1,1318 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* $Id$ */ - -package org.apache.fop.fonts; - -/** - * This class provides a number of constants for glyph management. - * @deprecated Use the Glyphs class from XML Graphics Commons instead! - */ -public final class Glyphs { - - private Glyphs() { - } - - /** - * Glyph name for the "notdef" glyph - */ - public static final String NOTDEF = ".notdef"; - - /** - * Glyph names for Mac encoding - */ - public static final String[] MAC_GLYPH_NAMES = { - /* 0x00 */ - NOTDEF, ".null", "CR", "space", "exclam", "quotedbl", "numbersign", - "dollar", "percent", "ampersand", "quotesingle", "parenleft", - "parenright", "asterisk", "plus", "comma", /* 0x10 */ - "hyphen", "period", "slash", "zero", "one", "two", "three", "four", - "five", "six", "seven", "eight", "nine", "colon", - "semicolon", "less", /* 0x20 */ - "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", - "G", "H", "I", "J", "K", "L", /* 0x30 */ - "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", - "bracketleft", "backslash", /* 0x40 */ - "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", - "d", "e", "f", "g", "h", "i", "j", "k", "l", - /* 0x50 */ - "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", - "braceleft", "bar", /* 0x60 */ - "braceright", "asciitilde", "Adieresis", "Aring", "Ccedilla", - "Eacute", "Ntilde", "Odieresis", "Udieresis", "aacute", - "agrave", "acircumflex", "adieresis", "atilde", - "aring", "ccedilla", /* 0x70 */ - "eacute", "egrave", "ecircumflex", "edieresis", "iacute", "igrave", - "icircumflex", "idieresis", "ntilde", "oacute", "ograve", - "ocircumflex", "odieresis", "otilde", "uacute", "ugrave", - /* 0x80 */ - "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", - "section", "bullet", "paragraph", "germandbls", - "registered", "copyright", "trademark", "acute", - "dieresis", "notequal", /* 0x90 */ - "AE", "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", - "yen", "mu", "partialdiff", "Sigma", "Pi", "pi", "integral", - "ordfeminine", "ordmasculine", "Omega", /* 0xa0 */ - "ae", "oslash", "questiondown", "exclamdown", "logicalnot", - "radical", "florin", "approxequal", "Delta", "guillemotleft", - "guillemotright", "ellipsis", "nbspace", "Agrave", "Atilde", - "Otilde", /* 0xb0 */ - "OE", "oe", "endash", "emdash", "quotedblleft", "quotedblright", - "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", - "Ydieresis", "fraction", "currency", "guilsinglleft", - "guilsinglright", /* 0xc0 */ - "fi", "fl", "daggerdbl", "periodcentered", "quotesinglbase", - "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", - "Aacute", "Edieresis", "Egrave", "Iacute", "Icircumflex", - "Idieresis", "Igrave", /* 0xd0 */ - "Oacute", "Ocircumflex", "applelogo", "Ograve", "Uacute", - "Ucircumflex", "Ugrave", "dotlessi", "circumflex", "tilde", - "macron", "breve", "dotaccent", "ring", "cedilla", - "hungarumlaut", /* 0xe0 */ - "ogonek", "caron", "Lslash", "lslash", "Scaron", "scaron", "Zcaron", - "zcaron", "brokenbar", "Eth", "eth", "Yacute", "yacute", - "Thorn", "thorn", "minus", /* 0xf0 */ - "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", - "onequarter", "threequarters", "franc", "Gbreve", - "gbreve", "Idot", "Scedilla", "scedilla", "Cacute", - "cacute", "Ccaron", /* 0x100 */ - "ccaron", "dmacron" - }; - - /** - * Glyph names for tex8r encoding - */ - public static final String[] TEX8R_GLYPH_NAMES = { - // 0x00 - NOTDEF, "dotaccent", "fi", "fl", "fraction", "hungarumlaut", - "Lslash", "lslash", "ogonek", "ring", ".notdef", "breve", - "minus", ".notdef", "Zcaron", "zcaron", // 0x10 - "caron", "dotlessi", "dotlessj", "ff", "ffi", "ffl", ".notdef", - ".notdef", ".notdef", ".notdef", ".notdef", ".notdef", - ".notdef", ".notdef", "grave", "quotesingle", // 0x20 - "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", - "ampersand", "quoteright", "parenleft", "parenright", - "asterisk", "plus", "comma", "hyphen", "period", "slash", - // 0x30 - "zero", "one", "two", "three", "four", "five", "six", "seven", - "eight", "nine", "colon", "semicolon", "less", "equal", - "greater", "question", // 0x40 - "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", - "M", "N", "O", // 0x50 - "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", - "backslash", "bracketright", "asciicircum", "underscore", // 0x60 - "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", - "l", "m", "n", "o", // 0x70 - "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", - "bar", "braceright", "asciitilde", ".notdef", // 0x80 - "Euro", ".notdef", "quotesinglbase", "florin", "quotedblbase", - "ellipsis", "dagger", "daggerdbl", "circumflex", - "perthousand", "Scaron", "guilsinglleft", "OE", ".notdef", - ".notdef", ".notdef", // 0x90 - ".notdef", ".notdef", ".notdef", "quotedblleft", "quotedblright", - "bullet", "endash", "emdash", "tilde", "trademark", - "scaron", "guilsinglright", "oe", ".notdef", ".notdef", - "Ydieresis", // 0xA0 - ".notdef", "exclamdown", "cent", "sterling", "currency", "yen", - "brokenbar", "section", "dieresis", "copyright", - "ordfeminine", "guillemotleft", "logicalnot", "hyphen", - "registered", "macron", // 0xB0 - "degree", "plusminus", "twosuperior", "threesuperior", "acute", "mu", - "paragraph", "periodcentered", "cedilla", "onesuperior", - "ordmasculine", "guillemotright", "onequarter", "onehalf", - "threequarters", "questiondown", // 0xC0 - "Agrave", "Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", - "AE", "Ccedilla", "Egrave", "Eacute", "Ecircumflex", - "Edieresis", "Igrave", "Iacute", "Icircumflex", - "Idieresis", // 0xD0 - "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", - "Odieresis", "multiply", "Oslash", "Ugrave", "Uacute", - "Ucircumflex", "Udieresis", "Yacute", "Thorn", "germandbls", - // 0xE0 - "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", - "ae", "ccedilla", "egrave", "eacute", "ecircumflex", - "edieresis", "igrave", "iacute", "icircumflex", - "idieresis", // 0xF0 - "eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", - "odieresis", "divide", "oslash", "ugrave", "uacute", - "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis" - }; - - /** - * The characters in WinAnsiEncoding - */ - public static final char[] WINANSI_ENCODING = { - // not used until char 32 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x20 - ' ', '\u0021', '\"', '\u0023', '$', '%', '&', '\'', '(', ')', '*', '+', ',', - '\u002d', '\u002e', '/', // 0x30 - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', - '>', '?', '@', // 0x40 - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', - 'O', // 0x50 - 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '\u005b', '\\', - '\u005d', '^', '_', // 0x60 - '\u2018', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', // 0x70 - 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '\u007b', '\u007c', '\u007d', - '\u007e', '\u2022', // 0x80 - '\u20ac', '\u2022', '\u201a', '\u0192', '\u201e', '\u2026', '\u2020', - '\u2021', '\u02c6', '\u2030', '\u0160', '\u2039', '\u0152', '\u2022', - '\u017d', '\u2022', // 0x90 - '\u2022', '\u2018', // quoteleft - '\u2019', // quoteright - '\u201c', // quotedblleft - '\u201d', // quotedblright - '\u2022', // bullet - '\u2013', // endash - '\u2014', // emdash - '~', - '\u2122', // trademark - '\u0161', '\u203a', '\u0153', '\u2022', '\u017e', '\u0178', // 0xA0 - ' ', '\u00a1', '\u00a2', '\u00a3', '\u00a4', '\u00a5', - '\u00a6', '\u00a7', '\u00a8', '\u00a9', '\u00aa', '\u00ab', - '\u00ac', '\u00ad', '\u00ae', '\u00af', // 0xb0 - '\u00b0', '\u00b1', '\u00b2', '\u00b3', '\u00b4', - '\u00b5', // This is hand-coded, the rest is assumption - '\u00b6', // and *might* not be correct... - '\u00b7', '\u00b8', '\u00b9', '\u00ba', '\u00bb', '\u00bc', '\u00bd', - '\u00be', '\u00bf', // 0xc0 - '\u00c0', '\u00c1', '\u00c2', '\u00c3', '\u00c4', '\u00c5', // Aring - '\u00c6', // AE - '\u00c7', '\u00c8', '\u00c9', '\u00ca', '\u00cb', '\u00cc', - '\u00cd', '\u00ce', '\u00cf', // 0xd0 - '\u00d0', '\u00d1', '\u00d2', '\u00d3', '\u00d4', '\u00d5', - '\u00d6', '\u00d7', '\u00d8', // Oslash - '\u00d9', '\u00da', '\u00db', '\u00dc', '\u00dd', '\u00de', - '\u00df', // 0xe0 - '\u00e0', '\u00e1', '\u00e2', '\u00e3', '\u00e4', '\u00e5', // aring - '\u00e6', // ae - '\u00e7', '\u00e8', '\u00e9', '\u00ea', '\u00eb', '\u00ec', - '\u00ed', '\u00ee', '\u00ef', // 0xf0 - '\u00f0', '\u00f1', '\u00f2', '\u00f3', '\u00f4', '\u00f5', - '\u00f6', '\u00f7', '\u00f8', '\u00f9', '\u00fa', '\u00fb', - '\u00fc', '\u00fd', '\u00fe', '\u00ff' - }; - - /** - * List of unicode glyphs - */ - public static final String[] UNICODE_GLYPHS = { - "\u0041", "A", - "\u00C6", "AE", - "\u01FC", "AEacute", - "\uF7E6", "AEsmall", - "\u00C1", "Aacute", - "\uF7E1", "Aacutesmall", - "\u0102", "Abreve", - "\u00C2", "Acircumflex", - "\uF7E2", "Acircumflexsmall", - "\uF6C9", "Acute", - "\uF7B4", "Acutesmall", - "\u00C4", "Adieresis", - "\uF7E4", "Adieresissmall", - "\u00C0", "Agrave", - "\uF7E0", "Agravesmall", - "\u0391", "Alpha", - "\u0386", "Alphatonos", - "\u0100", "Amacron", - "\u0104", "Aogonek", - "\u00C5", "Aring", - "\u01FA", "Aringacute", - "\uF7E5", "Aringsmall", - "\uF761", "Asmall", - "\u00C3", "Atilde", - "\uF7E3", "Atildesmall", - "\u0042", "B", - "\u0392", "Beta", - "\uF6F4", "Brevesmall", - "\uF762", "Bsmall", - "\u0043", "C", - "\u0106", "Cacute", - "\uF6CA", "Caron", - "\uF6F5", "Caronsmall", - "\u010C", "Ccaron", - "\u00C7", "Ccedilla", - "\uF7E7", "Ccedillasmall", - "\u0108", "Ccircumflex", - "\u010A", "Cdotaccent", - "\uF7B8", "Cedillasmall", - "\u03A7", "Chi", - "\uF6F6", "Circumflexsmall", - "\uF763", "Csmall", - "\u0044", "D", - "\u010E", "Dcaron", - "\u0110", "Dcroat", - "\u2206", "Delta", - "\u0394", "Delta", - "\uF6CB", "Dieresis", - "\uF6CC", "DieresisAcute", - "\uF6CD", "DieresisGrave", - "\uF7A8", "Dieresissmall", - "\uF6F7", "Dotaccentsmall", - "\uF764", "Dsmall", - "\u0045", "E", - "\u00C9", "Eacute", - "\uF7E9", "Eacutesmall", - "\u0114", "Ebreve", - "\u011A", "Ecaron", - "\u00CA", "Ecircumflex", - "\uF7EA", "Ecircumflexsmall", - "\u00CB", "Edieresis", - "\uF7EB", "Edieresissmall", - "\u0116", "Edotaccent", - "\u00C8", "Egrave", - "\uF7E8", "Egravesmall", - "\u0112", "Emacron", - "\u014A", "Eng", - "\u0118", "Eogonek", - "\u0395", "Epsilon", - "\u0388", "Epsilontonos", - "\uF765", "Esmall", - "\u0397", "Eta", - "\u0389", "Etatonos", - "\u00D0", "Eth", - "\uF7F0", "Ethsmall", - "\u20AC", "Euro", - "\u0046", "F", - "\uF766", "Fsmall", - "\u0047", "G", - "\u0393", "Gamma", - "\u011E", "Gbreve", - "\u01E6", "Gcaron", - "\u011C", "Gcircumflex", - "\u0122", "Gcommaaccent", - "\u0120", "Gdotaccent", - "\uF6CE", "Grave", - "\uF760", "Gravesmall", - "\uF767", "Gsmall", - "\u0048", "H", - "\u25CF", "H18533", - "\u25AA", "H18543", - "\u25AB", "H18551", - "\u25A1", "H22073", - "\u0126", "Hbar", - "\u0124", "Hcircumflex", - "\uF768", "Hsmall", - "\uF6CF", "Hungarumlaut", - "\uF6F8", "Hungarumlautsmall", - "\u0049", "I", - "\u0132", "IJ", - "\u00CD", "Iacute", - "\uF7ED", "Iacutesmall", - "\u012C", "Ibreve", - "\u00CE", "Icircumflex", - "\uF7EE", "Icircumflexsmall", - "\u00CF", "Idieresis", - "\uF7EF", "Idieresissmall", - "\u0130", "Idotaccent", - "\u2111", "Ifraktur", - "\u00CC", "Igrave", - "\uF7EC", "Igravesmall", - "\u012A", "Imacron", - "\u012E", "Iogonek", - "\u0399", "Iota", - "\u03AA", "Iotadieresis", - "\u038A", "Iotatonos", - "\uF769", "Ismall", - "\u0128", "Itilde", - "\u004A", "J", - "\u0134", "Jcircumflex", - "\uF76A", "Jsmall", - "\u004B", "K", - "\u039A", "Kappa", - "\u0136", "Kcommaaccent", - "\uF76B", "Ksmall", - "\u004C", "L", - "\uF6BF", "LL", - "\u0139", "Lacute", - "\u039B", "Lambda", - "\u013D", "Lcaron", - "\u013B", "Lcommaaccent", - "\u013F", "Ldot", - "\u0141", "Lslash", - "\uF6F9", "Lslashsmall", - "\uF76C", "Lsmall", - "\u004D", "M", - "\uF6D0", "Macron", - "\uF7AF", "Macronsmall", - "\uF76D", "Msmall", - "\u039C", "Mu", - "\u004E", "N", - "\u0143", "Nacute", - "\u0147", "Ncaron", - "\u0145", "Ncommaaccent", - "\uF76E", "Nsmall", - "\u00D1", "Ntilde", - "\uF7F1", "Ntildesmall", - "\u039D", "Nu", - "\u004F", "O", - "\u0152", "OE", - "\uF6FA", "OEsmall", - "\u00D3", "Oacute", - "\uF7F3", "Oacutesmall", - "\u014E", "Obreve", - "\u00D4", "Ocircumflex", - "\uF7F4", "Ocircumflexsmall", - "\u00D6", "Odieresis", - "\uF7F6", "Odieresissmall", - "\uF6FB", "Ogoneksmall", - "\u00D2", "Ograve", - "\uF7F2", "Ogravesmall", - "\u01A0", "Ohorn", - "\u0150", "Ohungarumlaut", - "\u014C", "Omacron", - "\u2126", "Omega", - "\u03A9", "Omega", - "\u038F", "Omegatonos", - "\u039F", "Omicron", - "\u038C", "Omicrontonos", - "\u00D8", "Oslash", - "\u01FE", "Oslashacute", - "\uF7F8", "Oslashsmall", - "\uF76F", "Osmall", - "\u00D5", "Otilde", - "\uF7F5", "Otildesmall", - "\u0050", "P", - "\u03A6", "Phi", - "\u03A0", "Pi", - "\u03A8", "Psi", - "\uF770", "Psmall", - "\u0051", "Q", - "\uF771", "Qsmall", - "\u0052", "R", - "\u0154", "Racute", - "\u0158", "Rcaron", - "\u0156", "Rcommaaccent", - "\u211C", "Rfraktur", - "\u03A1", "Rho", - "\uF6FC", "Ringsmall", - "\uF772", "Rsmall", - "\u0053", "S", - "\u250C", "SF010000", - "\u2514", "SF020000", - "\u2510", "SF030000", - "\u2518", "SF040000", - "\u253C", "SF050000", - "\u252C", "SF060000", - "\u2534", "SF070000", - "\u251C", "SF080000", - "\u2524", "SF090000", - "\u2500", "SF100000", - "\u2502", "SF110000", - "\u2561", "SF190000", - "\u2562", "SF200000", - "\u2556", "SF210000", - "\u2555", "SF220000", - "\u2563", "SF230000", - "\u2551", "SF240000", - "\u2557", "SF250000", - "\u255D", "SF260000", - "\u255C", "SF270000", - "\u255B", "SF280000", - "\u255E", "SF360000", - "\u255F", "SF370000", - "\u255A", "SF380000", - "\u2554", "SF390000", - "\u2569", "SF400000", - "\u2566", "SF410000", - "\u2560", "SF420000", - "\u2550", "SF430000", - "\u256C", "SF440000", - "\u2567", "SF450000", - "\u2568", "SF460000", - "\u2564", "SF470000", - "\u2565", "SF480000", - "\u2559", "SF490000", - "\u2558", "SF500000", - "\u2552", "SF510000", - "\u2553", "SF520000", - "\u256B", "SF530000", - "\u256A", "SF540000", - "\u015A", "Sacute", - "\u0160", "Scaron", - "\uF6FD", "Scaronsmall", - "\u015E", "Scedilla", - "\uF6C1", "Scedilla", - "\u015C", "Scircumflex", - "\u0218", "Scommaaccent", - "\u03A3", "Sigma", - "\uF773", "Ssmall", - "\u0054", "T", - "\u03A4", "Tau", - "\u0166", "Tbar", - "\u0164", "Tcaron", - "\u0162", "Tcommaaccent", - "\u021A", "Tcommaaccent", - "\u0398", "Theta", - "\u00DE", "Thorn", - "\uF7FE", "Thornsmall", - "\uF6FE", "Tildesmall", - "\uF774", "Tsmall", - "\u0055", "U", - "\u00DA", "Uacute", - "\uF7FA", "Uacutesmall", - "\u016C", "Ubreve", - "\u00DB", "Ucircumflex", - "\uF7FB", "Ucircumflexsmall", - "\u00DC", "Udieresis", - "\uF7FC", "Udieresissmall", - "\u00D9", "Ugrave", - "\uF7F9", "Ugravesmall", - "\u01AF", "Uhorn", - "\u0170", "Uhungarumlaut", - "\u016A", "Umacron", - "\u0172", "Uogonek", - "\u03A5", "Upsilon", - "\u03D2", "Upsilon1", - "\u03AB", "Upsilondieresis", - "\u038E", "Upsilontonos", - "\u016E", "Uring", - "\uF775", "Usmall", - "\u0168", "Utilde", - "\u0056", "V", - "\uF776", "Vsmall", - "\u0057", "W", - "\u1E82", "Wacute", - "\u0174", "Wcircumflex", - "\u1E84", "Wdieresis", - "\u1E80", "Wgrave", - "\uF777", "Wsmall", - "\u0058", "X", - "\u039E", "Xi", - "\uF778", "Xsmall", - "\u0059", "Y", - "\u00DD", "Yacute", - "\uF7FD", "Yacutesmall", - "\u0176", "Ycircumflex", - "\u0178", "Ydieresis", - "\uF7FF", "Ydieresissmall", - "\u1EF2", "Ygrave", - "\uF779", "Ysmall", - "\u005A", "Z", - "\u0179", "Zacute", - "\u017D", "Zcaron", - "\uF6FF", "Zcaronsmall", - "\u017B", "Zdotaccent", - "\u0396", "Zeta", - "\uF77A", "Zsmall", - "\u0061", "a", - "\u00E1", "aacute", - "\u0103", "abreve", - "\u00E2", "acircumflex", - "\u00B4", "acute", - "\u0301", "acutecomb", - "\u00E4", "adieresis", - "\u00E6", "ae", - "\u01FD", "aeacute", - "\u2015", "afii00208", - "\u0410", "afii10017", - "\u0411", "afii10018", - "\u0412", "afii10019", - "\u0413", "afii10020", - "\u0414", "afii10021", - "\u0415", "afii10022", - "\u0401", "afii10023", - "\u0416", "afii10024", - "\u0417", "afii10025", - "\u0418", "afii10026", - "\u0419", "afii10027", - "\u041A", "afii10028", - "\u041B", "afii10029", - "\u041C", "afii10030", - "\u041D", "afii10031", - "\u041E", "afii10032", - "\u041F", "afii10033", - "\u0420", "afii10034", - "\u0421", "afii10035", - "\u0422", "afii10036", - "\u0423", "afii10037", - "\u0424", "afii10038", - "\u0425", "afii10039", - "\u0426", "afii10040", - "\u0427", "afii10041", - "\u0428", "afii10042", - "\u0429", "afii10043", - "\u042A", "afii10044", - "\u042B", "afii10045", - "\u042C", "afii10046", - "\u042D", "afii10047", - "\u042E", "afii10048", - "\u042F", "afii10049", - "\u0490", "afii10050", - "\u0402", "afii10051", - "\u0403", "afii10052", - "\u0404", "afii10053", - "\u0405", "afii10054", - "\u0406", "afii10055", - "\u0407", "afii10056", - "\u0408", "afii10057", - "\u0409", "afii10058", - "\u040A", "afii10059", - "\u040B", "afii10060", - "\u040C", "afii10061", - "\u040E", "afii10062", - "\uF6C4", "afii10063", - "\uF6C5", "afii10064", - "\u0430", "afii10065", - "\u0431", "afii10066", - "\u0432", "afii10067", - "\u0433", "afii10068", - "\u0434", "afii10069", - "\u0435", "afii10070", - "\u0451", "afii10071", - "\u0436", "afii10072", - "\u0437", "afii10073", - "\u0438", "afii10074", - "\u0439", "afii10075", - "\u043A", "afii10076", - "\u043B", "afii10077", - "\u043C", "afii10078", - "\u043D", "afii10079", - "\u043E", "afii10080", - "\u043F", "afii10081", - "\u0440", "afii10082", - "\u0441", "afii10083", - "\u0442", "afii10084", - "\u0443", "afii10085", - "\u0444", "afii10086", - "\u0445", "afii10087", - "\u0446", "afii10088", - "\u0447", "afii10089", - "\u0448", "afii10090", - "\u0449", "afii10091", - "\u044A", "afii10092", - "\u044B", "afii10093", - "\u044C", "afii10094", - "\u044D", "afii10095", - "\u044E", "afii10096", - "\u044F", "afii10097", - "\u0491", "afii10098", - "\u0452", "afii10099", - "\u0453", "afii10100", - "\u0454", "afii10101", - "\u0455", "afii10102", - "\u0456", "afii10103", - "\u0457", "afii10104", - "\u0458", "afii10105", - "\u0459", "afii10106", - "\u045A", "afii10107", - "\u045B", "afii10108", - "\u045C", "afii10109", - "\u045E", "afii10110", - "\u040F", "afii10145", - "\u0462", "afii10146", - "\u0472", "afii10147", - "\u0474", "afii10148", - "\uF6C6", "afii10192", - "\u045F", "afii10193", - "\u0463", "afii10194", - "\u0473", "afii10195", - "\u0475", "afii10196", - "\uF6C7", "afii10831", - "\uF6C8", "afii10832", - "\u04D9", "afii10846", - "\u200E", "afii299", - "\u200F", "afii300", - "\u200D", "afii301", - "\u066A", "afii57381", - "\u060C", "afii57388", - "\u0660", "afii57392", - "\u0661", "afii57393", - "\u0662", "afii57394", - "\u0663", "afii57395", - "\u0664", "afii57396", - "\u0665", "afii57397", - "\u0666", "afii57398", - "\u0667", "afii57399", - "\u0668", "afii57400", - "\u0669", "afii57401", - "\u061B", "afii57403", - "\u061F", "afii57407", - "\u0621", "afii57409", - "\u0622", "afii57410", - "\u0623", "afii57411", - "\u0624", "afii57412", - "\u0625", "afii57413", - "\u0626", "afii57414", - "\u0627", "afii57415", - "\u0628", "afii57416", - "\u0629", "afii57417", - "\u062A", "afii57418", - "\u062B", "afii57419", - "\u062C", "afii57420", - "\u062D", "afii57421", - "\u062E", "afii57422", - "\u062F", "afii57423", - "\u0630", "afii57424", - "\u0631", "afii57425", - "\u0632", "afii57426", - "\u0633", "afii57427", - "\u0634", "afii57428", - "\u0635", "afii57429", - "\u0636", "afii57430", - "\u0637", "afii57431", - "\u0638", "afii57432", - "\u0639", "afii57433", - "\u063A", "afii57434", - "\u0640", "afii57440", - "\u0641", "afii57441", - "\u0642", "afii57442", - "\u0643", "afii57443", - "\u0644", "afii57444", - "\u0645", "afii57445", - "\u0646", "afii57446", - "\u0648", "afii57448", - "\u0649", "afii57449", - "\u064A", "afii57450", - "\u064B", "afii57451", - "\u064C", "afii57452", - "\u064D", "afii57453", - "\u064E", "afii57454", - "\u064F", "afii57455", - "\u0650", "afii57456", - "\u0651", "afii57457", - "\u0652", "afii57458", - "\u0647", "afii57470", - "\u06A4", "afii57505", - "\u067E", "afii57506", - "\u0686", "afii57507", - "\u0698", "afii57508", - "\u06AF", "afii57509", - "\u0679", "afii57511", - "\u0688", "afii57512", - "\u0691", "afii57513", - "\u06BA", "afii57514", - "\u06D2", "afii57519", - "\u06D5", "afii57534", - "\u20AA", "afii57636", - "\u05BE", "afii57645", - "\u05C3", "afii57658", - "\u05D0", "afii57664", - "\u05D1", "afii57665", - "\u05D2", "afii57666", - "\u05D3", "afii57667", - "\u05D4", "afii57668", - "\u05D5", "afii57669", - "\u05D6", "afii57670", - "\u05D7", "afii57671", - "\u05D8", "afii57672", - "\u05D9", "afii57673", - "\u05DA", "afii57674", - "\u05DB", "afii57675", - "\u05DC", "afii57676", - "\u05DD", "afii57677", - "\u05DE", "afii57678", - "\u05DF", "afii57679", - "\u05E0", "afii57680", - "\u05E1", "afii57681", - "\u05E2", "afii57682", - "\u05E3", "afii57683", - "\u05E4", "afii57684", - "\u05E5", "afii57685", - "\u05E6", "afii57686", - "\u05E7", "afii57687", - "\u05E8", "afii57688", - "\u05E9", "afii57689", - "\u05EA", "afii57690", - "\uFB2A", "afii57694", - "\uFB2B", "afii57695", - "\uFB4B", "afii57700", - "\uFB1F", "afii57705", - "\u05F0", "afii57716", - "\u05F1", "afii57717", - "\u05F2", "afii57718", - "\uFB35", "afii57723", - "\u05B4", "afii57793", - "\u05B5", "afii57794", - "\u05B6", "afii57795", - "\u05BB", "afii57796", - "\u05B8", "afii57797", - "\u05B7", "afii57798", - "\u05B0", "afii57799", - "\u05B2", "afii57800", - "\u05B1", "afii57801", - "\u05B3", "afii57802", - "\u05C2", "afii57803", - "\u05C1", "afii57804", - "\u05B9", "afii57806", - "\u05BC", "afii57807", - "\u05BD", "afii57839", - "\u05BF", "afii57841", - "\u05C0", "afii57842", - "\u02BC", "afii57929", - "\u2105", "afii61248", - "\u2113", "afii61289", - "\u2116", "afii61352", - "\u202C", "afii61573", - "\u202D", "afii61574", - "\u202E", "afii61575", - "\u200C", "afii61664", - "\u066D", "afii63167", - "\u02BD", "afii64937", - "\u00E0", "agrave", - "\u2135", "aleph", - "\u03B1", "alpha", - "\u03AC", "alphatonos", - "\u0101", "amacron", - "\u0026", "ampersand", - "\uF726", "ampersandsmall", - "\u2220", "angle", - "\u2329", "angleleft", - "\u232A", "angleright", - "\u0387", "anoteleia", - "\u0105", "aogonek", - "\u2248", "approxequal", - "\u00E5", "aring", - "\u01FB", "aringacute", - "\u2194", "arrowboth", - "\u21D4", "arrowdblboth", - "\u21D3", "arrowdbldown", - "\u21D0", "arrowdblleft", - "\u21D2", "arrowdblright", - "\u21D1", "arrowdblup", - "\u2193", "arrowdown", - "\uF8E7", "arrowhorizex", - "\u2190", "arrowleft", - "\u2192", "arrowright", - "\u2191", "arrowup", - "\u2195", "arrowupdn", - "\u21A8", "arrowupdnbse", - "\uF8E6", "arrowvertex", - "\u005E", "asciicircum", - "\u007E", "asciitilde", - "\u002A", "asterisk", - "\u2217", "asteriskmath", - "\uF6E9", "asuperior", - "\u0040", "at", - "\u00E3", "atilde", - "\u0062", "b", - //"\u005C", "backslash", - "\\", "backslash", - "\u007C", "bar", - "\u03B2", "beta", - "\u2588", "block", - "\uF8F4", "braceex", - "\u007B", "braceleft", - "\uF8F3", "braceleftbt", - "\uF8F2", "braceleftmid", - "\uF8F1", "bracelefttp", - "\u007D", "braceright", - "\uF8FE", "bracerightbt", - "\uF8FD", "bracerightmid", - "\uF8FC", "bracerighttp", - "\u005B", "bracketleft", - "\uF8F0", "bracketleftbt", - "\uF8EF", "bracketleftex", - "\uF8EE", "bracketlefttp", - "\u005D", "bracketright", - "\uF8FB", "bracketrightbt", - "\uF8FA", "bracketrightex", - "\uF8F9", "bracketrighttp", - "\u02D8", "breve", - "\u00A6", "brokenbar", - "\uF6EA", "bsuperior", - "\u2022", "bullet", - "\u0063", "c", - "\u0107", "cacute", - "\u02C7", "caron", - "\u21B5", "carriagereturn", - "\u010D", "ccaron", - "\u00E7", "ccedilla", - "\u0109", "ccircumflex", - "\u010B", "cdotaccent", - "\u00B8", "cedilla", - "\u00A2", "cent", - "\uF6DF", "centinferior", - "\uF7A2", "centoldstyle", - "\uF6E0", "centsuperior", - "\u03C7", "chi", - "\u25CB", "circle", - "\u2297", "circlemultiply", - "\u2295", "circleplus", - "\u02C6", "circumflex", - "\u2663", "club", - "\u003A", "colon", - "\u20A1", "colonmonetary", - "\u002C", "comma", - "\uF6C3", "commaaccent", - "\uF6E1", "commainferior", - "\uF6E2", "commasuperior", - "\u2245", "congruent", - "\u00A9", "copyright", - "\uF8E9", "copyrightsans", - "\uF6D9", "copyrightserif", - "\u00A4", "currency", - "\uF6D1", "cyrBreve", - "\uF6D2", "cyrFlex", - "\uF6D4", "cyrbreve", - "\uF6D5", "cyrflex", - "\u0064", "d", - "\u2020", "dagger", - "\u2021", "daggerdbl", - "\uF6D3", "dblGrave", - "\uF6D6", "dblgrave", - "\u010F", "dcaron", - "\u0111", "dcroat", - "\u00B0", "degree", - "\u03B4", "delta", - "\u2666", "diamond", - "\u00A8", "dieresis", - "\uF6D7", "dieresisacute", - "\uF6D8", "dieresisgrave", - "\u0385", "dieresistonos", - "\u00F7", "divide", - "\u2593", "dkshade", - "\u2584", "dnblock", - "\u0024", "dollar", - "\uF6E3", "dollarinferior", - "\uF724", "dollaroldstyle", - "\uF6E4", "dollarsuperior", - "\u20AB", "dong", - "\u02D9", "dotaccent", - "\u0323", "dotbelowcomb", - "\u0131", "dotlessi", - "\uF6BE", "dotlessj", - "\u22C5", "dotmath", - "\uF6EB", "dsuperior", - "\u0065", "e", - "\u00E9", "eacute", - "\u0115", "ebreve", - "\u011B", "ecaron", - "\u00EA", "ecircumflex", - "\u00EB", "edieresis", - "\u0117", "edotaccent", - "\u00E8", "egrave", - "\u0038", "eight", - "\u2088", "eightinferior", - "\uF738", "eightoldstyle", - "\u2078", "eightsuperior", - "\u2208", "element", - "\u2026", "ellipsis", - "\u0113", "emacron", - "\u2014", "emdash", - "\u2205", "emptyset", - "\u2013", "endash", - "\u014B", "eng", - "\u0119", "eogonek", - "\u03B5", "epsilon", - "\u03AD", "epsilontonos", - "\u003D", "equal", - "\u2261", "equivalence", - "\u212E", "estimated", - "\uF6EC", "esuperior", - "\u03B7", "eta", - "\u03AE", "etatonos", - "\u00F0", "eth", - "\u0021", "exclam", - "\u203C", "exclamdbl", - "\u00A1", "exclamdown", - "\uF7A1", "exclamdownsmall", - "\uF721", "exclamsmall", - "\u2203", "existential", - "\u0066", "f", - "\u2640", "female", - "\uFB00", "ff", - "\uFB03", "ffi", - "\uFB04", "ffl", - "\uFB01", "fi", - "\u2012", "figuredash", - "\u25A0", "filledbox", - "\u25AC", "filledrect", - "\u0035", "five", - "\u215D", "fiveeighths", - "\u2085", "fiveinferior", - "\uF735", "fiveoldstyle", - "\u2075", "fivesuperior", - "\uFB02", "fl", - "\u0192", "florin", - "\u0034", "four", - "\u2084", "fourinferior", - "\uF734", "fouroldstyle", - "\u2074", "foursuperior", - "\u2044", "fraction", - "\u2215", "fraction", - "\u20A3", "franc", - "\u0067", "g", - "\u03B3", "gamma", - "\u011F", "gbreve", - "\u01E7", "gcaron", - "\u011D", "gcircumflex", - "\u0123", "gcommaaccent", - "\u0121", "gdotaccent", - "\u00DF", "germandbls", - "\u2207", "gradient", - "\u0060", "grave", - "\u0300", "gravecomb", - "\u003E", "greater", - "\u2265", "greaterequal", - "\u00AB", "guillemotleft", - "\u00BB", "guillemotright", - "\u2039", "guilsinglleft", - "\u203A", "guilsinglright", - "\u0068", "h", - "\u0127", "hbar", - "\u0125", "hcircumflex", - "\u2665", "heart", - "\u0309", "hookabovecomb", - "\u2302", "house", - "\u02DD", "hungarumlaut", - "\u002D", "hyphen", - "\u00AD", "hyphen", - "\uF6E5", "hypheninferior", - "\uF6E6", "hyphensuperior", - "\u0069", "i", - "\u00ED", "iacute", - "\u012D", "ibreve", - "\u00EE", "icircumflex", - "\u00EF", "idieresis", - "\u00EC", "igrave", - "\u0133", "ij", - "\u012B", "imacron", - "\u221E", "infinity", - "\u222B", "integral", - "\u2321", "integralbt", - "\uF8F5", "integralex", - "\u2320", "integraltp", - "\u2229", "intersection", - "\u25D8", "invbullet", - "\u25D9", "invcircle", - "\u263B", "invsmileface", - "\u012F", "iogonek", - "\u03B9", "iota", - "\u03CA", "iotadieresis", - "\u0390", "iotadieresistonos", - "\u03AF", "iotatonos", - "\uF6ED", "isuperior", - "\u0129", "itilde", - "\u006A", "j", - "\u0135", "jcircumflex", - "\u006B", "k", - "\u03BA", "kappa", - "\u0137", "kcommaaccent", - "\u0138", "kgreenlandic", - "\u006C", "l", - "\u013A", "lacute", - "\u03BB", "lambda", - "\u013E", "lcaron", - "\u013C", "lcommaaccent", - "\u0140", "ldot", - "\u003C", "less", - "\u2264", "lessequal", - "\u258C", "lfblock", - "\u20A4", "lira", - "\uF6C0", "ll", - "\u2227", "logicaland", - "\u00AC", "logicalnot", - "\u2228", "logicalor", - "\u017F", "longs", - "\u25CA", "lozenge", - "\u0142", "lslash", - "\uF6EE", "lsuperior", - "\u2591", "ltshade", - "\u006D", "m", - "\u00AF", "macron", - "\u02C9", "macron", - "\u2642", "male", - "\u2212", "minus", - "\u2032", "minute", - "\uF6EF", "msuperior", - "\u00B5", "mu", - "\u03BC", "mu", - "\u00D7", "multiply", - "\u266A", "musicalnote", - "\u266B", "musicalnotedbl", - "\u006E", "n", - "\u0144", "nacute", - "\u0149", "napostrophe", - "\u0148", "ncaron", - "\u0146", "ncommaaccent", - "\u0039", "nine", - "\u2089", "nineinferior", - "\uF739", "nineoldstyle", - "\u2079", "ninesuperior", - "\u2209", "notelement", - "\u2260", "notequal", - "\u2284", "notsubset", - "\u207F", "nsuperior", - "\u00F1", "ntilde", - "\u03BD", "nu", - "\u0023", "numbersign", - "\u006F", "o", - "\u00F3", "oacute", - "\u014F", "obreve", - "\u00F4", "ocircumflex", - "\u00F6", "odieresis", - "\u0153", "oe", - "\u02DB", "ogonek", - "\u00F2", "ograve", - "\u01A1", "ohorn", - "\u0151", "ohungarumlaut", - "\u014D", "omacron", - "\u03C9", "omega", - "\u03D6", "omega1", - "\u03CE", "omegatonos", - "\u03BF", "omicron", - "\u03CC", "omicrontonos", - "\u0031", "one", - "\u2024", "onedotenleader", - "\u215B", "oneeighth", - "\uF6DC", "onefitted", - "\u00BD", "onehalf", - "\u2081", "oneinferior", - "\uF731", "oneoldstyle", - "\u00BC", "onequarter", - "\u00B9", "onesuperior", - "\u2153", "onethird", - "\u25E6", "openbullet", - "\u00AA", "ordfeminine", - "\u00BA", "ordmasculine", - "\u221F", "orthogonal", - "\u00F8", "oslash", - "\u01FF", "oslashacute", - "\uF6F0", "osuperior", - "\u00F5", "otilde", - "\u0070", "p", - "\u00B6", "paragraph", - "\u0028", "parenleft", - "\uF8ED", "parenleftbt", - "\uF8EC", "parenleftex", - "\u208D", "parenleftinferior", - "\u207D", "parenleftsuperior", - "\uF8EB", "parenlefttp", - "\u0029", "parenright", - "\uF8F8", "parenrightbt", - "\uF8F7", "parenrightex", - "\u208E", "parenrightinferior", - "\u207E", "parenrightsuperior", - "\uF8F6", "parenrighttp", - "\u2202", "partialdiff", - "\u0025", "percent", - "\u002E", "period", - "\u00B7", "periodcentered", - "\u2219", "periodcentered", - "\uF6E7", "periodinferior", - "\uF6E8", "periodsuperior", - "\u22A5", "perpendicular", - "\u2030", "perthousand", - "\u20A7", "peseta", - "\u03C6", "phi", - "\u03D5", "phi1", - "\u03C0", "pi", - "\u002B", "plus", - "\u00B1", "plusminus", - "\u211E", "prescription", - "\u220F", "product", - "\u2282", "propersubset", - "\u2283", "propersuperset", - "\u221D", "proportional", - "\u03C8", "psi", - "\u0071", "q", - "\u003F", "question", - "\u00BF", "questiondown", - "\uF7BF", "questiondownsmall", - "\uF73F", "questionsmall", - "\"", "quotedbl", -// "\u0022", "quotedbl", - "\u201E", "quotedblbase", - "\u201C", "quotedblleft", - "\u201D", "quotedblright", - "\u2018", "quoteleft", - "\u201B", "quotereversed", - "\u2019", "quoteright", - "\u201A", "quotesinglbase", - "\u0027", "quotesingle", - "\u0072", "r", - "\u0155", "racute", - "\u221A", "radical", - "\uF8E5", "radicalex", - "\u0159", "rcaron", - "\u0157", "rcommaaccent", - "\u2286", "reflexsubset", - "\u2287", "reflexsuperset", - "\u00AE", "registered", - "\uF8E8", "registersans", - "\uF6DA", "registerserif", - "\u2310", "revlogicalnot", - "\u03C1", "rho", - "\u02DA", "ring", - "\uF6F1", "rsuperior", - "\u2590", "rtblock", - "\uF6DD", "rupiah", - "\u0073", "s", - "\u015B", "sacute", - "\u0161", "scaron", - "\u015F", "scedilla", - "\uF6C2", "scedilla", - "\u015D", "scircumflex", - "\u0219", "scommaaccent", - "\u2033", "second", - "\u00A7", "section", - "\u003B", "semicolon", - "\u0037", "seven", - "\u215E", "seveneighths", - "\u2087", "seveninferior", - "\uF737", "sevenoldstyle", - "\u2077", "sevensuperior", - "\u2592", "shade", - "\u03C3", "sigma", - "\u03C2", "sigma1", - "\u223C", "similar", - "\u0036", "six", - "\u2086", "sixinferior", - "\uF736", "sixoldstyle", - "\u2076", "sixsuperior", - "\u002F", "slash", - "\u263A", "smileface", - "\u0020", "space", - "\u00A0", "space", - "\u2660", "spade", - "\uF6F2", "ssuperior", - "\u00A3", "sterling", - "\u220B", "suchthat", - "\u2211", "summation", - "\u263C", "sun", - "\u0074", "t", - "\u03C4", "tau", - "\u0167", "tbar", - "\u0165", "tcaron", - "\u0163", "tcommaaccent", - "\u021B", "tcommaaccent", - "\u2234", "therefore", - "\u03B8", "theta", - "\u03D1", "theta1", - "\u00FE", "thorn", - "\u0033", "three", - "\u215C", "threeeighths", - "\u2083", "threeinferior", - "\uF733", "threeoldstyle", - "\u00BE", "threequarters", - "\uF6DE", "threequartersemdash", - "\u00B3", "threesuperior", - "\u02DC", "tilde", - "\u0303", "tildecomb", - "\u0384", "tonos", - "\u2122", "trademark", - "\uF8EA", "trademarksans", - "\uF6DB", "trademarkserif", - "\u25BC", "triagdn", - "\u25C4", "triaglf", - "\u25BA", "triagrt", - "\u25B2", "triagup", - "\uF6F3", "tsuperior", - "\u0032", "two", - "\u2025", "twodotenleader", - "\u2082", "twoinferior", - "\uF732", "twooldstyle", - "\u00B2", "twosuperior", - "\u2154", "twothirds", - "\u0075", "u", - "\u00FA", "uacute", - "\u016D", "ubreve", - "\u00FB", "ucircumflex", - "\u00FC", "udieresis", - "\u00F9", "ugrave", - "\u01B0", "uhorn", - "\u0171", "uhungarumlaut", - "\u016B", "umacron", - "\u005F", "underscore", - "\u2017", "underscoredbl", - "\u222A", "union", - "\u2200", "universal", - "\u0173", "uogonek", - "\u2580", "upblock", - "\u03C5", "upsilon", - "\u03CB", "upsilondieresis", - "\u03B0", "upsilondieresistonos", - "\u03CD", "upsilontonos", - "\u016F", "uring", - "\u0169", "utilde", - "\u0076", "v", - "\u0077", "w", - "\u1E83", "wacute", - "\u0175", "wcircumflex", - "\u1E85", "wdieresis", - "\u2118", "weierstrass", - "\u1E81", "wgrave", - "\u0078", "x", - "\u03BE", "xi", - "\u0079", "y", - "\u00FD", "yacute", - "\u0177", "ycircumflex", - "\u00FF", "ydieresis", - "\u00A5", "yen", - "\u1EF3", "ygrave", - "\u007A", "z", - "\u017A", "zacute", - "\u017E", "zcaron", - "\u017C", "zdotaccent", - "\u0030", "zero", - "\u2080", "zeroinferior", - "\uF730", "zerooldstyle", - "\u2070", "zerosuperior", - "\u03B6", "zeta" - }; - - /** - * Return the glyphname from a character, - * eg, charToGlyphName('\\') returns "backslash" - * - * @param ch glyph to evaluate - * @return the name of the glyph - */ - public static String charToGlyphName(char ch) { - return stringToGlyph(new Character(ch).toString()); - } - - /** - * Return the glyphname from a string, - * eg, glyphToString("\\") returns "backslash" - * - * @param name glyph to evaluate - * @return the name of the glyph - * TODO: javadocs for glyphToString and stringToGlyph are confused - * TODO: Improve method names - */ - public static String glyphToString(String name) { - for (int i = 0; i < UNICODE_GLYPHS.length; i += 2) { - if (UNICODE_GLYPHS[i + 1].equals(name)) { - return UNICODE_GLYPHS[i]; - } - } - return ""; - } - - /** - * Return the string representation of a glyphname, - * eg stringToGlyph("backslash") returns "\\" - * - * @param name name of the glyph - * @return the string representation - */ - public static String stringToGlyph(String name) { - for (int i = 0; i < UNICODE_GLYPHS.length; i += 2) { - if (UNICODE_GLYPHS[i].equals(name)) { - return UNICODE_GLYPHS[i + 1]; - } - } - return ""; - } - -} - diff --git a/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java index 478ba68e1..3997b74d2 100644 --- a/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java @@ -1025,7 +1025,11 @@ private AreaInfo processWhitespace(final int alignment, // 4. compute glyph position adjustments on (substituted) characters int[][] gpa; if ( font.performsPositioning() ) { + // handle GPOS adjustments gpa = font.performPositioning ( mcs, script, language ); + } else if ( font.hasKerning() ) { + // handle standard (non-GPOS) kerning adjustments + gpa = getKerningAdjustments ( mcs, font ); } else { gpa = null; } @@ -1042,21 +1046,18 @@ private AreaInfo processWhitespace(final int alignment, // 7. compute word ipd based on final position adjustments MinOptMax ipd = MinOptMax.ZERO; for ( int i = 0, n = mcs.length(); i < n; i++ ) { - char c = mcs.charAt ( i ); + int c = mcs.charAt ( i ); + // TODO !BMP int w = font.getCharWidth ( c ); + if ( w < 0 ) { + w = 0; + } if ( gpa != null ) { w += gpa [ i ] [ GlyphPositioningTable.Value.IDX_X_ADVANCE ]; } ipd = ipd.plus ( w ); } - // [TBD] - handle kerning - note that standard kerning would only apply in - // the off-chance that a font supports substitution, but does not support - // positioning and yet has kerning data - // if ( ! font.performsPositioning() ) { - // // do standard kerning - // } - // [TBD] - handle letter spacing return new AreaInfo @@ -1064,6 +1065,47 @@ private AreaInfo processWhitespace(final int alignment, breakOpportunityChar != 0, font, level, gpa ); } + /** + * Given a mapped character sequence MCS, obtain glyph position adjustments + * from the font's kerning data. + * @param mcs mapped character sequence + * @param font applicable font + * @return glyph position adjustments (or null if no kerning) + */ + private int[][] getKerningAdjustments ( CharSequence mcs, final Font font ) { + int nc = mcs.length(); + // extract kerning array + int[] ka = new int [ nc ]; // kerning array + for ( int i = 0, n = nc, cPrev = -1; i < n; i++ ) { + int c = mcs.charAt ( i ); + // TODO !BMP + if ( cPrev >= 0 ) { + ka[i] = font.getKernValue ( cPrev, c ); + } + cPrev = c; + } + // was there a non-zero kerning? + boolean hasKerning = false; + for ( int i = 0, n = nc; i < n; i++ ) { + if ( ka[i] != 0 ) { + hasKerning = true; + break; + } + } + // if non-zero kerning, then create and return glyph position adjustment array + if ( hasKerning ) { + int[][] gpa = new int [ nc ] [ 4 ]; + for ( int i = 0, n = nc; i < n; i++ ) { + if ( i > 0 ) { + gpa [ i - 1 ] [ GlyphPositioningTable.Value.IDX_X_ADVANCE ] = ka [ i ]; + } + } + return gpa; + } else { + return null; + } + } + private AreaInfo processWordNoMapping(int lastIndex, final Font font, AreaInfo prevAreaInfo, final char breakOpportunityChar, final boolean endsWithHyphen, int level) { boolean kerning = font.hasKerning();