diff options
Diffstat (limited to 'devices/vector')
29 files changed, 865 insertions, 4891 deletions
diff --git a/devices/vector/doc_common.c b/devices/vector/doc_common.c index 50123f8f..c7d38836 100644 --- a/devices/vector/doc_common.c +++ b/devices/vector/doc_common.c @@ -3,7 +3,7 @@ #include "gxfont.h" #include "gserrors.h" #include "gxfcid.h" -#include "gdevagl.h" +#include "gsagl.h" #include "gxdevcli.h" #include "gxgstate.h" diff --git a/devices/vector/gdevagl.c b/devices/vector/gdevagl.c deleted file mode 100644 index 05b971a1..00000000 --- a/devices/vector/gdevagl.c +++ /dev/null @@ -1,4312 +0,0 @@ -/* Copyright (C) 2001-2021 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, - modified or distributed except as expressly authorized under the terms - of the license contained in the file LICENSE in this distribution. - - Refer to licensing information at http://www.artifex.com or contact - Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato, - CA 94945, U.S.A., +1(415)492-9861, for further information. -*/ -#include "gdevagl.h" - -single_glyph_list_t SingleGlyphList[] = { -{"A", 0x0041}, -{"AE", 0x00C6}, -{"AEacute", 0x01FC}, -{"AEmacron", 0x01E2}, -{"AEsmall", 0xF7E6}, -{"Aacute", 0x00C1}, -{"Aacutesmall", 0xF7E1}, -{"Abreve", 0x0102}, -{"Abreveacute", 0x1EAE}, -{"Abrevecyrillic", 0x04D0}, -{"Abrevedotbelow", 0x1EB6}, -{"Abrevegrave", 0x1EB0}, -{"Abrevehookabove", 0x1EB2}, -{"Abrevetilde", 0x1EB4}, -{"Acaron", 0x01CD}, -{"Acircle", 0x24B6}, -{"Acircumflex", 0x00C2}, -{"Acircumflexacute", 0x1EA4}, -{"Acircumflexdotbelow", 0x1EAC}, -{"Acircumflexgrave", 0x1EA6}, -{"Acircumflexhookabove", 0x1EA8}, -{"Acircumflexsmall", 0xF7E2}, -{"Acircumflextilde", 0x1EAA}, -{"Acute", 0xF6C9}, -{"Acutesmall", 0xF7B4}, -{"Acyrillic", 0x0410}, -{"Adblgrave", 0x0200}, -{"Adieresis", 0x00C4}, -{"Adieresiscyrillic", 0x04D2}, -{"Adieresismacron", 0x01DE}, -{"Adieresissmall", 0xF7E4}, -{"Adotbelow", 0x1EA0}, -{"Adotmacron", 0x01E0}, -{"Agrave", 0x00C0}, -{"Agravesmall", 0xF7E0}, -{"Ahookabove", 0x1EA2}, -{"Aiecyrillic", 0x04D4}, -{"Ainvertedbreve", 0x0202}, -{"Alpha", 0x0391}, -{"Alphatonos", 0x0386}, -{"Amacron", 0x0100}, -{"Amonospace", 0xFF21}, -{"Aogonek", 0x0104}, -{"Aring", 0x00C5}, -{"Aringacute", 0x01FA}, -{"Aringbelow", 0x1E00}, -{"Aringsmall", 0xF7E5}, -{"Asmall", 0xF761}, -{"Atilde", 0x00C3}, -{"Atildesmall", 0xF7E3}, -{"Aybarmenian", 0x0531}, -{"B", 0x0042}, -{"Bcircle", 0x24B7}, -{"Bdotaccent", 0x1E02}, -{"Bdotbelow", 0x1E04}, -{"Becyrillic", 0x0411}, -{"Benarmenian", 0x0532}, -{"Beta", 0x0392}, -{"Bhook", 0x0181}, -{"Blinebelow", 0x1E06}, -{"Bmonospace", 0xFF22}, -{"Brevesmall", 0xF6F4}, -{"Bsmall", 0xF762}, -{"Btopbar", 0x0182}, -{"C", 0x0043}, -{"Caarmenian", 0x053E}, -{"Cacute", 0x0106}, -{"Caron", 0xF6CA}, -{"Caronsmall", 0xF6F5}, -{"Ccaron", 0x010C}, -{"Ccedilla", 0x00C7}, -{"Ccedillaacute", 0x1E08}, -{"Ccedillasmall", 0xF7E7}, -{"Ccircle", 0x24B8}, -{"Ccircumflex", 0x0108}, -{"Cdot", 0x010A}, -{"Cdotaccent", 0x010A}, -{"Cedillasmall", 0xF7B8}, -{"Chaarmenian", 0x0549}, -{"Cheabkhasiancyrillic", 0x04BC}, -{"Checyrillic", 0x0427}, -{"Chedescenderabkhasiancyrillic", 0x04BE}, -{"Chedescendercyrillic", 0x04B6}, -{"Chedieresiscyrillic", 0x04F4}, -{"Cheharmenian", 0x0543}, -{"Chekhakassiancyrillic", 0x04CB}, -{"Cheverticalstrokecyrillic", 0x04B8}, -{"Chi", 0x03A7}, -{"Chook", 0x0187}, -{"Circumflexsmall", 0xF6F6}, -{"Cmonospace", 0xFF23}, -{"Coarmenian", 0x0551}, -{"Csmall", 0xF763}, -{"D", 0x0044}, -{"DZ", 0x01F1}, -{"DZcaron", 0x01C4}, -{"Daarmenian", 0x0534}, -{"Dafrican", 0x0189}, -{"Dcaron", 0x010E}, -{"Dcedilla", 0x1E10}, -{"Dcircle", 0x24B9}, -{"Dcircumflexbelow", 0x1E12}, -{"Dcroat", 0x0110}, -{"Ddotaccent", 0x1E0A}, -{"Ddotbelow", 0x1E0C}, -{"Decyrillic", 0x0414}, -{"Deicoptic", 0x03EE}, -{"Delta", 0x2206}, -{"Deltagreek", 0x0394}, -{"Dhook", 0x018A}, -{"Dieresis", 0xF6CB}, -{"DieresisAcute", 0xF6CC}, -{"DieresisGrave", 0xF6CD}, -{"Dieresissmall", 0xF7A8}, -{"Digammagreek", 0x03DC}, -{"Djecyrillic", 0x0402}, -{"Dlinebelow", 0x1E0E}, -{"Dmonospace", 0xFF24}, -{"Dotaccentsmall", 0xF6F7}, -{"Dslash", 0x0110}, -{"Dsmall", 0xF764}, -{"Dtopbar", 0x018B}, -{"Dz", 0x01F2}, -{"Dzcaron", 0x01C5}, -{"Dzeabkhasiancyrillic", 0x04E0}, -{"Dzecyrillic", 0x0405}, -{"Dzhecyrillic", 0x040F}, -{"E", 0x0045}, -{"Eacute", 0x00C9}, -{"Eacutesmall", 0xF7E9}, -{"Ebreve", 0x0114}, -{"Ecaron", 0x011A}, -{"Ecedillabreve", 0x1E1C}, -{"Echarmenian", 0x0535}, -{"Ecircle", 0x24BA}, -{"Ecircumflex", 0x00CA}, -{"Ecircumflexacute", 0x1EBE}, -{"Ecircumflexbelow", 0x1E18}, -{"Ecircumflexdotbelow", 0x1EC6}, -{"Ecircumflexgrave", 0x1EC0}, -{"Ecircumflexhookabove", 0x1EC2}, -{"Ecircumflexsmall", 0xF7EA}, -{"Ecircumflextilde", 0x1EC4}, -{"Ecyrillic", 0x0404}, -{"Edblgrave", 0x0204}, -{"Edieresis", 0x00CB}, -{"Edieresissmall", 0xF7EB}, -{"Edot", 0x0116}, -{"Edotaccent", 0x0116}, -{"Edotbelow", 0x1EB8}, -{"Efcyrillic", 0x0424}, -{"Egrave", 0x00C8}, -{"Egravesmall", 0xF7E8}, -{"Eharmenian", 0x0537}, -{"Ehookabove", 0x1EBA}, -{"Eightroman", 0x2167}, -{"Einvertedbreve", 0x0206}, -{"Eiotifiedcyrillic", 0x0464}, -{"Elcyrillic", 0x041B}, -{"Elevenroman", 0x216A}, -{"Emacron", 0x0112}, -{"Emacronacute", 0x1E16}, -{"Emacrongrave", 0x1E14}, -{"Emcyrillic", 0x041C}, -{"Emonospace", 0xFF25}, -{"Encyrillic", 0x041D}, -{"Endescendercyrillic", 0x04A2}, -{"Eng", 0x014A}, -{"Enghecyrillic", 0x04A4}, -{"Enhookcyrillic", 0x04C7}, -{"Eogonek", 0x0118}, -{"Eopen", 0x0190}, -{"Epsilon", 0x0395}, -{"Epsilontonos", 0x0388}, -{"Ercyrillic", 0x0420}, -{"Ereversed", 0x018E}, -{"Ereversedcyrillic", 0x042D}, -{"Escyrillic", 0x0421}, -{"Esdescendercyrillic", 0x04AA}, -{"Esh", 0x01A9}, -{"Esmall", 0xF765}, -{"Eta", 0x0397}, -{"Etarmenian", 0x0538}, -{"Etatonos", 0x0389}, -{"Eth", 0x00D0}, -{"Ethsmall", 0xF7F0}, -{"Etilde", 0x1EBC}, -{"Etildebelow", 0x1E1A}, -{"Euro", 0x20AC}, -{"Ezh", 0x01B7}, -{"Ezhcaron", 0x01EE}, -{"Ezhreversed", 0x01B8}, -{"F", 0x0046}, -{"Fcircle", 0x24BB}, -{"Fdotaccent", 0x1E1E}, -{"Feharmenian", 0x0556}, -{"Feicoptic", 0x03E4}, -{"Fhook", 0x0191}, -{"Fitacyrillic", 0x0472}, -{"Fiveroman", 0x2164}, -{"Fmonospace", 0xFF26}, -{"Fourroman", 0x2163}, -{"Fsmall", 0xF766}, -{"G", 0x0047}, -{"GBsquare", 0x3387}, -{"Gacute", 0x01F4}, -{"Gamma", 0x0393}, -{"Gammaafrican", 0x0194}, -{"Gangiacoptic", 0x03EA}, -{"Gbreve", 0x011E}, -{"Gcaron", 0x01E6}, -{"Gcedilla", 0x0122}, -{"Gcircle", 0x24BC}, -{"Gcircumflex", 0x011C}, -{"Gcommaaccent", 0x0122}, -{"Gdot", 0x0120}, -{"Gdotaccent", 0x0120}, -{"Gecyrillic", 0x0413}, -{"Ghadarmenian", 0x0542}, -{"Ghemiddlehookcyrillic", 0x0494}, -{"Ghestrokecyrillic", 0x0492}, -{"Gheupturncyrillic", 0x0490}, -{"Ghook", 0x0193}, -{"Gimarmenian", 0x0533}, -{"Gjecyrillic", 0x0403}, -{"Gmacron", 0x1E20}, -{"Gmonospace", 0xFF27}, -{"Grave", 0xF6CE}, -{"Gravesmall", 0xF760}, -{"Gsmall", 0xF767}, -{"Gsmallhook", 0x029B}, -{"Gstroke", 0x01E4}, -{"H", 0x0048}, -{"H18533", 0x25CF}, -{"H18543", 0x25AA}, -{"H18551", 0x25AB}, -{"H22073", 0x25A1}, -{"HPsquare", 0x33CB}, -{"Haabkhasiancyrillic", 0x04A8}, -{"Hadescendercyrillic", 0x04B2}, -{"Hardsigncyrillic", 0x042A}, -{"Hbar", 0x0126}, -{"Hbrevebelow", 0x1E2A}, -{"Hcedilla", 0x1E28}, -{"Hcircle", 0x24BD}, -{"Hcircumflex", 0x0124}, -{"Hdieresis", 0x1E26}, -{"Hdotaccent", 0x1E22}, -{"Hdotbelow", 0x1E24}, -{"Hmonospace", 0xFF28}, -{"Hoarmenian", 0x0540}, -{"Horicoptic", 0x03E8}, -{"Hsmall", 0xF768}, -{"Hungarumlaut", 0xF6CF}, -{"Hungarumlautsmall", 0xF6F8}, -{"Hzsquare", 0x3390}, -{"I", 0x0049}, -{"IAcyrillic", 0x042F}, -{"IJ", 0x0132}, -{"IUcyrillic", 0x042E}, -{"Iacute", 0x00CD}, -{"Iacutesmall", 0xF7ED}, -{"Ibreve", 0x012C}, -{"Icaron", 0x01CF}, -{"Icircle", 0x24BE}, -{"Icircumflex", 0x00CE}, -{"Icircumflexsmall", 0xF7EE}, -{"Icyrillic", 0x0406}, -{"Idblgrave", 0x0208}, -{"Idieresis", 0x00CF}, -{"Idieresisacute", 0x1E2E}, -{"Idieresiscyrillic", 0x04E4}, -{"Idieresissmall", 0xF7EF}, -{"Idot", 0x0130}, -{"Idotaccent", 0x0130}, -{"Idotbelow", 0x1ECA}, -{"Iebrevecyrillic", 0x04D6}, -{"Iecyrillic", 0x0415}, -{"Ifraktur", 0x2111}, -{"Igrave", 0x00CC}, -{"Igravesmall", 0xF7EC}, -{"Ihookabove", 0x1EC8}, -{"Iicyrillic", 0x0418}, -{"Iinvertedbreve", 0x020A}, -{"Iishortcyrillic", 0x0419}, -{"Imacron", 0x012A}, -{"Imacroncyrillic", 0x04E2}, -{"Imonospace", 0xFF29}, -{"Iniarmenian", 0x053B}, -{"Iocyrillic", 0x0401}, -{"Iogonek", 0x012E}, -{"Iota", 0x0399}, -{"Iotaafrican", 0x0196}, -{"Iotadieresis", 0x03AA}, -{"Iotatonos", 0x038A}, -{"Ismall", 0xF769}, -{"Istroke", 0x0197}, -{"Itilde", 0x0128}, -{"Itildebelow", 0x1E2C}, -{"Izhitsacyrillic", 0x0474}, -{"Izhitsadblgravecyrillic", 0x0476}, -{"J", 0x004A}, -{"Jaarmenian", 0x0541}, -{"Jcircle", 0x24BF}, -{"Jcircumflex", 0x0134}, -{"Jecyrillic", 0x0408}, -{"Jheharmenian", 0x054B}, -{"Jmonospace", 0xFF2A}, -{"Jsmall", 0xF76A}, -{"K", 0x004B}, -{"KBsquare", 0x3385}, -{"KKsquare", 0x33CD}, -{"Kabashkircyrillic", 0x04A0}, -{"Kacute", 0x1E30}, -{"Kacyrillic", 0x041A}, -{"Kadescendercyrillic", 0x049A}, -{"Kahookcyrillic", 0x04C3}, -{"Kappa", 0x039A}, -{"Kastrokecyrillic", 0x049E}, -{"Kaverticalstrokecyrillic", 0x049C}, -{"Kcaron", 0x01E8}, -{"Kcedilla", 0x0136}, -{"Kcircle", 0x24C0}, -{"Kcommaaccent", 0x0136}, -{"Kdotbelow", 0x1E32}, -{"Keharmenian", 0x0554}, -{"Kenarmenian", 0x053F}, -{"Khacyrillic", 0x0425}, -{"Kheicoptic", 0x03E6}, -{"Khook", 0x0198}, -{"Kjecyrillic", 0x040C}, -{"Klinebelow", 0x1E34}, -{"Kmonospace", 0xFF2B}, -{"Koppacyrillic", 0x0480}, -{"Koppagreek", 0x03DE}, -{"Ksicyrillic", 0x046E}, -{"Ksmall", 0xF76B}, -{"L", 0x004C}, -{"LJ", 0x01C7}, -{"LL", 0xF6BF}, -{"Lacute", 0x0139}, -{"Lambda", 0x039B}, -{"Lcaron", 0x013D}, -{"Lcedilla", 0x013B}, -{"Lcircle", 0x24C1}, -{"Lcircumflexbelow", 0x1E3C}, -{"Lcommaaccent", 0x013B}, -{"Ldot", 0x013F}, -{"Ldotaccent", 0x013F}, -{"Ldotbelow", 0x1E36}, -{"Ldotbelowmacron", 0x1E38}, -{"Liwnarmenian", 0x053C}, -{"Lj", 0x01C8}, -{"Ljecyrillic", 0x0409}, -{"Llinebelow", 0x1E3A}, -{"Lmonospace", 0xFF2C}, -{"Lslash", 0x0141}, -{"Lslashsmall", 0xF6F9}, -{"Lsmall", 0xF76C}, -{"M", 0x004D}, -{"MBsquare", 0x3386}, -{"Macron", 0xF6D0}, -{"Macronsmall", 0xF7AF}, -{"Macute", 0x1E3E}, -{"Mcircle", 0x24C2}, -{"Mdotaccent", 0x1E40}, -{"Mdotbelow", 0x1E42}, -{"Menarmenian", 0x0544}, -{"Mmonospace", 0xFF2D}, -{"Msmall", 0xF76D}, -{"Mturned", 0x019C}, -{"Mu", 0x039C}, -{"N", 0x004E}, -{"NJ", 0x01CA}, -{"Nacute", 0x0143}, -{"Ncaron", 0x0147}, -{"Ncedilla", 0x0145}, -{"Ncircle", 0x24C3}, -{"Ncircumflexbelow", 0x1E4A}, -{"Ncommaaccent", 0x0145}, -{"Ndotaccent", 0x1E44}, -{"Ndotbelow", 0x1E46}, -{"Nhookleft", 0x019D}, -{"Nineroman", 0x2168}, -{"Nj", 0x01CB}, -{"Njecyrillic", 0x040A}, -{"Nlinebelow", 0x1E48}, -{"Nmonospace", 0xFF2E}, -{"Nowarmenian", 0x0546}, -{"Nsmall", 0xF76E}, -{"Ntilde", 0x00D1}, -{"Ntildesmall", 0xF7F1}, -{"Nu", 0x039D}, -{"O", 0x004F}, -{"OE", 0x0152}, -{"OEsmall", 0xF6FA}, -{"Oacute", 0x00D3}, -{"Oacutesmall", 0xF7F3}, -{"Obarredcyrillic", 0x04E8}, -{"Obarreddieresiscyrillic", 0x04EA}, -{"Obreve", 0x014E}, -{"Ocaron", 0x01D1}, -{"Ocenteredtilde", 0x019F}, -{"Ocircle", 0x24C4}, -{"Ocircumflex", 0x00D4}, -{"Ocircumflexacute", 0x1ED0}, -{"Ocircumflexdotbelow", 0x1ED8}, -{"Ocircumflexgrave", 0x1ED2}, -{"Ocircumflexhookabove", 0x1ED4}, -{"Ocircumflexsmall", 0xF7F4}, -{"Ocircumflextilde", 0x1ED6}, -{"Ocyrillic", 0x041E}, -{"Odblacute", 0x0150}, -{"Odblgrave", 0x020C}, -{"Odieresis", 0x00D6}, -{"Odieresiscyrillic", 0x04E6}, -{"Odieresissmall", 0xF7F6}, -{"Odotbelow", 0x1ECC}, -{"Ogoneksmall", 0xF6FB}, -{"Ograve", 0x00D2}, -{"Ogravesmall", 0xF7F2}, -{"Oharmenian", 0x0555}, -{"Ohm", 0x2126}, -{"Ohookabove", 0x1ECE}, -{"Ohorn", 0x01A0}, -{"Ohornacute", 0x1EDA}, -{"Ohorndotbelow", 0x1EE2}, -{"Ohorngrave", 0x1EDC}, -{"Ohornhookabove", 0x1EDE}, -{"Ohorntilde", 0x1EE0}, -{"Ohungarumlaut", 0x0150}, -{"Oi", 0x01A2}, -{"Oinvertedbreve", 0x020E}, -{"Omacron", 0x014C}, -{"Omacronacute", 0x1E52}, -{"Omacrongrave", 0x1E50}, -{"Omega", 0x2126}, -{"Omegacyrillic", 0x0460}, -{"Omegagreek", 0x03A9}, -{"Omegaroundcyrillic", 0x047A}, -{"Omegatitlocyrillic", 0x047C}, -{"Omegatonos", 0x038F}, -{"Omicron", 0x039F}, -{"Omicrontonos", 0x038C}, -{"Omonospace", 0xFF2F}, -{"Oneroman", 0x2160}, -{"Oogonek", 0x01EA}, -{"Oogonekmacron", 0x01EC}, -{"Oopen", 0x0186}, -{"Oslash", 0x00D8}, -{"Oslashacute", 0x01FE}, -{"Oslashsmall", 0xF7F8}, -{"Osmall", 0xF76F}, -{"Ostrokeacute", 0x01FE}, -{"Otcyrillic", 0x047E}, -{"Otilde", 0x00D5}, -{"Otildeacute", 0x1E4C}, -{"Otildedieresis", 0x1E4E}, -{"Otildesmall", 0xF7F5}, -{"P", 0x0050}, -{"Pacute", 0x1E54}, -{"Pcircle", 0x24C5}, -{"Pdotaccent", 0x1E56}, -{"Pecyrillic", 0x041F}, -{"Peharmenian", 0x054A}, -{"Pemiddlehookcyrillic", 0x04A6}, -{"Phi", 0x03A6}, -{"Phook", 0x01A4}, -{"Pi", 0x03A0}, -{"Piwrarmenian", 0x0553}, -{"Pmonospace", 0xFF30}, -{"Psi", 0x03A8}, -{"Psicyrillic", 0x0470}, -{"Psmall", 0xF770}, -{"Q", 0x0051}, -{"Qcircle", 0x24C6}, -{"Qmonospace", 0xFF31}, -{"Qsmall", 0xF771}, -{"R", 0x0052}, -{"Raarmenian", 0x054C}, -{"Racute", 0x0154}, -{"Rcaron", 0x0158}, -{"Rcedilla", 0x0156}, -{"Rcircle", 0x24C7}, -{"Rcommaaccent", 0x0156}, -{"Rdblgrave", 0x0210}, -{"Rdotaccent", 0x1E58}, -{"Rdotbelow", 0x1E5A}, -{"Rdotbelowmacron", 0x1E5C}, -{"Reharmenian", 0x0550}, -{"Rfraktur", 0x211C}, -{"Rho", 0x03A1}, -{"Ringsmall", 0xF6FC}, -{"Rinvertedbreve", 0x0212}, -{"Rlinebelow", 0x1E5E}, -{"Rmonospace", 0xFF32}, -{"Rsmall", 0xF772}, -{"Rsmallinverted", 0x0281}, -{"Rsmallinvertedsuperior", 0x02B6}, -{"S", 0x0053}, -{"SF010000", 0x250C}, -{"SF020000", 0x2514}, -{"SF030000", 0x2510}, -{"SF040000", 0x2518}, -{"SF050000", 0x253C}, -{"SF060000", 0x252C}, -{"SF070000", 0x2534}, -{"SF080000", 0x251C}, -{"SF090000", 0x2524}, -{"SF100000", 0x2500}, -{"SF110000", 0x2502}, -{"SF190000", 0x2561}, -{"SF200000", 0x2562}, -{"SF210000", 0x2556}, -{"SF220000", 0x2555}, -{"SF230000", 0x2563}, -{"SF240000", 0x2551}, -{"SF250000", 0x2557}, -{"SF260000", 0x255D}, -{"SF270000", 0x255C}, -{"SF280000", 0x255B}, -{"SF360000", 0x255E}, -{"SF370000", 0x255F}, -{"SF380000", 0x255A}, -{"SF390000", 0x2554}, -{"SF400000", 0x2569}, -{"SF410000", 0x2566}, -{"SF420000", 0x2560}, -{"SF430000", 0x2550}, -{"SF440000", 0x256C}, -{"SF450000", 0x2567}, -{"SF460000", 0x2568}, -{"SF470000", 0x2564}, -{"SF480000", 0x2565}, -{"SF490000", 0x2559}, -{"SF500000", 0x2558}, -{"SF510000", 0x2552}, -{"SF520000", 0x2553}, -{"SF530000", 0x256B}, -{"SF540000", 0x256A}, -{"Sacute", 0x015A}, -{"Sacutedotaccent", 0x1E64}, -{"Sampigreek", 0x03E0}, -{"Scaron", 0x0160}, -{"Scarondotaccent", 0x1E66}, -{"Scaronsmall", 0xF6FD}, -{"Scedilla", 0x015E}, -{"Schwa", 0x018F}, -{"Schwacyrillic", 0x04D8}, -{"Schwadieresiscyrillic", 0x04DA}, -{"Scircle", 0x24C8}, -{"Scircumflex", 0x015C}, -{"Scommaaccent", 0x0218}, -{"Sdotaccent", 0x1E60}, -{"Sdotbelow", 0x1E62}, -{"Sdotbelowdotaccent", 0x1E68}, -{"Seharmenian", 0x054D}, -{"Sevenroman", 0x2166}, -{"Shaarmenian", 0x0547}, -{"Shacyrillic", 0x0428}, -{"Shchacyrillic", 0x0429}, -{"Sheicoptic", 0x03E2}, -{"Shhacyrillic", 0x04BA}, -{"Shimacoptic", 0x03EC}, -{"Sigma", 0x03A3}, -{"Sixroman", 0x2165}, -{"Smonospace", 0xFF33}, -{"Softsigncyrillic", 0x042C}, -{"Ssmall", 0xF773}, -{"Stigmagreek", 0x03DA}, -{"T", 0x0054}, -{"Tau", 0x03A4}, -{"Tbar", 0x0166}, -{"Tcaron", 0x0164}, -{"Tcedilla", 0x0162}, -{"Tcircle", 0x24C9}, -{"Tcircumflexbelow", 0x1E70}, -{"Tcommaaccent", 0x0162}, -{"Tdotaccent", 0x1E6A}, -{"Tdotbelow", 0x1E6C}, -{"Tecyrillic", 0x0422}, -{"Tedescendercyrillic", 0x04AC}, -{"Tenroman", 0x2169}, -{"Tetsecyrillic", 0x04B4}, -{"Theta", 0x0398}, -{"Thook", 0x01AC}, -{"Thorn", 0x00DE}, -{"Thornsmall", 0xF7FE}, -{"Threeroman", 0x2162}, -{"Tildesmall", 0xF6FE}, -{"Tiwnarmenian", 0x054F}, -{"Tlinebelow", 0x1E6E}, -{"Tmonospace", 0xFF34}, -{"Toarmenian", 0x0539}, -{"Tonefive", 0x01BC}, -{"Tonesix", 0x0184}, -{"Tonetwo", 0x01A7}, -{"Tretroflexhook", 0x01AE}, -{"Tsecyrillic", 0x0426}, -{"Tshecyrillic", 0x040B}, -{"Tsmall", 0xF774}, -{"Twelveroman", 0x216B}, -{"Tworoman", 0x2161}, -{"U", 0x0055}, -{"Uacute", 0x00DA}, -{"Uacutesmall", 0xF7FA}, -{"Ubreve", 0x016C}, -{"Ucaron", 0x01D3}, -{"Ucircle", 0x24CA}, -{"Ucircumflex", 0x00DB}, -{"Ucircumflexbelow", 0x1E76}, -{"Ucircumflexsmall", 0xF7FB}, -{"Ucyrillic", 0x0423}, -{"Udblacute", 0x0170}, -{"Udblgrave", 0x0214}, -{"Udieresis", 0x00DC}, -{"Udieresisacute", 0x01D7}, -{"Udieresisbelow", 0x1E72}, -{"Udieresiscaron", 0x01D9}, -{"Udieresiscyrillic", 0x04F0}, -{"Udieresisgrave", 0x01DB}, -{"Udieresismacron", 0x01D5}, -{"Udieresissmall", 0xF7FC}, -{"Udotbelow", 0x1EE4}, -{"Ugrave", 0x00D9}, -{"Ugravesmall", 0xF7F9}, -{"Uhookabove", 0x1EE6}, -{"Uhorn", 0x01AF}, -{"Uhornacute", 0x1EE8}, -{"Uhorndotbelow", 0x1EF0}, -{"Uhorngrave", 0x1EEA}, -{"Uhornhookabove", 0x1EEC}, -{"Uhorntilde", 0x1EEE}, -{"Uhungarumlaut", 0x0170}, -{"Uhungarumlautcyrillic", 0x04F2}, -{"Uinvertedbreve", 0x0216}, -{"Ukcyrillic", 0x0478}, -{"Umacron", 0x016A}, -{"Umacroncyrillic", 0x04EE}, -{"Umacrondieresis", 0x1E7A}, -{"Umonospace", 0xFF35}, -{"Uogonek", 0x0172}, -{"Upsilon", 0x03A5}, -{"Upsilon1", 0x03D2}, -{"Upsilonacutehooksymbolgreek", 0x03D3}, -{"Upsilonafrican", 0x01B1}, -{"Upsilondieresis", 0x03AB}, -{"Upsilondieresishooksymbolgreek", 0x03D4}, -{"Upsilonhooksymbol", 0x03D2}, -{"Upsilontonos", 0x038E}, -{"Uring", 0x016E}, -{"Ushortcyrillic", 0x040E}, -{"Usmall", 0xF775}, -{"Ustraightcyrillic", 0x04AE}, -{"Ustraightstrokecyrillic", 0x04B0}, -{"Utilde", 0x0168}, -{"Utildeacute", 0x1E78}, -{"Utildebelow", 0x1E74}, -{"V", 0x0056}, -{"Vcircle", 0x24CB}, -{"Vdotbelow", 0x1E7E}, -{"Vecyrillic", 0x0412}, -{"Vewarmenian", 0x054E}, -{"Vhook", 0x01B2}, -{"Vmonospace", 0xFF36}, -{"Voarmenian", 0x0548}, -{"Vsmall", 0xF776}, -{"Vtilde", 0x1E7C}, -{"W", 0x0057}, -{"Wacute", 0x1E82}, -{"Wcircle", 0x24CC}, -{"Wcircumflex", 0x0174}, -{"Wdieresis", 0x1E84}, -{"Wdotaccent", 0x1E86}, -{"Wdotbelow", 0x1E88}, -{"Wgrave", 0x1E80}, -{"Wmonospace", 0xFF37}, -{"Wsmall", 0xF777}, -{"X", 0x0058}, -{"Xcircle", 0x24CD}, -{"Xdieresis", 0x1E8C}, -{"Xdotaccent", 0x1E8A}, -{"Xeharmenian", 0x053D}, -{"Xi", 0x039E}, -{"Xmonospace", 0xFF38}, -{"Xsmall", 0xF778}, -{"Y", 0x0059}, -{"Yacute", 0x00DD}, -{"Yacutesmall", 0xF7FD}, -{"Yatcyrillic", 0x0462}, -{"Ycircle", 0x24CE}, -{"Ycircumflex", 0x0176}, -{"Ydieresis", 0x0178}, -{"Ydieresissmall", 0xF7FF}, -{"Ydotaccent", 0x1E8E}, -{"Ydotbelow", 0x1EF4}, -{"Yericyrillic", 0x042B}, -{"Yerudieresiscyrillic", 0x04F8}, -{"Ygrave", 0x1EF2}, -{"Yhook", 0x01B3}, -{"Yhookabove", 0x1EF6}, -{"Yiarmenian", 0x0545}, -{"Yicyrillic", 0x0407}, -{"Yiwnarmenian", 0x0552}, -{"Ymonospace", 0xFF39}, -{"Ysmall", 0xF779}, -{"Ytilde", 0x1EF8}, -{"Yusbigcyrillic", 0x046A}, -{"Yusbigiotifiedcyrillic", 0x046C}, -{"Yuslittlecyrillic", 0x0466}, -{"Yuslittleiotifiedcyrillic", 0x0468}, -{"Z", 0x005A}, -{"Zaarmenian", 0x0536}, -{"Zacute", 0x0179}, -{"Zcaron", 0x017D}, -{"Zcaronsmall", 0xF6FF}, -{"Zcircle", 0x24CF}, -{"Zcircumflex", 0x1E90}, -{"Zdot", 0x017B}, -{"Zdotaccent", 0x017B}, -{"Zdotbelow", 0x1E92}, -{"Zecyrillic", 0x0417}, -{"Zedescendercyrillic", 0x0498}, -{"Zedieresiscyrillic", 0x04DE}, -{"Zeta", 0x0396}, -{"Zhearmenian", 0x053A}, -{"Zhebrevecyrillic", 0x04C1}, -{"Zhecyrillic", 0x0416}, -{"Zhedescendercyrillic", 0x0496}, -{"Zhedieresiscyrillic", 0x04DC}, -{"Zlinebelow", 0x1E94}, -{"Zmonospace", 0xFF3A}, -{"Zsmall", 0xF77A}, -{"Zstroke", 0x01B5}, -{"a", 0x0061}, -{"aabengali", 0x0986}, -{"aacute", 0x00E1}, -{"aadeva", 0x0906}, -{"aagujarati", 0x0A86}, -{"aagurmukhi", 0x0A06}, -{"aamatragurmukhi", 0x0A3E}, -{"aarusquare", 0x3303}, -{"aavowelsignbengali", 0x09BE}, -{"aavowelsigndeva", 0x093E}, -{"aavowelsigngujarati", 0x0ABE}, -{"abbreviationmarkarmenian", 0x055F}, -{"abbreviationsigndeva", 0x0970}, -{"abengali", 0x0985}, -{"abopomofo", 0x311A}, -{"abreve", 0x0103}, -{"abreveacute", 0x1EAF}, -{"abrevecyrillic", 0x04D1}, -{"abrevedotbelow", 0x1EB7}, -{"abrevegrave", 0x1EB1}, -{"abrevehookabove", 0x1EB3}, -{"abrevetilde", 0x1EB5}, -{"acaron", 0x01CE}, -{"acircle", 0x24D0}, -{"acircumflex", 0x00E2}, -{"acircumflexacute", 0x1EA5}, -{"acircumflexdotbelow", 0x1EAD}, -{"acircumflexgrave", 0x1EA7}, -{"acircumflexhookabove", 0x1EA9}, -{"acircumflextilde", 0x1EAB}, -{"acute", 0x00B4}, -{"acutebelowcmb", 0x0317}, -{"acutecmb", 0x0301}, -{"acutecomb", 0x0301}, -{"acutedeva", 0x0954}, -{"acutelowmod", 0x02CF}, -{"acutetonecmb", 0x0341}, -{"acyrillic", 0x0430}, -{"adblgrave", 0x0201}, -{"addakgurmukhi", 0x0A71}, -{"adeva", 0x0905}, -{"adieresis", 0x00E4}, -{"adieresiscyrillic", 0x04D3}, -{"adieresismacron", 0x01DF}, -{"adotbelow", 0x1EA1}, -{"adotmacron", 0x01E1}, -{"ae", 0x00E6}, -{"aeacute", 0x01FD}, -{"aekorean", 0x3150}, -{"aemacron", 0x01E3}, -{"afii00208", 0x2015}, -{"afii08941", 0x20A4}, -{"afii10017", 0x0410}, -{"afii10018", 0x0411}, -{"afii10019", 0x0412}, -{"afii10020", 0x0413}, -{"afii10021", 0x0414}, -{"afii10022", 0x0415}, -{"afii10023", 0x0401}, -{"afii10024", 0x0416}, -{"afii10025", 0x0417}, -{"afii10026", 0x0418}, -{"afii10027", 0x0419}, -{"afii10028", 0x041A}, -{"afii10029", 0x041B}, -{"afii10030", 0x041C}, -{"afii10031", 0x041D}, -{"afii10032", 0x041E}, -{"afii10033", 0x041F}, -{"afii10034", 0x0420}, -{"afii10035", 0x0421}, -{"afii10036", 0x0422}, -{"afii10037", 0x0423}, -{"afii10038", 0x0424}, -{"afii10039", 0x0425}, -{"afii10040", 0x0426}, -{"afii10041", 0x0427}, -{"afii10042", 0x0428}, -{"afii10043", 0x0429}, -{"afii10044", 0x042A}, -{"afii10045", 0x042B}, -{"afii10046", 0x042C}, -{"afii10047", 0x042D}, -{"afii10048", 0x042E}, -{"afii10049", 0x042F}, -{"afii10050", 0x0490}, -{"afii10051", 0x0402}, -{"afii10052", 0x0403}, -{"afii10053", 0x0404}, -{"afii10054", 0x0405}, -{"afii10055", 0x0406}, -{"afii10056", 0x0407}, -{"afii10057", 0x0408}, -{"afii10058", 0x0409}, -{"afii10059", 0x040A}, -{"afii10060", 0x040B}, -{"afii10061", 0x040C}, -{"afii10062", 0x040E}, -{"afii10063", 0xF6C4}, -{"afii10064", 0xF6C5}, -{"afii10065", 0x0430}, -{"afii10066", 0x0431}, -{"afii10067", 0x0432}, -{"afii10068", 0x0433}, -{"afii10069", 0x0434}, -{"afii10070", 0x0435}, -{"afii10071", 0x0451}, -{"afii10072", 0x0436}, -{"afii10073", 0x0437}, -{"afii10074", 0x0438}, -{"afii10075", 0x0439}, -{"afii10076", 0x043A}, -{"afii10077", 0x043B}, -{"afii10078", 0x043C}, -{"afii10079", 0x043D}, -{"afii10080", 0x043E}, -{"afii10081", 0x043F}, -{"afii10082", 0x0440}, -{"afii10083", 0x0441}, -{"afii10084", 0x0442}, -{"afii10085", 0x0443}, -{"afii10086", 0x0444}, -{"afii10087", 0x0445}, -{"afii10088", 0x0446}, -{"afii10089", 0x0447}, -{"afii10090", 0x0448}, -{"afii10091", 0x0449}, -{"afii10092", 0x044A}, -{"afii10093", 0x044B}, -{"afii10094", 0x044C}, -{"afii10095", 0x044D}, -{"afii10096", 0x044E}, -{"afii10097", 0x044F}, -{"afii10098", 0x0491}, -{"afii10099", 0x0452}, -{"afii10100", 0x0453}, -{"afii10101", 0x0454}, -{"afii10102", 0x0455}, -{"afii10103", 0x0456}, -{"afii10104", 0x0457}, -{"afii10105", 0x0458}, -{"afii10106", 0x0459}, -{"afii10107", 0x045A}, -{"afii10108", 0x045B}, -{"afii10109", 0x045C}, -{"afii10110", 0x045E}, -{"afii10145", 0x040F}, -{"afii10146", 0x0462}, -{"afii10147", 0x0472}, -{"afii10148", 0x0474}, -{"afii10192", 0xF6C6}, -{"afii10193", 0x045F}, -{"afii10194", 0x0463}, -{"afii10195", 0x0473}, -{"afii10196", 0x0475}, -{"afii10831", 0xF6C7}, -{"afii10832", 0xF6C8}, -{"afii10846", 0x04D9}, -{"afii299", 0x200E}, -{"afii300", 0x200F}, -{"afii301", 0x200D}, -{"afii57381", 0x066A}, -{"afii57388", 0x060C}, -{"afii57392", 0x0660}, -{"afii57393", 0x0661}, -{"afii57394", 0x0662}, -{"afii57395", 0x0663}, -{"afii57396", 0x0664}, -{"afii57397", 0x0665}, -{"afii57398", 0x0666}, -{"afii57399", 0x0667}, -{"afii57400", 0x0668}, -{"afii57401", 0x0669}, -{"afii57403", 0x061B}, -{"afii57407", 0x061F}, -{"afii57409", 0x0621}, -{"afii57410", 0x0622}, -{"afii57411", 0x0623}, -{"afii57412", 0x0624}, -{"afii57413", 0x0625}, -{"afii57414", 0x0626}, -{"afii57415", 0x0627}, -{"afii57416", 0x0628}, -{"afii57417", 0x0629}, -{"afii57418", 0x062A}, -{"afii57419", 0x062B}, -{"afii57420", 0x062C}, -{"afii57421", 0x062D}, -{"afii57422", 0x062E}, -{"afii57423", 0x062F}, -{"afii57424", 0x0630}, -{"afii57425", 0x0631}, -{"afii57426", 0x0632}, -{"afii57427", 0x0633}, -{"afii57428", 0x0634}, -{"afii57429", 0x0635}, -{"afii57430", 0x0636}, -{"afii57431", 0x0637}, -{"afii57432", 0x0638}, -{"afii57433", 0x0639}, -{"afii57434", 0x063A}, -{"afii57440", 0x0640}, -{"afii57441", 0x0641}, -{"afii57442", 0x0642}, -{"afii57443", 0x0643}, -{"afii57444", 0x0644}, -{"afii57445", 0x0645}, -{"afii57446", 0x0646}, -{"afii57448", 0x0648}, -{"afii57449", 0x0649}, -{"afii57450", 0x064A}, -{"afii57451", 0x064B}, -{"afii57452", 0x064C}, -{"afii57453", 0x064D}, -{"afii57454", 0x064E}, -{"afii57455", 0x064F}, -{"afii57456", 0x0650}, -{"afii57457", 0x0651}, -{"afii57458", 0x0652}, -{"afii57470", 0x0647}, -{"afii57505", 0x06A4}, -{"afii57506", 0x067E}, -{"afii57507", 0x0686}, -{"afii57508", 0x0698}, -{"afii57509", 0x06AF}, -{"afii57511", 0x0679}, -{"afii57512", 0x0688}, -{"afii57513", 0x0691}, -{"afii57514", 0x06BA}, -{"afii57519", 0x06D2}, -{"afii57534", 0x06D5}, -{"afii57636", 0x20AA}, -{"afii57645", 0x05BE}, -{"afii57658", 0x05C3}, -{"afii57664", 0x05D0}, -{"afii57665", 0x05D1}, -{"afii57666", 0x05D2}, -{"afii57667", 0x05D3}, -{"afii57668", 0x05D4}, -{"afii57669", 0x05D5}, -{"afii57670", 0x05D6}, -{"afii57671", 0x05D7}, -{"afii57672", 0x05D8}, -{"afii57673", 0x05D9}, -{"afii57674", 0x05DA}, -{"afii57675", 0x05DB}, -{"afii57676", 0x05DC}, -{"afii57677", 0x05DD}, -{"afii57678", 0x05DE}, -{"afii57679", 0x05DF}, -{"afii57680", 0x05E0}, -{"afii57681", 0x05E1}, -{"afii57682", 0x05E2}, -{"afii57683", 0x05E3}, -{"afii57684", 0x05E4}, -{"afii57685", 0x05E5}, -{"afii57686", 0x05E6}, -{"afii57687", 0x05E7}, -{"afii57688", 0x05E8}, -{"afii57689", 0x05E9}, -{"afii57690", 0x05EA}, -{"afii57694", 0xFB2A}, -{"afii57695", 0xFB2B}, -{"afii57700", 0xFB4B}, -{"afii57705", 0xFB1F}, -{"afii57716", 0x05F0}, -{"afii57717", 0x05F1}, -{"afii57718", 0x05F2}, -{"afii57723", 0xFB35}, -{"afii57793", 0x05B4}, -{"afii57794", 0x05B5}, -{"afii57795", 0x05B6}, -{"afii57796", 0x05BB}, -{"afii57797", 0x05B8}, -{"afii57798", 0x05B7}, -{"afii57799", 0x05B0}, -{"afii57800", 0x05B2}, -{"afii57801", 0x05B1}, -{"afii57802", 0x05B3}, -{"afii57803", 0x05C2}, -{"afii57804", 0x05C1}, -{"afii57806", 0x05B9}, -{"afii57807", 0x05BC}, -{"afii57839", 0x05BD}, -{"afii57841", 0x05BF}, -{"afii57842", 0x05C0}, -{"afii57929", 0x02BC}, -{"afii61248", 0x2105}, -{"afii61289", 0x2113}, -{"afii61352", 0x2116}, -{"afii61573", 0x202C}, -{"afii61574", 0x202D}, -{"afii61575", 0x202E}, -{"afii61664", 0x200C}, -{"afii63167", 0x066D}, -{"afii64937", 0x02BD}, -{"agrave", 0x00E0}, -{"agujarati", 0x0A85}, -{"agurmukhi", 0x0A05}, -{"ahiragana", 0x3042}, -{"ahookabove", 0x1EA3}, -{"aibengali", 0x0990}, -{"aibopomofo", 0x311E}, -{"aideva", 0x0910}, -{"aiecyrillic", 0x04D5}, -{"aigujarati", 0x0A90}, -{"aigurmukhi", 0x0A10}, -{"aimatragurmukhi", 0x0A48}, -{"ainarabic", 0x0639}, -{"ainfinalarabic", 0xFECA}, -{"aininitialarabic", 0xFECB}, -{"ainmedialarabic", 0xFECC}, -{"ainvertedbreve", 0x0203}, -{"aivowelsignbengali", 0x09C8}, -{"aivowelsigndeva", 0x0948}, -{"aivowelsigngujarati", 0x0AC8}, -{"akatakana", 0x30A2}, -{"akatakanahalfwidth", 0xFF71}, -{"akorean", 0x314F}, -{"alef", 0x05D0}, -{"alefarabic", 0x0627}, -{"alefdageshhebrew", 0xFB30}, -{"aleffinalarabic", 0xFE8E}, -{"alefhamzaabovearabic", 0x0623}, -{"alefhamzaabovefinalarabic", 0xFE84}, -{"alefhamzabelowarabic", 0x0625}, -{"alefhamzabelowfinalarabic", 0xFE88}, -{"alefhebrew", 0x05D0}, -{"aleflamedhebrew", 0xFB4F}, -{"alefmaddaabovearabic", 0x0622}, -{"alefmaddaabovefinalarabic", 0xFE82}, -{"alefmaksuraarabic", 0x0649}, -{"alefmaksurafinalarabic", 0xFEF0}, -{"alefmaksurainitialarabic", 0xFEF3}, -{"alefmaksuramedialarabic", 0xFEF4}, -{"alefpatahhebrew", 0xFB2E}, -{"alefqamatshebrew", 0xFB2F}, -{"aleph", 0x2135}, -{"allequal", 0x224C}, -{"alpha", 0x03B1}, -{"alphatonos", 0x03AC}, -{"amacron", 0x0101}, -{"amonospace", 0xFF41}, -{"ampersand", 0x0026}, -{"ampersandmonospace", 0xFF06}, -{"ampersandsmall", 0xF726}, -{"amsquare", 0x33C2}, -{"anbopomofo", 0x3122}, -{"angbopomofo", 0x3124}, -{"angkhankhuthai", 0x0E5A}, -{"angle", 0x2220}, -{"anglebracketleft", 0x3008}, -{"anglebracketleftvertical", 0xFE3F}, -{"anglebracketright", 0x3009}, -{"anglebracketrightvertical", 0xFE40}, -{"angleleft", 0x2329}, -{"angleright", 0x232A}, -{"angstrom", 0x212B}, -{"anoteleia", 0x0387}, -{"anudattadeva", 0x0952}, -{"anusvarabengali", 0x0982}, -{"anusvaradeva", 0x0902}, -{"anusvaragujarati", 0x0A82}, -{"aogonek", 0x0105}, -{"apaatosquare", 0x3300}, -{"aparen", 0x249C}, -{"apostrophearmenian", 0x055A}, -{"apostrophemod", 0x02BC}, -{"apple", 0xF8FF}, -{"approaches", 0x2250}, -{"approxequal", 0x2248}, -{"approxequalorimage", 0x2252}, -{"approximatelyequal", 0x2245}, -{"araeaekorean", 0x318E}, -{"araeakorean", 0x318D}, -{"arc", 0x2312}, -{"arighthalfring", 0x1E9A}, -{"aring", 0x00E5}, -{"aringacute", 0x01FB}, -{"aringbelow", 0x1E01}, -{"arrowboth", 0x2194}, -{"arrowdashdown", 0x21E3}, -{"arrowdashleft", 0x21E0}, -{"arrowdashright", 0x21E2}, -{"arrowdashup", 0x21E1}, -{"arrowdblboth", 0x21D4}, -{"arrowdbldown", 0x21D3}, -{"arrowdblleft", 0x21D0}, -{"arrowdblright", 0x21D2}, -{"arrowdblup", 0x21D1}, -{"arrowdown", 0x2193}, -{"arrowdownleft", 0x2199}, -{"arrowdownright", 0x2198}, -{"arrowdownwhite", 0x21E9}, -{"arrowheaddownmod", 0x02C5}, -{"arrowheadleftmod", 0x02C2}, -{"arrowheadrightmod", 0x02C3}, -{"arrowheadupmod", 0x02C4}, -{"arrowhorizex", 0xF8E7}, -{"arrowleft", 0x2190}, -{"arrowleftdbl", 0x21D0}, -{"arrowleftdblstroke", 0x21CD}, -{"arrowleftoverright", 0x21C6}, -{"arrowleftwhite", 0x21E6}, -{"arrowright", 0x2192}, -{"arrowrightdblstroke", 0x21CF}, -{"arrowrightheavy", 0x279E}, -{"arrowrightoverleft", 0x21C4}, -{"arrowrightwhite", 0x21E8}, -{"arrowtableft", 0x21E4}, -{"arrowtabright", 0x21E5}, -{"arrowup", 0x2191}, -{"arrowupdn", 0x2195}, -{"arrowupdnbse", 0x21A8}, -{"arrowupdownbase", 0x21A8}, -{"arrowupleft", 0x2196}, -{"arrowupleftofdown", 0x21C5}, -{"arrowupright", 0x2197}, -{"arrowupwhite", 0x21E7}, -{"arrowvertex", 0xF8E6}, -{"asciicircum", 0x005E}, -{"asciicircummonospace", 0xFF3E}, -{"asciitilde", 0x007E}, -{"asciitildemonospace", 0xFF5E}, -{"ascript", 0x0251}, -{"ascriptturned", 0x0252}, -{"asmallhiragana", 0x3041}, -{"asmallkatakana", 0x30A1}, -{"asmallkatakanahalfwidth", 0xFF67}, -{"asterisk", 0x002A}, -{"asteriskaltonearabic", 0x066D}, -{"asteriskarabic", 0x066D}, -{"asteriskmath", 0x2217}, -{"asteriskmonospace", 0xFF0A}, -{"asterisksmall", 0xFE61}, -{"asterism", 0x2042}, -{"asuperior", 0xF6E9}, -{"asymptoticallyequal", 0x2243}, -{"at", 0x0040}, -{"atilde", 0x00E3}, -{"atmonospace", 0xFF20}, -{"atsmall", 0xFE6B}, -{"aturned", 0x0250}, -{"aubengali", 0x0994}, -{"aubopomofo", 0x3120}, -{"audeva", 0x0914}, -{"augujarati", 0x0A94}, -{"augurmukhi", 0x0A14}, -{"aulengthmarkbengali", 0x09D7}, -{"aumatragurmukhi", 0x0A4C}, -{"auvowelsignbengali", 0x09CC}, -{"auvowelsigndeva", 0x094C}, -{"auvowelsigngujarati", 0x0ACC}, -{"avagrahadeva", 0x093D}, -{"aybarmenian", 0x0561}, -{"ayin", 0x05E2}, -{"ayinaltonehebrew", 0xFB20}, -{"ayinhebrew", 0x05E2}, -{"b", 0x0062}, -{"babengali", 0x09AC}, -{"backslash", 0x005C}, -{"backslashmonospace", 0xFF3C}, -{"badeva", 0x092C}, -{"bagujarati", 0x0AAC}, -{"bagurmukhi", 0x0A2C}, -{"bahiragana", 0x3070}, -{"bahtthai", 0x0E3F}, -{"bakatakana", 0x30D0}, -{"bar", 0x007C}, -{"barmonospace", 0xFF5C}, -{"bbopomofo", 0x3105}, -{"bcircle", 0x24D1}, -{"bdotaccent", 0x1E03}, -{"bdotbelow", 0x1E05}, -{"beamedsixteenthnotes", 0x266C}, -{"because", 0x2235}, -{"becyrillic", 0x0431}, -{"beharabic", 0x0628}, -{"behfinalarabic", 0xFE90}, -{"behinitialarabic", 0xFE91}, -{"behiragana", 0x3079}, -{"behmedialarabic", 0xFE92}, -{"behmeeminitialarabic", 0xFC9F}, -{"behmeemisolatedarabic", 0xFC08}, -{"behnoonfinalarabic", 0xFC6D}, -{"bekatakana", 0x30D9}, -{"benarmenian", 0x0562}, -{"bet", 0x05D1}, -{"beta", 0x03B2}, -{"betasymbolgreek", 0x03D0}, -{"betdagesh", 0xFB31}, -{"betdageshhebrew", 0xFB31}, -{"bethebrew", 0x05D1}, -{"betrafehebrew", 0xFB4C}, -{"bhabengali", 0x09AD}, -{"bhadeva", 0x092D}, -{"bhagujarati", 0x0AAD}, -{"bhagurmukhi", 0x0A2D}, -{"bhook", 0x0253}, -{"bihiragana", 0x3073}, -{"bikatakana", 0x30D3}, -{"bilabialclick", 0x0298}, -{"bindigurmukhi", 0x0A02}, -{"birusquare", 0x3331}, -{"blackcircle", 0x25CF}, -{"blackdiamond", 0x25C6}, -{"blackdownpointingtriangle", 0x25BC}, -{"blackleftpointingpointer", 0x25C4}, -{"blackleftpointingtriangle", 0x25C0}, -{"blacklenticularbracketleft", 0x3010}, -{"blacklenticularbracketleftvertical", 0xFE3B}, -{"blacklenticularbracketright", 0x3011}, -{"blacklenticularbracketrightvertical", 0xFE3C}, -{"blacklowerlefttriangle", 0x25E3}, -{"blacklowerrighttriangle", 0x25E2}, -{"blackrectangle", 0x25AC}, -{"blackrightpointingpointer", 0x25BA}, -{"blackrightpointingtriangle", 0x25B6}, -{"blacksmallsquare", 0x25AA}, -{"blacksmilingface", 0x263B}, -{"blacksquare", 0x25A0}, -{"blackstar", 0x2605}, -{"blackupperlefttriangle", 0x25E4}, -{"blackupperrighttriangle", 0x25E5}, -{"blackuppointingsmalltriangle", 0x25B4}, -{"blackuppointingtriangle", 0x25B2}, -{"blank", 0x2423}, -{"blinebelow", 0x1E07}, -{"block", 0x2588}, -{"bmonospace", 0xFF42}, -{"bobaimaithai", 0x0E1A}, -{"bohiragana", 0x307C}, -{"bokatakana", 0x30DC}, -{"bparen", 0x249D}, -{"bqsquare", 0x33C3}, -{"braceex", 0xF8F4}, -{"braceleft", 0x007B}, -{"braceleftbt", 0xF8F3}, -{"braceleftmid", 0xF8F2}, -{"braceleftmonospace", 0xFF5B}, -{"braceleftsmall", 0xFE5B}, -{"bracelefttp", 0xF8F1}, -{"braceleftvertical", 0xFE37}, -{"braceright", 0x007D}, -{"bracerightbt", 0xF8FE}, -{"bracerightmid", 0xF8FD}, -{"bracerightmonospace", 0xFF5D}, -{"bracerightsmall", 0xFE5C}, -{"bracerighttp", 0xF8FC}, -{"bracerightvertical", 0xFE38}, -{"bracketleft", 0x005B}, -{"bracketleftbt", 0xF8F0}, -{"bracketleftex", 0xF8EF}, -{"bracketleftmonospace", 0xFF3B}, -{"bracketlefttp", 0xF8EE}, -{"bracketright", 0x005D}, -{"bracketrightbt", 0xF8FB}, -{"bracketrightex", 0xF8FA}, -{"bracketrightmonospace", 0xFF3D}, -{"bracketrighttp", 0xF8F9}, -{"breve", 0x02D8}, -{"brevebelowcmb", 0x032E}, -{"brevecmb", 0x0306}, -{"breveinvertedbelowcmb", 0x032F}, -{"breveinvertedcmb", 0x0311}, -{"breveinverteddoublecmb", 0x0361}, -{"bridgebelowcmb", 0x032A}, -{"bridgeinvertedbelowcmb", 0x033A}, -{"brokenbar", 0x00A6}, -{"bstroke", 0x0180}, -{"bsuperior", 0xF6EA}, -{"btopbar", 0x0183}, -{"buhiragana", 0x3076}, -{"bukatakana", 0x30D6}, -{"bullet", 0x2022}, -{"bulletinverse", 0x25D8}, -{"bulletoperator", 0x2219}, -{"bullseye", 0x25CE}, -{"c", 0x0063}, -{"caarmenian", 0x056E}, -{"cabengali", 0x099A}, -{"cacute", 0x0107}, -{"cadeva", 0x091A}, -{"cagujarati", 0x0A9A}, -{"cagurmukhi", 0x0A1A}, -{"calsquare", 0x3388}, -{"candrabindubengali", 0x0981}, -{"candrabinducmb", 0x0310}, -{"candrabindudeva", 0x0901}, -{"candrabindugujarati", 0x0A81}, -{"capslock", 0x21EA}, -{"careof", 0x2105}, -{"caron", 0x02C7}, -{"caronbelowcmb", 0x032C}, -{"caroncmb", 0x030C}, -{"carriagereturn", 0x21B5}, -{"cbopomofo", 0x3118}, -{"ccaron", 0x010D}, -{"ccedilla", 0x00E7}, -{"ccedillaacute", 0x1E09}, -{"ccircle", 0x24D2}, -{"ccircumflex", 0x0109}, -{"ccurl", 0x0255}, -{"cdot", 0x010B}, -{"cdotaccent", 0x010B}, -{"cdsquare", 0x33C5}, -{"cedilla", 0x00B8}, -{"cedillacmb", 0x0327}, -{"cent", 0x00A2}, -{"centigrade", 0x2103}, -{"centinferior", 0xF6DF}, -{"centmonospace", 0xFFE0}, -{"centoldstyle", 0xF7A2}, -{"centsuperior", 0xF6E0}, -{"chaarmenian", 0x0579}, -{"chabengali", 0x099B}, -{"chadeva", 0x091B}, -{"chagujarati", 0x0A9B}, -{"chagurmukhi", 0x0A1B}, -{"chbopomofo", 0x3114}, -{"cheabkhasiancyrillic", 0x04BD}, -{"checkmark", 0x2713}, -{"checyrillic", 0x0447}, -{"chedescenderabkhasiancyrillic", 0x04BF}, -{"chedescendercyrillic", 0x04B7}, -{"chedieresiscyrillic", 0x04F5}, -{"cheharmenian", 0x0573}, -{"chekhakassiancyrillic", 0x04CC}, -{"cheverticalstrokecyrillic", 0x04B9}, -{"chi", 0x03C7}, -{"chieuchacirclekorean", 0x3277}, -{"chieuchaparenkorean", 0x3217}, -{"chieuchcirclekorean", 0x3269}, -{"chieuchkorean", 0x314A}, -{"chieuchparenkorean", 0x3209}, -{"chochangthai", 0x0E0A}, -{"chochanthai", 0x0E08}, -{"chochingthai", 0x0E09}, -{"chochoethai", 0x0E0C}, -{"chook", 0x0188}, -{"cieucacirclekorean", 0x3276}, -{"cieucaparenkorean", 0x3216}, -{"cieuccirclekorean", 0x3268}, -{"cieuckorean", 0x3148}, -{"cieucparenkorean", 0x3208}, -{"cieucuparenkorean", 0x321C}, -{"circle", 0x25CB}, -{"circlemultiply", 0x2297}, -{"circleot", 0x2299}, -{"circleplus", 0x2295}, -{"circlepostalmark", 0x3036}, -{"circlewithlefthalfblack", 0x25D0}, -{"circlewithrighthalfblack", 0x25D1}, -{"circumflex", 0x02C6}, -{"circumflexbelowcmb", 0x032D}, -{"circumflexcmb", 0x0302}, -{"clear", 0x2327}, -{"clickalveolar", 0x01C2}, -{"clickdental", 0x01C0}, -{"clicklateral", 0x01C1}, -{"clickretroflex", 0x01C3}, -{"club", 0x2663}, -{"clubsuitblack", 0x2663}, -{"clubsuitwhite", 0x2667}, -{"cmcubedsquare", 0x33A4}, -{"cmonospace", 0xFF43}, -{"cmsquaredsquare", 0x33A0}, -{"coarmenian", 0x0581}, -{"colon", 0x003A}, -{"colonmonetary", 0x20A1}, -{"colonmonospace", 0xFF1A}, -{"colonsign", 0x20A1}, -{"colonsmall", 0xFE55}, -{"colontriangularhalfmod", 0x02D1}, -{"colontriangularmod", 0x02D0}, -{"comma", 0x002C}, -{"commaabovecmb", 0x0313}, -{"commaaboverightcmb", 0x0315}, -{"commaaccent", 0xF6C3}, -{"commaarabic", 0x060C}, -{"commaarmenian", 0x055D}, -{"commainferior", 0xF6E1}, -{"commamonospace", 0xFF0C}, -{"commareversedabovecmb", 0x0314}, -{"commareversedmod", 0x02BD}, -{"commasmall", 0xFE50}, -{"commasuperior", 0xF6E2}, -{"commaturnedabovecmb", 0x0312}, -{"commaturnedmod", 0x02BB}, -{"compass", 0x263C}, -{"congruent", 0x2245}, -{"contourintegral", 0x222E}, -{"control", 0x2303}, -{"controlACK", 0x0006}, -{"controlBEL", 0x0007}, -{"controlBS", 0x0008}, -{"controlCAN", 0x0018}, -{"controlCR", 0x000D}, -{"controlDC1", 0x0011}, -{"controlDC2", 0x0012}, -{"controlDC3", 0x0013}, -{"controlDC4", 0x0014}, -{"controlDEL", 0x007F}, -{"controlDLE", 0x0010}, -{"controlEM", 0x0019}, -{"controlENQ", 0x0005}, -{"controlEOT", 0x0004}, -{"controlESC", 0x001B}, -{"controlETB", 0x0017}, -{"controlETX", 0x0003}, -{"controlFF", 0x000C}, -{"controlFS", 0x001C}, -{"controlGS", 0x001D}, -{"controlHT", 0x0009}, -{"controlLF", 0x000A}, -{"controlNAK", 0x0015}, -{"controlRS", 0x001E}, -{"controlSI", 0x000F}, -{"controlSO", 0x000E}, -{"controlSOT", 0x0002}, -{"controlSTX", 0x0001}, -{"controlSUB", 0x001A}, -{"controlSYN", 0x0016}, -{"controlUS", 0x001F}, -{"controlVT", 0x000B}, -{"copyright", 0x00A9}, -{"copyrightsans", 0xF8E9}, -{"copyrightserif", 0xF6D9}, -{"cornerbracketleft", 0x300C}, -{"cornerbracketlefthalfwidth", 0xFF62}, -{"cornerbracketleftvertical", 0xFE41}, -{"cornerbracketright", 0x300D}, -{"cornerbracketrighthalfwidth", 0xFF63}, -{"cornerbracketrightvertical", 0xFE42}, -{"corporationsquare", 0x337F}, -{"cosquare", 0x33C7}, -{"coverkgsquare", 0x33C6}, -{"cparen", 0x249E}, -{"cruzeiro", 0x20A2}, -{"cstretched", 0x0297}, -{"curlyand", 0x22CF}, -{"curlyor", 0x22CE}, -{"currency", 0x00A4}, -{"cyrBreve", 0xF6D1}, -{"cyrFlex", 0xF6D2}, -{"cyrbreve", 0xF6D4}, -{"cyrflex", 0xF6D5}, -{"d", 0x0064}, -{"daarmenian", 0x0564}, -{"dabengali", 0x09A6}, -{"dadarabic", 0x0636}, -{"dadeva", 0x0926}, -{"dadfinalarabic", 0xFEBE}, -{"dadinitialarabic", 0xFEBF}, -{"dadmedialarabic", 0xFEC0}, -{"dagesh", 0x05BC}, -{"dageshhebrew", 0x05BC}, -{"dagger", 0x2020}, -{"daggerdbl", 0x2021}, -{"dagujarati", 0x0AA6}, -{"dagurmukhi", 0x0A26}, -{"dahiragana", 0x3060}, -{"dakatakana", 0x30C0}, -{"dalarabic", 0x062F}, -{"dalet", 0x05D3}, -{"daletdagesh", 0xFB33}, -{"daletdageshhebrew", 0xFB33}, -{"dalethebrew", 0x05D3}, -{"dalfinalarabic", 0xFEAA}, -{"dammaarabic", 0x064F}, -{"dammalowarabic", 0x064F}, -{"dammatanaltonearabic", 0x064C}, -{"dammatanarabic", 0x064C}, -{"danda", 0x0964}, -{"dargahebrew", 0x05A7}, -{"dargalefthebrew", 0x05A7}, -{"dasiapneumatacyrilliccmb", 0x0485}, -{"dblGrave", 0xF6D3}, -{"dblanglebracketleft", 0x300A}, -{"dblanglebracketleftvertical", 0xFE3D}, -{"dblanglebracketright", 0x300B}, -{"dblanglebracketrightvertical", 0xFE3E}, -{"dblarchinvertedbelowcmb", 0x032B}, -{"dblarrowleft", 0x21D4}, -{"dblarrowright", 0x21D2}, -{"dbldanda", 0x0965}, -{"dblgrave", 0xF6D6}, -{"dblgravecmb", 0x030F}, -{"dblintegral", 0x222C}, -{"dbllowline", 0x2017}, -{"dbllowlinecmb", 0x0333}, -{"dbloverlinecmb", 0x033F}, -{"dblprimemod", 0x02BA}, -{"dblverticalbar", 0x2016}, -{"dblverticallineabovecmb", 0x030E}, -{"dbopomofo", 0x3109}, -{"dbsquare", 0x33C8}, -{"dcaron", 0x010F}, -{"dcedilla", 0x1E11}, -{"dcircle", 0x24D3}, -{"dcircumflexbelow", 0x1E13}, -{"dcroat", 0x0111}, -{"ddabengali", 0x09A1}, -{"ddadeva", 0x0921}, -{"ddagujarati", 0x0AA1}, -{"ddagurmukhi", 0x0A21}, -{"ddalarabic", 0x0688}, -{"ddalfinalarabic", 0xFB89}, -{"dddhadeva", 0x095C}, -{"ddhabengali", 0x09A2}, -{"ddhadeva", 0x0922}, -{"ddhagujarati", 0x0AA2}, -{"ddhagurmukhi", 0x0A22}, -{"ddotaccent", 0x1E0B}, -{"ddotbelow", 0x1E0D}, -{"decimalseparatorarabic", 0x066B}, -{"decimalseparatorpersian", 0x066B}, -{"decyrillic", 0x0434}, -{"degree", 0x00B0}, -{"dehihebrew", 0x05AD}, -{"dehiragana", 0x3067}, -{"deicoptic", 0x03EF}, -{"dekatakana", 0x30C7}, -{"deleteleft", 0x232B}, -{"deleteright", 0x2326}, -{"delta", 0x03B4}, -{"deltaturned", 0x018D}, -{"denominatorminusonenumeratorbengali", 0x09F8}, -{"dezh", 0x02A4}, -{"dhabengali", 0x09A7}, -{"dhadeva", 0x0927}, -{"dhagujarati", 0x0AA7}, -{"dhagurmukhi", 0x0A27}, -{"dhook", 0x0257}, -{"dialytikatonos", 0x0385}, -{"dialytikatonoscmb", 0x0344}, -{"diamond", 0x2666}, -{"diamondsuitwhite", 0x2662}, -{"dieresis", 0x00A8}, -{"dieresisacute", 0xF6D7}, -{"dieresisbelowcmb", 0x0324}, -{"dieresiscmb", 0x0308}, -{"dieresisgrave", 0xF6D8}, -{"dieresistonos", 0x0385}, -{"dihiragana", 0x3062}, -{"dikatakana", 0x30C2}, -{"dittomark", 0x3003}, -{"divide", 0x00F7}, -{"divides", 0x2223}, -{"divisionslash", 0x2215}, -{"djecyrillic", 0x0452}, -{"dkshade", 0x2593}, -{"dlinebelow", 0x1E0F}, -{"dlsquare", 0x3397}, -{"dmacron", 0x0111}, -{"dmonospace", 0xFF44}, -{"dnblock", 0x2584}, -{"dochadathai", 0x0E0E}, -{"dodekthai", 0x0E14}, -{"dohiragana", 0x3069}, -{"dokatakana", 0x30C9}, -{"dollar", 0x0024}, -{"dollarinferior", 0xF6E3}, -{"dollarmonospace", 0xFF04}, -{"dollaroldstyle", 0xF724}, -{"dollarsmall", 0xFE69}, -{"dollarsuperior", 0xF6E4}, -{"dong", 0x20AB}, -{"dorusquare", 0x3326}, -{"dotaccent", 0x02D9}, -{"dotaccentcmb", 0x0307}, -{"dotbelowcmb", 0x0323}, -{"dotbelowcomb", 0x0323}, -{"dotkatakana", 0x30FB}, -{"dotlessi", 0x0131}, -{"dotlessj", 0xF6BE}, -{"dotlessjstrokehook", 0x0284}, -{"dotmath", 0x22C5}, -{"dottedcircle", 0x25CC}, -{"doubleyodpatah", 0xFB1F}, -{"doubleyodpatahhebrew", 0xFB1F}, -{"downtackbelowcmb", 0x031E}, -{"downtackmod", 0x02D5}, -{"dparen", 0x249F}, -{"dsuperior", 0xF6EB}, -{"dtail", 0x0256}, -{"dtopbar", 0x018C}, -{"duhiragana", 0x3065}, -{"dukatakana", 0x30C5}, -{"dz", 0x01F3}, -{"dzaltone", 0x02A3}, -{"dzcaron", 0x01C6}, -{"dzcurl", 0x02A5}, -{"dzeabkhasiancyrillic", 0x04E1}, -{"dzecyrillic", 0x0455}, -{"dzhecyrillic", 0x045F}, -{"e", 0x0065}, -{"eacute", 0x00E9}, -{"earth", 0x2641}, -{"ebengali", 0x098F}, -{"ebopomofo", 0x311C}, -{"ebreve", 0x0115}, -{"ecandradeva", 0x090D}, -{"ecandragujarati", 0x0A8D}, -{"ecandravowelsigndeva", 0x0945}, -{"ecandravowelsigngujarati", 0x0AC5}, -{"ecaron", 0x011B}, -{"ecedillabreve", 0x1E1D}, -{"echarmenian", 0x0565}, -{"echyiwnarmenian", 0x0587}, -{"ecircle", 0x24D4}, -{"ecircumflex", 0x00EA}, -{"ecircumflexacute", 0x1EBF}, -{"ecircumflexbelow", 0x1E19}, -{"ecircumflexdotbelow", 0x1EC7}, -{"ecircumflexgrave", 0x1EC1}, -{"ecircumflexhookabove", 0x1EC3}, -{"ecircumflextilde", 0x1EC5}, -{"ecyrillic", 0x0454}, -{"edblgrave", 0x0205}, -{"edeva", 0x090F}, -{"edieresis", 0x00EB}, -{"edot", 0x0117}, -{"edotaccent", 0x0117}, -{"edotbelow", 0x1EB9}, -{"eegurmukhi", 0x0A0F}, -{"eematragurmukhi", 0x0A47}, -{"efcyrillic", 0x0444}, -{"egrave", 0x00E8}, -{"egujarati", 0x0A8F}, -{"eharmenian", 0x0567}, -{"ehbopomofo", 0x311D}, -{"ehiragana", 0x3048}, -{"ehookabove", 0x1EBB}, -{"eibopomofo", 0x311F}, -{"eight", 0x0038}, -{"eightarabic", 0x0668}, -{"eightbengali", 0x09EE}, -{"eightcircle", 0x2467}, -{"eightcircleinversesansserif", 0x2791}, -{"eightdeva", 0x096E}, -{"eighteencircle", 0x2471}, -{"eighteenparen", 0x2485}, -{"eighteenperiod", 0x2499}, -{"eightgujarati", 0x0AEE}, -{"eightgurmukhi", 0x0A6E}, -{"eighthackarabic", 0x0668}, -{"eighthangzhou", 0x3028}, -{"eighthnotebeamed", 0x266B}, -{"eightideographicparen", 0x3227}, -{"eightinferior", 0x2088}, -{"eightmonospace", 0xFF18}, -{"eightoldstyle", 0xF738}, -{"eightparen", 0x247B}, -{"eightperiod", 0x248F}, -{"eightpersian", 0x06F8}, -{"eightroman", 0x2177}, -{"eightsuperior", 0x2078}, -{"eightthai", 0x0E58}, -{"einvertedbreve", 0x0207}, -{"eiotifiedcyrillic", 0x0465}, -{"ekatakana", 0x30A8}, -{"ekatakanahalfwidth", 0xFF74}, -{"ekonkargurmukhi", 0x0A74}, -{"ekorean", 0x3154}, -{"elcyrillic", 0x043B}, -{"element", 0x2208}, -{"elevencircle", 0x246A}, -{"elevenparen", 0x247E}, -{"elevenperiod", 0x2492}, -{"elevenroman", 0x217A}, -{"ellipsis", 0x2026}, -{"ellipsisvertical", 0x22EE}, -{"emacron", 0x0113}, -{"emacronacute", 0x1E17}, -{"emacrongrave", 0x1E15}, -{"emcyrillic", 0x043C}, -{"emdash", 0x2014}, -{"emdashvertical", 0xFE31}, -{"emonospace", 0xFF45}, -{"emphasismarkarmenian", 0x055B}, -{"emptyset", 0x2205}, -{"enbopomofo", 0x3123}, -{"encyrillic", 0x043D}, -{"endash", 0x2013}, -{"endashvertical", 0xFE32}, -{"endescendercyrillic", 0x04A3}, -{"eng", 0x014B}, -{"engbopomofo", 0x3125}, -{"enghecyrillic", 0x04A5}, -{"enhookcyrillic", 0x04C8}, -{"enspace", 0x2002}, -{"eogonek", 0x0119}, -{"eokorean", 0x3153}, -{"eopen", 0x025B}, -{"eopenclosed", 0x029A}, -{"eopenreversed", 0x025C}, -{"eopenreversedclosed", 0x025E}, -{"eopenreversedhook", 0x025D}, -{"eparen", 0x24A0}, -{"epsilon", 0x03B5}, -{"epsilontonos", 0x03AD}, -{"equal", 0x003D}, -{"equalmonospace", 0xFF1D}, -{"equalsmall", 0xFE66}, -{"equalsuperior", 0x207C}, -{"equivalence", 0x2261}, -{"erbopomofo", 0x3126}, -{"ercyrillic", 0x0440}, -{"ereversed", 0x0258}, -{"ereversedcyrillic", 0x044D}, -{"escyrillic", 0x0441}, -{"esdescendercyrillic", 0x04AB}, -{"esh", 0x0283}, -{"eshcurl", 0x0286}, -{"eshortdeva", 0x090E}, -{"eshortvowelsigndeva", 0x0946}, -{"eshreversedloop", 0x01AA}, -{"eshsquatreversed", 0x0285}, -{"esmallhiragana", 0x3047}, -{"esmallkatakana", 0x30A7}, -{"esmallkatakanahalfwidth", 0xFF6A}, -{"estimated", 0x212E}, -{"esuperior", 0xF6EC}, -{"eta", 0x03B7}, -{"etarmenian", 0x0568}, -{"etatonos", 0x03AE}, -{"eth", 0x00F0}, -{"etilde", 0x1EBD}, -{"etildebelow", 0x1E1B}, -{"etnahtafoukhhebrew", 0x0591}, -{"etnahtafoukhlefthebrew", 0x0591}, -{"etnahtahebrew", 0x0591}, -{"etnahtalefthebrew", 0x0591}, -{"eturned", 0x01DD}, -{"eukorean", 0x3161}, -{"euro", 0x20AC}, -{"evowelsignbengali", 0x09C7}, -{"evowelsigndeva", 0x0947}, -{"evowelsigngujarati", 0x0AC7}, -{"exclam", 0x0021}, -{"exclamarmenian", 0x055C}, -{"exclamdbl", 0x203C}, -{"exclamdown", 0x00A1}, -{"exclamdownsmall", 0xF7A1}, -{"exclammonospace", 0xFF01}, -{"exclamsmall", 0xF721}, -{"existential", 0x2203}, -{"ezh", 0x0292}, -{"ezhcaron", 0x01EF}, -{"ezhcurl", 0x0293}, -{"ezhreversed", 0x01B9}, -{"ezhtail", 0x01BA}, -{"f", 0x0066}, -{"fadeva", 0x095E}, -{"fagurmukhi", 0x0A5E}, -{"fahrenheit", 0x2109}, -{"fathaarabic", 0x064E}, -{"fathalowarabic", 0x064E}, -{"fathatanarabic", 0x064B}, -{"fbopomofo", 0x3108}, -{"fcircle", 0x24D5}, -{"fdotaccent", 0x1E1F}, -{"feharabic", 0x0641}, -{"feharmenian", 0x0586}, -{"fehfinalarabic", 0xFED2}, -{"fehinitialarabic", 0xFED3}, -{"fehmedialarabic", 0xFED4}, -{"feicoptic", 0x03E5}, -{"female", 0x2640}, -{"ff", 0xFB00}, -{"ffi", 0xFB03}, -{"ffl", 0xFB04}, -{"fi", 0xFB01}, -{"fifteencircle", 0x246E}, -{"fifteenparen", 0x2482}, -{"fifteenperiod", 0x2496}, -{"figuredash", 0x2012}, -{"filledbox", 0x25A0}, -{"filledrect", 0x25AC}, -{"finalkaf", 0x05DA}, -{"finalkafdagesh", 0xFB3A}, -{"finalkafdageshhebrew", 0xFB3A}, -{"finalkafhebrew", 0x05DA}, -{"finalmem", 0x05DD}, -{"finalmemhebrew", 0x05DD}, -{"finalnun", 0x05DF}, -{"finalnunhebrew", 0x05DF}, -{"finalpe", 0x05E3}, -{"finalpehebrew", 0x05E3}, -{"finaltsadi", 0x05E5}, -{"finaltsadihebrew", 0x05E5}, -{"firsttonechinese", 0x02C9}, -{"fisheye", 0x25C9}, -{"fitacyrillic", 0x0473}, -{"five", 0x0035}, -{"fivearabic", 0x0665}, -{"fivebengali", 0x09EB}, -{"fivecircle", 0x2464}, -{"fivecircleinversesansserif", 0x278E}, -{"fivedeva", 0x096B}, -{"fiveeighths", 0x215D}, -{"fivegujarati", 0x0AEB}, -{"fivegurmukhi", 0x0A6B}, -{"fivehackarabic", 0x0665}, -{"fivehangzhou", 0x3025}, -{"fiveideographicparen", 0x3224}, -{"fiveinferior", 0x2085}, -{"fivemonospace", 0xFF15}, -{"fiveoldstyle", 0xF735}, -{"fiveparen", 0x2478}, -{"fiveperiod", 0x248C}, -{"fivepersian", 0x06F5}, -{"fiveroman", 0x2174}, -{"fivesuperior", 0x2075}, -{"fivethai", 0x0E55}, -{"fl", 0xFB02}, -{"florin", 0x0192}, -{"fmonospace", 0xFF46}, -{"fmsquare", 0x3399}, -{"fofanthai", 0x0E1F}, -{"fofathai", 0x0E1D}, -{"fongmanthai", 0x0E4F}, -{"forall", 0x2200}, -{"four", 0x0034}, -{"fourarabic", 0x0664}, -{"fourbengali", 0x09EA}, -{"fourcircle", 0x2463}, -{"fourcircleinversesansserif", 0x278D}, -{"fourdeva", 0x096A}, -{"fourgujarati", 0x0AEA}, -{"fourgurmukhi", 0x0A6A}, -{"fourhackarabic", 0x0664}, -{"fourhangzhou", 0x3024}, -{"fourideographicparen", 0x3223}, -{"fourinferior", 0x2084}, -{"fourmonospace", 0xFF14}, -{"fournumeratorbengali", 0x09F7}, -{"fouroldstyle", 0xF734}, -{"fourparen", 0x2477}, -{"fourperiod", 0x248B}, -{"fourpersian", 0x06F4}, -{"fourroman", 0x2173}, -{"foursuperior", 0x2074}, -{"fourteencircle", 0x246D}, -{"fourteenparen", 0x2481}, -{"fourteenperiod", 0x2495}, -{"fourthai", 0x0E54}, -{"fourthtonechinese", 0x02CB}, -{"fparen", 0x24A1}, -{"fraction", 0x2044}, -{"franc", 0x20A3}, -{"g", 0x0067}, -{"gabengali", 0x0997}, -{"gacute", 0x01F5}, -{"gadeva", 0x0917}, -{"gafarabic", 0x06AF}, -{"gaffinalarabic", 0xFB93}, -{"gafinitialarabic", 0xFB94}, -{"gafmedialarabic", 0xFB95}, -{"gagujarati", 0x0A97}, -{"gagurmukhi", 0x0A17}, -{"gahiragana", 0x304C}, -{"gakatakana", 0x30AC}, -{"gamma", 0x03B3}, -{"gammalatinsmall", 0x0263}, -{"gammasuperior", 0x02E0}, -{"gangiacoptic", 0x03EB}, -{"gbopomofo", 0x310D}, -{"gbreve", 0x011F}, -{"gcaron", 0x01E7}, -{"gcedilla", 0x0123}, -{"gcircle", 0x24D6}, -{"gcircumflex", 0x011D}, -{"gcommaaccent", 0x0123}, -{"gdot", 0x0121}, -{"gdotaccent", 0x0121}, -{"gecyrillic", 0x0433}, -{"gehiragana", 0x3052}, -{"gekatakana", 0x30B2}, -{"geometricallyequal", 0x2251}, -{"gereshaccenthebrew", 0x059C}, -{"gereshhebrew", 0x05F3}, -{"gereshmuqdamhebrew", 0x059D}, -{"germandbls", 0x00DF}, -{"gershayimaccenthebrew", 0x059E}, -{"gershayimhebrew", 0x05F4}, -{"getamark", 0x3013}, -{"ghabengali", 0x0998}, -{"ghadarmenian", 0x0572}, -{"ghadeva", 0x0918}, -{"ghagujarati", 0x0A98}, -{"ghagurmukhi", 0x0A18}, -{"ghainarabic", 0x063A}, -{"ghainfinalarabic", 0xFECE}, -{"ghaininitialarabic", 0xFECF}, -{"ghainmedialarabic", 0xFED0}, -{"ghemiddlehookcyrillic", 0x0495}, -{"ghestrokecyrillic", 0x0493}, -{"gheupturncyrillic", 0x0491}, -{"ghhadeva", 0x095A}, -{"ghhagurmukhi", 0x0A5A}, -{"ghook", 0x0260}, -{"ghzsquare", 0x3393}, -{"gihiragana", 0x304E}, -{"gikatakana", 0x30AE}, -{"gimarmenian", 0x0563}, -{"gimel", 0x05D2}, -{"gimeldagesh", 0xFB32}, -{"gimeldageshhebrew", 0xFB32}, -{"gimelhebrew", 0x05D2}, -{"gjecyrillic", 0x0453}, -{"glottalinvertedstroke", 0x01BE}, -{"glottalstop", 0x0294}, -{"glottalstopinverted", 0x0296}, -{"glottalstopmod", 0x02C0}, -{"glottalstopreversed", 0x0295}, -{"glottalstopreversedmod", 0x02C1}, -{"glottalstopreversedsuperior", 0x02E4}, -{"glottalstopstroke", 0x02A1}, -{"glottalstopstrokereversed", 0x02A2}, -{"gmacron", 0x1E21}, -{"gmonospace", 0xFF47}, -{"gohiragana", 0x3054}, -{"gokatakana", 0x30B4}, -{"gparen", 0x24A2}, -{"gpasquare", 0x33AC}, -{"gradient", 0x2207}, -{"grave", 0x0060}, -{"gravebelowcmb", 0x0316}, -{"gravecmb", 0x0300}, -{"gravecomb", 0x0300}, -{"gravedeva", 0x0953}, -{"gravelowmod", 0x02CE}, -{"gravemonospace", 0xFF40}, -{"gravetonecmb", 0x0340}, -{"greater", 0x003E}, -{"greaterequal", 0x2265}, -{"greaterequalorless", 0x22DB}, -{"greatermonospace", 0xFF1E}, -{"greaterorequivalent", 0x2273}, -{"greaterorless", 0x2277}, -{"greateroverequal", 0x2267}, -{"greatersmall", 0xFE65}, -{"gscript", 0x0261}, -{"gstroke", 0x01E5}, -{"guhiragana", 0x3050}, -{"guillemotleft", 0x00AB}, -{"guillemotright", 0x00BB}, -{"guilsinglleft", 0x2039}, -{"guilsinglright", 0x203A}, -{"gukatakana", 0x30B0}, -{"guramusquare", 0x3318}, -{"gysquare", 0x33C9}, -{"h", 0x0068}, -{"haabkhasiancyrillic", 0x04A9}, -{"haaltonearabic", 0x06C1}, -{"habengali", 0x09B9}, -{"hadescendercyrillic", 0x04B3}, -{"hadeva", 0x0939}, -{"hagujarati", 0x0AB9}, -{"hagurmukhi", 0x0A39}, -{"haharabic", 0x062D}, -{"hahfinalarabic", 0xFEA2}, -{"hahinitialarabic", 0xFEA3}, -{"hahiragana", 0x306F}, -{"hahmedialarabic", 0xFEA4}, -{"haitusquare", 0x332A}, -{"hakatakana", 0x30CF}, -{"hakatakanahalfwidth", 0xFF8A}, -{"halantgurmukhi", 0x0A4D}, -{"hamzaarabic", 0x0621}, -{"hamzalowarabic", 0x0621}, -{"hangulfiller", 0x3164}, -{"hardsigncyrillic", 0x044A}, -{"harpoonleftbarbup", 0x21BC}, -{"harpoonrightbarbup", 0x21C0}, -{"hasquare", 0x33CA}, -{"hatafpatah", 0x05B2}, -{"hatafpatah16", 0x05B2}, -{"hatafpatah23", 0x05B2}, -{"hatafpatah2f", 0x05B2}, -{"hatafpatahhebrew", 0x05B2}, -{"hatafpatahnarrowhebrew", 0x05B2}, -{"hatafpatahquarterhebrew", 0x05B2}, -{"hatafpatahwidehebrew", 0x05B2}, -{"hatafqamats", 0x05B3}, -{"hatafqamats1b", 0x05B3}, -{"hatafqamats28", 0x05B3}, -{"hatafqamats34", 0x05B3}, -{"hatafqamatshebrew", 0x05B3}, -{"hatafqamatsnarrowhebrew", 0x05B3}, -{"hatafqamatsquarterhebrew", 0x05B3}, -{"hatafqamatswidehebrew", 0x05B3}, -{"hatafsegol", 0x05B1}, -{"hatafsegol17", 0x05B1}, -{"hatafsegol24", 0x05B1}, -{"hatafsegol30", 0x05B1}, -{"hatafsegolhebrew", 0x05B1}, -{"hatafsegolnarrowhebrew", 0x05B1}, -{"hatafsegolquarterhebrew", 0x05B1}, -{"hatafsegolwidehebrew", 0x05B1}, -{"hbar", 0x0127}, -{"hbopomofo", 0x310F}, -{"hbrevebelow", 0x1E2B}, -{"hcedilla", 0x1E29}, -{"hcircle", 0x24D7}, -{"hcircumflex", 0x0125}, -{"hdieresis", 0x1E27}, -{"hdotaccent", 0x1E23}, -{"hdotbelow", 0x1E25}, -{"he", 0x05D4}, -{"heart", 0x2665}, -{"heartsuitblack", 0x2665}, -{"heartsuitwhite", 0x2661}, -{"hedagesh", 0xFB34}, -{"hedageshhebrew", 0xFB34}, -{"hehaltonearabic", 0x06C1}, -{"heharabic", 0x0647}, -{"hehebrew", 0x05D4}, -{"hehfinalaltonearabic", 0xFBA7}, -{"hehfinalalttwoarabic", 0xFEEA}, -{"hehfinalarabic", 0xFEEA}, -{"hehhamzaabovefinalarabic", 0xFBA5}, -{"hehhamzaaboveisolatedarabic", 0xFBA4}, -{"hehinitialaltonearabic", 0xFBA8}, -{"hehinitialarabic", 0xFEEB}, -{"hehiragana", 0x3078}, -{"hehmedialaltonearabic", 0xFBA9}, -{"hehmedialarabic", 0xFEEC}, -{"heiseierasquare", 0x337B}, -{"hekatakana", 0x30D8}, -{"hekatakanahalfwidth", 0xFF8D}, -{"hekutaarusquare", 0x3336}, -{"henghook", 0x0267}, -{"herutusquare", 0x3339}, -{"het", 0x05D7}, -{"hethebrew", 0x05D7}, -{"hhook", 0x0266}, -{"hhooksuperior", 0x02B1}, -{"hieuhacirclekorean", 0x327B}, -{"hieuhaparenkorean", 0x321B}, -{"hieuhcirclekorean", 0x326D}, -{"hieuhkorean", 0x314E}, -{"hieuhparenkorean", 0x320D}, -{"hihiragana", 0x3072}, -{"hikatakana", 0x30D2}, -{"hikatakanahalfwidth", 0xFF8B}, -{"hiriq", 0x05B4}, -{"hiriq14", 0x05B4}, -{"hiriq21", 0x05B4}, -{"hiriq2d", 0x05B4}, -{"hiriqhebrew", 0x05B4}, -{"hiriqnarrowhebrew", 0x05B4}, -{"hiriqquarterhebrew", 0x05B4}, -{"hiriqwidehebrew", 0x05B4}, -{"hlinebelow", 0x1E96}, -{"hmonospace", 0xFF48}, -{"hoarmenian", 0x0570}, -{"hohipthai", 0x0E2B}, -{"hohiragana", 0x307B}, -{"hokatakana", 0x30DB}, -{"hokatakanahalfwidth", 0xFF8E}, -{"holam", 0x05B9}, -{"holam19", 0x05B9}, -{"holam26", 0x05B9}, -{"holam32", 0x05B9}, -{"holamhebrew", 0x05B9}, -{"holamnarrowhebrew", 0x05B9}, -{"holamquarterhebrew", 0x05B9}, -{"holamwidehebrew", 0x05B9}, -{"honokhukthai", 0x0E2E}, -{"hookabovecomb", 0x0309}, -{"hookcmb", 0x0309}, -{"hookpalatalizedbelowcmb", 0x0321}, -{"hookretroflexbelowcmb", 0x0322}, -{"hoonsquare", 0x3342}, -{"horicoptic", 0x03E9}, -{"horizontalbar", 0x2015}, -{"horncmb", 0x031B}, -{"hotsprings", 0x2668}, -{"house", 0x2302}, -{"hparen", 0x24A3}, -{"hsuperior", 0x02B0}, -{"hturned", 0x0265}, -{"huhiragana", 0x3075}, -{"huiitosquare", 0x3333}, -{"hukatakana", 0x30D5}, -{"hukatakanahalfwidth", 0xFF8C}, -{"hungarumlaut", 0x02DD}, -{"hungarumlautcmb", 0x030B}, -{"hv", 0x0195}, -{"hyphen", 0x002D}, -{"hypheninferior", 0xF6E5}, -{"hyphenmonospace", 0xFF0D}, -{"hyphensmall", 0xFE63}, -{"hyphensuperior", 0xF6E6}, -{"hyphentwo", 0x2010}, -{"i", 0x0069}, -{"iacute", 0x00ED}, -{"iacyrillic", 0x044F}, -{"ibengali", 0x0987}, -{"ibopomofo", 0x3127}, -{"ibreve", 0x012D}, -{"icaron", 0x01D0}, -{"icircle", 0x24D8}, -{"icircumflex", 0x00EE}, -{"icyrillic", 0x0456}, -{"idblgrave", 0x0209}, -{"ideographearthcircle", 0x328F}, -{"ideographfirecircle", 0x328B}, -{"ideographicallianceparen", 0x323F}, -{"ideographiccallparen", 0x323A}, -{"ideographiccentrecircle", 0x32A5}, -{"ideographicclose", 0x3006}, -{"ideographiccomma", 0x3001}, -{"ideographiccommaleft", 0xFF64}, -{"ideographiccongratulationparen", 0x3237}, -{"ideographiccorrectcircle", 0x32A3}, -{"ideographicearthparen", 0x322F}, -{"ideographicenterpriseparen", 0x323D}, -{"ideographicexcellentcircle", 0x329D}, -{"ideographicfestivalparen", 0x3240}, -{"ideographicfinancialcircle", 0x3296}, -{"ideographicfinancialparen", 0x3236}, -{"ideographicfireparen", 0x322B}, -{"ideographichaveparen", 0x3232}, -{"ideographichighcircle", 0x32A4}, -{"ideographiciterationmark", 0x3005}, -{"ideographiclaborcircle", 0x3298}, -{"ideographiclaborparen", 0x3238}, -{"ideographicleftcircle", 0x32A7}, -{"ideographiclowcircle", 0x32A6}, -{"ideographicmedicinecircle", 0x32A9}, -{"ideographicmetalparen", 0x322E}, -{"ideographicmoonparen", 0x322A}, -{"ideographicnameparen", 0x3234}, -{"ideographicperiod", 0x3002}, -{"ideographicprintcircle", 0x329E}, -{"ideographicreachparen", 0x3243}, -{"ideographicrepresentparen", 0x3239}, -{"ideographicresourceparen", 0x323E}, -{"ideographicrightcircle", 0x32A8}, -{"ideographicsecretcircle", 0x3299}, -{"ideographicselfparen", 0x3242}, -{"ideographicsocietyparen", 0x3233}, -{"ideographicspace", 0x3000}, -{"ideographicspecialparen", 0x3235}, -{"ideographicstockparen", 0x3231}, -{"ideographicstudyparen", 0x323B}, -{"ideographicsunparen", 0x3230}, -{"ideographicsuperviseparen", 0x323C}, -{"ideographicwaterparen", 0x322C}, -{"ideographicwoodparen", 0x322D}, -{"ideographiczero", 0x3007}, -{"ideographmetalcircle", 0x328E}, -{"ideographmooncircle", 0x328A}, -{"ideographnamecircle", 0x3294}, -{"ideographsuncircle", 0x3290}, -{"ideographwatercircle", 0x328C}, -{"ideographwoodcircle", 0x328D}, -{"ideva", 0x0907}, -{"idieresis", 0x00EF}, -{"idieresisacute", 0x1E2F}, -{"idieresiscyrillic", 0x04E5}, -{"idotbelow", 0x1ECB}, -{"iebrevecyrillic", 0x04D7}, -{"iecyrillic", 0x0435}, -{"ieungacirclekorean", 0x3275}, -{"ieungaparenkorean", 0x3215}, -{"ieungcirclekorean", 0x3267}, -{"ieungkorean", 0x3147}, -{"ieungparenkorean", 0x3207}, -{"igrave", 0x00EC}, -{"igujarati", 0x0A87}, -{"igurmukhi", 0x0A07}, -{"ihiragana", 0x3044}, -{"ihookabove", 0x1EC9}, -{"iibengali", 0x0988}, -{"iicyrillic", 0x0438}, -{"iideva", 0x0908}, -{"iigujarati", 0x0A88}, -{"iigurmukhi", 0x0A08}, -{"iimatragurmukhi", 0x0A40}, -{"iinvertedbreve", 0x020B}, -{"iishortcyrillic", 0x0439}, -{"iivowelsignbengali", 0x09C0}, -{"iivowelsigndeva", 0x0940}, -{"iivowelsigngujarati", 0x0AC0}, -{"ij", 0x0133}, -{"ikatakana", 0x30A4}, -{"ikatakanahalfwidth", 0xFF72}, -{"ikorean", 0x3163}, -{"ilde", 0x02DC}, -{"iluyhebrew", 0x05AC}, -{"imacron", 0x012B}, -{"imacroncyrillic", 0x04E3}, -{"imageorapproximatelyequal", 0x2253}, -{"imatragurmukhi", 0x0A3F}, -{"imonospace", 0xFF49}, -{"increment", 0x2206}, -{"infinity", 0x221E}, -{"iniarmenian", 0x056B}, -{"integral", 0x222B}, -{"integralbottom", 0x2321}, -{"integralbt", 0x2321}, -{"integralex", 0xF8F5}, -{"integraltop", 0x2320}, -{"integraltp", 0x2320}, -{"intersection", 0x2229}, -{"intisquare", 0x3305}, -{"invbullet", 0x25D8}, -{"invcircle", 0x25D9}, -{"invsmileface", 0x263B}, -{"iocyrillic", 0x0451}, -{"iogonek", 0x012F}, -{"iota", 0x03B9}, -{"iotadieresis", 0x03CA}, -{"iotadieresistonos", 0x0390}, -{"iotalatin", 0x0269}, -{"iotatonos", 0x03AF}, -{"iparen", 0x24A4}, -{"irigurmukhi", 0x0A72}, -{"ismallhiragana", 0x3043}, -{"ismallkatakana", 0x30A3}, -{"ismallkatakanahalfwidth", 0xFF68}, -{"issharbengali", 0x09FA}, -{"istroke", 0x0268}, -{"isuperior", 0xF6ED}, -{"iterationhiragana", 0x309D}, -{"iterationkatakana", 0x30FD}, -{"itilde", 0x0129}, -{"itildebelow", 0x1E2D}, -{"iubopomofo", 0x3129}, -{"iucyrillic", 0x044E}, -{"ivowelsignbengali", 0x09BF}, -{"ivowelsigndeva", 0x093F}, -{"ivowelsigngujarati", 0x0ABF}, -{"izhitsacyrillic", 0x0475}, -{"izhitsadblgravecyrillic", 0x0477}, -{"j", 0x006A}, -{"jaarmenian", 0x0571}, -{"jabengali", 0x099C}, -{"jadeva", 0x091C}, -{"jagujarati", 0x0A9C}, -{"jagurmukhi", 0x0A1C}, -{"jbopomofo", 0x3110}, -{"jcaron", 0x01F0}, -{"jcircle", 0x24D9}, -{"jcircumflex", 0x0135}, -{"jcrossedtail", 0x029D}, -{"jdotlessstroke", 0x025F}, -{"jecyrillic", 0x0458}, -{"jeemarabic", 0x062C}, -{"jeemfinalarabic", 0xFE9E}, -{"jeeminitialarabic", 0xFE9F}, -{"jeemmedialarabic", 0xFEA0}, -{"jeharabic", 0x0698}, -{"jehfinalarabic", 0xFB8B}, -{"jhabengali", 0x099D}, -{"jhadeva", 0x091D}, -{"jhagujarati", 0x0A9D}, -{"jhagurmukhi", 0x0A1D}, -{"jheharmenian", 0x057B}, -{"jis", 0x3004}, -{"jmonospace", 0xFF4A}, -{"jparen", 0x24A5}, -{"jsuperior", 0x02B2}, -{"k", 0x006B}, -{"kabashkircyrillic", 0x04A1}, -{"kabengali", 0x0995}, -{"kacute", 0x1E31}, -{"kacyrillic", 0x043A}, -{"kadescendercyrillic", 0x049B}, -{"kadeva", 0x0915}, -{"kaf", 0x05DB}, -{"kafarabic", 0x0643}, -{"kafdagesh", 0xFB3B}, -{"kafdageshhebrew", 0xFB3B}, -{"kaffinalarabic", 0xFEDA}, -{"kafhebrew", 0x05DB}, -{"kafinitialarabic", 0xFEDB}, -{"kafmedialarabic", 0xFEDC}, -{"kafrafehebrew", 0xFB4D}, -{"kagujarati", 0x0A95}, -{"kagurmukhi", 0x0A15}, -{"kahiragana", 0x304B}, -{"kahookcyrillic", 0x04C4}, -{"kakatakana", 0x30AB}, -{"kakatakanahalfwidth", 0xFF76}, -{"kappa", 0x03BA}, -{"kappasymbolgreek", 0x03F0}, -{"kapyeounmieumkorean", 0x3171}, -{"kapyeounphieuphkorean", 0x3184}, -{"kapyeounpieupkorean", 0x3178}, -{"kapyeounssangpieupkorean", 0x3179}, -{"karoriisquare", 0x330D}, -{"kashidaautoarabic", 0x0640}, -{"kashidaautonosidebearingarabic", 0x0640}, -{"kasmallkatakana", 0x30F5}, -{"kasquare", 0x3384}, -{"kasraarabic", 0x0650}, -{"kasratanarabic", 0x064D}, -{"kastrokecyrillic", 0x049F}, -{"katahiraprolongmarkhalfwidth", 0xFF70}, -{"kaverticalstrokecyrillic", 0x049D}, -{"kbopomofo", 0x310E}, -{"kcalsquare", 0x3389}, -{"kcaron", 0x01E9}, -{"kcedilla", 0x0137}, -{"kcircle", 0x24DA}, -{"kcommaaccent", 0x0137}, -{"kdotbelow", 0x1E33}, -{"keharmenian", 0x0584}, -{"kehiragana", 0x3051}, -{"kekatakana", 0x30B1}, -{"kekatakanahalfwidth", 0xFF79}, -{"kenarmenian", 0x056F}, -{"kesmallkatakana", 0x30F6}, -{"kgreenlandic", 0x0138}, -{"khabengali", 0x0996}, -{"khacyrillic", 0x0445}, -{"khadeva", 0x0916}, -{"khagujarati", 0x0A96}, -{"khagurmukhi", 0x0A16}, -{"khaharabic", 0x062E}, -{"khahfinalarabic", 0xFEA6}, -{"khahinitialarabic", 0xFEA7}, -{"khahmedialarabic", 0xFEA8}, -{"kheicoptic", 0x03E7}, -{"khhadeva", 0x0959}, -{"khhagurmukhi", 0x0A59}, -{"khieukhacirclekorean", 0x3278}, -{"khieukhaparenkorean", 0x3218}, -{"khieukhcirclekorean", 0x326A}, -{"khieukhkorean", 0x314B}, -{"khieukhparenkorean", 0x320A}, -{"khokhaithai", 0x0E02}, -{"khokhonthai", 0x0E05}, -{"khokhuatthai", 0x0E03}, -{"khokhwaithai", 0x0E04}, -{"khomutthai", 0x0E5B}, -{"khook", 0x0199}, -{"khorakhangthai", 0x0E06}, -{"khzsquare", 0x3391}, -{"kihiragana", 0x304D}, -{"kikatakana", 0x30AD}, -{"kikatakanahalfwidth", 0xFF77}, -{"kiroguramusquare", 0x3315}, -{"kiromeetorusquare", 0x3316}, -{"kirosquare", 0x3314}, -{"kiyeokacirclekorean", 0x326E}, -{"kiyeokaparenkorean", 0x320E}, -{"kiyeokcirclekorean", 0x3260}, -{"kiyeokkorean", 0x3131}, -{"kiyeokparenkorean", 0x3200}, -{"kiyeoksioskorean", 0x3133}, -{"kjecyrillic", 0x045C}, -{"klinebelow", 0x1E35}, -{"klsquare", 0x3398}, -{"kmcubedsquare", 0x33A6}, -{"kmonospace", 0xFF4B}, -{"kmsquaredsquare", 0x33A2}, -{"kohiragana", 0x3053}, -{"kohmsquare", 0x33C0}, -{"kokaithai", 0x0E01}, -{"kokatakana", 0x30B3}, -{"kokatakanahalfwidth", 0xFF7A}, -{"kooposquare", 0x331E}, -{"koppacyrillic", 0x0481}, -{"koreanstandardsymbol", 0x327F}, -{"koroniscmb", 0x0343}, -{"kparen", 0x24A6}, -{"kpasquare", 0x33AA}, -{"ksicyrillic", 0x046F}, -{"ktsquare", 0x33CF}, -{"kturned", 0x029E}, -{"kuhiragana", 0x304F}, -{"kukatakana", 0x30AF}, -{"kukatakanahalfwidth", 0xFF78}, -{"kvsquare", 0x33B8}, -{"kwsquare", 0x33BE}, -{"l", 0x006C}, -{"labengali", 0x09B2}, -{"lacute", 0x013A}, -{"ladeva", 0x0932}, -{"lagujarati", 0x0AB2}, -{"lagurmukhi", 0x0A32}, -{"lakkhangyaothai", 0x0E45}, -{"lamaleffinalarabic", 0xFEFC}, -{"lamalefhamzaabovefinalarabic", 0xFEF8}, -{"lamalefhamzaaboveisolatedarabic", 0xFEF7}, -{"lamalefhamzabelowfinalarabic", 0xFEFA}, -{"lamalefhamzabelowisolatedarabic", 0xFEF9}, -{"lamalefisolatedarabic", 0xFEFB}, -{"lamalefmaddaabovefinalarabic", 0xFEF6}, -{"lamalefmaddaaboveisolatedarabic", 0xFEF5}, -{"lamarabic", 0x0644}, -{"lambda", 0x03BB}, -{"lambdastroke", 0x019B}, -{"lamed", 0x05DC}, -{"lameddagesh", 0xFB3C}, -{"lameddageshhebrew", 0xFB3C}, -{"lamedhebrew", 0x05DC}, -{"lamfinalarabic", 0xFEDE}, -{"lamhahinitialarabic", 0xFCCA}, -{"laminitialarabic", 0xFEDF}, -{"lamjeeminitialarabic", 0xFCC9}, -{"lamkhahinitialarabic", 0xFCCB}, -{"lamlamhehisolatedarabic", 0xFDF2}, -{"lammedialarabic", 0xFEE0}, -{"lammeemhahinitialarabic", 0xFD88}, -{"lammeeminitialarabic", 0xFCCC}, -{"largecircle", 0x25EF}, -{"lbar", 0x019A}, -{"lbelt", 0x026C}, -{"lbopomofo", 0x310C}, -{"lcaron", 0x013E}, -{"lcedilla", 0x013C}, -{"lcircle", 0x24DB}, -{"lcircumflexbelow", 0x1E3D}, -{"lcommaaccent", 0x013C}, -{"ldot", 0x0140}, -{"ldotaccent", 0x0140}, -{"ldotbelow", 0x1E37}, -{"ldotbelowmacron", 0x1E39}, -{"leftangleabovecmb", 0x031A}, -{"lefttackbelowcmb", 0x0318}, -{"less", 0x003C}, -{"lessequal", 0x2264}, -{"lessequalorgreater", 0x22DA}, -{"lessmonospace", 0xFF1C}, -{"lessorequivalent", 0x2272}, -{"lessorgreater", 0x2276}, -{"lessoverequal", 0x2266}, -{"lesssmall", 0xFE64}, -{"lezh", 0x026E}, -{"lfblock", 0x258C}, -{"lhookretroflex", 0x026D}, -{"lira", 0x20A4}, -{"liwnarmenian", 0x056C}, -{"lj", 0x01C9}, -{"ljecyrillic", 0x0459}, -{"ll", 0xF6C0}, -{"lladeva", 0x0933}, -{"llagujarati", 0x0AB3}, -{"llinebelow", 0x1E3B}, -{"llladeva", 0x0934}, -{"llvocalicbengali", 0x09E1}, -{"llvocalicdeva", 0x0961}, -{"llvocalicvowelsignbengali", 0x09E3}, -{"llvocalicvowelsigndeva", 0x0963}, -{"lmiddletilde", 0x026B}, -{"lmonospace", 0xFF4C}, -{"lmsquare", 0x33D0}, -{"lochulathai", 0x0E2C}, -{"logicaland", 0x2227}, -{"logicalnot", 0x00AC}, -{"logicalnotreversed", 0x2310}, -{"logicalor", 0x2228}, -{"lolingthai", 0x0E25}, -{"longs", 0x017F}, -{"lowlinecenterline", 0xFE4E}, -{"lowlinecmb", 0x0332}, -{"lowlinedashed", 0xFE4D}, -{"lozenge", 0x25CA}, -{"lparen", 0x24A7}, -{"lslash", 0x0142}, -{"lsquare", 0x2113}, -{"lsuperior", 0xF6EE}, -{"ltshade", 0x2591}, -{"luthai", 0x0E26}, -{"lvocalicbengali", 0x098C}, -{"lvocalicdeva", 0x090C}, -{"lvocalicvowelsignbengali", 0x09E2}, -{"lvocalicvowelsigndeva", 0x0962}, -{"lxsquare", 0x33D3}, -{"m", 0x006D}, -{"mabengali", 0x09AE}, -{"macron", 0x00AF}, -{"macronbelowcmb", 0x0331}, -{"macroncmb", 0x0304}, -{"macronlowmod", 0x02CD}, -{"macronmonospace", 0xFFE3}, -{"macute", 0x1E3F}, -{"madeva", 0x092E}, -{"magujarati", 0x0AAE}, -{"magurmukhi", 0x0A2E}, -{"mahapakhhebrew", 0x05A4}, -{"mahapakhlefthebrew", 0x05A4}, -{"mahiragana", 0x307E}, -{"maichattawalowleftthai", 0xF895}, -{"maichattawalowrightthai", 0xF894}, -{"maichattawathai", 0x0E4B}, -{"maichattawaupperleftthai", 0xF893}, -{"maieklowleftthai", 0xF88C}, -{"maieklowrightthai", 0xF88B}, -{"maiekthai", 0x0E48}, -{"maiekupperleftthai", 0xF88A}, -{"maihanakatleftthai", 0xF884}, -{"maihanakatthai", 0x0E31}, -{"maitaikhuleftthai", 0xF889}, -{"maitaikhuthai", 0x0E47}, -{"maitholowleftthai", 0xF88F}, -{"maitholowrightthai", 0xF88E}, -{"maithothai", 0x0E49}, -{"maithoupperleftthai", 0xF88D}, -{"maitrilowleftthai", 0xF892}, -{"maitrilowrightthai", 0xF891}, -{"maitrithai", 0x0E4A}, -{"maitriupperleftthai", 0xF890}, -{"maiyamokthai", 0x0E46}, -{"makatakana", 0x30DE}, -{"makatakanahalfwidth", 0xFF8F}, -{"male", 0x2642}, -{"mansyonsquare", 0x3347}, -{"maqafhebrew", 0x05BE}, -{"mars", 0x2642}, -{"masoracirclehebrew", 0x05AF}, -{"masquare", 0x3383}, -{"mbopomofo", 0x3107}, -{"mbsquare", 0x33D4}, -{"mcircle", 0x24DC}, -{"mcubedsquare", 0x33A5}, -{"mdotaccent", 0x1E41}, -{"mdotbelow", 0x1E43}, -{"meemarabic", 0x0645}, -{"meemfinalarabic", 0xFEE2}, -{"meeminitialarabic", 0xFEE3}, -{"meemmedialarabic", 0xFEE4}, -{"meemmeeminitialarabic", 0xFCD1}, -{"meemmeemisolatedarabic", 0xFC48}, -{"meetorusquare", 0x334D}, -{"mehiragana", 0x3081}, -{"meizierasquare", 0x337E}, -{"mekatakana", 0x30E1}, -{"mekatakanahalfwidth", 0xFF92}, -{"mem", 0x05DE}, -{"memdagesh", 0xFB3E}, -{"memdageshhebrew", 0xFB3E}, -{"memhebrew", 0x05DE}, -{"menarmenian", 0x0574}, -{"merkhahebrew", 0x05A5}, -{"merkhakefulahebrew", 0x05A6}, -{"merkhakefulalefthebrew", 0x05A6}, -{"merkhalefthebrew", 0x05A5}, -{"mhook", 0x0271}, -{"mhzsquare", 0x3392}, -{"middledotkatakanahalfwidth", 0xFF65}, -{"middot", 0x00B7}, -{"mieumacirclekorean", 0x3272}, -{"mieumaparenkorean", 0x3212}, -{"mieumcirclekorean", 0x3264}, -{"mieumkorean", 0x3141}, -{"mieumpansioskorean", 0x3170}, -{"mieumparenkorean", 0x3204}, -{"mieumpieupkorean", 0x316E}, -{"mieumsioskorean", 0x316F}, -{"mihiragana", 0x307F}, -{"mikatakana", 0x30DF}, -{"mikatakanahalfwidth", 0xFF90}, -{"minus", 0x2212}, -{"minusbelowcmb", 0x0320}, -{"minuscircle", 0x2296}, -{"minusmod", 0x02D7}, -{"minusplus", 0x2213}, -{"minute", 0x2032}, -{"miribaarusquare", 0x334A}, -{"mirisquare", 0x3349}, -{"mlonglegturned", 0x0270}, -{"mlsquare", 0x3396}, -{"mmcubedsquare", 0x33A3}, -{"mmonospace", 0xFF4D}, -{"mmsquaredsquare", 0x339F}, -{"mohiragana", 0x3082}, -{"mohmsquare", 0x33C1}, -{"mokatakana", 0x30E2}, -{"mokatakanahalfwidth", 0xFF93}, -{"molsquare", 0x33D6}, -{"momathai", 0x0E21}, -{"moverssquare", 0x33A7}, -{"moverssquaredsquare", 0x33A8}, -{"mparen", 0x24A8}, -{"mpasquare", 0x33AB}, -{"mssquare", 0x33B3}, -{"msuperior", 0xF6EF}, -{"mturned", 0x026F}, -{"mu", 0x00B5}, -{"mu1", 0x00B5}, -{"muasquare", 0x3382}, -{"muchgreater", 0x226B}, -{"muchless", 0x226A}, -{"mufsquare", 0x338C}, -{"mugreek", 0x03BC}, -{"mugsquare", 0x338D}, -{"muhiragana", 0x3080}, -{"mukatakana", 0x30E0}, -{"mukatakanahalfwidth", 0xFF91}, -{"mulsquare", 0x3395}, -{"multiply", 0x00D7}, -{"mumsquare", 0x339B}, -{"munahhebrew", 0x05A3}, -{"munahlefthebrew", 0x05A3}, -{"musicalnote", 0x266A}, -{"musicalnotedbl", 0x266B}, -{"musicflatsign", 0x266D}, -{"musicsharpsign", 0x266F}, -{"mussquare", 0x33B2}, -{"muvsquare", 0x33B6}, -{"muwsquare", 0x33BC}, -{"mvmegasquare", 0x33B9}, -{"mvsquare", 0x33B7}, -{"mwmegasquare", 0x33BF}, -{"mwsquare", 0x33BD}, -{"n", 0x006E}, -{"nabengali", 0x09A8}, -{"nabla", 0x2207}, -{"nacute", 0x0144}, -{"nadeva", 0x0928}, -{"nagujarati", 0x0AA8}, -{"nagurmukhi", 0x0A28}, -{"nahiragana", 0x306A}, -{"nakatakana", 0x30CA}, -{"nakatakanahalfwidth", 0xFF85}, -{"napostrophe", 0x0149}, -{"nasquare", 0x3381}, -{"nbopomofo", 0x310B}, -{"nbspace", 0x00A0}, -{"ncaron", 0x0148}, -{"ncedilla", 0x0146}, -{"ncircle", 0x24DD}, -{"ncircumflexbelow", 0x1E4B}, -{"ncommaaccent", 0x0146}, -{"ndotaccent", 0x1E45}, -{"ndotbelow", 0x1E47}, -{"nehiragana", 0x306D}, -{"nekatakana", 0x30CD}, -{"nekatakanahalfwidth", 0xFF88}, -{"newsheqelsign", 0x20AA}, -{"nfsquare", 0x338B}, -{"ngabengali", 0x0999}, -{"ngadeva", 0x0919}, -{"ngagujarati", 0x0A99}, -{"ngagurmukhi", 0x0A19}, -{"ngonguthai", 0x0E07}, -{"nhiragana", 0x3093}, -{"nhookleft", 0x0272}, -{"nhookretroflex", 0x0273}, -{"nieunacirclekorean", 0x326F}, -{"nieunaparenkorean", 0x320F}, -{"nieuncieuckorean", 0x3135}, -{"nieuncirclekorean", 0x3261}, -{"nieunhieuhkorean", 0x3136}, -{"nieunkorean", 0x3134}, -{"nieunpansioskorean", 0x3168}, -{"nieunparenkorean", 0x3201}, -{"nieunsioskorean", 0x3167}, -{"nieuntikeutkorean", 0x3166}, -{"nihiragana", 0x306B}, -{"nikatakana", 0x30CB}, -{"nikatakanahalfwidth", 0xFF86}, -{"nikhahitleftthai", 0xF899}, -{"nikhahitthai", 0x0E4D}, -{"nine", 0x0039}, -{"ninearabic", 0x0669}, -{"ninebengali", 0x09EF}, -{"ninecircle", 0x2468}, -{"ninecircleinversesansserif", 0x2792}, -{"ninedeva", 0x096F}, -{"ninegujarati", 0x0AEF}, -{"ninegurmukhi", 0x0A6F}, -{"ninehackarabic", 0x0669}, -{"ninehangzhou", 0x3029}, -{"nineideographicparen", 0x3228}, -{"nineinferior", 0x2089}, -{"ninemonospace", 0xFF19}, -{"nineoldstyle", 0xF739}, -{"nineparen", 0x247C}, -{"nineperiod", 0x2490}, -{"ninepersian", 0x06F9}, -{"nineroman", 0x2178}, -{"ninesuperior", 0x2079}, -{"nineteencircle", 0x2472}, -{"nineteenparen", 0x2486}, -{"nineteenperiod", 0x249A}, -{"ninethai", 0x0E59}, -{"nj", 0x01CC}, -{"njecyrillic", 0x045A}, -{"nkatakana", 0x30F3}, -{"nkatakanahalfwidth", 0xFF9D}, -{"nlegrightlong", 0x019E}, -{"nlinebelow", 0x1E49}, -{"nmonospace", 0xFF4E}, -{"nmsquare", 0x339A}, -{"nnabengali", 0x09A3}, -{"nnadeva", 0x0923}, -{"nnagujarati", 0x0AA3}, -{"nnagurmukhi", 0x0A23}, -{"nnnadeva", 0x0929}, -{"nohiragana", 0x306E}, -{"nokatakana", 0x30CE}, -{"nokatakanahalfwidth", 0xFF89}, -{"nonbreakingspace", 0x00A0}, -{"nonenthai", 0x0E13}, -{"nonuthai", 0x0E19}, -{"noonarabic", 0x0646}, -{"noonfinalarabic", 0xFEE6}, -{"noonghunnaarabic", 0x06BA}, -{"noonghunnafinalarabic", 0xFB9F}, -{"nooninitialarabic", 0xFEE7}, -{"noonjeeminitialarabic", 0xFCD2}, -{"noonjeemisolatedarabic", 0xFC4B}, -{"noonmedialarabic", 0xFEE8}, -{"noonmeeminitialarabic", 0xFCD5}, -{"noonmeemisolatedarabic", 0xFC4E}, -{"noonnoonfinalarabic", 0xFC8D}, -{"notcontains", 0x220C}, -{"notelement", 0x2209}, -{"notelementof", 0x2209}, -{"notequal", 0x2260}, -{"notgreater", 0x226F}, -{"notgreaternorequal", 0x2271}, -{"notgreaternorless", 0x2279}, -{"notidentical", 0x2262}, -{"notless", 0x226E}, -{"notlessnorequal", 0x2270}, -{"notparallel", 0x2226}, -{"notprecedes", 0x2280}, -{"notsubset", 0x2284}, -{"notsucceeds", 0x2281}, -{"notsuperset", 0x2285}, -{"nowarmenian", 0x0576}, -{"nparen", 0x24A9}, -{"nssquare", 0x33B1}, -{"nsuperior", 0x207F}, -{"ntilde", 0x00F1}, -{"nu", 0x03BD}, -{"nuhiragana", 0x306C}, -{"nukatakana", 0x30CC}, -{"nukatakanahalfwidth", 0xFF87}, -{"nuktabengali", 0x09BC}, -{"nuktadeva", 0x093C}, -{"nuktagujarati", 0x0ABC}, -{"nuktagurmukhi", 0x0A3C}, -{"numbersign", 0x0023}, -{"numbersignmonospace", 0xFF03}, -{"numbersignsmall", 0xFE5F}, -{"numeralsigngreek", 0x0374}, -{"numeralsignlowergreek", 0x0375}, -{"numero", 0x2116}, -{"nun", 0x05E0}, -{"nundagesh", 0xFB40}, -{"nundageshhebrew", 0xFB40}, -{"nunhebrew", 0x05E0}, -{"nvsquare", 0x33B5}, -{"nwsquare", 0x33BB}, -{"nyabengali", 0x099E}, -{"nyadeva", 0x091E}, -{"nyagujarati", 0x0A9E}, -{"nyagurmukhi", 0x0A1E}, -{"o", 0x006F}, -{"oacute", 0x00F3}, -{"oangthai", 0x0E2D}, -{"obarred", 0x0275}, -{"obarredcyrillic", 0x04E9}, -{"obarreddieresiscyrillic", 0x04EB}, -{"obengali", 0x0993}, -{"obopomofo", 0x311B}, -{"obreve", 0x014F}, -{"ocandradeva", 0x0911}, -{"ocandragujarati", 0x0A91}, -{"ocandravowelsigndeva", 0x0949}, -{"ocandravowelsigngujarati", 0x0AC9}, -{"ocaron", 0x01D2}, -{"ocircle", 0x24DE}, -{"ocircumflex", 0x00F4}, -{"ocircumflexacute", 0x1ED1}, -{"ocircumflexdotbelow", 0x1ED9}, -{"ocircumflexgrave", 0x1ED3}, -{"ocircumflexhookabove", 0x1ED5}, -{"ocircumflextilde", 0x1ED7}, -{"ocyrillic", 0x043E}, -{"odblacute", 0x0151}, -{"odblgrave", 0x020D}, -{"odeva", 0x0913}, -{"odieresis", 0x00F6}, -{"odieresiscyrillic", 0x04E7}, -{"odotbelow", 0x1ECD}, -{"oe", 0x0153}, -{"oekorean", 0x315A}, -{"ogonek", 0x02DB}, -{"ogonekcmb", 0x0328}, -{"ograve", 0x00F2}, -{"ogujarati", 0x0A93}, -{"oharmenian", 0x0585}, -{"ohiragana", 0x304A}, -{"ohookabove", 0x1ECF}, -{"ohorn", 0x01A1}, -{"ohornacute", 0x1EDB}, -{"ohorndotbelow", 0x1EE3}, -{"ohorngrave", 0x1EDD}, -{"ohornhookabove", 0x1EDF}, -{"ohorntilde", 0x1EE1}, -{"ohungarumlaut", 0x0151}, -{"oi", 0x01A3}, -{"oinvertedbreve", 0x020F}, -{"okatakana", 0x30AA}, -{"okatakanahalfwidth", 0xFF75}, -{"okorean", 0x3157}, -{"olehebrew", 0x05AB}, -{"omacron", 0x014D}, -{"omacronacute", 0x1E53}, -{"omacrongrave", 0x1E51}, -{"omdeva", 0x0950}, -{"omega", 0x03C9}, -{"omega1", 0x03D6}, -{"omegacyrillic", 0x0461}, -{"omegalatinclosed", 0x0277}, -{"omegaroundcyrillic", 0x047B}, -{"omegatitlocyrillic", 0x047D}, -{"omegatonos", 0x03CE}, -{"omgujarati", 0x0AD0}, -{"omicron", 0x03BF}, -{"omicrontonos", 0x03CC}, -{"omonospace", 0xFF4F}, -{"one", 0x0031}, -{"onearabic", 0x0661}, -{"onebengali", 0x09E7}, -{"onecircle", 0x2460}, -{"onecircleinversesansserif", 0x278A}, -{"onedeva", 0x0967}, -{"onedotenleader", 0x2024}, -{"oneeighth", 0x215B}, -{"onefitted", 0xF6DC}, -{"onegujarati", 0x0AE7}, -{"onegurmukhi", 0x0A67}, -{"onehackarabic", 0x0661}, -{"onehalf", 0x00BD}, -{"onehangzhou", 0x3021}, -{"oneideographicparen", 0x3220}, -{"oneinferior", 0x2081}, -{"onemonospace", 0xFF11}, -{"onenumeratorbengali", 0x09F4}, -{"oneoldstyle", 0xF731}, -{"oneparen", 0x2474}, -{"oneperiod", 0x2488}, -{"onepersian", 0x06F1}, -{"onequarter", 0x00BC}, -{"oneroman", 0x2170}, -{"onesuperior", 0x00B9}, -{"onethai", 0x0E51}, -{"onethird", 0x2153}, -{"oogonek", 0x01EB}, -{"oogonekmacron", 0x01ED}, -{"oogurmukhi", 0x0A13}, -{"oomatragurmukhi", 0x0A4B}, -{"oopen", 0x0254}, -{"oparen", 0x24AA}, -{"openbullet", 0x25E6}, -{"option", 0x2325}, -{"ordfeminine", 0x00AA}, -{"ordmasculine", 0x00BA}, -{"orthogonal", 0x221F}, -{"oshortdeva", 0x0912}, -{"oshortvowelsigndeva", 0x094A}, -{"oslash", 0x00F8}, -{"oslashacute", 0x01FF}, -{"osmallhiragana", 0x3049}, -{"osmallkatakana", 0x30A9}, -{"osmallkatakanahalfwidth", 0xFF6B}, -{"ostrokeacute", 0x01FF}, -{"osuperior", 0xF6F0}, -{"otcyrillic", 0x047F}, -{"otilde", 0x00F5}, -{"otildeacute", 0x1E4D}, -{"otildedieresis", 0x1E4F}, -{"oubopomofo", 0x3121}, -{"overline", 0x203E}, -{"overlinecenterline", 0xFE4A}, -{"overlinecmb", 0x0305}, -{"overlinedashed", 0xFE49}, -{"overlinedblwavy", 0xFE4C}, -{"overlinewavy", 0xFE4B}, -{"overscore", 0x00AF}, -{"ovowelsignbengali", 0x09CB}, -{"ovowelsigndeva", 0x094B}, -{"ovowelsigngujarati", 0x0ACB}, -{"p", 0x0070}, -{"paampssquare", 0x3380}, -{"paasentosquare", 0x332B}, -{"pabengali", 0x09AA}, -{"pacute", 0x1E55}, -{"padeva", 0x092A}, -{"pagedown", 0x21DF}, -{"pageup", 0x21DE}, -{"pagujarati", 0x0AAA}, -{"pagurmukhi", 0x0A2A}, -{"pahiragana", 0x3071}, -{"paiyannoithai", 0x0E2F}, -{"pakatakana", 0x30D1}, -{"palatalizationcyrilliccmb", 0x0484}, -{"palochkacyrillic", 0x04C0}, -{"pansioskorean", 0x317F}, -{"paragraph", 0x00B6}, -{"parallel", 0x2225}, -{"parenleft", 0x0028}, -{"parenleftaltonearabic", 0xFD3E}, -{"parenleftbt", 0xF8ED}, -{"parenleftex", 0xF8EC}, -{"parenleftinferior", 0x208D}, -{"parenleftmonospace", 0xFF08}, -{"parenleftsmall", 0xFE59}, -{"parenleftsuperior", 0x207D}, -{"parenlefttp", 0xF8EB}, -{"parenleftvertical", 0xFE35}, -{"parenright", 0x0029}, -{"parenrightaltonearabic", 0xFD3F}, -{"parenrightbt", 0xF8F8}, -{"parenrightex", 0xF8F7}, -{"parenrightinferior", 0x208E}, -{"parenrightmonospace", 0xFF09}, -{"parenrightsmall", 0xFE5A}, -{"parenrightsuperior", 0x207E}, -{"parenrighttp", 0xF8F6}, -{"parenrightvertical", 0xFE36}, -{"partialdiff", 0x2202}, -{"paseqhebrew", 0x05C0}, -{"pashtahebrew", 0x0599}, -{"pasquare", 0x33A9}, -{"patah", 0x05B7}, -{"patah11", 0x05B7}, -{"patah1d", 0x05B7}, -{"patah2a", 0x05B7}, -{"patahhebrew", 0x05B7}, -{"patahnarrowhebrew", 0x05B7}, -{"patahquarterhebrew", 0x05B7}, -{"patahwidehebrew", 0x05B7}, -{"pazerhebrew", 0x05A1}, -{"pbopomofo", 0x3106}, -{"pcircle", 0x24DF}, -{"pdotaccent", 0x1E57}, -{"pe", 0x05E4}, -{"pecyrillic", 0x043F}, -{"pedagesh", 0xFB44}, -{"pedageshhebrew", 0xFB44}, -{"peezisquare", 0x333B}, -{"pefinaldageshhebrew", 0xFB43}, -{"peharabic", 0x067E}, -{"peharmenian", 0x057A}, -{"pehebrew", 0x05E4}, -{"pehfinalarabic", 0xFB57}, -{"pehinitialarabic", 0xFB58}, -{"pehiragana", 0x307A}, -{"pehmedialarabic", 0xFB59}, -{"pekatakana", 0x30DA}, -{"pemiddlehookcyrillic", 0x04A7}, -{"perafehebrew", 0xFB4E}, -{"percent", 0x0025}, -{"percentarabic", 0x066A}, -{"percentmonospace", 0xFF05}, -{"percentsmall", 0xFE6A}, -{"period", 0x002E}, -{"periodarmenian", 0x0589}, -{"periodcentered", 0x00B7}, -{"periodhalfwidth", 0xFF61}, -{"periodinferior", 0xF6E7}, -{"periodmonospace", 0xFF0E}, -{"periodsmall", 0xFE52}, -{"periodsuperior", 0xF6E8}, -{"perispomenigreekcmb", 0x0342}, -{"perpendicular", 0x22A5}, -{"perthousand", 0x2030}, -{"peseta", 0x20A7}, -{"pfsquare", 0x338A}, -{"phabengali", 0x09AB}, -{"phadeva", 0x092B}, -{"phagujarati", 0x0AAB}, -{"phagurmukhi", 0x0A2B}, -{"phi", 0x03C6}, -{"phi1", 0x03D5}, -{"phieuphacirclekorean", 0x327A}, -{"phieuphaparenkorean", 0x321A}, -{"phieuphcirclekorean", 0x326C}, -{"phieuphkorean", 0x314D}, -{"phieuphparenkorean", 0x320C}, -{"philatin", 0x0278}, -{"phinthuthai", 0x0E3A}, -{"phisymbolgreek", 0x03D5}, -{"phook", 0x01A5}, -{"phophanthai", 0x0E1E}, -{"phophungthai", 0x0E1C}, -{"phosamphaothai", 0x0E20}, -{"pi", 0x03C0}, -{"pieupacirclekorean", 0x3273}, -{"pieupaparenkorean", 0x3213}, -{"pieupcieuckorean", 0x3176}, -{"pieupcirclekorean", 0x3265}, -{"pieupkiyeokkorean", 0x3172}, -{"pieupkorean", 0x3142}, -{"pieupparenkorean", 0x3205}, -{"pieupsioskiyeokkorean", 0x3174}, -{"pieupsioskorean", 0x3144}, -{"pieupsiostikeutkorean", 0x3175}, -{"pieupthieuthkorean", 0x3177}, -{"pieuptikeutkorean", 0x3173}, -{"pihiragana", 0x3074}, -{"pikatakana", 0x30D4}, -{"pisymbolgreek", 0x03D6}, -{"piwrarmenian", 0x0583}, -{"plus", 0x002B}, -{"plusbelowcmb", 0x031F}, -{"pluscircle", 0x2295}, -{"plusminus", 0x00B1}, -{"plusmod", 0x02D6}, -{"plusmonospace", 0xFF0B}, -{"plussmall", 0xFE62}, -{"plussuperior", 0x207A}, -{"pmonospace", 0xFF50}, -{"pmsquare", 0x33D8}, -{"pohiragana", 0x307D}, -{"pointingindexdownwhite", 0x261F}, -{"pointingindexleftwhite", 0x261C}, -{"pointingindexrightwhite", 0x261E}, -{"pointingindexupwhite", 0x261D}, -{"pokatakana", 0x30DD}, -{"poplathai", 0x0E1B}, -{"postalmark", 0x3012}, -{"postalmarkface", 0x3020}, -{"pparen", 0x24AB}, -{"precedes", 0x227A}, -{"prescription", 0x211E}, -{"primemod", 0x02B9}, -{"primereversed", 0x2035}, -{"product", 0x220F}, -{"projective", 0x2305}, -{"prolongedkana", 0x30FC}, -{"propellor", 0x2318}, -{"propersubset", 0x2282}, -{"propersuperset", 0x2283}, -{"proportion", 0x2237}, -{"proportional", 0x221D}, -{"psi", 0x03C8}, -{"psicyrillic", 0x0471}, -{"psilipneumatacyrilliccmb", 0x0486}, -{"pssquare", 0x33B0}, -{"puhiragana", 0x3077}, -{"pukatakana", 0x30D7}, -{"pvsquare", 0x33B4}, -{"pwsquare", 0x33BA}, -{"q", 0x0071}, -{"qadeva", 0x0958}, -{"qadmahebrew", 0x05A8}, -{"qafarabic", 0x0642}, -{"qaffinalarabic", 0xFED6}, -{"qafinitialarabic", 0xFED7}, -{"qafmedialarabic", 0xFED8}, -{"qamats", 0x05B8}, -{"qamats10", 0x05B8}, -{"qamats1a", 0x05B8}, -{"qamats1c", 0x05B8}, -{"qamats27", 0x05B8}, -{"qamats29", 0x05B8}, -{"qamats33", 0x05B8}, -{"qamatsde", 0x05B8}, -{"qamatshebrew", 0x05B8}, -{"qamatsnarrowhebrew", 0x05B8}, -{"qamatsqatanhebrew", 0x05B8}, -{"qamatsqatannarrowhebrew", 0x05B8}, -{"qamatsqatanquarterhebrew", 0x05B8}, -{"qamatsqatanwidehebrew", 0x05B8}, -{"qamatsquarterhebrew", 0x05B8}, -{"qamatswidehebrew", 0x05B8}, -{"qarneyparahebrew", 0x059F}, -{"qbopomofo", 0x3111}, -{"qcircle", 0x24E0}, -{"qhook", 0x02A0}, -{"qmonospace", 0xFF51}, -{"qof", 0x05E7}, -{"qofdagesh", 0xFB47}, -{"qofdageshhebrew", 0xFB47}, -{"qofhebrew", 0x05E7}, -{"qparen", 0x24AC}, -{"quarternote", 0x2669}, -{"qubuts", 0x05BB}, -{"qubuts18", 0x05BB}, -{"qubuts25", 0x05BB}, -{"qubuts31", 0x05BB}, -{"qubutshebrew", 0x05BB}, -{"qubutsnarrowhebrew", 0x05BB}, -{"qubutsquarterhebrew", 0x05BB}, -{"qubutswidehebrew", 0x05BB}, -{"question", 0x003F}, -{"questionarabic", 0x061F}, -{"questionarmenian", 0x055E}, -{"questiondown", 0x00BF}, -{"questiondownsmall", 0xF7BF}, -{"questiongreek", 0x037E}, -{"questionmonospace", 0xFF1F}, -{"questionsmall", 0xF73F}, -{"quotedbl", 0x0022}, -{"quotedblbase", 0x201E}, -{"quotedblleft", 0x201C}, -{"quotedblmonospace", 0xFF02}, -{"quotedblprime", 0x301E}, -{"quotedblprimereversed", 0x301D}, -{"quotedblright", 0x201D}, -{"quoteleft", 0x2018}, -{"quoteleftreversed", 0x201B}, -{"quotereversed", 0x201B}, -{"quoteright", 0x2019}, -{"quoterightn", 0x0149}, -{"quotesinglbase", 0x201A}, -{"quotesingle", 0x0027}, -{"quotesinglemonospace", 0xFF07}, -{"r", 0x0072}, -{"raarmenian", 0x057C}, -{"rabengali", 0x09B0}, -{"racute", 0x0155}, -{"radeva", 0x0930}, -{"radical", 0x221A}, -{"radicalex", 0xF8E5}, -{"radoverssquare", 0x33AE}, -{"radoverssquaredsquare", 0x33AF}, -{"radsquare", 0x33AD}, -{"rafe", 0x05BF}, -{"rafehebrew", 0x05BF}, -{"ragujarati", 0x0AB0}, -{"ragurmukhi", 0x0A30}, -{"rahiragana", 0x3089}, -{"rakatakana", 0x30E9}, -{"rakatakanahalfwidth", 0xFF97}, -{"ralowerdiagonalbengali", 0x09F1}, -{"ramiddlediagonalbengali", 0x09F0}, -{"ramshorn", 0x0264}, -{"ratio", 0x2236}, -{"rbopomofo", 0x3116}, -{"rcaron", 0x0159}, -{"rcedilla", 0x0157}, -{"rcircle", 0x24E1}, -{"rcommaaccent", 0x0157}, -{"rdblgrave", 0x0211}, -{"rdotaccent", 0x1E59}, -{"rdotbelow", 0x1E5B}, -{"rdotbelowmacron", 0x1E5D}, -{"referencemark", 0x203B}, -{"reflexsubset", 0x2286}, -{"reflexsuperset", 0x2287}, -{"registered", 0x00AE}, -{"registersans", 0xF8E8}, -{"registerserif", 0xF6DA}, -{"reharabic", 0x0631}, -{"reharmenian", 0x0580}, -{"rehfinalarabic", 0xFEAE}, -{"rehiragana", 0x308C}, -{"rekatakana", 0x30EC}, -{"rekatakanahalfwidth", 0xFF9A}, -{"resh", 0x05E8}, -{"reshdageshhebrew", 0xFB48}, -{"reshhebrew", 0x05E8}, -{"reversedtilde", 0x223D}, -{"reviahebrew", 0x0597}, -{"reviamugrashhebrew", 0x0597}, -{"revlogicalnot", 0x2310}, -{"rfishhook", 0x027E}, -{"rfishhookreversed", 0x027F}, -{"rhabengali", 0x09DD}, -{"rhadeva", 0x095D}, -{"rho", 0x03C1}, -{"rhook", 0x027D}, -{"rhookturned", 0x027B}, -{"rhookturnedsuperior", 0x02B5}, -{"rhosymbolgreek", 0x03F1}, -{"rhotichookmod", 0x02DE}, -{"rieulacirclekorean", 0x3271}, -{"rieulaparenkorean", 0x3211}, -{"rieulcirclekorean", 0x3263}, -{"rieulhieuhkorean", 0x3140}, -{"rieulkiyeokkorean", 0x313A}, -{"rieulkiyeoksioskorean", 0x3169}, -{"rieulkorean", 0x3139}, -{"rieulmieumkorean", 0x313B}, -{"rieulpansioskorean", 0x316C}, -{"rieulparenkorean", 0x3203}, -{"rieulphieuphkorean", 0x313F}, -{"rieulpieupkorean", 0x313C}, -{"rieulpieupsioskorean", 0x316B}, -{"rieulsioskorean", 0x313D}, -{"rieulthieuthkorean", 0x313E}, -{"rieultikeutkorean", 0x316A}, -{"rieulyeorinhieuhkorean", 0x316D}, -{"rightangle", 0x221F}, -{"righttackbelowcmb", 0x0319}, -{"righttriangle", 0x22BF}, -{"rihiragana", 0x308A}, -{"rikatakana", 0x30EA}, -{"rikatakanahalfwidth", 0xFF98}, -{"ring", 0x02DA}, -{"ringbelowcmb", 0x0325}, -{"ringcmb", 0x030A}, -{"ringhalfleft", 0x02BF}, -{"ringhalfleftarmenian", 0x0559}, -{"ringhalfleftbelowcmb", 0x031C}, -{"ringhalfleftcentered", 0x02D3}, -{"ringhalfright", 0x02BE}, -{"ringhalfrightbelowcmb", 0x0339}, -{"ringhalfrightcentered", 0x02D2}, -{"rinvertedbreve", 0x0213}, -{"rittorusquare", 0x3351}, -{"rlinebelow", 0x1E5F}, -{"rlongleg", 0x027C}, -{"rlonglegturned", 0x027A}, -{"rmonospace", 0xFF52}, -{"rohiragana", 0x308D}, -{"rokatakana", 0x30ED}, -{"rokatakanahalfwidth", 0xFF9B}, -{"roruathai", 0x0E23}, -{"rparen", 0x24AD}, -{"rrabengali", 0x09DC}, -{"rradeva", 0x0931}, -{"rragurmukhi", 0x0A5C}, -{"rreharabic", 0x0691}, -{"rrehfinalarabic", 0xFB8D}, -{"rrvocalicbengali", 0x09E0}, -{"rrvocalicdeva", 0x0960}, -{"rrvocalicgujarati", 0x0AE0}, -{"rrvocalicvowelsignbengali", 0x09C4}, -{"rrvocalicvowelsigndeva", 0x0944}, -{"rrvocalicvowelsigngujarati", 0x0AC4}, -{"rsuperior", 0xF6F1}, -{"rtblock", 0x2590}, -{"rturned", 0x0279}, -{"rturnedsuperior", 0x02B4}, -{"ruhiragana", 0x308B}, -{"rukatakana", 0x30EB}, -{"rukatakanahalfwidth", 0xFF99}, -{"rupeemarkbengali", 0x09F2}, -{"rupeesignbengali", 0x09F3}, -{"rupiah", 0xF6DD}, -{"ruthai", 0x0E24}, -{"rvocalicbengali", 0x098B}, -{"rvocalicdeva", 0x090B}, -{"rvocalicgujarati", 0x0A8B}, -{"rvocalicvowelsignbengali", 0x09C3}, -{"rvocalicvowelsigndeva", 0x0943}, -{"rvocalicvowelsigngujarati", 0x0AC3}, -{"s", 0x0073}, -{"sabengali", 0x09B8}, -{"sacute", 0x015B}, -{"sacutedotaccent", 0x1E65}, -{"sadarabic", 0x0635}, -{"sadeva", 0x0938}, -{"sadfinalarabic", 0xFEBA}, -{"sadinitialarabic", 0xFEBB}, -{"sadmedialarabic", 0xFEBC}, -{"sagujarati", 0x0AB8}, -{"sagurmukhi", 0x0A38}, -{"sahiragana", 0x3055}, -{"sakatakana", 0x30B5}, -{"sakatakanahalfwidth", 0xFF7B}, -{"sallallahoualayhewasallamarabic", 0xFDFA}, -{"samekh", 0x05E1}, -{"samekhdagesh", 0xFB41}, -{"samekhdageshhebrew", 0xFB41}, -{"samekhhebrew", 0x05E1}, -{"saraaathai", 0x0E32}, -{"saraaethai", 0x0E41}, -{"saraaimaimalaithai", 0x0E44}, -{"saraaimaimuanthai", 0x0E43}, -{"saraamthai", 0x0E33}, -{"saraathai", 0x0E30}, -{"saraethai", 0x0E40}, -{"saraiileftthai", 0xF886}, -{"saraiithai", 0x0E35}, -{"saraileftthai", 0xF885}, -{"saraithai", 0x0E34}, -{"saraothai", 0x0E42}, -{"saraueeleftthai", 0xF888}, -{"saraueethai", 0x0E37}, -{"saraueleftthai", 0xF887}, -{"sarauethai", 0x0E36}, -{"sarauthai", 0x0E38}, -{"sarauuthai", 0x0E39}, -{"sbopomofo", 0x3119}, -{"scaron", 0x0161}, -{"scarondotaccent", 0x1E67}, -{"scedilla", 0x015F}, -{"schwa", 0x0259}, -{"schwacyrillic", 0x04D9}, -{"schwadieresiscyrillic", 0x04DB}, -{"schwahook", 0x025A}, -{"scircle", 0x24E2}, -{"scircumflex", 0x015D}, -{"scommaaccent", 0x0219}, -{"sdotaccent", 0x1E61}, -{"sdotbelow", 0x1E63}, -{"sdotbelowdotaccent", 0x1E69}, -{"seagullbelowcmb", 0x033C}, -{"second", 0x2033}, -{"secondtonechinese", 0x02CA}, -{"section", 0x00A7}, -{"seenarabic", 0x0633}, -{"seenfinalarabic", 0xFEB2}, -{"seeninitialarabic", 0xFEB3}, -{"seenmedialarabic", 0xFEB4}, -{"segol", 0x05B6}, -{"segol13", 0x05B6}, -{"segol1f", 0x05B6}, -{"segol2c", 0x05B6}, -{"segolhebrew", 0x05B6}, -{"segolnarrowhebrew", 0x05B6}, -{"segolquarterhebrew", 0x05B6}, -{"segoltahebrew", 0x0592}, -{"segolwidehebrew", 0x05B6}, -{"seharmenian", 0x057D}, -{"sehiragana", 0x305B}, -{"sekatakana", 0x30BB}, -{"sekatakanahalfwidth", 0xFF7E}, -{"semicolon", 0x003B}, -{"semicolonarabic", 0x061B}, -{"semicolonmonospace", 0xFF1B}, -{"semicolonsmall", 0xFE54}, -{"semivoicedmarkkana", 0x309C}, -{"semivoicedmarkkanahalfwidth", 0xFF9F}, -{"sentisquare", 0x3322}, -{"sentosquare", 0x3323}, -{"seven", 0x0037}, -{"sevenarabic", 0x0667}, -{"sevenbengali", 0x09ED}, -{"sevencircle", 0x2466}, -{"sevencircleinversesansserif", 0x2790}, -{"sevendeva", 0x096D}, -{"seveneighths", 0x215E}, -{"sevengujarati", 0x0AED}, -{"sevengurmukhi", 0x0A6D}, -{"sevenhackarabic", 0x0667}, -{"sevenhangzhou", 0x3027}, -{"sevenideographicparen", 0x3226}, -{"seveninferior", 0x2087}, -{"sevenmonospace", 0xFF17}, -{"sevenoldstyle", 0xF737}, -{"sevenparen", 0x247A}, -{"sevenperiod", 0x248E}, -{"sevenpersian", 0x06F7}, -{"sevenroman", 0x2176}, -{"sevensuperior", 0x2077}, -{"seventeencircle", 0x2470}, -{"seventeenparen", 0x2484}, -{"seventeenperiod", 0x2498}, -{"seventhai", 0x0E57}, -{"sfthyphen", 0x00AD}, -{"shaarmenian", 0x0577}, -{"shabengali", 0x09B6}, -{"shacyrillic", 0x0448}, -{"shaddaarabic", 0x0651}, -{"shaddadammaarabic", 0xFC61}, -{"shaddadammatanarabic", 0xFC5E}, -{"shaddafathaarabic", 0xFC60}, -{"shaddakasraarabic", 0xFC62}, -{"shaddakasratanarabic", 0xFC5F}, -{"shade", 0x2592}, -{"shadedark", 0x2593}, -{"shadelight", 0x2591}, -{"shademedium", 0x2592}, -{"shadeva", 0x0936}, -{"shagujarati", 0x0AB6}, -{"shagurmukhi", 0x0A36}, -{"shalshelethebrew", 0x0593}, -{"shbopomofo", 0x3115}, -{"shchacyrillic", 0x0449}, -{"sheenarabic", 0x0634}, -{"sheenfinalarabic", 0xFEB6}, -{"sheeninitialarabic", 0xFEB7}, -{"sheenmedialarabic", 0xFEB8}, -{"sheicoptic", 0x03E3}, -{"sheqel", 0x20AA}, -{"sheqelhebrew", 0x20AA}, -{"sheva", 0x05B0}, -{"sheva115", 0x05B0}, -{"sheva15", 0x05B0}, -{"sheva22", 0x05B0}, -{"sheva2e", 0x05B0}, -{"shevahebrew", 0x05B0}, -{"shevanarrowhebrew", 0x05B0}, -{"shevaquarterhebrew", 0x05B0}, -{"shevawidehebrew", 0x05B0}, -{"shhacyrillic", 0x04BB}, -{"shimacoptic", 0x03ED}, -{"shin", 0x05E9}, -{"shindagesh", 0xFB49}, -{"shindageshhebrew", 0xFB49}, -{"shindageshshindot", 0xFB2C}, -{"shindageshshindothebrew", 0xFB2C}, -{"shindageshsindot", 0xFB2D}, -{"shindageshsindothebrew", 0xFB2D}, -{"shindothebrew", 0x05C1}, -{"shinhebrew", 0x05E9}, -{"shinshindot", 0xFB2A}, -{"shinshindothebrew", 0xFB2A}, -{"shinsindot", 0xFB2B}, -{"shinsindothebrew", 0xFB2B}, -{"shook", 0x0282}, -{"sigma", 0x03C3}, -{"sigma1", 0x03C2}, -{"sigmafinal", 0x03C2}, -{"sigmalunatesymbolgreek", 0x03F2}, -{"sihiragana", 0x3057}, -{"sikatakana", 0x30B7}, -{"sikatakanahalfwidth", 0xFF7C}, -{"siluqhebrew", 0x05BD}, -{"siluqlefthebrew", 0x05BD}, -{"similar", 0x223C}, -{"sindothebrew", 0x05C2}, -{"siosacirclekorean", 0x3274}, -{"siosaparenkorean", 0x3214}, -{"sioscieuckorean", 0x317E}, -{"sioscirclekorean", 0x3266}, -{"sioskiyeokkorean", 0x317A}, -{"sioskorean", 0x3145}, -{"siosnieunkorean", 0x317B}, -{"siosparenkorean", 0x3206}, -{"siospieupkorean", 0x317D}, -{"siostikeutkorean", 0x317C}, -{"six", 0x0036}, -{"sixarabic", 0x0666}, -{"sixbengali", 0x09EC}, -{"sixcircle", 0x2465}, -{"sixcircleinversesansserif", 0x278F}, -{"sixdeva", 0x096C}, -{"sixgujarati", 0x0AEC}, -{"sixgurmukhi", 0x0A6C}, -{"sixhackarabic", 0x0666}, -{"sixhangzhou", 0x3026}, -{"sixideographicparen", 0x3225}, -{"sixinferior", 0x2086}, -{"sixmonospace", 0xFF16}, -{"sixoldstyle", 0xF736}, -{"sixparen", 0x2479}, -{"sixperiod", 0x248D}, -{"sixpersian", 0x06F6}, -{"sixroman", 0x2175}, -{"sixsuperior", 0x2076}, -{"sixteencircle", 0x246F}, -{"sixteencurrencydenominatorbengali", 0x09F9}, -{"sixteenparen", 0x2483}, -{"sixteenperiod", 0x2497}, -{"sixthai", 0x0E56}, -{"slash", 0x002F}, -{"slashmonospace", 0xFF0F}, -{"slong", 0x017F}, -{"slongdotaccent", 0x1E9B}, -{"smileface", 0x263A}, -{"smonospace", 0xFF53}, -{"sofpasuqhebrew", 0x05C3}, -{"softhyphen", 0x00AD}, -{"softsigncyrillic", 0x044C}, -{"sohiragana", 0x305D}, -{"sokatakana", 0x30BD}, -{"sokatakanahalfwidth", 0xFF7F}, -{"soliduslongoverlaycmb", 0x0338}, -{"solidusshortoverlaycmb", 0x0337}, -{"sorusithai", 0x0E29}, -{"sosalathai", 0x0E28}, -{"sosothai", 0x0E0B}, -{"sosuathai", 0x0E2A}, -{"space", 0x0020}, -{"spacehackarabic", 0x0020}, -{"spade", 0x2660}, -{"spadesuitblack", 0x2660}, -{"spadesuitwhite", 0x2664}, -{"sparen", 0x24AE}, -{"squarebelowcmb", 0x033B}, -{"squarecc", 0x33C4}, -{"squarecm", 0x339D}, -{"squarediagonalcrosshatchfill", 0x25A9}, -{"squarehorizontalfill", 0x25A4}, -{"squarekg", 0x338F}, -{"squarekm", 0x339E}, -{"squarekmcapital", 0x33CE}, -{"squareln", 0x33D1}, -{"squarelog", 0x33D2}, -{"squaremg", 0x338E}, -{"squaremil", 0x33D5}, -{"squaremm", 0x339C}, -{"squaremsquared", 0x33A1}, -{"squareorthogonalcrosshatchfill", 0x25A6}, -{"squareupperlefttolowerrightfill", 0x25A7}, -{"squareupperrighttolowerleftfill", 0x25A8}, -{"squareverticalfill", 0x25A5}, -{"squarewhitewithsmallblack", 0x25A3}, -{"srsquare", 0x33DB}, -{"ssabengali", 0x09B7}, -{"ssadeva", 0x0937}, -{"ssagujarati", 0x0AB7}, -{"ssangcieuckorean", 0x3149}, -{"ssanghieuhkorean", 0x3185}, -{"ssangieungkorean", 0x3180}, -{"ssangkiyeokkorean", 0x3132}, -{"ssangnieunkorean", 0x3165}, -{"ssangpieupkorean", 0x3143}, -{"ssangsioskorean", 0x3146}, -{"ssangtikeutkorean", 0x3138}, -{"ssuperior", 0xF6F2}, -{"sterling", 0x00A3}, -{"sterlingmonospace", 0xFFE1}, -{"strokelongoverlaycmb", 0x0336}, -{"strokeshortoverlaycmb", 0x0335}, -{"subset", 0x2282}, -{"subsetnotequal", 0x228A}, -{"subsetorequal", 0x2286}, -{"succeeds", 0x227B}, -{"suchthat", 0x220B}, -{"suhiragana", 0x3059}, -{"sukatakana", 0x30B9}, -{"sukatakanahalfwidth", 0xFF7D}, -{"sukunarabic", 0x0652}, -{"summation", 0x2211}, -{"sun", 0x263C}, -{"superset", 0x2283}, -{"supersetnotequal", 0x228B}, -{"supersetorequal", 0x2287}, -{"svsquare", 0x33DC}, -{"syouwaerasquare", 0x337C}, -{"t", 0x0074}, -{"tabengali", 0x09A4}, -{"tackdown", 0x22A4}, -{"tackleft", 0x22A3}, -{"tadeva", 0x0924}, -{"tagujarati", 0x0AA4}, -{"tagurmukhi", 0x0A24}, -{"taharabic", 0x0637}, -{"tahfinalarabic", 0xFEC2}, -{"tahinitialarabic", 0xFEC3}, -{"tahiragana", 0x305F}, -{"tahmedialarabic", 0xFEC4}, -{"taisyouerasquare", 0x337D}, -{"takatakana", 0x30BF}, -{"takatakanahalfwidth", 0xFF80}, -{"tatweelarabic", 0x0640}, -{"tau", 0x03C4}, -{"tav", 0x05EA}, -{"tavdages", 0xFB4A}, -{"tavdagesh", 0xFB4A}, -{"tavdageshhebrew", 0xFB4A}, -{"tavhebrew", 0x05EA}, -{"tbar", 0x0167}, -{"tbopomofo", 0x310A}, -{"tcaron", 0x0165}, -{"tccurl", 0x02A8}, -{"tcedilla", 0x0163}, -{"tcheharabic", 0x0686}, -{"tchehfinalarabic", 0xFB7B}, -{"tchehinitialarabic", 0xFB7C}, -{"tchehmedialarabic", 0xFB7D}, -{"tcircle", 0x24E3}, -{"tcircumflexbelow", 0x1E71}, -{"tcommaaccent", 0x0163}, -{"tdieresis", 0x1E97}, -{"tdotaccent", 0x1E6B}, -{"tdotbelow", 0x1E6D}, -{"tecyrillic", 0x0442}, -{"tedescendercyrillic", 0x04AD}, -{"teharabic", 0x062A}, -{"tehfinalarabic", 0xFE96}, -{"tehhahinitialarabic", 0xFCA2}, -{"tehhahisolatedarabic", 0xFC0C}, -{"tehinitialarabic", 0xFE97}, -{"tehiragana", 0x3066}, -{"tehjeeminitialarabic", 0xFCA1}, -{"tehjeemisolatedarabic", 0xFC0B}, -{"tehmarbutaarabic", 0x0629}, -{"tehmarbutafinalarabic", 0xFE94}, -{"tehmedialarabic", 0xFE98}, -{"tehmeeminitialarabic", 0xFCA4}, -{"tehmeemisolatedarabic", 0xFC0E}, -{"tehnoonfinalarabic", 0xFC73}, -{"tekatakana", 0x30C6}, -{"tekatakanahalfwidth", 0xFF83}, -{"telephone", 0x2121}, -{"telephoneblack", 0x260E}, -{"telishagedolahebrew", 0x05A0}, -{"telishaqetanahebrew", 0x05A9}, -{"tencircle", 0x2469}, -{"tenideographicparen", 0x3229}, -{"tenparen", 0x247D}, -{"tenperiod", 0x2491}, -{"tenroman", 0x2179}, -{"tesh", 0x02A7}, -{"tet", 0x05D8}, -{"tetdagesh", 0xFB38}, -{"tetdageshhebrew", 0xFB38}, -{"tethebrew", 0x05D8}, -{"tetsecyrillic", 0x04B5}, -{"tevirhebrew", 0x059B}, -{"tevirlefthebrew", 0x059B}, -{"thabengali", 0x09A5}, -{"thadeva", 0x0925}, -{"thagujarati", 0x0AA5}, -{"thagurmukhi", 0x0A25}, -{"thalarabic", 0x0630}, -{"thalfinalarabic", 0xFEAC}, -{"thanthakhatlowleftthai", 0xF898}, -{"thanthakhatlowrightthai", 0xF897}, -{"thanthakhatthai", 0x0E4C}, -{"thanthakhatupperleftthai", 0xF896}, -{"theharabic", 0x062B}, -{"thehfinalarabic", 0xFE9A}, -{"thehinitialarabic", 0xFE9B}, -{"thehmedialarabic", 0xFE9C}, -{"thereexists", 0x2203}, -{"therefore", 0x2234}, -{"theta", 0x03B8}, -{"theta1", 0x03D1}, -{"thetasymbolgreek", 0x03D1}, -{"thieuthacirclekorean", 0x3279}, -{"thieuthaparenkorean", 0x3219}, -{"thieuthcirclekorean", 0x326B}, -{"thieuthkorean", 0x314C}, -{"thieuthparenkorean", 0x320B}, -{"thirteencircle", 0x246C}, -{"thirteenparen", 0x2480}, -{"thirteenperiod", 0x2494}, -{"thonangmonthothai", 0x0E11}, -{"thook", 0x01AD}, -{"thophuthaothai", 0x0E12}, -{"thorn", 0x00FE}, -{"thothahanthai", 0x0E17}, -{"thothanthai", 0x0E10}, -{"thothongthai", 0x0E18}, -{"thothungthai", 0x0E16}, -{"thousandcyrillic", 0x0482}, -{"thousandsseparatorarabic", 0x066C}, -{"thousandsseparatorpersian", 0x066C}, -{"three", 0x0033}, -{"threearabic", 0x0663}, -{"threebengali", 0x09E9}, -{"threecircle", 0x2462}, -{"threecircleinversesansserif", 0x278C}, -{"threedeva", 0x0969}, -{"threeeighths", 0x215C}, -{"threegujarati", 0x0AE9}, -{"threegurmukhi", 0x0A69}, -{"threehackarabic", 0x0663}, -{"threehangzhou", 0x3023}, -{"threeideographicparen", 0x3222}, -{"threeinferior", 0x2083}, -{"threemonospace", 0xFF13}, -{"threenumeratorbengali", 0x09F6}, -{"threeoldstyle", 0xF733}, -{"threeparen", 0x2476}, -{"threeperiod", 0x248A}, -{"threepersian", 0x06F3}, -{"threequarters", 0x00BE}, -{"threequartersemdash", 0xF6DE}, -{"threeroman", 0x2172}, -{"threesuperior", 0x00B3}, -{"threethai", 0x0E53}, -{"thzsquare", 0x3394}, -{"tihiragana", 0x3061}, -{"tikatakana", 0x30C1}, -{"tikatakanahalfwidth", 0xFF81}, -{"tikeutacirclekorean", 0x3270}, -{"tikeutaparenkorean", 0x3210}, -{"tikeutcirclekorean", 0x3262}, -{"tikeutkorean", 0x3137}, -{"tikeutparenkorean", 0x3202}, -{"tilde", 0x02DC}, -{"tildebelowcmb", 0x0330}, -{"tildecmb", 0x0303}, -{"tildecomb", 0x0303}, -{"tildedoublecmb", 0x0360}, -{"tildeoperator", 0x223C}, -{"tildeoverlaycmb", 0x0334}, -{"tildeverticalcmb", 0x033E}, -{"timescircle", 0x2297}, -{"tipehahebrew", 0x0596}, -{"tipehalefthebrew", 0x0596}, -{"tippigurmukhi", 0x0A70}, -{"titlocyrilliccmb", 0x0483}, -{"tiwnarmenian", 0x057F}, -{"tlinebelow", 0x1E6F}, -{"tmonospace", 0xFF54}, -{"toarmenian", 0x0569}, -{"tohiragana", 0x3068}, -{"tokatakana", 0x30C8}, -{"tokatakanahalfwidth", 0xFF84}, -{"tonebarextrahighmod", 0x02E5}, -{"tonebarextralowmod", 0x02E9}, -{"tonebarhighmod", 0x02E6}, -{"tonebarlowmod", 0x02E8}, -{"tonebarmidmod", 0x02E7}, -{"tonefive", 0x01BD}, -{"tonesix", 0x0185}, -{"tonetwo", 0x01A8}, -{"tonos", 0x0384}, -{"tonsquare", 0x3327}, -{"topatakthai", 0x0E0F}, -{"tortoiseshellbracketleft", 0x3014}, -{"tortoiseshellbracketleftsmall", 0xFE5D}, -{"tortoiseshellbracketleftvertical", 0xFE39}, -{"tortoiseshellbracketright", 0x3015}, -{"tortoiseshellbracketrightsmall", 0xFE5E}, -{"tortoiseshellbracketrightvertical", 0xFE3A}, -{"totaothai", 0x0E15}, -{"tpalatalhook", 0x01AB}, -{"tparen", 0x24AF}, -{"trademark", 0x2122}, -{"trademarksans", 0xF8EA}, -{"trademarkserif", 0xF6DB}, -{"tretroflexhook", 0x0288}, -{"triagdn", 0x25BC}, -{"triaglf", 0x25C4}, -{"triagrt", 0x25BA}, -{"triagup", 0x25B2}, -{"ts", 0x02A6}, -{"tsadi", 0x05E6}, -{"tsadidagesh", 0xFB46}, -{"tsadidageshhebrew", 0xFB46}, -{"tsadihebrew", 0x05E6}, -{"tsecyrillic", 0x0446}, -{"tsere", 0x05B5}, -{"tsere12", 0x05B5}, -{"tsere1e", 0x05B5}, -{"tsere2b", 0x05B5}, -{"tserehebrew", 0x05B5}, -{"tserenarrowhebrew", 0x05B5}, -{"tserequarterhebrew", 0x05B5}, -{"tserewidehebrew", 0x05B5}, -{"tshecyrillic", 0x045B}, -{"tsuperior", 0xF6F3}, -{"ttabengali", 0x099F}, -{"ttadeva", 0x091F}, -{"ttagujarati", 0x0A9F}, -{"ttagurmukhi", 0x0A1F}, -{"tteharabic", 0x0679}, -{"ttehfinalarabic", 0xFB67}, -{"ttehinitialarabic", 0xFB68}, -{"ttehmedialarabic", 0xFB69}, -{"tthabengali", 0x09A0}, -{"tthadeva", 0x0920}, -{"tthagujarati", 0x0AA0}, -{"tthagurmukhi", 0x0A20}, -{"tturned", 0x0287}, -{"tuhiragana", 0x3064}, -{"tukatakana", 0x30C4}, -{"tukatakanahalfwidth", 0xFF82}, -{"tusmallhiragana", 0x3063}, -{"tusmallkatakana", 0x30C3}, -{"tusmallkatakanahalfwidth", 0xFF6F}, -{"twelvecircle", 0x246B}, -{"twelveparen", 0x247F}, -{"twelveperiod", 0x2493}, -{"twelveroman", 0x217B}, -{"twentycircle", 0x2473}, -{"twentyhangzhou", 0x5344}, -{"twentyparen", 0x2487}, -{"twentyperiod", 0x249B}, -{"two", 0x0032}, -{"twoarabic", 0x0662}, -{"twobengali", 0x09E8}, -{"twocircle", 0x2461}, -{"twocircleinversesansserif", 0x278B}, -{"twodeva", 0x0968}, -{"twodotenleader", 0x2025}, -{"twodotleader", 0x2025}, -{"twodotleadervertical", 0xFE30}, -{"twogujarati", 0x0AE8}, -{"twogurmukhi", 0x0A68}, -{"twohackarabic", 0x0662}, -{"twohangzhou", 0x3022}, -{"twoideographicparen", 0x3221}, -{"twoinferior", 0x2082}, -{"twomonospace", 0xFF12}, -{"twonumeratorbengali", 0x09F5}, -{"twooldstyle", 0xF732}, -{"twoparen", 0x2475}, -{"twoperiod", 0x2489}, -{"twopersian", 0x06F2}, -{"tworoman", 0x2171}, -{"twostroke", 0x01BB}, -{"twosuperior", 0x00B2}, -{"twothai", 0x0E52}, -{"twothirds", 0x2154}, -{"u", 0x0075}, -{"uacute", 0x00FA}, -{"ubar", 0x0289}, -{"ubengali", 0x0989}, -{"ubopomofo", 0x3128}, -{"ubreve", 0x016D}, -{"ucaron", 0x01D4}, -{"ucircle", 0x24E4}, -{"ucircumflex", 0x00FB}, -{"ucircumflexbelow", 0x1E77}, -{"ucyrillic", 0x0443}, -{"udattadeva", 0x0951}, -{"udblacute", 0x0171}, -{"udblgrave", 0x0215}, -{"udeva", 0x0909}, -{"udieresis", 0x00FC}, -{"udieresisacute", 0x01D8}, -{"udieresisbelow", 0x1E73}, -{"udieresiscaron", 0x01DA}, -{"udieresiscyrillic", 0x04F1}, -{"udieresisgrave", 0x01DC}, -{"udieresismacron", 0x01D6}, -{"udotbelow", 0x1EE5}, -{"ugrave", 0x00F9}, -{"ugujarati", 0x0A89}, -{"ugurmukhi", 0x0A09}, -{"uhiragana", 0x3046}, -{"uhookabove", 0x1EE7}, -{"uhorn", 0x01B0}, -{"uhornacute", 0x1EE9}, -{"uhorndotbelow", 0x1EF1}, -{"uhorngrave", 0x1EEB}, -{"uhornhookabove", 0x1EED}, -{"uhorntilde", 0x1EEF}, -{"uhungarumlaut", 0x0171}, -{"uhungarumlautcyrillic", 0x04F3}, -{"uinvertedbreve", 0x0217}, -{"ukatakana", 0x30A6}, -{"ukatakanahalfwidth", 0xFF73}, -{"ukcyrillic", 0x0479}, -{"ukorean", 0x315C}, -{"umacron", 0x016B}, -{"umacroncyrillic", 0x04EF}, -{"umacrondieresis", 0x1E7B}, -{"umatragurmukhi", 0x0A41}, -{"umonospace", 0xFF55}, -{"underscore", 0x005F}, -{"underscoredbl", 0x2017}, -{"underscoremonospace", 0xFF3F}, -{"underscorevertical", 0xFE33}, -{"underscorewavy", 0xFE4F}, -{"union", 0x222A}, -{"universal", 0x2200}, -{"uogonek", 0x0173}, -{"uparen", 0x24B0}, -{"upblock", 0x2580}, -{"upperdothebrew", 0x05C4}, -{"upsilon", 0x03C5}, -{"upsilondieresis", 0x03CB}, -{"upsilondieresistonos", 0x03B0}, -{"upsilonlatin", 0x028A}, -{"upsilontonos", 0x03CD}, -{"uptackbelowcmb", 0x031D}, -{"uptackmod", 0x02D4}, -{"uragurmukhi", 0x0A73}, -{"uring", 0x016F}, -{"ushortcyrillic", 0x045E}, -{"usmallhiragana", 0x3045}, -{"usmallkatakana", 0x30A5}, -{"usmallkatakanahalfwidth", 0xFF69}, -{"ustraightcyrillic", 0x04AF}, -{"ustraightstrokecyrillic", 0x04B1}, -{"utilde", 0x0169}, -{"utildeacute", 0x1E79}, -{"utildebelow", 0x1E75}, -{"uubengali", 0x098A}, -{"uudeva", 0x090A}, -{"uugujarati", 0x0A8A}, -{"uugurmukhi", 0x0A0A}, -{"uumatragurmukhi", 0x0A42}, -{"uuvowelsignbengali", 0x09C2}, -{"uuvowelsigndeva", 0x0942}, -{"uuvowelsigngujarati", 0x0AC2}, -{"uvowelsignbengali", 0x09C1}, -{"uvowelsigndeva", 0x0941}, -{"uvowelsigngujarati", 0x0AC1}, -{"v", 0x0076}, -{"vadeva", 0x0935}, -{"vagujarati", 0x0AB5}, -{"vagurmukhi", 0x0A35}, -{"vakatakana", 0x30F7}, -{"vav", 0x05D5}, -{"vavdagesh", 0xFB35}, -{"vavdagesh65", 0xFB35}, -{"vavdageshhebrew", 0xFB35}, -{"vavhebrew", 0x05D5}, -{"vavholam", 0xFB4B}, -{"vavholamhebrew", 0xFB4B}, -{"vavvavhebrew", 0x05F0}, -{"vavyodhebrew", 0x05F1}, -{"vcircle", 0x24E5}, -{"vdotbelow", 0x1E7F}, -{"vecyrillic", 0x0432}, -{"veharabic", 0x06A4}, -{"vehfinalarabic", 0xFB6B}, -{"vehinitialarabic", 0xFB6C}, -{"vehmedialarabic", 0xFB6D}, -{"vekatakana", 0x30F9}, -{"venus", 0x2640}, -{"verticalbar", 0x007C}, -{"verticallineabovecmb", 0x030D}, -{"verticallinebelowcmb", 0x0329}, -{"verticallinelowmod", 0x02CC}, -{"verticallinemod", 0x02C8}, -{"vewarmenian", 0x057E}, -{"vhook", 0x028B}, -{"vikatakana", 0x30F8}, -{"viramabengali", 0x09CD}, -{"viramadeva", 0x094D}, -{"viramagujarati", 0x0ACD}, -{"visargabengali", 0x0983}, -{"visargadeva", 0x0903}, -{"visargagujarati", 0x0A83}, -{"vmonospace", 0xFF56}, -{"voarmenian", 0x0578}, -{"voicediterationhiragana", 0x309E}, -{"voicediterationkatakana", 0x30FE}, -{"voicedmarkkana", 0x309B}, -{"voicedmarkkanahalfwidth", 0xFF9E}, -{"vokatakana", 0x30FA}, -{"vparen", 0x24B1}, -{"vtilde", 0x1E7D}, -{"vturned", 0x028C}, -{"vuhiragana", 0x3094}, -{"vukatakana", 0x30F4}, -{"w", 0x0077}, -{"wacute", 0x1E83}, -{"waekorean", 0x3159}, -{"wahiragana", 0x308F}, -{"wakatakana", 0x30EF}, -{"wakatakanahalfwidth", 0xFF9C}, -{"wakorean", 0x3158}, -{"wasmallhiragana", 0x308E}, -{"wasmallkatakana", 0x30EE}, -{"wattosquare", 0x3357}, -{"wavedash", 0x301C}, -{"wavyunderscorevertical", 0xFE34}, -{"wawarabic", 0x0648}, -{"wawfinalarabic", 0xFEEE}, -{"wawhamzaabovearabic", 0x0624}, -{"wawhamzaabovefinalarabic", 0xFE86}, -{"wbsquare", 0x33DD}, -{"wcircle", 0x24E6}, -{"wcircumflex", 0x0175}, -{"wdieresis", 0x1E85}, -{"wdotaccent", 0x1E87}, -{"wdotbelow", 0x1E89}, -{"wehiragana", 0x3091}, -{"weierstrass", 0x2118}, -{"wekatakana", 0x30F1}, -{"wekorean", 0x315E}, -{"weokorean", 0x315D}, -{"wgrave", 0x1E81}, -{"whitebullet", 0x25E6}, -{"whitecircle", 0x25CB}, -{"whitecircleinverse", 0x25D9}, -{"whitecornerbracketleft", 0x300E}, -{"whitecornerbracketleftvertical", 0xFE43}, -{"whitecornerbracketright", 0x300F}, -{"whitecornerbracketrightvertical", 0xFE44}, -{"whitediamond", 0x25C7}, -{"whitediamondcontainingblacksmalldiamond", 0x25C8}, -{"whitedownpointingsmalltriangle", 0x25BF}, -{"whitedownpointingtriangle", 0x25BD}, -{"whiteleftpointingsmalltriangle", 0x25C3}, -{"whiteleftpointingtriangle", 0x25C1}, -{"whitelenticularbracketleft", 0x3016}, -{"whitelenticularbracketright", 0x3017}, -{"whiterightpointingsmalltriangle", 0x25B9}, -{"whiterightpointingtriangle", 0x25B7}, -{"whitesmallsquare", 0x25AB}, -{"whitesmilingface", 0x263A}, -{"whitesquare", 0x25A1}, -{"whitestar", 0x2606}, -{"whitetelephone", 0x260F}, -{"whitetortoiseshellbracketleft", 0x3018}, -{"whitetortoiseshellbracketright", 0x3019}, -{"whiteuppointingsmalltriangle", 0x25B5}, -{"whiteuppointingtriangle", 0x25B3}, -{"wihiragana", 0x3090}, -{"wikatakana", 0x30F0}, -{"wikorean", 0x315F}, -{"wmonospace", 0xFF57}, -{"wohiragana", 0x3092}, -{"wokatakana", 0x30F2}, -{"wokatakanahalfwidth", 0xFF66}, -{"won", 0x20A9}, -{"wonmonospace", 0xFFE6}, -{"wowaenthai", 0x0E27}, -{"wparen", 0x24B2}, -{"wring", 0x1E98}, -{"wsuperior", 0x02B7}, -{"wturned", 0x028D}, -{"wynn", 0x01BF}, -{"x", 0x0078}, -{"xabovecmb", 0x033D}, -{"xbopomofo", 0x3112}, -{"xcircle", 0x24E7}, -{"xdieresis", 0x1E8D}, -{"xdotaccent", 0x1E8B}, -{"xeharmenian", 0x056D}, -{"xi", 0x03BE}, -{"xmonospace", 0xFF58}, -{"xparen", 0x24B3}, -{"xsuperior", 0x02E3}, -{"y", 0x0079}, -{"yaadosquare", 0x334E}, -{"yabengali", 0x09AF}, -{"yacute", 0x00FD}, -{"yadeva", 0x092F}, -{"yaekorean", 0x3152}, -{"yagujarati", 0x0AAF}, -{"yagurmukhi", 0x0A2F}, -{"yahiragana", 0x3084}, -{"yakatakana", 0x30E4}, -{"yakatakanahalfwidth", 0xFF94}, -{"yakorean", 0x3151}, -{"yamakkanthai", 0x0E4E}, -{"yasmallhiragana", 0x3083}, -{"yasmallkatakana", 0x30E3}, -{"yasmallkatakanahalfwidth", 0xFF6C}, -{"yatcyrillic", 0x0463}, -{"ycircle", 0x24E8}, -{"ycircumflex", 0x0177}, -{"ydieresis", 0x00FF}, -{"ydotaccent", 0x1E8F}, -{"ydotbelow", 0x1EF5}, -{"yeharabic", 0x064A}, -{"yehbarreearabic", 0x06D2}, -{"yehbarreefinalarabic", 0xFBAF}, -{"yehfinalarabic", 0xFEF2}, -{"yehhamzaabovearabic", 0x0626}, -{"yehhamzaabovefinalarabic", 0xFE8A}, -{"yehhamzaaboveinitialarabic", 0xFE8B}, -{"yehhamzaabovemedialarabic", 0xFE8C}, -{"yehinitialarabic", 0xFEF3}, -{"yehmedialarabic", 0xFEF4}, -{"yehmeeminitialarabic", 0xFCDD}, -{"yehmeemisolatedarabic", 0xFC58}, -{"yehnoonfinalarabic", 0xFC94}, -{"yehthreedotsbelowarabic", 0x06D1}, -{"yekorean", 0x3156}, -{"yen", 0x00A5}, -{"yenmonospace", 0xFFE5}, -{"yeokorean", 0x3155}, -{"yeorinhieuhkorean", 0x3186}, -{"yerahbenyomohebrew", 0x05AA}, -{"yerahbenyomolefthebrew", 0x05AA}, -{"yericyrillic", 0x044B}, -{"yerudieresiscyrillic", 0x04F9}, -{"yesieungkorean", 0x3181}, -{"yesieungpansioskorean", 0x3183}, -{"yesieungsioskorean", 0x3182}, -{"yetivhebrew", 0x059A}, -{"ygrave", 0x1EF3}, -{"yhook", 0x01B4}, -{"yhookabove", 0x1EF7}, -{"yiarmenian", 0x0575}, -{"yicyrillic", 0x0457}, -{"yikorean", 0x3162}, -{"yinyang", 0x262F}, -{"yiwnarmenian", 0x0582}, -{"ymonospace", 0xFF59}, -{"yod", 0x05D9}, -{"yoddagesh", 0xFB39}, -{"yoddageshhebrew", 0xFB39}, -{"yodhebrew", 0x05D9}, -{"yodyodhebrew", 0x05F2}, -{"yodyodpatahhebrew", 0xFB1F}, -{"yohiragana", 0x3088}, -{"yoikorean", 0x3189}, -{"yokatakana", 0x30E8}, -{"yokatakanahalfwidth", 0xFF96}, -{"yokorean", 0x315B}, -{"yosmallhiragana", 0x3087}, -{"yosmallkatakana", 0x30E7}, -{"yosmallkatakanahalfwidth", 0xFF6E}, -{"yotgreek", 0x03F3}, -{"yoyaekorean", 0x3188}, -{"yoyakorean", 0x3187}, -{"yoyakthai", 0x0E22}, -{"yoyingthai", 0x0E0D}, -{"yparen", 0x24B4}, -{"ypogegrammeni", 0x037A}, -{"ypogegrammenigreekcmb", 0x0345}, -{"yr", 0x01A6}, -{"yring", 0x1E99}, -{"ysuperior", 0x02B8}, -{"ytilde", 0x1EF9}, -{"yturned", 0x028E}, -{"yuhiragana", 0x3086}, -{"yuikorean", 0x318C}, -{"yukatakana", 0x30E6}, -{"yukatakanahalfwidth", 0xFF95}, -{"yukorean", 0x3160}, -{"yusbigcyrillic", 0x046B}, -{"yusbigiotifiedcyrillic", 0x046D}, -{"yuslittlecyrillic", 0x0467}, -{"yuslittleiotifiedcyrillic", 0x0469}, -{"yusmallhiragana", 0x3085}, -{"yusmallkatakana", 0x30E5}, -{"yusmallkatakanahalfwidth", 0xFF6D}, -{"yuyekorean", 0x318B}, -{"yuyeokorean", 0x318A}, -{"yyabengali", 0x09DF}, -{"yyadeva", 0x095F}, -{"z", 0x007A}, -{"zaarmenian", 0x0566}, -{"zacute", 0x017A}, -{"zadeva", 0x095B}, -{"zagurmukhi", 0x0A5B}, -{"zaharabic", 0x0638}, -{"zahfinalarabic", 0xFEC6}, -{"zahinitialarabic", 0xFEC7}, -{"zahiragana", 0x3056}, -{"zahmedialarabic", 0xFEC8}, -{"zainarabic", 0x0632}, -{"zainfinalarabic", 0xFEB0}, -{"zakatakana", 0x30B6}, -{"zaqefgadolhebrew", 0x0595}, -{"zaqefqatanhebrew", 0x0594}, -{"zarqahebrew", 0x0598}, -{"zayin", 0x05D6}, -{"zayindagesh", 0xFB36}, -{"zayindageshhebrew", 0xFB36}, -{"zayinhebrew", 0x05D6}, -{"zbopomofo", 0x3117}, -{"zcaron", 0x017E}, -{"zcircle", 0x24E9}, -{"zcircumflex", 0x1E91}, -{"zcurl", 0x0291}, -{"zdot", 0x017C}, -{"zdotaccent", 0x017C}, -{"zdotbelow", 0x1E93}, -{"zecyrillic", 0x0437}, -{"zedescendercyrillic", 0x0499}, -{"zedieresiscyrillic", 0x04DF}, -{"zehiragana", 0x305C}, -{"zekatakana", 0x30BC}, -{"zero", 0x0030}, -{"zeroarabic", 0x0660}, -{"zerobengali", 0x09E6}, -{"zerodeva", 0x0966}, -{"zerogujarati", 0x0AE6}, -{"zerogurmukhi", 0x0A66}, -{"zerohackarabic", 0x0660}, -{"zeroinferior", 0x2080}, -{"zeromonospace", 0xFF10}, -{"zerooldstyle", 0xF730}, -{"zeropersian", 0x06F0}, -{"zerosuperior", 0x2070}, -{"zerothai", 0x0E50}, -{"zerowidthjoiner", 0xFEFF}, -{"zerowidthnonjoiner", 0x200C}, -{"zerowidthspace", 0x200B}, -{"zeta", 0x03B6}, -{"zhbopomofo", 0x3113}, -{"zhearmenian", 0x056A}, -{"zhebrevecyrillic", 0x04C2}, -{"zhecyrillic", 0x0436}, -{"zhedescendercyrillic", 0x0497}, -{"zhedieresiscyrillic", 0x04DD}, -{"zihiragana", 0x3058}, -{"zikatakana", 0x30B8}, -{"zinorhebrew", 0x05AE}, -{"zlinebelow", 0x1E95}, -{"zmonospace", 0xFF5A}, -{"zohiragana", 0x305E}, -{"zokatakana", 0x30BE}, -{"zparen", 0x24B5}, -{"zretroflexhook", 0x0290}, -{"zstroke", 0x01B6}, -{"zuhiragana", 0x305A}, -{"zukatakana", 0x30BA}, - {0x00, 0} -}; - -double_glyph_list_t DoubleGlyphList[] = { -{"dalethatafpatah", {0x05D3, 0x05B2}}, -{"dalethatafpatahhebrew", {0x05D3, 0x05B2}}, -{"dalethatafsegol", {0x05D3, 0x05B1}}, -{"dalethatafsegolhebrew", {0x05D3, 0x05B1}}, -{"dalethiriq", {0x05D3, 0x05B4}}, -{"dalethiriqhebrew", {0x05D3, 0x05B4}}, -{"daletholam", {0x05D3, 0x05B9}}, -{"daletholamhebrew", {0x05D3, 0x05B9}}, -{"daletpatah", {0x05D3, 0x05B7}}, -{"daletpatahhebrew", {0x05D3, 0x05B7}}, -{"daletqamats", {0x05D3, 0x05B8}}, -{"daletqamatshebrew", {0x05D3, 0x05B8}}, -{"daletqubuts", {0x05D3, 0x05BB}}, -{"daletqubutshebrew", {0x05D3, 0x05BB}}, -{"daletsegol", {0x05D3, 0x05B6}}, -{"daletsegolhebrew", {0x05D3, 0x05B6}}, -{"daletsheva", {0x05D3, 0x05B0}}, -{"daletshevahebrew", {0x05D3, 0x05B0}}, -{"dalettsere", {0x05D3, 0x05B5}}, -{"dalettserehebrew", {0x05D3, 0x05B5}}, -{"finalkafqamats", {0x05DA, 0x05B8}}, -{"finalkafqamatshebrew", {0x05DA, 0x05B8}}, -{"finalkafsheva", {0x05DA, 0x05B0}}, -{"finalkafshevahebrew", {0x05DA, 0x05B0}}, -{"hamzadammaarabic", {0x0621, 0x064F}}, -{"hamzadammatanarabic", {0x0621, 0x064C}}, -{"hamzafathaarabic", {0x0621, 0x064E}}, -{"hamzafathatanarabic", {0x0621, 0x064B}}, -{"hamzalowkasraarabic", {0x0621, 0x0650}}, -{"hamzalowkasratanarabic", {0x0621, 0x064D}}, -{"hamzasukunarabic", {0x0621, 0x0652}}, -{"lamedholam", {0x05DC, 0x05B9}}, -{"lamedholamhebrew", {0x05DC, 0x05B9}}, -{"noonhehinitialarabic", {0xFEE7, 0xFEEC}}, -{"qofhatafpatah", {0x05E7, 0x05B2}}, -{"qofhatafpatahhebrew", {0x05E7, 0x05B2}}, -{"qofhatafsegol", {0x05E7, 0x05B1}}, -{"qofhatafsegolhebrew", {0x05E7, 0x05B1}}, -{"qofhiriq", {0x05E7, 0x05B4}}, -{"qofhiriqhebrew", {0x05E7, 0x05B4}}, -{"qofholam", {0x05E7, 0x05B9}}, -{"qofholamhebrew", {0x05E7, 0x05B9}}, -{"qofpatah", {0x05E7, 0x05B7}}, -{"qofpatahhebrew", {0x05E7, 0x05B7}}, -{"qofqamats", {0x05E7, 0x05B8}}, -{"qofqamatshebrew", {0x05E7, 0x05B8}}, -{"qofqubuts", {0x05E7, 0x05BB}}, -{"qofqubutshebrew", {0x05E7, 0x05BB}}, -{"qofsegol", {0x05E7, 0x05B6}}, -{"qofsegolhebrew", {0x05E7, 0x05B6}}, -{"qofsheva", {0x05E7, 0x05B0}}, -{"qofshevahebrew", {0x05E7, 0x05B0}}, -{"qoftsere", {0x05E7, 0x05B5}}, -{"qoftserehebrew", {0x05E7, 0x05B5}}, -{"reshhatafpatah", {0x05E8, 0x05B2}}, -{"reshhatafpatahhebrew", {0x05E8, 0x05B2}}, -{"reshhatafsegol", {0x05E8, 0x05B1}}, -{"reshhatafsegolhebrew", {0x05E8, 0x05B1}}, -{"reshhiriq", {0x05E8, 0x05B4}}, -{"reshhiriqhebrew", {0x05E8, 0x05B4}}, -{"reshholam", {0x05E8, 0x05B9}}, -{"reshholamhebrew", {0x05E8, 0x05B9}}, -{"reshpatah", {0x05E8, 0x05B7}}, -{"reshpatahhebrew", {0x05E8, 0x05B7}}, -{"reshqamats", {0x05E8, 0x05B8}}, -{"reshqamatshebrew", {0x05E8, 0x05B8}}, -{"reshqubuts", {0x05E8, 0x05BB}}, -{"reshqubutshebrew", {0x05E8, 0x05BB}}, -{"reshsegol", {0x05E8, 0x05B6}}, -{"reshsegolhebrew", {0x05E8, 0x05B6}}, -{"reshsheva", {0x05E8, 0x05B0}}, -{"reshshevahebrew", {0x05E8, 0x05B0}}, -{"reshtsere", {0x05E8, 0x05B5}}, -{"reshtserehebrew", {0x05E8, 0x05B5}}, -{"shaddafathatanarabic", {0x0651, 0x064B}}, -{"tchehmeeminitialarabic", {0xFB7C, 0xFEE4}}, - {0x00, {0,0}} -}; - -treble_glyph_list_t TrebleGlyphList[] = { - {"lamedholamdagesh", {0x05DC, 0x05B9, 0x05BC}}, - {"lamedholamdageshhebrew", {0x05DC, 0x05B9, 0x05BC}}, - {"lammeemjeeminitialarabic", {0xFEDF, 0xFEE4, 0xFEA0}}, - {"lammeemkhahinitialarabic", {0xFEDF, 0xFEE4, 0xFEA8}}, - {0x00, {0,0,0}} -}; - -quad_glyph_list_t QuadGlyphList[] = { - {"rehyehaleflamarabic", {0x0631, 0xFEF3, 0xFE8E, 0x0644}}, - {0x00, {0,0,0,0}} -}; diff --git a/devices/vector/gdevagl.h b/devices/vector/gdevagl.h deleted file mode 100644 index e05b53be..00000000 --- a/devices/vector/gdevagl.h +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (C) 2001-2021 Artifex Software, Inc. - All Rights Reserved. - - This software is provided AS-IS with no warranty, either express or - implied. - - This software is distributed under license and may not be copied, - modified or distributed except as expressly authorized under the terms - of the license contained in the file LICENSE in this distribution. - - Refer to licensing information at http://www.artifex.com or contact - Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato, - CA 94945, U.S.A., +1(415)492-9861, for further information. -*/ -/* We need several tables, to hold the glyph names and a variable number of - * Unicode code points. - */ - -#ifndef gdevagl_h_INCLUDED -#define gdevagl_h_INCLUDED - -typedef struct single_glyph_list_s { - const char *Glyph; - unsigned short Unicode; -} single_glyph_list_t; - -typedef struct double_glyph_list_s { - const char *Glyph; - unsigned short Unicode[2]; -} double_glyph_list_t; - -typedef struct treble_glyph_list_s { - const char *Glyph; - unsigned short Unicode[3]; -} treble_glyph_list_t; - -typedef struct quad_glyph_list_s { - const char *Glyph; - unsigned short Unicode[4]; -} quad_glyph_list_t; - -#endif diff --git a/devices/vector/gdevdocxw.c b/devices/vector/gdevdocxw.c index c9be4757..54ab5be7 100644 --- a/devices/vector/gdevdocxw.c +++ b/devices/vector/gdevdocxw.c @@ -30,7 +30,7 @@ #include "gxfcid.h" #include "gxgstate.h" #include "gxpath.h" -#include "gdevagl.h" +#include "gsagl.h" #include "gxdevsop.h" #include "gzpath.h" #include "gdevkrnlsclass.h" /* 'standard' built in subclasses, currently First/Last Page and obejct filter */ @@ -117,7 +117,7 @@ static dev_proc_put_params(docxwrite_put_params); static dev_proc_fill_path(docxwrite_fill_path); static dev_proc_stroke_path(docxwrite_stroke_path); static dev_proc_text_begin(docxwrite_text_begin); -static dev_proc_strip_copy_rop(docxwrite_strip_copy_rop); +static dev_proc_strip_copy_rop2(docxwrite_strip_copy_rop2); static dev_proc_dev_spec_op(docxwrite_dev_spec_op); @@ -144,86 +144,35 @@ typedef struct { private_st_textw_text_enum(); +static void +docxwrite_initialize_device_procs(gx_device *dev) +{ + set_dev_proc(dev, open_device, docxwrite_open_device); + set_dev_proc(dev, output_page, docxwrite_output_page); + set_dev_proc(dev, close_device, docxwrite_close_device); + set_dev_proc(dev, fill_rectangle, docxwrite_fill_rectangle); + set_dev_proc(dev, get_params, docxwrite_get_params); + set_dev_proc(dev, put_params, docxwrite_put_params); + set_dev_proc(dev, get_page_device, gx_page_device_get_page_device); + set_dev_proc(dev, fill_path, docxwrite_fill_path); + set_dev_proc(dev, stroke_path, docxwrite_stroke_path); + set_dev_proc(dev, strip_copy_rop2, docxwrite_strip_copy_rop2); + set_dev_proc(dev, composite, gx_null_composite); + set_dev_proc(dev, text_begin, docxwrite_text_begin); + set_dev_proc(dev, dev_spec_op, docxwrite_dev_spec_op); +} + const gx_device_docxwrite_t gs_docxwrite_device = { /* Define the device as 8-bit gray scale to avoid computing halftones. */ - std_device_dci_body(gx_device_docxwrite_t, 0, "docxwrite", + std_device_dci_body(gx_device_docxwrite_t, + docxwrite_initialize_device_procs, + "docxwrite", DEFAULT_WIDTH_10THS * X_DPI / 10, DEFAULT_HEIGHT_10THS * Y_DPI / 10, X_DPI, Y_DPI, 1, 8, 255, 0, 256, 1), - {docxwrite_open_device, - NULL, /*gx_upright_get_initial_matrix,*/ - NULL, /*gx_default_sync_output,*/ - docxwrite_output_page, - docxwrite_close_device, - NULL, /*gx_default_gray_map_rgb_color,*/ - NULL, /*gx_default_gray_map_color_rgb,*/ - docxwrite_fill_rectangle, /* Can't be NULL and there is no gx_default_fill_rectangle! */ - NULL, /*gx_default_tile_rectangle,*/ - NULL, /*gx_default_copy_mono,*/ - NULL, /*gx_default_copy_color,*/ - NULL, /*gx_default_draw_line,*/ - NULL, /*gx_default_get_bits,*/ - docxwrite_get_params, - docxwrite_put_params, - NULL, /*gx_default_map_cmyk_color,*/ - NULL, /*gx_default_get_xfont_procs,*/ - NULL, /*gx_default_get_xfont_device,*/ - NULL, /*gx_default_map_rgb_alpha_color,*/ - gx_page_device_get_page_device, /*gx_page_device_get_page_device,*/ - NULL, /* get_alpha_bits */ - NULL, /*gx_default_copy_alpha,*/ - NULL, /* get_band */ - NULL, /* copy_rop */ - docxwrite_fill_path, - docxwrite_stroke_path, - NULL, /*gx_default_fill_mask,*/ - NULL, /*gx_default_fill_trapezoid,*/ - NULL, /*gx_default_fill_parallelogram,*/ - NULL, /*gx_default_fill_triangle,*/ - NULL, /*gx_default_draw_thin_line,*/ - NULL, /* begin image */ - NULL, /* image_data */ - NULL, /* end_image */ - NULL, /*gx_default_strip_tile_rectangle,*/ - docxwrite_strip_copy_rop, - NULL, /* get_clipping_box */ - NULL, /* docxwrite_begin_typed_image */ - NULL, /* get_bits_rectangle */ - NULL, /*gx_default_map_color_rgb_alpha,*/ - gx_null_create_compositor, - NULL, /* get_hardware_params */ - docxwrite_text_begin, - NULL, /* finish_copydevice */ - NULL, /* begin_transparency_group */ - NULL, /* end_transparency_group */ - NULL, /* begin_transparency_mask */ - NULL, /* end_transparency_mask */ - NULL, /* discard_transparency_layer */ - NULL, /* get_color_mapping_procs */ - NULL, /* get_color_comp_index */ - NULL, /* encode_color */ - NULL, /* decode_color */ - NULL, /* pattern manager */ - NULL, /* fill_rectangle_hl_color */ - NULL, /* include_color_space */ - NULL, /* fill_linear_color_scanline */ - NULL, /* fill_linear_color_trapezoid */ - NULL, /* fill_linear_color_triangle */ - NULL, /* update_spot_equivalent_colors */ - NULL, /* ret_devn_params */ - NULL, /* fillpage */ - NULL, /* push_transparency_state */ - NULL, /* pop_transparency_state */ - NULL, /* put_image */ - docxwrite_dev_spec_op, /* dev_spec_op */ - NULL, /* copy_planes */ - NULL, /* get_profile */ - NULL, /* set_graphics_type_tag */ - NULL, /* strip_copy_rop2 */ - NULL /* strip_tile_rect_devn */ - }, + { 0 }, /* procs */ { 0 }, /* Page Data */ 0, /* Output FILE * */ 0, /* TextFormat */ @@ -314,7 +263,7 @@ docxwrite_open_device(gx_device * dev) } extract_alloc_exp_min(tdev->alloc, 64); - if (extract_begin(tdev->alloc, &tdev->extract)) { + if (extract_begin(tdev->alloc, extract_format_DOCX, &tdev->extract)) { code = s_errno_to_gs(); goto end; } @@ -423,7 +372,7 @@ docxwrite_output_page(gx_device * dev, int num_copies, int flush) if (tdev->file_per_page) { /* Create a new extract_t for the next page. */ extract_end(&tdev->extract); - if (extract_begin(tdev->alloc, &tdev->extract)) { + if (extract_begin(tdev->alloc, extract_format_DOCX, &tdev->extract)) { code = s_errno_to_gs(); goto end; } @@ -482,14 +431,15 @@ docxwrite_strip_tile_rectangle(gx_device * dev, const gx_strip_bitmap * tiles, } static int -docxwrite_strip_copy_rop(gx_device * dev, +docxwrite_strip_copy_rop2(gx_device * dev, const byte * sdata, int sourcex, uint sraster, gx_bitmap_id id, const gx_color_index * scolors, const gx_strip_bitmap * textures, const gx_color_index * tcolors, int x, int y, int w, int h, - int phase_x, int phase_y, gs_logical_operation_t lop) + int phase_x, int phase_y, gs_logical_operation_t lop, + uint plane_height) { return 0; }*/ @@ -736,7 +686,7 @@ docx_update_text_state(docx_list_entry_t *ppts, gs_matrix smat, tmat; float size; int mask = 0; - int code = gx_path_current_point(penum->path, &cpt); + int code = gx_path_current_point(gs_text_enum_path(penum), &cpt); if (code < 0) return code; @@ -1190,7 +1140,7 @@ textw_text_process(gs_text_enum_t *pte) return code; /* Fall back to the default implementation. */ code = gx_default_text_begin(pte->dev, pte->pgs, &pte->text, pte->current_font, - pte->path, pte->pdcolor, pte->pcpath, pte->memory, &pte_fallback); + pte->pcpath, &pte_fallback); if (code < 0) return code; penum->pte_fallback = pte_fallback; @@ -1291,13 +1241,14 @@ static const gs_text_enum_procs_t textw_text_procs = { static int docxwrite_text_begin(gx_device * dev, gs_gstate * pgs, const gs_text_params_t * text, gs_font * font, - gx_path * path, const gx_device_color * pdcolor, const gx_clip_path * pcpath, - gs_memory_t * mem, gs_text_enum_t ** ppenum) + gs_text_enum_t ** ppenum) { gx_device_docxwrite_t *const tdev = (gx_device_docxwrite_t *) dev; docxw_text_enum_t *penum; int code; + gx_path *path = pgs->path; + gs_memory_t * mem = pgs->memory; /* If this is a stringwidth, we must let the default graphics library code handle it * in case there is no current point (this can happen if this is the first operation @@ -1308,8 +1259,8 @@ docxwrite_text_begin(gx_device * dev, gs_gstate * pgs, */ if ((!(text->operation & TEXT_DO_DRAW) && pgs->text_rendering_mode != 3) || path == 0 || !path_position_valid(path)) - return gx_default_text_begin(dev, pgs, text, font, path, pdcolor, - pcpath, mem, ppenum); + return gx_default_text_begin(dev, pgs, text, font, + pcpath, ppenum); /* Allocate and initialize one of our text enumerators. */ rc_alloc_struct_1(penum, docxw_text_enum_t, &st_textw_text_enum, mem, return_error(gs_error_VMerror), "gdev_textw_text_begin"); @@ -1328,7 +1279,7 @@ docxwrite_text_begin(gx_device * dev, gs_gstate * pgs, memset(penum->text_state, 0x00, sizeof(docx_list_entry_t)); code = gs_text_enum_init((gs_text_enum_t *)penum, &textw_text_procs, - dev, pgs, text, font, path, pdcolor, pcpath, mem); + dev, pgs, text, font, pcpath, mem); if (code < 0) { /* Belt and braces; I'm not certain this is required, but its safe */ gs_free(tdev->memory, penum->text_state, 1, sizeof(docx_list_entry_t), "txtwrite free text state"); @@ -1337,7 +1288,7 @@ docxwrite_text_begin(gx_device * dev, gs_gstate * pgs, return code; } - code = gx_path_current_point(penum->path, &penum->origin); + code = gx_path_current_point(gs_text_enum_path(penum), &penum->origin); if (code != 0) return code; @@ -1347,14 +1298,15 @@ docxwrite_text_begin(gx_device * dev, gs_gstate * pgs, } static int -docxwrite_strip_copy_rop(gx_device * dev, +docxwrite_strip_copy_rop2(gx_device * dev, const byte * sdata, int sourcex, uint sraster, gx_bitmap_id id, const gx_color_index * scolors, const gx_strip_bitmap * textures, const gx_color_index * tcolors, int x, int y, int w, int h, - int phase_x, int phase_y, gs_logical_operation_t lop) + int phase_x, int phase_y, gs_logical_operation_t lop, + uint plane_height) { return 0; } diff --git a/devices/vector/gdevpdf.c b/devices/vector/gdevpdf.c index 35dc6dc2..9ab562c7 100644 --- a/devices/vector/gdevpdf.c +++ b/devices/vector/gdevpdf.c @@ -220,6 +220,40 @@ static dev_proc_close_device(pdf_close); /* ---------------- Device prototype ---------------- */ +static void +pdfwrite_initialize_device_procs(gx_device *dev) +{ + set_dev_proc(dev, open_device, pdf_open); + set_dev_proc(dev, get_initial_matrix, gx_upright_get_initial_matrix); + set_dev_proc(dev, output_page, pdf_output_page); + set_dev_proc(dev, close_device, pdf_close); + set_dev_proc(dev, map_rgb_color, gx_default_rgb_map_rgb_color); + set_dev_proc(dev, map_color_rgb, gx_default_rgb_map_color_rgb); + set_dev_proc(dev, fill_rectangle, gdev_pdf_fill_rectangle); + set_dev_proc(dev, copy_mono, gdev_pdf_copy_mono); + set_dev_proc(dev, copy_color, gdev_pdf_copy_color); + set_dev_proc(dev, get_params, gdev_pdf_get_params); + set_dev_proc(dev, put_params, gdev_pdf_put_params); + set_dev_proc(dev, get_page_device, gx_page_device_get_page_device); + set_dev_proc(dev, fill_path, gdev_pdf_fill_path); + set_dev_proc(dev, stroke_path, gdev_pdf_stroke_path); + set_dev_proc(dev, fill_mask, gdev_pdf_fill_mask); + set_dev_proc(dev, strip_tile_rectangle, gdev_pdf_strip_tile_rectangle); + set_dev_proc(dev, begin_typed_image, gdev_pdf_begin_typed_image); + set_dev_proc(dev, get_bits_rectangle, psdf_get_bits_rectangle); + set_dev_proc(dev, composite, gdev_pdf_composite); + set_dev_proc(dev, text_begin, gdev_pdf_text_begin); + set_dev_proc(dev, begin_transparency_group, gdev_pdf_begin_transparency_group); + set_dev_proc(dev, end_transparency_group, gdev_pdf_end_transparency_group); + set_dev_proc(dev, begin_transparency_mask ,gdev_pdf_begin_transparency_mask); + set_dev_proc(dev, end_transparency_mask, gdev_pdf_end_transparency_mask); + set_dev_proc(dev, fill_rectangle_hl_color, gdev_pdf_fill_rectangle_hl_color); + set_dev_proc(dev, include_color_space, gdev_pdf_include_color_space); + set_dev_proc(dev, fillpage, gdev_pdf_fillpage); + set_dev_proc(dev, dev_spec_op, gdev_pdf_dev_spec_op); + set_dev_proc(dev, fill_stroke_path, gdev_pdf_fill_stroke_path); +} + #define PDF_DEVICE_NAME "pdfwrite" #define PDF_DEVICE_IDENT gs_pdfwrite_device #define PDF_DEVICE_MaxInlineImageSize 4000 @@ -1089,6 +1123,15 @@ round_box_coord(double xy) { return (int)(xy * 100 + 0.5) / 100.0; } +static int check_annot_in_named(void *client_data, const byte *key_data, uint key_size, const cos_value_t *value) +{ + cos_value_t *v = (cos_value_t *)client_data; + + if (value->contents.object == v->contents.object) + return 1; + return 0; +} + static int pdf_write_page(gx_device_pdf *pdev, int page_num) { @@ -1411,8 +1454,16 @@ pdf_write_page(gx_device_pdf *pdev, int page_num) e = cos_array_element_first(page->Annots); while (e != NULL) { next = cos_array_element_next(e, &index, &value); - if (value->contents.object != NULL) - value->contents.object->id = 0; + if (value->contents.object != NULL) { + /* Check to see if this is a local named object, if it is do not + * zero the ID! This object has not yet been written, because it + * is a named object it can be modified after creation. We must + * allow the named object code to write out the object and free it. + */ + if (cos_dict_forall(pdev->local_named_objects, (void *)value, + check_annot_in_named) == 0) + value->contents.object->id = 0; + } e = next; } COS_FREE(page->Annots, "pdf_write_page(Annots)"); @@ -2602,6 +2653,18 @@ pdf_close(gx_device * dev) return_error(gs_error_undefined); dev->is_open = false; + if (pdev->initial_pattern_states != NULL) { + int pdepth = 0; + + while (pdev->initial_pattern_states[pdepth] != 0x00) { + gs_free_object(pdev->pdf_memory->non_gc_memory, pdev->initial_pattern_states[pdepth], "Freeing dangling pattern state"); + pdev->initial_pattern_states[pdepth] = NULL; + pdepth++; + } + gs_free_object(pdev->pdf_memory->non_gc_memory, pdev->initial_pattern_states, "Freeing dangling pattern state stack"); + pdev->initial_pattern_states = NULL; + } + if (pdev->Catalog) Catalog_id = pdev->Catalog->id; if (pdev->Info) diff --git a/devices/vector/gdevpdfb.h b/devices/vector/gdevpdfb.h index c0c3d220..daa6ba0a 100644 --- a/devices/vector/gdevpdfb.h +++ b/devices/vector/gdevpdfb.h @@ -27,88 +27,14 @@ #ifdef PDF_DEVICE_NAME const gx_device_pdf PDF_DEVICE_IDENT = -{std_device_dci_type_body(gx_device_pdf, 0, PDF_DEVICE_NAME, +{std_device_dci_type_body(gx_device_pdf, pdfwrite_initialize_device_procs, + PDF_DEVICE_NAME, &st_device_pdfwrite, DEFAULT_WIDTH_10THS * X_DPI / 10, DEFAULT_HEIGHT_10THS * Y_DPI / 10, X_DPI, Y_DPI, 3, 24, 255, 255, 256, 256), - {pdf_open, - gx_upright_get_initial_matrix, - NULL, /* sync_output */ - pdf_output_page, - pdf_close, - gx_default_rgb_map_rgb_color, - gx_default_rgb_map_color_rgb, - gdev_pdf_fill_rectangle, - NULL, /* tile_rectangle */ - gdev_pdf_copy_mono, - gdev_pdf_copy_color, - NULL, /* draw_line */ - psdf_get_bits, /* get_bits */ - gdev_pdf_get_params, - gdev_pdf_put_params, - NULL, /* map_cmyk_color */ - NULL, /* get_xfont_procs */ - NULL, /* get_xfont_device */ - NULL, /* map_rgb_alpha_color */ - gx_page_device_get_page_device, - NULL, /* get_alpha_bits */ - NULL, /* copy_alpha */ - NULL, /* get_band */ - NULL, /* copy_rop */ - gdev_pdf_fill_path, - gdev_pdf_stroke_path, - gdev_pdf_fill_mask, - NULL, /* fill_trapezoid */ - NULL, /* fill_parallelogram */ - NULL, /* fill_triangle */ - NULL, /* draw_thin_line */ - NULL, /* begin_image */ - NULL, /* image_data */ - NULL, /* end_image */ - gdev_pdf_strip_tile_rectangle, - NULL, /* strip_copy_rop */ - NULL, /* get_clipping_box */ - gdev_pdf_begin_typed_image, - psdf_get_bits_rectangle, /* get_bits_rectangle */ - NULL, /* map_color_rgb_alpha */ - gdev_pdf_create_compositor, /* create_compositor */ - NULL, /* get_hardware_params */ - gdev_pdf_text_begin, - NULL, /* finish_copydevice */ - gdev_pdf_begin_transparency_group, /* begin_transparency_group */ - gdev_pdf_end_transparency_group, /* end_transparency_group */ - gdev_pdf_begin_transparency_mask, /* begin_transparency_mask */ - gdev_pdf_end_transparency_mask, /* end_transparency_mask */ - NULL, /* discard_transparency_layer */ - NULL, /* get_color_mapping_procs */ - NULL, /* get_color_comp_index */ - NULL, /* encode_color */ - NULL, /* decode_color */ - NULL, /* pattern_manage */ - gdev_pdf_fill_rectangle_hl_color, /* fill_rectangle_hl_color */ - gdev_pdf_include_color_space, /* include_color_space */ - NULL, /* fill_linear_color_scanline */ - NULL, /* fill_linear_color_trapezoid */ - NULL, /* fill_linear_color_triangle */ - NULL, /* update_spot_equivalent_colors */ - NULL, /* ret_devn_params */ - gdev_pdf_fillpage, /* fillpage */ - NULL, /* push_transparency_state */ - NULL, /* pop_transparency_state */ - NULL, /* put_image */ - gdev_pdf_dev_spec_op, /* dev_spec_op */ - NULL, /* copy_planes */ - NULL, /* get_profile */ - NULL, /* set_graphics_type_tag */ - NULL, /* strip_copy_rop2 */ - NULL, /* strip_tile_rect_devn */ - NULL, /* copy_alpha_hl_color */ - NULL, /* process_page */ - NULL, /* transform_pixel_region */ - gdev_pdf_fill_stroke_path /* fill_stroke_path */ - }, + { 0 }, psdf_initial_values(PSDF_VERSION_INITIAL, 0 /*false */ ), /* (!ASCII85EncodePages) */ 0, /* pdf_font_dir */ PDF_FOR_OPDFREAD, /* is_ps2write */ @@ -309,7 +235,8 @@ const gx_device_pdf PDF_DEVICE_IDENT = NULL, /* OCRUnicode */ 0, /* OCR_char_code */ 0, /* OCR_glyph */ - NULL /* ocr_glyphs */ + NULL, /* ocr_glyphs */ + 0 /* initial_pattern_state */ }; #else diff --git a/devices/vector/gdevpdfd.c b/devices/vector/gdevpdfd.c index 32f75555..c7cad3e5 100644 --- a/devices/vector/gdevpdfd.c +++ b/devices/vector/gdevpdfd.c @@ -181,6 +181,47 @@ pdf_dorect(gx_device_vector * vdev, fixed x0, fixed y0, fixed x1, fixed y1, ymin -= d; ymax += d; } + if (pdev->PDFA == 1) { + /* Check values, and decide how to proceed based on PDFACompatibilitylevel */ + if (x0 < xmin || y0 < ymin || x1 - x0 > xmax || y1 - y0 >ymax) { + switch(pdev->PDFACompatibilityPolicy) { + case 0: + emprintf(pdev->memory, + "Required co-ordinate outside valid range for PDF/A-1, reverting to normal PDF output.\n"); + pdev->AbortPDFAX = true; + pdev->PDFA = 0; + break; + case 1: + emprintf(pdev->memory, + "Required co-ordinate outside valid range for PDF/A-1, clamping to valid range, output may be incorrect.\n"); + /* + * Clamp coordinates to avoid tripping over Acrobat Reader's limit + * of 32K on user coordinate values, which was adopted by the PDF/A-1 spec. + */ + if (x0 < xmin) + x0 = xmin; + + if (y0 < ymin) + y0 = ymin; + + /* We used to clamp x1 and y1 here, but actually, because this is a rectangle + * we don't need to do that, we need to clamp the *difference* between x0,x1 + * and y0,y1 to keep it inside the Acrobat 4 or 5 limits. + */ + if (x1 - x0 > xmax) + x1 = x0 + xmax; + if (y1 - y0 > ymax) + y1 = y0 + ymax; + break; + default: + case 2: + emprintf(pdev->memory, + "Required co-ordinate outside valid range for PDF/A-1, aborting.\n"); + return_error(gs_error_limitcheck); + break; + } + } + } return psdf_dorect(vdev, x0, y0, x1, y1, type); } @@ -780,6 +821,38 @@ pdf_put_clip_path(gx_device_pdf * pdev, const gx_clip_path * pcpath) } /* + * Compute the scaling to ensure that user coordinates for a path are within + * PDF/A-1 valid range. Return true if scaling was needed. In this case, the + * CTM will be multiplied by *pscale, and all coordinates will be divided by + * *pscale. + */ +static bool +make_rect_scaling(const gx_device_pdf *pdev, const gs_fixed_rect *bbox, + double prescale, double *pscale) +{ + double bmin, bmax; + + if (pdev->PDFA != 1) { + *pscale = 1; + return false; + } + + bmin = min(bbox->p.x / pdev->scale.x, bbox->p.y / pdev->scale.y) * prescale; + bmax = max(bbox->q.x / pdev->scale.x, bbox->q.y / pdev->scale.y) * prescale; + if (bmin <= int2fixed(-MAX_USER_COORD) || + bmax > int2fixed(MAX_USER_COORD) + ) { + /* Rescale the path. */ + *pscale = max(bmin / int2fixed(-MAX_USER_COORD), + bmax / int2fixed(MAX_USER_COORD)); + return true; + } else { + *pscale = 1; + return false; + } +} + +/* * Prepare a fill with a color anc a clipping path. * Return 1 if there is nothing to paint. * Changes *box to the clipping box. @@ -1543,22 +1616,24 @@ gdev_pdf_fill_path(gx_device * dev, const gs_gstate * pgs, gx_path * ppath, pi.saved = pgs2; code = gx_path_bbox(ppath, &bbox); if (code < 0) - return code; + goto image_exit; rect_intersect(bbox, box); code = gx_dc_pattern2_get_bbox(pdcolor, &bbox1); if (code < 0) - return code; + goto image_exit; if (code) rect_intersect(bbox, bbox1); - if (bbox.p.x >= bbox.q.x || bbox.p.y >= bbox.q.y) - return 0; + if (bbox.p.x >= bbox.q.x || bbox.p.y >= bbox.q.y) { + code = 0; + goto image_exit; + } sx = fixed2int(bbox.p.x); sy = fixed2int(bbox.p.y); gs_make_identity(&m); rect_size.x = fixed2int(bbox.q.x + fixed_half) - sx; rect_size.y = fixed2int(bbox.q.y + fixed_half) - sy; if (rect_size.x == 0 || rect_size.y == 0) - return 0; + goto image_exit; m.tx = (float)sx; m.ty = (float)sy; cvd.path_offset.x = sx; @@ -1614,6 +1689,7 @@ gdev_pdf_fill_path(gx_device * dev, const gs_gstate * pgs, gx_path * ppath, stream_puts(pdev->strm, "Q Q\n"); pdf_remove_masked_image_converter(pdev, &cvd, need_mask); gs_setmatrix((gs_gstate *)pgs, &save_ctm); +image_exit: gs_gstate_free(pgs2); return code; } @@ -1622,6 +1698,8 @@ gdev_pdf_fill_path(gx_device * dev, const gs_gstate * pgs, gx_path * ppath, return code; { stream *s = pdev->strm; + double scale; + gs_matrix smat, *psmat = NULL; gs_path_enum cenum; gdev_vector_dopath_state_t state; @@ -1634,11 +1712,19 @@ gdev_pdf_fill_path(gx_device * dev, const gs_gstate * pgs, gx_path * ppath, pprintg1(s, "%g i\n", params->flatness); pdev->state.flatness = params->flatness; } + if (make_rect_scaling(pdev, &box1, 1.0, &scale)) { + gs_make_scaling(pdev->scale.x * scale, pdev->scale.y * scale, + &smat); + pdf_put_matrix(pdev, "q ", &smat, "cm\n"); + psmat = &smat; + } code = pdf_write_path(pdev, (gs_path_enum *)&cenum, &state, (gx_path *)ppath, 0, gx_path_type_fill | gx_path_type_optimize, NULL); if (code < 0) return code; stream_puts(s, (params->rule < 0 ? "f\n" : "f*\n")); + if (psmat != NULL) + stream_puts(pdev->strm, "Q\n"); } return 0; } @@ -1652,9 +1738,10 @@ gdev_pdf_stroke_path(gx_device * dev, const gs_gstate * pgs, gx_device_pdf *pdev = (gx_device_pdf *) dev; stream *s; int code; - double scale; + double scale, path_scale; bool set_ctm; gs_matrix mat; + double prescale = 1; gs_fixed_rect bbox; gs_path_enum cenum; gdev_vector_dopath_state_t state; @@ -1740,6 +1827,20 @@ gdev_pdf_stroke_path(gx_device * dev, const gs_gstate * pgs, scale = fabs(pgs->ctm.xx + pgs->ctm.xy + pgs->ctm.yx + pgs->ctm.yy) /* Using the non-zero coeff. */ / sqrt(2); /* Empirically from Adobe. */ } + if (set_ctm && pdev->PDFA == 1) { + /* + * We want a scaling factor that will bring the largest reasonable + * user coordinate within bounds. We choose a factor based on the + * minor axis of the transformation. Thanks to Raph Levien for + * the following formula. + */ + double a = mat.xx, b = mat.xy, c = mat.yx, d = mat.yy; + double u = fabs(a * d - b * c); + double v = a * a + b * b + c * c + d * d; + double minor = (sqrt(v + 2 * u) - sqrt(v - 2 * u)) * 0.5; + + prescale = (minor == 0 || minor > 1 ? 1 : 1 / minor); + } gx_path_bbox(ppath, &bbox); { /* Check whether a painting appears inside the clipping box. @@ -1772,6 +1873,15 @@ gdev_pdf_stroke_path(gx_device * dev, const gs_gstate * pgs, if (stroke_bbox.q.x < stroke_bbox.p.x || stroke_bbox.q.y < stroke_bbox.p.y) return 0; } + if (make_rect_scaling(pdev, &bbox, prescale, &path_scale)) { + scale /= path_scale; + if (set_ctm) + gs_matrix_scale(&mat, path_scale, path_scale, &mat); + else { + gs_make_scaling(path_scale, path_scale, &mat); + set_ctm = true; + } + } code = gdev_vector_prepare_stroke((gx_device_vector *)pdev, pgs, params, pdcolor, scale); if (code < 0) @@ -1838,7 +1948,8 @@ gdev_pdf_fill_stroke_path(gx_device *dev, const gs_gstate *pgs, gx_path *ppath, } else { bool set_ctm; gs_matrix mat; - double scale; + double scale, path_scale; + double prescale = 1; gs_fixed_rect bbox; gs_path_enum cenum; gdev_vector_dopath_state_t state; @@ -1901,6 +2012,20 @@ gdev_pdf_fill_stroke_path(gx_device *dev, const gs_gstate *pgs, gx_path *ppath, scale = fabs(pgs->ctm.xx + pgs->ctm.xy + pgs->ctm.yx + pgs->ctm.yy) /* Using the non-zero coeff. */ / sqrt(2); /* Empirically from Adobe. */ } + if (pdev->PDFA == 1 && set_ctm) { + /* + * We want a scaling factor that will bring the largest reasonable + * user coordinate within bounds. We choose a factor based on the + * minor axis of the transformation. Thanks to Raph Levien for + * the following formula. + */ + double a = mat.xx, b = mat.xy, c = mat.yx, d = mat.yy; + double u = fabs(a * d - b * c); + double v = a * a + b * b + c * c + d * d; + double minor = (sqrt(v + 2 * u) - sqrt(v - 2 * u)) * 0.5; + + prescale = (minor == 0 || minor > 1 ? 1 : 1 / minor); + } gx_path_bbox(ppath, &bbox); { /* Check whether a painting appears inside the clipping box. @@ -1933,6 +2058,15 @@ gdev_pdf_fill_stroke_path(gx_device *dev, const gs_gstate *pgs, gx_path *ppath, if (stroke_bbox.q.x < stroke_bbox.p.x || stroke_bbox.q.y < stroke_bbox.p.y) return 0; } + if (make_rect_scaling(pdev, &bbox, prescale, &path_scale)) { + scale /= path_scale; + if (set_ctm) + gs_matrix_scale(&mat, path_scale, path_scale, &mat); + else { + gs_make_scaling(path_scale, path_scale, &mat); + set_ctm = true; + } + } code = pdf_setfillcolor((gx_device_vector *)pdev, pgs, pdcolor_fill); if (code == gs_error_rangecheck) { @@ -1987,6 +2121,8 @@ gdev_pdf_fill_rectangle_hl_color(gx_device *dev, const gs_fixed_rect *rect, int code; gs_fixed_rect box1 = *rect, box = box1; gx_device_pdf *pdev = (gx_device_pdf *) dev; + double scale; + gs_matrix smat, *psmat = NULL; const bool convert_to_image = (pdev->CompatibilityLevel <= 1.2 && gx_dc_is_pattern2_color(pdcolor)); @@ -2005,9 +2141,16 @@ gdev_pdf_fill_rectangle_hl_color(gx_device *dev, const gs_fixed_rect *rect, rect_intersect(box1, box); if (box1.p.x > box1.q.x || box1.p.y > box1.q.y) return 0; /* outside the clipping path */ + if (make_rect_scaling(pdev, &box1, 1.0, &scale)) { + gs_make_scaling(pdev->scale.x * scale, pdev->scale.y * scale, &smat); + pdf_put_matrix(pdev, "q ", &smat, "cm\n"); + psmat = &smat; + } pprintg4(pdev->strm, "%g %g %g %g re f\n", - fixed2float(box1.p.x), fixed2float(box1.p.y), - fixed2float(box1.q.x - box1.p.x) , fixed2float(box1.q.y - box1.p.y)); + fixed2float(box1.p.x) / scale, fixed2float(box1.p.y) / scale, + fixed2float(box1.q.x - box1.p.x) / scale, fixed2float(box1.q.y - box1.p.y) / scale); + if (psmat != NULL) + stream_puts(pdev->strm, "Q\n"); if (pdev->Eps2Write) { gs_rect *Box; diff --git a/devices/vector/gdevpdfg.c b/devices/vector/gdevpdfg.c index f08acb7c..6feec8b0 100644 --- a/devices/vector/gdevpdfg.c +++ b/devices/vector/gdevpdfg.c @@ -215,9 +215,9 @@ pdf_viewer_state_from_gs_gstate_aux(pdf_viewer_state *pvs, const gs_gstate *pgs) pvs->strokeconstantalpha = pgs->strokeconstantalpha; pvs->alphaisshape = pgs->alphaisshape; pvs->blend_mode = pgs->blend_mode; - pvs->halftone_id = (pgs->dev_ht != 0 ? pgs->dev_ht->id : 0); - pvs->black_generation_id = (pgs->black_generation != 0 ? pgs->black_generation->id : 0); - pvs->undercolor_removal_id = (pgs->undercolor_removal != 0 ? pgs->undercolor_removal->id : 0); + pvs->halftone_id = (pgs->dev_ht[HT_OBJTYPE_DEFAULT] != NULL ? pgs->dev_ht[HT_OBJTYPE_DEFAULT]->id : 0); + pvs->black_generation_id = (pgs->black_generation != NULL ? pgs->black_generation->id : 0); + pvs->undercolor_removal_id = (pgs->undercolor_removal != NULL ? pgs->undercolor_removal->id : 0); pvs->overprint_mode = 0; pvs->flatness = pgs->flatness; pvs->smoothness = pgs->smoothness; @@ -2713,7 +2713,7 @@ pdf_update_halftone(gx_device_pdf *pdev, const gs_gstate *pgs, char *hts) { const gs_halftone *pht = pgs->halftone; - const gx_device_halftone *pdht = pgs->dev_ht; + const gx_device_halftone *pdht = pgs->dev_ht[HT_OBJTYPE_DEFAULT]; int code; long id; @@ -2749,7 +2749,7 @@ pdf_update_halftone(gx_device_pdf *pdev, const gs_gstate *pgs, if (code < 0) return code; gs_sprintf(hts, "%ld 0 R", id); - pdev->halftone_id = pgs->dev_ht->id; + pdev->halftone_id = pgs->dev_ht[HT_OBJTYPE_DEFAULT]->id; return code; } @@ -2910,22 +2910,24 @@ pdf_update_alpha(gx_device_pdf *pdev, const gs_gstate *pgs, pdev->state.strokeconstantalpha != pgs->strokeconstantalpha || pdev->state.fillconstantalpha != pgs->fillconstantalpha) { - pdev->state.strokeconstantalpha = pgs->strokeconstantalpha; - pdev->state.fillconstantalpha = pgs->fillconstantalpha; - pdev->state.alphaisshape = pgs->alphaisshape; - code = pdf_open_gstate(pdev, ppres); if (code < 0) return code; + code = cos_dict_put_c_key_bool(resource_dict(*ppres), "/AIS", pgs->alphaisshape); if (code < 0) return code; + pdev->state.alphaisshape = pgs->alphaisshape; code = cos_dict_put_c_key_real(resource_dict(*ppres), "/CA", pgs->strokeconstantalpha); if (code < 0) return code; - return cos_dict_put_c_key_real(resource_dict(*ppres), "/ca", pgs->fillconstantalpha); - } else - return 0; + pdev->state.strokeconstantalpha = pgs->strokeconstantalpha; + code = cos_dict_put_c_key_real(resource_dict(*ppres), "/ca", pgs->fillconstantalpha); + if (code < 0) + return code; + pdev->state.fillconstantalpha = pgs->fillconstantalpha; + } + return 0; } /* @@ -2986,7 +2988,7 @@ pdf_prepare_drawing(gx_device_pdf *pdev, const gs_gstate *pgs, hts[0] = trs[0] = bgs[0] = ucrs[0] = 0; if (pdev->params.PreserveHalftoneInfo && - pdev->halftone_id != pgs->dev_ht->id && + pdev->halftone_id != pgs->dev_ht[HT_OBJTYPE_DEFAULT]->id && !pdev->PDFX ) { code = pdf_update_halftone(pdev, pgs, hts); diff --git a/devices/vector/gdevpdfi.c b/devices/vector/gdevpdfi.c index 08e217fa..82e8f7a2 100644 --- a/devices/vector/gdevpdfi.c +++ b/devices/vector/gdevpdfi.c @@ -80,6 +80,7 @@ typedef struct pdf_image_enum_s { gs_matrix mat; gs_color_space_index initial_colorspace; int JPEG_PassThrough; + int JPX_PassThrough; } pdf_image_enum; gs_private_st_composite(st_pdf_image_enum, pdf_image_enum, "pdf_image_enum", pdf_image_enum_enum_ptrs, pdf_image_enum_reloc_ptrs); @@ -1115,6 +1116,7 @@ pdf_begin_typed_image(gx_device_pdf *pdev, const gs_gstate * pgs, * should get the data. But lets get the simple code working first. */ pdev->JPEG_PassThrough = 0; + pdev->JPX_PassThrough = 0; pdev->image_mask_is_SMask = false; if (pdev->CompatibilityLevel < 1.2 || (prect && !(prect->p.x == 0 && prect->p.y == 0 && @@ -1128,6 +1130,7 @@ pdf_begin_typed_image(gx_device_pdf *pdev, const gs_gstate * pgs, case IMAGE3X_IMAGETYPE: pdev->JPEG_PassThrough = 0; + pdev->JPX_PassThrough = 0; if (pdev->CompatibilityLevel < 1.4 || (prect && !(prect->p.x == 0 && prect->p.y == 0 && prect->q.x == ((const gs_image3x_t *)pic)->Width && @@ -1195,6 +1198,7 @@ pdf_begin_typed_image(gx_device_pdf *pdev, const gs_gstate * pgs, * the image. */ pdev->JPEG_PassThrough = 0; + pdev->JPX_PassThrough = 0; use_fallback = 0; code = convert_type4_to_masked_image(pdev, pgs, pic, prect, pdcolor, pcpath, mem,pinfo); @@ -1207,6 +1211,7 @@ pdf_begin_typed_image(gx_device_pdf *pdev, const gs_gstate * pgs, } } pdev->JPEG_PassThrough = 0; + pdev->JPX_PassThrough = 0; code = convert_type4_image(pdev, pgs, pmat, pic, prect, pdcolor, pcpath, mem, pinfo, context, image, pnamed); if (code < 0) @@ -1447,12 +1452,16 @@ pdf_begin_typed_image(gx_device_pdf *pdev, const gs_gstate * pgs, if (code < 0) goto fail_and_fallback; + if (pdev->CompatibilityLevel < 1.5) + pdev->JPX_PassThrough = 0; + if (!convert_to_process_colors) { gs_color_space_index csi; if (pdev->params.TransferFunctionInfo == tfi_Apply && pdev->transfer_not_identity && !is_mask) { pdev->JPEG_PassThrough = 0; + pdev->JPX_PassThrough = 0; csi = gs_color_space_get_index(image[0].pixel.ColorSpace); if (csi == gs_color_space_index_Indexed) { csi = gs_color_space_get_index(image[0].pixel.ColorSpace->base_space); @@ -1503,7 +1512,7 @@ pdf_begin_typed_image(gx_device_pdf *pdev, const gs_gstate * pgs, } /* If we are not preserving the colour space unchanged, then we can't pass through JPEG */ else - pdev->JPEG_PassThrough = 0; + pdev->JPEG_PassThrough = pdev->JPX_PassThrough = 0; /* Code below here deals with setting up the multiple data stream writing. * We can have up to 4 stream writers, which we keep in an array. We must @@ -1518,6 +1527,7 @@ pdf_begin_typed_image(gx_device_pdf *pdev, const gs_gstate * pgs, */ if (in_line) { pdev->JPEG_PassThrough = 0; + pdev->JPX_PassThrough = 0; code = new_setup_lossless_filters((gx_device_psdf *) pdev, &pie->writer.binary[0], &image[0].pixel, in_line, convert_to_process_colors, (gs_matrix *)pmat, (gs_gstate *)pgs); @@ -1559,7 +1569,7 @@ pdf_begin_typed_image(gx_device_pdf *pdev, const gs_gstate * pgs, image[0].pixel.ColorSpace = pcs_device; } - if (pdev->JPEG_PassThrough) { + if (pdev->JPEG_PassThrough || pdev->JPX_PassThrough) { /* if (pie->writer.alt_writer_count > 1) { s_close_filters(&pie->writer.binary[0].strm, uncompressed); memset(pie->writer.binary + 1, 0, sizeof(pie->writer.binary[1])); @@ -1569,6 +1579,7 @@ pdf_begin_typed_image(gx_device_pdf *pdev, const gs_gstate * pgs, pie->writer.alt_writer_count = 1; } pie->JPEG_PassThrough = pdev->JPEG_PassThrough; + pie->JPX_PassThrough = pdev->JPX_PassThrough; if (pie->writer.alt_writer_count > 1) { code = pdf_make_alt_stream(pdev, &pie->writer.binary[1]); @@ -1681,6 +1692,7 @@ pdf_begin_typed_image(gx_device_pdf *pdev, const gs_gstate * pgs, /* Do the fallback */ if (use_fallback) { pdev->JPEG_PassThrough = 0; + pdev->JPX_PassThrough = 0; code = gx_default_begin_typed_image ((gx_device *)pdev, pgs, pmat, pic, prect, pdcolor, pcpath, mem, pinfo); } @@ -1789,7 +1801,7 @@ pdf_image_plane_data(gx_image_enum_common_t * info, pdf_image_enum *pie = (pdf_image_enum *) info; int i; - if (pie->JPEG_PassThrough) { + if (pie->JPEG_PassThrough || pie->JPX_PassThrough) { pie->rows_left -= height; *rows_used = height; return !pie->rows_left; @@ -2291,6 +2303,81 @@ check_unsubstituted1(gx_device_pdf * pdev, pdf_resource_t *pres0) return ppat->substitute != NULL; } +static int reset_gstate_for_pattern(gx_device_pdf * pdev, gs_gstate *destination, gs_gstate *source) +{ + if (pdev->vg_initial_set) { + destination->strokeconstantalpha = source->strokeconstantalpha; + source->strokeconstantalpha = pdev->vg_initial.strokeconstantalpha; + destination->fillconstantalpha = source->fillconstantalpha; + source->fillconstantalpha = pdev->vg_initial.fillconstantalpha; + if (destination->set_transfer.red != NULL) + destination->set_transfer.red->id = (source->set_transfer.red != NULL ? source->set_transfer.red->id : 0); + if (destination->set_transfer.green != NULL) + destination->set_transfer.green->id = (source->set_transfer.green != NULL ? source->set_transfer.green->id : 0); + if (destination->set_transfer.blue != NULL) + destination->set_transfer.blue->id = (source->set_transfer.blue != NULL ? source->set_transfer.blue->id : 0); + if (destination->set_transfer.gray != NULL) + destination->set_transfer.gray->id = (source->set_transfer.gray != NULL ? source->set_transfer.gray->id : 0); + if (source->set_transfer.red != NULL) + source->set_transfer.red->id = pdev->vg_initial.transfer_ids[0]; + if (source->set_transfer.green != NULL) + source->set_transfer.green->id = pdev->vg_initial.transfer_ids[1]; + if (source->set_transfer.blue != NULL) + source->set_transfer.blue->id = pdev->vg_initial.transfer_ids[2]; + if (source->set_transfer.gray != NULL) + source->set_transfer.gray->id = pdev->vg_initial.transfer_ids[3]; + destination->alphaisshape = source->alphaisshape; + source->alphaisshape = pdev->vg_initial.alphaisshape; + destination->blend_mode = source->blend_mode; + source->blend_mode = pdev->vg_initial.blend_mode; + if (destination->black_generation != NULL) + destination->black_generation->id = (source->black_generation != NULL ? source->black_generation->id : 0); + if (source->black_generation != NULL) + source->black_generation->id = pdev->vg_initial.black_generation_id; + if (destination->undercolor_removal != NULL) + destination->undercolor_removal->id = (source->undercolor_removal != NULL ? source->undercolor_removal->id : 0); + if (source->undercolor_removal != NULL) + source->undercolor_removal->id = pdev->vg_initial.undercolor_removal_id; + destination->overprint_mode = source->overprint_mode; + source->overprint_mode = pdev->vg_initial.overprint_mode; + destination->flatness = source->flatness; + source->flatness = pdev->vg_initial.flatness; + destination->smoothness = source->smoothness; + source->smoothness = pdev->vg_initial.smoothness; + destination->flatness = source->flatness; + source->flatness = pdev->vg_initial.flatness; + destination->text_knockout = source->text_knockout; + source->text_knockout = pdev->vg_initial.text_knockout; + destination->stroke_adjust = source->stroke_adjust; + source->stroke_adjust = pdev->vg_initial.stroke_adjust; + destination->line_params.half_width = source->line_params.half_width; + source->line_params.half_width = pdev->vg_initial.line_params.half_width; + destination->line_params.start_cap = source->line_params.start_cap; + source->line_params.start_cap = pdev->vg_initial.line_params.start_cap; + destination->line_params.end_cap = source->line_params.end_cap; + source->line_params.end_cap = pdev->vg_initial.line_params.end_cap; + destination->line_params.dash_cap = source->line_params.dash_cap; + source->line_params.dash_cap = pdev->vg_initial.line_params.dash_cap; + destination->line_params.join = source->line_params.join; + source->line_params.join = pdev->vg_initial.line_params.join; + destination->line_params.curve_join = source->line_params.curve_join; + source->line_params.curve_join = pdev->vg_initial.line_params.curve_join; + destination->line_params.miter_limit = source->line_params.miter_limit; + source->line_params.miter_limit = pdev->vg_initial.line_params.miter_limit; + destination->line_params.miter_check = source->line_params.miter_check; + source->line_params.miter_check = pdev->vg_initial.line_params.miter_check; + destination->line_params.dot_length = source->line_params.dot_length; + source->line_params.dot_length = pdev->vg_initial.line_params.dot_length; + destination->line_params.dot_length_absolute = source->line_params.dot_length_absolute; + source->line_params.dot_length_absolute = pdev->vg_initial.line_params.dot_length_absolute; + destination->line_params.dot_orientation = source->line_params.dot_orientation; + source->line_params.dot_orientation = pdev->vg_initial.line_params.dot_orientation; + memcpy(&destination->line_params.dash, &source->line_params.dash, sizeof(source->line_params.dash)); + memcpy(&source->line_params.dash, &pdev->vg_initial.line_params.dash, sizeof(source->line_params.dash)); + } + return 0; +} + /* The device specific operations - just pattern management. See gxdevcli.h about return codes. @@ -2304,6 +2391,8 @@ gdev_pdf_dev_spec_op(gx_device *pdev1, int dev_spec_op, void *data, int size) gx_bitmap_id id = (gx_bitmap_id)size; switch (dev_spec_op) { + case gxdso_supports_pattern_transparency: + return 1; case gxdso_pattern_can_accum: return 1; case gxdso_pdf_form_name: @@ -2608,10 +2697,50 @@ gdev_pdf_dev_spec_op(gx_device *pdev1, int dev_spec_op, void *data, int size) code = pdf_check_soft_mask(pdev, (gs_gstate *)pgs); if (code < 0) return code; + if (pdev->context == PDF_IN_NONE) { + code = pdf_open_page(pdev, PDF_IN_STREAM); + if (code < 0) + return code; + } + code = pdf_prepare_fill_stroke(pdev, (gs_gstate *)pgs, false); + if (code < 0) + return code; + if (pdev->PatternDepth == 0 && pdev->initial_pattern_states != NULL) { + int pdepth = 0; + + while (pdev->initial_pattern_states[pdepth] != 0x00) { + gs_free_object(pdev->pdf_memory->non_gc_memory, pdev->initial_pattern_states[pdepth], "Freeing dangling pattern state"); + pdev->initial_pattern_states[pdepth] = NULL; + pdepth++; + } + gs_free_object(pdev->pdf_memory->non_gc_memory, pdev->initial_pattern_states, "Freeing dangling pattern state stack"); + } + + { + gs_gstate **new_states; + int pdepth; + + new_states = (gs_gstate **)gs_alloc_bytes(pdev->pdf_memory->non_gc_memory, sizeof(gs_gstate *) * (pdev->PatternDepth + 2), "pattern initial graphics state stack"); + memset(new_states, 0x00, sizeof(gs_gstate *) * (pdev->PatternDepth + 2)); + for (pdepth = 0; pdepth < pdev->PatternDepth;pdepth++) + new_states[pdepth] = pdev->initial_pattern_states[pdepth]; + gs_free_object(pdev->pdf_memory->non_gc_memory, pdev->initial_pattern_states, "Freeing old pattern state stack"); + pdev->initial_pattern_states = new_states; + } + pdev->initial_pattern_states[pdev->PatternDepth] = (gs_gstate *)gs_alloc_bytes(pdev->pdf_memory->non_gc_memory, sizeof(gs_gstate), "pattern initial graphics state"); + if (pdev->initial_pattern_states[pdev->PatternDepth] == NULL) + return code; + memset(pdev->initial_pattern_states[pdev->PatternDepth], 0x00, sizeof(gs_gstate)); + + reset_gstate_for_pattern(pdev, pdev->initial_pattern_states[pdev->PatternDepth], pgs); code = pdf_enter_substream(pdev, resourcePattern, id, &pres, false, pdev->CompressStreams); - if (code < 0) + if (code < 0) { + gs_free_object(pdev->pdf_memory->non_gc_memory, pdev->initial_pattern_states[pdev->PatternDepth], "Freeing dangling pattern state"); + pdev->initial_pattern_states[pdev->PatternDepth] = NULL; return code; + } + /* We have started a new substream, to avoid confusing the 'saved viewer state' * (the stack of pdfwrite's saved copies of graophics states) we need to reset the * soft_mask_id, which is the ID of the SMask we have already created in the pdfwrite @@ -2622,8 +2751,11 @@ gdev_pdf_dev_spec_op(gx_device *pdev1, int dev_spec_op, void *data, int size) pdev->state.soft_mask_id = pgs->soft_mask_id; pres->rid = id; code = pdf_store_pattern1_params(pdev, pres, pinst); - if (code < 0) + if (code < 0) { + gs_free_object(pdev->pdf_memory->non_gc_memory, pdev->initial_pattern_states[pdev->PatternDepth], "Freeing dangling pattern state"); + pdev->initial_pattern_states[pdev->PatternDepth] = NULL; return code; + } /* Scale the coordinate system, because object handlers assume so. See none_to_stream. */ pprintg2(pdev->strm, "%g 0 0 %g 0 0 cm\n", 72.0 / pdev->HWResolution[0], 72.0 / pdev->HWResolution[1]); @@ -2632,43 +2764,68 @@ gdev_pdf_dev_spec_op(gx_device *pdev1, int dev_spec_op, void *data, int size) } return 1; case gxdso_pattern_finish_accum: - if (pdev->CompatibilityLevel <= 1.7) { - if (pdev->substream_Resources == NULL) { - pdev->substream_Resources = cos_dict_alloc(pdev, "pdf_pattern(Resources)"); - if (pdev->substream_Resources == NULL) - return_error(gs_error_VMerror); + { + pattern_accum_param_s *param = (pattern_accum_param_s *)data; + gs_gstate *pgs = param->graphics_state; + + if (pdev->CompatibilityLevel <= 1.7) { + if (pdev->substream_Resources == NULL) { + pdev->substream_Resources = cos_dict_alloc(pdev, "pdf_pattern(Resources)"); + if (pdev->substream_Resources == NULL) + return_error(gs_error_VMerror); + } + code = pdf_add_procsets(pdev->substream_Resources, pdev->procsets); + if (code < 0) { + gs_free_object(pdev->pdf_memory->non_gc_memory, pdev->initial_pattern_states[pdev->PatternDepth], "Freeing dangling pattern state"); + pdev->initial_pattern_states[pdev->PatternDepth] = NULL; + return code; + } } - code = pdf_add_procsets(pdev->substream_Resources, pdev->procsets); - if (code < 0) + pres = pres1 = pdev->accumulating_substream_resource; + code = pdf_exit_substream(pdev); + if (code < 0) { + gs_free_object(pdev->pdf_memory->non_gc_memory, pdev->initial_pattern_states[pdev->PatternDepth], "Freeing dangling pattern state"); + pdev->initial_pattern_states[pdev->PatternDepth] = NULL; return code; - } - pres = pres1 = pdev->accumulating_substream_resource; - code = pdf_exit_substream(pdev); - if (code < 0) - return code; - if (pdev->substituted_pattern_count > 300 && - pdev->substituted_pattern_drop_page != pdev->next_page) { /* arbitrary */ - pdf_drop_resources(pdev, resourcePattern, check_unsubstituted1); - pdev->substituted_pattern_count = 0; - pdev->substituted_pattern_drop_page = pdev->next_page; - } - code = pdf_find_same_resource(pdev, resourcePattern, &pres, check_unsubstituted2); - if (code < 0) - return code; - if (code > 0) { - pdf_pattern_t *ppat = (pdf_pattern_t *)pres1; - - code = pdf_cancel_resource(pdev, pres1, resourcePattern); - if (code < 0) + } + if (pdev->substituted_pattern_count > 300 && + pdev->substituted_pattern_drop_page != pdev->next_page) { /* arbitrary */ + pdf_drop_resources(pdev, resourcePattern, check_unsubstituted1); + pdev->substituted_pattern_count = 0; + pdev->substituted_pattern_drop_page = pdev->next_page; + } + code = pdf_find_same_resource(pdev, resourcePattern, &pres, check_unsubstituted2); + if (code < 0) { + gs_free_object(pdev->pdf_memory->non_gc_memory, pdev->initial_pattern_states[pdev->PatternDepth], "Freeing dangling pattern state"); + pdev->initial_pattern_states[pdev->PatternDepth] = NULL; return code; - /* Do not remove pres1, because it keeps the substitution. */ - ppat->substitute = (pdf_pattern_t *)pres; - pres->where_used |= pdev->used_mask; - pdev->substituted_pattern_count++; - } else if (pres->object->id < 0) - pdf_reserve_object_id(pdev, pres, 0); - pdev->PatternDepth--; - pdev->PatternsSinceForm--; + } + if (code > 0) { + pdf_pattern_t *ppat = (pdf_pattern_t *)pres1; + + code = pdf_cancel_resource(pdev, pres1, resourcePattern); + if (code < 0) { + gs_free_object(pdev->pdf_memory->non_gc_memory, pdev->initial_pattern_states[pdev->PatternDepth], "Freeing dangling pattern state"); + pdev->initial_pattern_states[pdev->PatternDepth] = NULL; + return code; + } + /* Do not remove pres1, because it keeps the substitution. */ + ppat->substitute = (pdf_pattern_t *)pres; + pres->where_used |= pdev->used_mask; + pdev->substituted_pattern_count++; + } else if (pres->object->id < 0) + pdf_reserve_object_id(pdev, pres, 0); + reset_gstate_for_pattern(pdev, pgs, pdev->initial_pattern_states[pdev->PatternDepth - 1]); + gs_free_object(pdev->pdf_memory->non_gc_memory, pdev->initial_pattern_states[pdev->PatternDepth - 1], "Freeing dangling pattern state"); + pdev->initial_pattern_states[pdev->PatternDepth - 1] = NULL; + if (pdev->PatternDepth == 1) { + gs_free_object(pdev->pdf_memory->non_gc_memory, pdev->initial_pattern_states, "Freeing dangling pattern state"); + pdev->initial_pattern_states = NULL; + } + + pdev->PatternDepth--; + pdev->PatternsSinceForm--; + } return 1; case gxdso_pattern_load: pres = pdf_find_resource_by_gs_id(pdev, resourcePattern, id); @@ -2728,6 +2885,29 @@ gdev_pdf_dev_spec_op(gx_device *pdev1, int dev_spec_op, void *data, int size) pdev->PassThroughWriter = 0; return 0; break; + case gxdso_JPX_passthrough_query: + pdev->JPX_PassThrough = pdev->params.PassThroughJPXImages; + return 1; + break; + case gxdso_JPX_passthrough_begin: + return 0; + break; + case gxdso_JPX_passthrough_data: + if (pdev->JPX_PassThrough && pdev->PassThroughWriter) + { + uint ignore; + if (sputs(pdev->PassThroughWriter, + data, size, + &ignore) < 0) + return_error(gs_error_ioerror); + } + return 0; + break; + case gxdso_JPX_passthrough_end: + pdev->JPX_PassThrough = 0; + pdev->PassThroughWriter = 0; + return 0; + break; case gxdso_event_info: { dev_param_req_t *request = (dev_param_req_t *)data; diff --git a/devices/vector/gdevpdfj.c b/devices/vector/gdevpdfj.c index 6140d4d6..02692510 100644 --- a/devices/vector/gdevpdfj.c +++ b/devices/vector/gdevpdfj.c @@ -412,6 +412,9 @@ pdf_begin_image_data(gx_device_pdf * pdev, pdf_image_writer * piw, if (pdev->JPEG_PassThrough) { CHECK(cos_dict_put_c_strings(pcd, "/Filter", "/DCTDecode")); } + if (pdev->JPX_PassThrough) { + CHECK(cos_dict_put_c_strings(pcd, "/Filter", "/JPXDecode")); + } return code; } diff --git a/devices/vector/gdevpdfm.c b/devices/vector/gdevpdfm.c index ba00700a..902c17ac 100644 --- a/devices/vector/gdevpdfm.c +++ b/devices/vector/gdevpdfm.c @@ -879,6 +879,8 @@ pdfmark_put_ao_pairs(gx_device_pdf * pdev, cos_dict_t *pcd, i = 2; if (Dest.size > 5 && Dest.data[2] == 0x00 && Dest.data[3] == 0x00) i += 2; + /* If it has preceeding NULLs, then it has a terminating NULL as well, get rid of that too */ + Dest.size--; } if (Dest.data[i] == '/') { @@ -1931,6 +1933,31 @@ pdfmark_PAGELABEL(gx_device_pdf * pdev, gs_param_string * pairs, uint count, return 0; } +static int is_XMP_Key(gs_param_string *param) +{ + if (pdf_key_eq(param, "/Title")) + return 1; + if (pdf_key_eq(param, "/Author")) + return 1; + if (pdf_key_eq(param, "/Subject")) + return 1; + if (pdf_key_eq(param, "/Keywords")) + return 1; + if (pdf_key_eq(param, "/Creator")) + return 1; + if (pdf_key_eq(param, "/Producer")) + return 1; + /* These two aren't string data types and so won't affect anything + * in the DOCINFO pdfmark, which is the only client for this code currently + * but we may want to use this in future for other purposed. + */ + if (pdf_key_eq(param, "/CreationDate")) + return 1; + if (pdf_key_eq(param, "/ModDate")) + return 1; + return 0; +} + /* DOCINFO pdfmark */ static int pdfmark_DOCINFO(gx_device_pdf * pdev, gs_param_string * pairs, uint count, @@ -1954,7 +1981,7 @@ pdfmark_DOCINFO(gx_device_pdf * pdev, gs_param_string * pairs, uint count, continue; } - if (pdev->PDFA !=0) { + if (pdev->PDFA !=0 && is_XMP_Key(pair)) { const gs_param_string *p = pairs + i + 1; bool abort = false; diff --git a/devices/vector/gdevpdfp.c b/devices/vector/gdevpdfp.c index e78d9596..42fa1c52 100644 --- a/devices/vector/gdevpdfp.c +++ b/devices/vector/gdevpdfp.c @@ -595,28 +595,13 @@ gdev_pdf_put_params_impl(gx_device * dev, const gx_device_pdf * save_dev, gs_par case 1: break; } - { /* HACK : gs_param_list_s::memory is documented in gsparam.h as - "for allocating coerced arrays". Not sure why zputdeviceparams - sets it to the current memory space, while the device - assumes to store them in the device's memory space. - As a hackish workaround we temporary replace it here. - Doing so because we don't want to change the global code now - because we're unable to test it with all devices. - Bug 688531 "Segmentation fault running pdfwrite from 219-01.ps". - - This solution to be reconsidered after fixing - the bug 688533 "zputdeviceparams specifies a wrong memory space.". - */ - gs_memory_t *mem = plist->memory; - - plist->memory = pdev->pdf_memory; - code = gs_param_read_items(plist, pdev, pdf_param_items); + { + code = gs_param_read_items(plist, pdev, pdf_param_items, pdev->pdf_memory); if (code < 0 || (code = param_read_bool(plist, "ForOPDFRead", &ForOPDFRead)) < 0) { } if (code == 0 && !pdev->is_ps2write && !(locked && pdev->params.LockDistillerParams)) pdev->ForOPDFRead = ForOPDFRead; - plist->memory = mem; } if (code < 0) ecode = code; diff --git a/devices/vector/gdevpdft.c b/devices/vector/gdevpdft.c index 8b5a2094..5b8af68d 100644 --- a/devices/vector/gdevpdft.c +++ b/devices/vector/gdevpdft.c @@ -401,7 +401,7 @@ pdf_set_blend_params(gs_gstate * pgs, gx_device_pdf * dev, } int -gdev_pdf_create_compositor(gx_device *dev, +gdev_pdf_composite(gx_device *dev, gx_device **pcdev, const gs_composite_t *pct, gs_gstate *pgs, gs_memory_t *memory, gx_device *cdev) { @@ -451,7 +451,7 @@ gdev_pdf_create_compositor(gx_device *dev, } return 0; } - return psdf_create_compositor(dev, pcdev, pct, pgs, memory, cdev); + return psdf_composite(dev, pcdev, pct, pgs, memory, cdev); } /* We're not sure why the folllowing device methods are never called. diff --git a/devices/vector/gdevpdfu.c b/devices/vector/gdevpdfu.c index 325af7c2..ec4a8165 100644 --- a/devices/vector/gdevpdfu.c +++ b/devices/vector/gdevpdfu.c @@ -39,9 +39,9 @@ #include "sstring.h" #include "strmio.h" #include "szlibx.h" +#include "gsagl.h" #include "opdfread.h" -#include "gdevagl.h" #include "gs_mgl_e.h" #include "gs_mro_e.h" diff --git a/devices/vector/gdevpdfv.c b/devices/vector/gdevpdfv.c index 6b3c5c97..0159169c 100644 --- a/devices/vector/gdevpdfv.c +++ b/devices/vector/gdevpdfv.c @@ -250,6 +250,9 @@ pdf_store_pattern1_params(gx_device_pdf *pdev, pdf_resource_t *pres, } else { smat = smat2; } + if ((smat.xx == 0.0 && smat.yy == 0.0) && (smat.xy == 0.0 && smat.yx == 0.0)) + return_error(gs_error_undefinedresult); + if (pdev->ForOPDFRead) { if (pdev->PatternDepth) { gs_matrix_multiply(&smat, &pdev->AccumulatedPatternMatrix, &smat2); @@ -360,6 +363,9 @@ pdf_put_uncolored_pattern(gx_device_pdf *pdev, const gx_drawing_color *pdc, if (code < 0) return code; *ppres = pdf_find_resource_by_gs_id(pdev, resourcePattern, pdc->mask.id); + if (*ppres == NULL) + return_error(gs_error_undefined); + *ppres = pdf_substitute_pattern(*ppres); if (!pdev->AR4_save_bug && pdev->CompatibilityLevel <= 1.3) { /* We reconnized AR4 behavior as reserving "q Q" stack elements diff --git a/devices/vector/gdevpdfx.h b/devices/vector/gdevpdfx.h index 2db4f77a..d5dfd756 100644 --- a/devices/vector/gdevpdfx.h +++ b/devices/vector/gdevpdfx.h @@ -45,7 +45,13 @@ * Acrobat 4 is now more than 20 years old, lets just drop support for it. The * PDF specification never had this limit, just Adobe's software. */ -/* #define MAX_USER_COORD 16300 */ +/* 31/05/2021 However, it transpires that the PDF/A-1 specification adopted the + * implementation limits of Acrobat 5 as part of the specification. So we need + * to handle that, but we don't need to limit ourselves to the more restrictive + * Acrobat 4 limit of 16384 ( MAX_USER_COORD 16300), we can use 32767. THis is only + * used when creating PDF/A-1 files. + */ +#define MAX_USER_COORD 32700 /* ---------------- Statically allocated sizes ---------------- */ /* These should really be dynamic.... */ @@ -946,6 +952,7 @@ struct gx_device_pdf_s { gs_char OCR_char_code; /* Passes the current character code from text processing to the image processing code when rendering glyph bitmaps for OCR */ gs_glyph OCR_glyph; /* Passes the current glyph code from text processing to the image processing code when rendering glyph bitmaps for OCR */ ocr_glyph_t *ocr_glyphs; /* Records bitmaps and other data from text processing when doing OCR */ + gs_gstate **initial_pattern_states; }; #define is_in_page(pdev)\ @@ -1019,7 +1026,7 @@ dev_proc_fill_rectangle_hl_color(gdev_pdf_fill_rectangle_hl_color); /* In gdevpdfv.c */ dev_proc_include_color_space(gdev_pdf_include_color_space); /* In gdevpdft.c */ -dev_proc_create_compositor(gdev_pdf_create_compositor); +dev_proc_composite(gdev_pdf_composite); dev_proc_begin_transparency_group(gdev_pdf_begin_transparency_group); dev_proc_end_transparency_group(gdev_pdf_end_transparency_group); dev_proc_begin_transparency_mask(gdev_pdf_begin_transparency_mask); diff --git a/devices/vector/gdevpdtb.c b/devices/vector/gdevpdtb.c index c0a148c3..42ef43e4 100644 --- a/devices/vector/gdevpdtb.c +++ b/devices/vector/gdevpdtb.c @@ -349,7 +349,18 @@ pdf_base_font_alloc(gx_device_pdf *pdev, pdf_base_font_t **ppbfont, * this is required for PCL, see 'pdf_free_pdf_font_cache' in gdevpdf.c * for further details. */ + pdev->pdf_font_dir->global_glyph_code = font->dir->global_glyph_code; + pbfont->copied->dir = pbfont->complete->dir = pdev->pdf_font_dir; + + if (pbfont->copied->FontType == ft_CID_encrypted) { + gs_font_cid0 *copied0 = (gs_font_cid0 *)pbfont->copied; + int i; + for (i = 0; i < copied0->cidata.FDArray_size; ++i) { + ((gs_font *)copied0->cidata.FDArray[i])->dir = pdev->pdf_font_dir; + } + } + pbfont->is_standard = is_standard; if (pfname->size > 0) { font_name.data = pfname->chars; diff --git a/devices/vector/gdevpdtc.c b/devices/vector/gdevpdtc.c index c2b76b7c..81d66dd5 100644 --- a/devices/vector/gdevpdtc.c +++ b/devices/vector/gdevpdtc.c @@ -54,10 +54,11 @@ process_composite_text(gs_text_enum_t *pte, void *vbuf, uint bsize) gs_char chr, char_code = 0x0badf00d, space_char = GS_NO_CHAR; int buf_index = 0; bool return_width = (penum->text.operation & TEXT_RETURN_WIDTH); + gx_path *path = gs_text_enum_path(penum); str.data = buf; if (return_width) { - code = gx_path_current_point(penum->path, &penum->origin); + code = gx_path_current_point(path, &penum->origin); if (code < 0) return code; } @@ -432,8 +433,9 @@ scan_cmap_text(pdf_text_enum_t *pte, void *vbuf) gs_font *subfont = NULL; gs_point wxy; bool font_change = 0; + gx_path *path = gs_text_enum_path(pte); - code = gx_path_current_point(pte->path, &pte->origin); + code = gx_path_current_point(path, &pte->origin); if (code < 0) return code; do { @@ -449,6 +451,8 @@ scan_cmap_text(pdf_text_enum_t *pte, void *vbuf) break_xy_index = scan.xy_index; code = font->procs.next_char_glyph(&scan, &chr, &glyph); if (code == 2) { /* end of string */ + if (subfont == NULL) + subfont = scan.fstack.items[scan.fstack.depth].font; done = true; break; } @@ -770,6 +774,7 @@ scan_cmap_text(pdf_text_enum_t *pte, void *vbuf) str.data = scan.text.data.bytes; pdsubf = pdsubf0; pte->text.operation = save_op; + pte->text.data.glyphs = save_data; } pte->current_font = subfont0; if (!subfont0 || !pdsubf0) diff --git a/devices/vector/gdevpdte.c b/devices/vector/gdevpdte.c index 7a6b145e..592205fd 100644 --- a/devices/vector/gdevpdte.c +++ b/devices/vector/gdevpdte.c @@ -616,8 +616,9 @@ process_text_estimate_bbox(pdf_text_enum_t *pte, gs_font_base *font, gs_fixed_point origin; gs_matrix m; int xy_index = pte->xy_index, info_flags = 0; + gx_path *path = gs_text_enum_path(pte); - code = gx_path_current_point(pte->path, &origin); + code = gx_path_current_point(path, &origin); if (code < 0) return code; m = ctm_only(pte->pgs); @@ -829,6 +830,7 @@ pdf_process_string(pdf_text_enum_t *penum, gs_string *pstr, int accepted; gs_rect text_bbox = {{0, 0}, {0, 0}}, glyphs_bbox = {{10000,10000}, {0,0}}; unsigned int operation = text->operation; + gx_path *path = gs_text_enum_path(penum); code = pdf_obtain_font_resource(penum, pstr, &pdfont); if (code < 0) @@ -836,7 +838,7 @@ pdf_process_string(pdf_text_enum_t *penum, gs_string *pstr, if (pfmat == 0) pfmat = &font->FontMatrix; if (text->operation & TEXT_RETURN_WIDTH) { - code = gx_path_current_point(penum->path, &penum->origin); + code = gx_path_current_point(path, &penum->origin); if (code < 0) return code; } @@ -872,7 +874,7 @@ pdf_process_string(pdf_text_enum_t *penum, gs_string *pstr, gs_fixed_point origin; gs_point p0, p1, p2, p3; - code = gx_path_current_point(penum->path, &origin); + code = gx_path_current_point(path, &origin); if (code < 0) goto done; @@ -1016,7 +1018,7 @@ pdf_process_string(pdf_text_enum_t *penum, gs_string *pstr, gs_fixed_point origin; gs_point p0, p1, p2, p3; - code = gx_path_current_point(penum->path, &origin); + code = gx_path_current_point(path, &origin); if (code < 0) return code; @@ -1622,6 +1624,20 @@ process_text_modify_width(pdf_text_enum_t *pte, gs_font *font, if (code < 0) return_error(gs_error_unregistered); gs_distance_transform(dpt.x, dpt.y, &ctm_only(pte->pgs), &wanted); + + gs_distance_transform(((font->WMode && !cw.ignore_wmode) ? 0 : ppts->values.character_spacing), + ((font->WMode && !cw.ignore_wmode) ? ppts->values.character_spacing : 0), + &ppts->values.matrix, &tpt); + wanted.x += tpt.x; + wanted.y += tpt.y; + + if (chr == space_char && (!pte->single_byte_space || decoded_bytes == 1)) { + gs_distance_transform(((font->WMode && !cw.ignore_wmode)? 0 : ppts->values.word_spacing), + ((font->WMode && !cw.ignore_wmode) ? ppts->values.word_spacing : 0), + &ppts->values.matrix, &tpt); + wanted.x += tpt.x; + wanted.y += tpt.y; + } } else { pdev->text->text_state->can_use_TJ = true; gs_distance_transform(cw.real_width.xy.x * ppts->values.size, diff --git a/devices/vector/gdevpdts.c b/devices/vector/gdevpdts.c index ec946ac4..4b3de5e1 100644 --- a/devices/vector/gdevpdts.c +++ b/devices/vector/gdevpdts.c @@ -67,7 +67,7 @@ gs_private_st_ptrs2(st_pdf_text_state, pdf_text_state_t, "pdf_text_state_t", * pdf_append_chars.) Requires pts->buffer.count_chars > 0. */ static int -append_text_move(pdf_text_state_t *pts, double dw) +append_text_move(gx_device_pdf *pdev, pdf_text_state_t *pts, double dw) { int count = pts->buffer.count_moves; int pos = pts->buffer.count_chars; @@ -81,6 +81,10 @@ append_text_move(pdf_text_state_t *pts, double dw) rounded = floor(dw + 0.5); if (fabs(dw - rounded) < 0.001) dw = rounded; + if (pdev->PDFA == 1 && dw < -MAX_USER_COORD) { + /* PDF/A-1 limit on co-ordinates */ + return -1; + } if (dw != 0) { if (count == MAX_TEXT_BUFFER_MOVES) return -1; @@ -168,11 +172,47 @@ add_text_delta_move(gx_device_pdf *pdev, const gs_matrix *pmat) * for the xhow and once for the Width override. Otherwise, we do * want to use TJ as it makes for smaller files. */ - if (pts->can_use_TJ && dnotw == 0 && pts->buffer.count_chars > 0) { + if (pts->can_use_TJ && dnotw == 0 && pts->buffer.count_chars > 0 && + /* + * Acrobat Reader limits the magnitude of user-space + * coordinates. Also, AR apparently doesn't handle large + * positive movement values (negative X displacements), even + * though the PDF Reference says this bug was fixed in AR3. + * + * Old revisions used the upper threshold 1000 for tdw, + * but it appears too big when a font sets a too big + * character width in setcachedevice. Particularly this happens + * with a Type 3 font generated by Aldus Freehand 4.0 + * to represent a texture - see bug #687051. + * The problem is that when the Widths is multiplied + * to the font size, the viewer represents the result + * with insufficient fraction bits to represent the precise width. + * We work around that problem here restricting tdw + * with a smaller threshold 990. Our intention is to + * disable Tj when the real glyph width appears smaller + * than 1% of the width specified in setcachedevice. + * A Td instruction will be generated instead. + * Note that the value 990 is arbitrary and may need a + * further adjustment. + */ + /* Revised the above. It seems unreasonable to use a fixed + * value which is not based on the point size, when the problem is + * caused by a large point size being multiplied by the width. The + * original fix also caused bitmap fonts (from PCL and other sources) + * to fail to use kerning, as these fonts are scaled to 1 point and + * therefore use large kerning values. Instead we check the kerned value + * multiplied by the point size of the font. + */ + (((tdw >= -MAX_USER_COORD && (tdw * pts->in.size) < MAX_USER_COORD) || pdev->PDFA != 1)) + ) { /* Use TJ. */ int code; - code = append_text_move(pts, tdw); + if (tdw < MAX_USER_COORD || pdev->PDFA != 1) + code = append_text_move(pdev, pts, tdw); + else + return -1; + if (code >= 0) goto finish; } diff --git a/devices/vector/gdevpdtt.c b/devices/vector/gdevpdtt.c index 952f41db..3091a18d 100644 --- a/devices/vector/gdevpdtt.c +++ b/devices/vector/gdevpdtt.c @@ -517,20 +517,22 @@ pdf_prepare_text_drawing(gx_device_pdf *const pdev, gs_text_enum_t *pte) int gdev_pdf_text_begin(gx_device * dev, gs_gstate * pgs, const gs_text_params_t *text, gs_font * font, - gx_path * path0, const gx_device_color * pdcolor, const gx_clip_path * pcpath, - gs_memory_t * mem, gs_text_enum_t ** ppte) + gs_text_enum_t ** ppte) { gx_device_pdf *const pdev = (gx_device_pdf *)dev; - gx_path *path = path0; + gx_path *path0 = pgs->path; + gx_path *path = ((text->operation & TEXT_DO_NONE) && + !(text->operation & TEXT_RETURN_WIDTH) ? NULL : path0); pdf_text_enum_t *penum; int code, user_defined = 0; + gs_memory_t * mem = pgs->memory; /* should we "flatten" the font to "normal" marking operations */ if (pdev->FlattenFonts) { font->dir->ccache.upper = 0; - return gx_default_text_begin(dev, pgs, text, font, path, pdcolor, - pcpath, mem, ppte); + return gx_default_text_begin(dev, pgs, text, font, + pcpath, ppte); } /* Track the dominant text rotation. */ @@ -588,7 +590,7 @@ gdev_pdf_text_begin(gx_device * dev, gs_gstate * pgs, penum->cgp = NULL; penum->output_char_code = GS_NO_CHAR; code = gs_text_enum_init((gs_text_enum_t *)penum, &pdf_text_procs, - dev, pgs, text, font, path, pdcolor, pcpath, mem); + dev, pgs, text, font, pcpath, mem); if (code < 0) { gs_free_object(mem, penum, "gdev_pdf_text_begin"); return code; @@ -625,11 +627,11 @@ gdev_pdf_text_begin(gx_device * dev, gs_gstate * pgs, } else if ((!(text->operation & TEXT_DO_DRAW) && pgs->text_rendering_mode != 3) || path == 0 || !path_position_valid(path) || pdev->type3charpath) - return gx_default_text_begin(dev, pgs, text, font, path, pdcolor, - pcpath, mem, ppte); + return gx_default_text_begin(dev, pgs, text, font, + pcpath, ppte); else if (text->operation & TEXT_DO_ANY_CHARPATH) - return gx_default_text_begin(dev, pgs, text, font, path, pdcolor, - pcpath, mem, ppte); + return gx_default_text_begin(dev, pgs, text, font, + pcpath, ppte); } if (!pdev->ForOPDFRead) { @@ -652,7 +654,7 @@ gdev_pdf_text_begin(gx_device * dev, gs_gstate * pgs, penum->returned.current_glyph = GS_NO_GLYPH; penum->output_char_code = GS_NO_CHAR; code = gs_text_enum_init((gs_text_enum_t *)penum, &pdf_text_procs, - dev, pgs, text, font, path, pdcolor, pcpath, mem); + dev, pgs, text, font, pcpath, mem); penum->k_text_release = 1; /* early release of black_text_state */ if (code < 0) { @@ -2450,7 +2452,7 @@ pdf_update_text_state(pdf_text_process_state_t *ppts, float size; float c_s = 0, w_s = 0; int mask = 0; - int code = gx_path_current_point(penum->path, &cpt); + int code = gx_path_current_point(gs_text_enum_path(penum), &cpt); if (code < 0) return code; @@ -2909,14 +2911,14 @@ pdf_default_text_begin(gs_text_enum_t *pte, const gs_text_params_t *text, text1.operation |= TEXT_DO_DRAW; } return gx_default_text_begin(pte->dev, pte->pgs, &text1, pte->current_font, - pte->path, pte->pdcolor, pte->pcpath, - pte->memory, ppte); + pte->pcpath, ppte); } static int install_PS_charproc_accumulator(gx_device_pdf *pdev, gs_text_enum_t *pte, gs_text_enum_t *pte_default, pdf_text_enum_t *const penum) { int code; + const gx_device_color * pdcolor = gs_currentdevicecolor_inline(pte->pgs); penum->returned.current_char = pte_default->returned.current_char; penum->returned.current_glyph = pte_default->returned.current_glyph; @@ -2946,7 +2948,7 @@ static int install_PS_charproc_accumulator(gx_device_pdf *pdev, gs_text_enum_t * pdev->width *= 100; pdev->height *= 100; - pdf_viewer_state_from_gs_gstate(pdev, pte->pgs, pte->pdcolor); + pdf_viewer_state_from_gs_gstate(pdev, pte->pgs, pdcolor); /* Set line params to unallowed values so that they'll synchronize with writing them out on the first use. Doing so because PDF viewer inherits them from the @@ -2999,6 +3001,7 @@ static int install_charproc_accumulator(gx_device_pdf *pdev, gs_text_enum_t *pte gs_text_enum_t *pte_default, pdf_text_enum_t *const penum) { int code; + const gx_device_color * pdcolor = gs_currentdevicecolor_inline(pte->pgs); pdev->charproc_ctm = penum->pgs->ctm; if ((penum->current_font->FontType == ft_user_defined || @@ -3019,7 +3022,7 @@ static int install_charproc_accumulator(gx_device_pdf *pdev, gs_text_enum_t *pte if (code < 0) return code; - pdf_viewer_state_from_gs_gstate(pdev, pte->pgs, pte->pdcolor); + pdf_viewer_state_from_gs_gstate(pdev, pte->pgs, pdcolor); /* Set line params to unallowed values so that they'll synchronize with writing them out on the first use. Doing so because PDF viewer inherits them from the diff --git a/devices/vector/gdevpdtw.c b/devices/vector/gdevpdtw.c index 19438685..0647db66 100644 --- a/devices/vector/gdevpdtw.c +++ b/devices/vector/gdevpdtw.c @@ -239,8 +239,7 @@ pdf_write_simple_contents(gx_device_pdf *pdev, if (code < 0) return code; pprints1(s, "/Subtype/%s>>\n", - (pdfont->FontType == ft_TrueType ? "TrueType" : - pdfont->u.simple.s.type1.is_MM_instance ? "MMType1" : "Type1")); + (pdfont->FontType == ft_TrueType ? "TrueType" : "Type1")); pdf_end_separate(pdev, resourceFont); if (diff_id) { mark_font_descriptor_symbolic(pdfont); diff --git a/devices/vector/gdevpsdf.h b/devices/vector/gdevpsdf.h index 700278e2..8f5d6ad8 100644 --- a/devices/vector/gdevpsdf.h +++ b/devices/vector/gdevpsdf.h @@ -174,6 +174,7 @@ typedef struct psdf_distiller_params_s { int MaxSubsetPct; bool SubsetFonts; bool PassThroughJPEGImages; + bool PassThroughJPXImages; gs_param_string PSDocOptions; gs_param_string_array PSPageOptions; } psdf_distiller_params; @@ -267,6 +268,8 @@ extern const stream_template s_zlibE_template; #define psdf_JPEGPassThrough_param_defaults\ 1 /* PassThroughJPEGImages */ +#define psdf_JPXPassThrough_param_defaults\ + 1 /* PassThroughJPXImages */ #define psdf_PSOption_param_defaults\ {0}, /* PSDocOptions */\ @@ -292,6 +295,7 @@ typedef enum { bool HaveCIDSystem;\ double ParamCompatibilityLevel;\ bool JPEG_PassThrough;\ + bool JPX_PassThrough;\ psdf_distiller_params params typedef struct gx_device_psdf_s { @@ -307,12 +311,14 @@ typedef struct gx_device_psdf_s { false,\ 1.3,\ 0,\ + 0,\ { psdf_general_param_defaults(ascii),\ psdf_color_image_param_defaults,\ psdf_gray_image_param_defaults,\ psdf_mono_image_param_defaults,\ psdf_font_param_defaults,\ psdf_JPEGPassThrough_param_defaults,\ + psdf_JPXPassThrough_param_defaults,\ psdf_PSOption_param_defaults\ } /* st_device_psdf is never instantiated per se, but we still need to */ @@ -508,11 +514,10 @@ int psdf_set_color(gx_device_vector *vdev, const gx_drawing_color *pdc, /* Round a double value to a specified precision. */ double psdf_round(double v, int precision, int radix); -/* stubs to disable get_bits, get_bits_rectangle */ -dev_proc_get_bits(psdf_get_bits); +/* stub to disable get_bits_rectangle */ dev_proc_get_bits_rectangle(psdf_get_bits_rectangle); /* intercept and ignore overprint compositor creation */ -dev_proc_create_compositor(psdf_create_compositor); +dev_proc_composite(psdf_composite); #endif /* gdevpsdf_INCLUDED */ diff --git a/devices/vector/gdevpsdi.c b/devices/vector/gdevpsdi.c index 8ac9735a..955e06b2 100644 --- a/devices/vector/gdevpsdi.c +++ b/devices/vector/gdevpsdi.c @@ -269,7 +269,7 @@ setup_image_compression(psdf_binary_writer *pbw, const psdf_image_params *pdip, templat = lossless_template; if (dict != NULL) /* Some interpreters don't supply filter parameters. */ gs_c_param_list_read(dict); /* ensure param list is in read mode */ - if (templat == 0 || pdev->JPEG_PassThrough) /* no compression */ + if (templat == 0 || pdev->JPEG_PassThrough || pdev->JPX_PassThrough) /* no compression */ return 0; if (pim->Width < 200 && pim->Height < 200) /* Prevent a fixed overflow. */ if (pim->Width * pim->Height * Colors * pim->BitsPerComponent <= 160) @@ -886,8 +886,10 @@ new_setup_image_filters(gx_device_psdf * pdev, psdf_binary_writer * pbw, resolution = resolutiony; } - if (bpc != bpc_out) + if (bpc != bpc_out) { pdev->JPEG_PassThrough = 0; + pdev->JPX_PassThrough = 0; + } if (ncomp == 1 && pim->ColorSpace && pim->ColorSpace->type->index != gs_color_space_index_Indexed) { /* Monochrome, gray, or mask */ @@ -906,6 +908,7 @@ new_setup_image_filters(gx_device_psdf * pdev, psdf_binary_writer * pbw, params.Dict = pdev->params.GrayImage.Dict; } pdev->JPEG_PassThrough = 0; + pdev->JPX_PassThrough = 0; code = setup_downsampling(pbw, ¶ms, pim, pgs, resolution, lossless); } else { code = setup_image_compression(pbw, ¶ms, pim, pgs, lossless); @@ -919,6 +922,7 @@ new_setup_image_filters(gx_device_psdf * pdev, psdf_binary_writer * pbw, params.Depth = (colour_conversion ? 8 : bpc_out); if (do_downsample(¶ms, pim, resolution)) { pdev->JPEG_PassThrough = 0; + pdev->JPX_PassThrough = 0; code = setup_downsampling(pbw, ¶ms, pim, pgs, resolution, lossless); } else { code = setup_image_compression(pbw, ¶ms, pim, pgs, lossless); diff --git a/devices/vector/gdevpsdp.c b/devices/vector/gdevpsdp.c index d995dc5c..fc944539 100644 --- a/devices/vector/gdevpsdp.c +++ b/devices/vector/gdevpsdp.c @@ -243,6 +243,7 @@ static const gs_param_item_t psdf_param_items[] = { pi("MaxSubsetPct", gs_param_type_int, MaxSubsetPct), pi("SubsetFonts", gs_param_type_bool, SubsetFonts), pi("PassThroughJPEGImages", gs_param_type_bool, PassThroughJPEGImages), + pi("PassThroughJPXImages", gs_param_type_bool, PassThroughJPXImages), #undef pi gs_param_item_end @@ -905,12 +906,12 @@ psdf_put_image_params(const gx_device_psdf * pdev, gs_param_list * plist, * Since this procedure can be called before the device is open, * we must use pdev->memory rather than pdev->v_memory. */ - gs_memory_t *mem = pdev->memory; + gs_memory_t *mem = gs_memory_stable(pdev->memory); gs_param_name pname; /* Skip AutoFilter for mono images. */ const gs_param_item_t *items = (pnames->items[0].key == 0 ? pnames->items + 1 : pnames->items); - int code = gs_param_read_items(plist, params, items); + int code = gs_param_read_items(plist, params, items, mem); if (code < 0) ecode = code; @@ -1124,7 +1125,7 @@ gdev_psdf_put_params(gx_device * dev, gs_param_list * plist) /* General parameters. */ - code = gs_param_read_items(plist, ¶ms, psdf_param_items); + code = gs_param_read_items(plist, ¶ms, psdf_param_items, NULL); if (code < 0) return code; diff --git a/devices/vector/gdevpsdu.c b/devices/vector/gdevpsdu.c index c4957691..210e224a 100644 --- a/devices/vector/gdevpsdu.c +++ b/devices/vector/gdevpsdu.c @@ -468,23 +468,14 @@ psdf_end_binary(psdf_binary_writer * pbw) /* ---------------- Overprint, Get Bits ---------------- */ /* - * High level devices cannot perform get_bits or get_bits_rectangle + * High level devices cannot perform get_bits_rectangle * operations, for obvious reasons. */ int -psdf_get_bits(gx_device * dev, int y, byte * data, byte ** actual_data) -{ - emprintf(dev->memory, - "Can't set GraphicsAlphaBits or TextAlphaBits with a vector device.\n"); - return_error(gs_error_unregistered); -} - -int psdf_get_bits_rectangle( gx_device * dev, const gs_int_rect * prect, - gs_get_bits_params_t * params, - gs_int_rect ** unread ) + gs_get_bits_params_t * params ) { emprintf(dev->memory, "Can't set GraphicsAlphaBits or TextAlphaBits with a vector device.\n"); @@ -499,7 +490,7 @@ psdf_get_bits_rectangle( * compositor. */ int -psdf_create_compositor( +psdf_composite( gx_device * dev, gx_device ** pcdev, const gs_composite_t * pct, @@ -511,5 +502,5 @@ psdf_create_compositor( *pcdev = dev; return 0; } - return gx_default_create_compositor(dev, pcdev, pct, pgs, mem, cdev); + return gx_default_composite(dev, pcdev, pct, pgs, mem, cdev); } diff --git a/devices/vector/gdevpx.c b/devices/vector/gdevpx.c index 2002219d..fad8727c 100644 --- a/devices/vector/gdevpx.c +++ b/devices/vector/gdevpx.c @@ -122,8 +122,8 @@ gs_public_st_suffix_add0_final(st_device_pclxl, gx_device_pclxl, device_pclxl_reloc_ptrs, gx_device_finalize, st_device_vector); -#define pclxl_device_body(dname, depth)\ - std_device_dci_type_body(gx_device_pclxl, 0, dname, &st_device_pclxl,\ +#define pclxl_device_body(dname, depth, init)\ + std_device_dci_type_body(gx_device_pclxl, init, dname, &st_device_pclxl,\ DEFAULT_WIDTH_10THS * X_DPI / 10,\ DEFAULT_HEIGHT_10THS * Y_DPI / 10,\ X_DPI, Y_DPI,\ @@ -143,59 +143,57 @@ static dev_proc_get_params(pclxl_get_params); static dev_proc_put_params(pclxl_put_params); /*static dev_proc_draw_thin_line(pclxl_draw_thin_line); */ -static dev_proc_begin_image(pclxl_begin_image); -static dev_proc_strip_copy_rop(pclxl_strip_copy_rop); - -#define pclxl_device_procs(map_rgb_color, map_color_rgb)\ -{\ - pclxl_open_device,\ - NULL, /* get_initial_matrix */\ - NULL, /* sync_output */\ - pclxl_output_page,\ - pclxl_close_device,\ - map_rgb_color, /* differs */\ - map_color_rgb, /* differs */\ - gdev_vector_fill_rectangle,\ - NULL, /* tile_rectangle */\ - pclxl_copy_mono,\ - pclxl_copy_color,\ - NULL, /* draw_line */\ - NULL, /* get_bits */\ - pclxl_get_params,\ - pclxl_put_params,\ - NULL, /* map_cmyk_color */\ - NULL, /* get_xfont_procs */\ - NULL, /* get_xfont_device */\ - NULL, /* map_rgb_alpha_color */\ - gx_page_device_get_page_device,\ - NULL, /* get_alpha_bits */\ - NULL, /* copy_alpha */\ - NULL, /* get_band */\ - NULL, /* copy_rop */\ - gdev_vector_fill_path,\ - gdev_vector_stroke_path,\ - pclxl_fill_mask,\ - gdev_vector_fill_trapezoid,\ - gdev_vector_fill_parallelogram,\ - gdev_vector_fill_triangle,\ - NULL /****** WRONG ******/, /* draw_thin_line */\ - pclxl_begin_image,\ - NULL, /* image_data */\ - NULL, /* end_image */\ - NULL, /* strip_tile_rectangle */\ - pclxl_strip_copy_rop\ +static dev_proc_begin_typed_image(pclxl_begin_typed_image); +static dev_proc_strip_copy_rop2(pclxl_strip_copy_rop2); + +static void +pclxl_initialize_device_procs(gx_device *dev, + dev_proc_map_rgb_color(map_rgb_color), + dev_proc_map_color_rgb(map_color_rgb)) +{ + set_dev_proc(dev, open_device, pclxl_open_device); + set_dev_proc(dev, output_page, pclxl_output_page); + set_dev_proc(dev, close_device, pclxl_close_device); + set_dev_proc(dev, map_rgb_color, map_rgb_color); + set_dev_proc(dev, map_color_rgb, map_color_rgb); + set_dev_proc(dev, fill_rectangle, gdev_vector_fill_rectangle); + set_dev_proc(dev, copy_mono, pclxl_copy_mono); + set_dev_proc(dev, copy_color, pclxl_copy_color); + set_dev_proc(dev, get_params, pclxl_get_params); + set_dev_proc(dev, put_params, pclxl_put_params); + set_dev_proc(dev, get_page_device, gx_page_device_get_page_device); + set_dev_proc(dev, fill_path, gdev_vector_fill_path); + set_dev_proc(dev, stroke_path, gdev_vector_stroke_path); + set_dev_proc(dev, fill_mask, pclxl_fill_mask); + set_dev_proc(dev, fill_trapezoid, gdev_vector_fill_trapezoid); + set_dev_proc(dev, fill_parallelogram, gdev_vector_fill_parallelogram); + set_dev_proc(dev, fill_triangle, gdev_vector_fill_triangle); + set_dev_proc(dev, begin_typed_image, pclxl_begin_typed_image); + set_dev_proc(dev, strip_copy_rop2, pclxl_strip_copy_rop2); +} + +static void +pxlmono_initialize_device_procs(gx_device *dev) +{ + pclxl_initialize_device_procs(dev, + gx_default_gray_map_rgb_color, + gx_default_gray_map_color_rgb); +} + +static void +pxlcolor_initialize_device_procs(gx_device *dev) +{ + pclxl_initialize_device_procs(dev, + gx_default_rgb_map_rgb_color, + gx_default_rgb_map_color_rgb); } const gx_device_pclxl gs_pxlmono_device = { - pclxl_device_body("pxlmono", 8), - pclxl_device_procs(gx_default_gray_map_rgb_color, - gx_default_gray_map_color_rgb) + pclxl_device_body("pxlmono", 8, pxlmono_initialize_device_procs) }; const gx_device_pclxl gs_pxlcolor_device = { - pclxl_device_body("pxlcolor", 24), - pclxl_device_procs(gx_default_rgb_map_rgb_color, - gx_default_rgb_map_color_rgb) + pclxl_device_body("pxlcolor", 24, pxlcolor_initialize_device_procs) }; /* ---------------- Other utilities ---------------- */ @@ -1973,25 +1971,27 @@ pclxl_fill_mask(gx_device * dev, /* Do a RasterOp. */ static int -pclxl_strip_copy_rop(gx_device * dev, const byte * sdata, int sourcex, +pclxl_strip_copy_rop2(gx_device * dev, const byte * sdata, int sourcex, uint sraster, gx_bitmap_id id, const gx_color_index * scolors, const gx_strip_bitmap * textures, const gx_color_index * tcolors, int x, int y, int width, int height, - int phase_x, int phase_y, gs_logical_operation_t lop) + int phase_x, int phase_y, gs_logical_operation_t lop, + uint plane_height) { lop = lop_sanitize(lop); /* Improvements possible here using PXL ROP3 for some combinations of args; use gx_default for now */ if (!rop3_uses_D(lop)) /* gx_default() cannot cope with D ops */ - return gx_default_strip_copy_rop(dev, sdata, sourcex, - sraster, id, - scolors, - textures, - tcolors, - x, y, width, height, - phase_x, phase_y, lop); + return gx_default_strip_copy_rop2(dev, sdata, sourcex, + sraster, id, + scolors, + textures, + tcolors, + x, y, width, height, + phase_x, phase_y, lop, + plane_height); return 0; } @@ -2018,30 +2018,39 @@ gs_private_st_suffix_add2(st_pclxl_image_enum, pclxl_image_enum_t, /* Start processing an image. */ static int -pclxl_begin_image(gx_device * dev, - const gs_gstate * pgs, const gs_image_t * pim, - gs_image_format_t format, const gs_int_rect * prect, +pclxl_begin_typed_image(gx_device * dev, + const gs_gstate * pgs, + const gs_matrix *pmat, + const gs_image_common_t * pic, + const gs_int_rect * prect, const gx_drawing_color * pdcolor, const gx_clip_path * pcpath, gs_memory_t * mem, gx_image_enum_common_t ** pinfo) { gx_device_vector *const vdev = (gx_device_vector *) dev; gx_device_pclxl *const xdev = (gx_device_pclxl *) dev; - const gs_color_space *pcs = pim->ColorSpace; + const gs_image_t *pim = (const gs_image_t *)pic; + const gs_color_space *pcs; pclxl_image_enum_t *pie; byte *row_data; int num_rows; uint row_raster; + int bits_per_pixel; + gs_matrix mat; + int code; + /* We only cope with image type 1 here. */ + if (pic->type->index != 1) + goto use_default; + + pcs = pim->ColorSpace; /* * Following should divide by num_planes, but we only handle chunky * images, i.e., num_planes = 1. */ - int bits_per_pixel = + bits_per_pixel = (pim->ImageMask ? 1 : pim->BitsPerComponent * gs_color_space_num_components(pcs)); - gs_matrix mat; - int code; /* * Check whether we can handle this image. PCL XL 1.0 and 2.0 only @@ -2050,7 +2059,9 @@ pclxl_begin_image(gx_device * dev, code = gs_matrix_invert(&pim->ImageMatrix, &mat); if (code < 0) goto use_default; - gs_matrix_multiply(&mat, &ctm_only(pgs), &mat); + if (pmat == NULL) + pmat = &ctm_only(pgs); + gs_matrix_multiply(&mat, pmat, &mat); if (pclxl_nontrivial_transfer(pgs)) goto use_default; @@ -2095,7 +2106,7 @@ pclxl_begin_image(gx_device * dev, bits_per_pixel != 8 && bits_per_pixel != 24 && bits_per_pixel != 32)) && !(pclxl_can_icctransform(pim) && xdev->iccTransform))) || - format != gs_image_format_chunky || pim->Interpolate || prect) + pim->format != gs_image_format_chunky || pim->Interpolate || prect) goto use_default; row_raster = (bits_per_pixel * pim->Width + 7) >> 3; num_rows = MAX_ROW_DATA / row_raster; @@ -2111,7 +2122,7 @@ pclxl_begin_image(gx_device * dev, code = gs_note_error(gs_error_VMerror); goto fail; } - code = gdev_vector_begin_image(vdev, pgs, pim, format, prect, + code = gdev_vector_begin_image(vdev, pgs, pim, pim->format, prect, pdcolor, pcpath, mem, &pclxl_image_enum_procs, (gdev_vector_image_enum_t *) pie); @@ -2332,8 +2343,8 @@ pclxl_begin_image(gx_device * dev, pclxl_set_color_space(xdev, eGray); else pclxl_set_color_space(xdev, eRGB); - return gx_default_begin_image(dev, pgs, pim, format, prect, - pdcolor, pcpath, mem, pinfo); + return gx_default_begin_typed_image(dev, pgs, pmat, pic, prect, + pdcolor, pcpath, mem, pinfo); } /* Write one strip of an image, from pie->rows.first_y to pie->y. */ diff --git a/devices/vector/gdevtxtw.c b/devices/vector/gdevtxtw.c index 687581d5..cbe2b19e 100644 --- a/devices/vector/gdevtxtw.c +++ b/devices/vector/gdevtxtw.c @@ -30,7 +30,7 @@ #include "gxfcid.h" #include "gxgstate.h" #include "gxpath.h" -#include "gdevagl.h" +#include "gsagl.h" #include "gxdevsop.h" #include "gzpath.h" #include "gdevkrnlsclass.h" /* 'standard' built in subclasses, currently First/Last Page and obejct filter */ @@ -112,7 +112,7 @@ static dev_proc_put_params(txtwrite_put_params); static dev_proc_fill_path(txtwrite_fill_path); static dev_proc_stroke_path(txtwrite_stroke_path); static dev_proc_text_begin(txtwrite_text_begin); -static dev_proc_strip_copy_rop(txtwrite_strip_copy_rop); +static dev_proc_strip_copy_rop2(txtwrite_strip_copy_rop2); static dev_proc_dev_spec_op(txtwrite_dev_spec_op); @@ -145,86 +145,34 @@ typedef struct textw_text_enum_s { private_st_textw_text_enum(); +static void +txtwrite_initialize_device_procs(gx_device *dev) +{ + set_dev_proc(dev, open_device, txtwrite_open_device); + set_dev_proc(dev, output_page, txtwrite_output_page); + set_dev_proc(dev, close_device, txtwrite_close_device); + set_dev_proc(dev, fill_rectangle, txtwrite_fill_rectangle); + set_dev_proc(dev, get_params, txtwrite_get_params); + set_dev_proc(dev, put_params, txtwrite_put_params); + set_dev_proc(dev, get_page_device, gx_page_device_get_page_device); + set_dev_proc(dev, fill_path, txtwrite_fill_path); + set_dev_proc(dev, stroke_path, txtwrite_stroke_path); + set_dev_proc(dev, strip_copy_rop2, txtwrite_strip_copy_rop2); + set_dev_proc(dev, composite, gx_null_composite); + set_dev_proc(dev, text_begin, txtwrite_text_begin); + set_dev_proc(dev, dev_spec_op, txtwrite_dev_spec_op); +} + const gx_device_txtwrite_t gs_txtwrite_device = { /* Define the device as 8-bit gray scale to avoid computing halftones. */ - std_device_dci_body(gx_device_txtwrite_t, 0, "txtwrite", + std_device_dci_body(gx_device_txtwrite_t, + txtwrite_initialize_device_procs, "txtwrite", DEFAULT_WIDTH_10THS * X_DPI / 10, DEFAULT_HEIGHT_10THS * Y_DPI / 10, X_DPI, Y_DPI, 1, 8, 255, 0, 256, 1), - {txtwrite_open_device, - NULL, /*gx_upright_get_initial_matrix,*/ - NULL, /*gx_default_sync_output,*/ - txtwrite_output_page, - txtwrite_close_device, - NULL, /*gx_default_gray_map_rgb_color,*/ - NULL, /*gx_default_gray_map_color_rgb,*/ - txtwrite_fill_rectangle, /* Can't be NULL and there is no gx_default_fill_rectangle! */ - NULL, /*gx_default_tile_rectangle,*/ - NULL, /*gx_default_copy_mono,*/ - NULL, /*gx_default_copy_color,*/ - NULL, /*gx_default_draw_line,*/ - NULL, /*gx_default_get_bits,*/ - txtwrite_get_params, - txtwrite_put_params, - NULL, /*gx_default_map_cmyk_color,*/ - NULL, /*gx_default_get_xfont_procs,*/ - NULL, /*gx_default_get_xfont_device,*/ - NULL, /*gx_default_map_rgb_alpha_color,*/ - gx_page_device_get_page_device, /*gx_page_device_get_page_device,*/ - NULL, /* get_alpha_bits */ - NULL, /*gx_default_copy_alpha,*/ - NULL, /* get_band */ - NULL, /* copy_rop */ - txtwrite_fill_path, - txtwrite_stroke_path, - NULL, /*gx_default_fill_mask,*/ - NULL, /*gx_default_fill_trapezoid,*/ - NULL, /*gx_default_fill_parallelogram,*/ - NULL, /*gx_default_fill_triangle,*/ - NULL, /*gx_default_draw_thin_line,*/ - NULL, /* begin image */ - NULL, /* image_data */ - NULL, /* end_image */ - NULL, /*gx_default_strip_tile_rectangle,*/ - txtwrite_strip_copy_rop, - NULL, /* get_clipping_box */ - NULL, /* txtwrite_begin_typed_image */ - NULL, /* get_bits_rectangle */ - NULL, /*gx_default_map_color_rgb_alpha,*/ - gx_null_create_compositor, - NULL, /* get_hardware_params */ - txtwrite_text_begin, - NULL, /* finish_copydevice */ - NULL, /* begin_transparency_group */ - NULL, /* end_transparency_group */ - NULL, /* begin_transparency_mask */ - NULL, /* end_transparency_mask */ - NULL, /* discard_transparency_layer */ - NULL, /* get_color_mapping_procs */ - NULL, /* get_color_comp_index */ - NULL, /* encode_color */ - NULL, /* decode_color */ - NULL, /* pattern manager */ - NULL, /* fill_rectangle_hl_color */ - NULL, /* include_color_space */ - NULL, /* fill_linear_color_scanline */ - NULL, /* fill_linear_color_trapezoid */ - NULL, /* fill_linear_color_triangle */ - NULL, /* update_spot_equivalent_colors */ - NULL, /* ret_devn_params */ - NULL, /* fillpage */ - NULL, /* push_transparency_state */ - NULL, /* pop_transparency_state */ - NULL, /* put_image */ - txtwrite_dev_spec_op, /* dev_spec_op */ - NULL, /* copy_planes */ - NULL, /* get_profile */ - NULL, /* set_graphics_type_tag */ - NULL, /* strip_copy_rop2 */ - NULL /* strip_tile_rect_devn */ - }, + { 0 }, /* proc table */ { 0 }, /* Page Data */ { 0 }, /* Output Filename */ 0, /* Output FILE * */ @@ -1090,14 +1038,15 @@ txtwrite_strip_tile_rectangle(gx_device * dev, const gx_strip_bitmap * tiles, } static int -txtwrite_strip_copy_rop(gx_device * dev, +txtwrite_strip_copy_rop2(gx_device * dev, const byte * sdata, int sourcex, uint sraster, gx_bitmap_id id, const gx_color_index * scolors, const gx_strip_bitmap * textures, const gx_color_index * tcolors, int x, int y, int w, int h, - int phase_x, int phase_y, gs_logical_operation_t lop) + int phase_x, int phase_y, gs_logical_operation_t lop, + uint plane_height) { return 0; }*/ @@ -1344,7 +1293,7 @@ txt_update_text_state(text_list_entry_t *ppts, gs_matrix smat, tmat; float size; int mask = 0; - int code = gx_path_current_point(penum->path, &cpt); + int code = gx_path_current_point(gs_text_enum_path(penum), &cpt); if (code < 0) return code; @@ -1957,7 +1906,7 @@ textw_text_process(gs_text_enum_t *pte) return code; /* Fall back to the default implementation. */ code = gx_default_text_begin(pte->dev, pte->pgs, &pte->text, pte->current_font, - pte->path, pte->pdcolor, pte->pcpath, pte->memory, &pte_fallback); + pte->pcpath, &pte_fallback); if (code < 0) return code; penum->pte_fallback = pte_fallback; @@ -2033,16 +1982,26 @@ textw_text_release(gs_text_enum_t *pte, client_name_t cname) gx_device_txtwrite_t *const tdev = (gx_device_txtwrite_t *) pte->dev; /* Free the working buffer where the Unicode was assembled from the enumerated text */ - if (penum->TextBuffer) + if (penum->TextBuffer) { gs_free(tdev->memory, penum->TextBuffer, 1, penum->TextBufferIndex, "txtwrite free temporary text buffer"); - if (penum->Widths) + penum->TextBuffer = NULL; + } + if (penum->Widths) { gs_free(tdev->memory, penum->Widths, sizeof(float), pte->text.size, "txtwrite free temporary widths array"); - if (penum->Advs) + penum->Widths = NULL; + } + if (penum->Advs) { gs_free(tdev->memory, penum->Advs, 1, penum->TextBufferIndex, "txtwrite free temporary text buffer"); - if (penum->GlyphWidths) + penum->Advs = NULL; + } + if (penum->GlyphWidths) { gs_free(tdev->memory, penum->GlyphWidths, 1, penum->TextBufferIndex, "txtwrite free temporary text buffer"); - if (penum->SpanDeltaX) + penum->GlyphWidths = NULL; + } + if (penum->SpanDeltaX) { gs_free(tdev->memory, penum->SpanDeltaX, 1, penum->TextBufferIndex, "txtwrite free temporary text buffer"); + penum->SpanDeltaX = NULL; + } /* If this is copied away when we complete the text enumeration succesfully, then * we set the pointer to NULL, if we get here with it non-NULL , then there was * an error. @@ -2059,6 +2018,7 @@ textw_text_release(gs_text_enum_t *pte, client_name_t cname) if (penum->text_state->FontName) gs_free(tdev->memory, penum->text_state->FontName, 1, penum->TextBufferIndex, "txtwrite free temporary font name copy"); gs_free(tdev->memory, penum->text_state, 1, sizeof(penum->text_state), "txtwrite free text state"); + penum->text_state = NULL; } } @@ -2078,13 +2038,14 @@ static const gs_text_enum_procs_t textw_text_procs = { static int txtwrite_text_begin(gx_device * dev, gs_gstate * pgs, const gs_text_params_t * text, gs_font * font, - gx_path * path, const gx_device_color * pdcolor, const gx_clip_path * pcpath, - gs_memory_t * mem, gs_text_enum_t ** ppenum) + gs_text_enum_t ** ppenum) { gx_device_txtwrite_t *const tdev = (gx_device_txtwrite_t *) dev; textw_text_enum_t *penum; int code; + gx_path *path = pgs->path; + gs_memory_t * mem = pgs->memory; /* If this is a stringwidth, we must let the default graphics library code handle it * in case there is no current point (this can happen if this is the first operation @@ -2095,8 +2056,8 @@ txtwrite_text_begin(gx_device * dev, gs_gstate * pgs, */ if ((!(text->operation & TEXT_DO_DRAW) && pgs->text_rendering_mode != 3) || path == 0 || !path_position_valid(path)) - return gx_default_text_begin(dev, pgs, text, font, path, pdcolor, - pcpath, mem, ppenum); + return gx_default_text_begin(dev, pgs, text, font, + pcpath, ppenum); /* Allocate and initialize one of our text enumerators. */ rc_alloc_struct_1(penum, textw_text_enum_t, &st_textw_text_enum, mem, return_error(gs_error_VMerror), "gdev_textw_text_begin"); @@ -2107,6 +2068,9 @@ txtwrite_text_begin(gx_device * dev, gs_gstate * pgs, penum->TextBuffer = NULL; penum->TextBufferIndex = 0; penum->Widths = NULL; + penum->Advs = NULL; + penum->GlyphWidths = NULL; + penum->SpanDeltaX = NULL; penum->pte_fallback = NULL; penum->d1_width = 0; penum->d1_width_set = false; @@ -2118,7 +2082,7 @@ txtwrite_text_begin(gx_device * dev, gs_gstate * pgs, memset(penum->text_state, 0x00, sizeof(text_list_entry_t)); code = gs_text_enum_init((gs_text_enum_t *)penum, &textw_text_procs, - dev, pgs, text, font, path, pdcolor, pcpath, mem); + dev, pgs, text, font, pcpath, mem); if (code < 0) { /* Belt and braces; I'm not certain this is required, but its safe */ gs_free(tdev->memory, penum->text_state, 1, sizeof(text_list_entry_t), "txtwrite free text state"); @@ -2127,7 +2091,7 @@ txtwrite_text_begin(gx_device * dev, gs_gstate * pgs, return code; } - code = gx_path_current_point(penum->path, &penum->origin); + code = gx_path_current_point(gs_text_enum_path(penum), &penum->origin); if (code != 0) return code; @@ -2137,14 +2101,15 @@ txtwrite_text_begin(gx_device * dev, gs_gstate * pgs, } static int -txtwrite_strip_copy_rop(gx_device * dev, +txtwrite_strip_copy_rop2(gx_device * dev, const byte * sdata, int sourcex, uint sraster, gx_bitmap_id id, const gx_color_index * scolors, const gx_strip_bitmap * textures, const gx_color_index * tcolors, int x, int y, int w, int h, - int phase_x, int phase_y, gs_logical_operation_t lop) + int phase_x, int phase_y, gs_logical_operation_t lop, + uint plane_height) { return 0; } diff --git a/devices/vector/gdevxps.c b/devices/vector/gdevxps.c index c435cd47..c946f322 100644 --- a/devices/vector/gdevxps.c +++ b/devices/vector/gdevxps.c @@ -198,8 +198,8 @@ gs_public_st_suffix_add1_final(st_device_xps, gx_device_xps, "gx_device_xps", device_xps_enum_ptrs, device_xps_reloc_ptrs, gx_device_finalize, st_device_vector, xps_pie); -#define xps_device_body(dname, depth)\ - std_device_dci_type_body(gx_device_xps, 0, dname, &st_device_xps, \ +#define xps_device_body(dname, depth, init)\ + std_device_dci_type_body(gx_device_xps, init, dname, &st_device_xps, \ DEFAULT_WIDTH_10THS * X_DPI / 10, \ DEFAULT_HEIGHT_10THS * Y_DPI / 10, \ X_DPI, Y_DPI, \ @@ -214,63 +214,41 @@ static dev_proc_get_params(xps_get_params); static dev_proc_put_params(xps_put_params); static dev_proc_fill_path(gdev_xps_fill_path); static dev_proc_stroke_path(gdev_xps_stroke_path); -static dev_proc_finish_copydevice(xps_finish_copydevice); -static dev_proc_begin_image(xps_begin_image); - -#define xps_device_procs \ -{ \ - xps_open_device, \ - NULL, /* get_initial_matrix */\ - NULL, /* sync_output */\ - xps_output_page,\ - xps_close_device,\ - gx_default_rgb_map_rgb_color,\ - gx_default_rgb_map_color_rgb,\ - gdev_vector_fill_rectangle,\ - NULL, /* tile_rectangle */\ - NULL, /* copy_mono */\ - NULL, /* copy_color */\ - NULL, /* draw_line */\ - NULL, /* get_bits */\ - xps_get_params,\ - xps_put_params,\ - NULL, /* map_cmyk_color */\ - NULL, /* get_xfont_procs */\ - NULL, /* get_xfont_device */\ - NULL, /* map_rgb_alpha_color */\ - gx_page_device_get_page_device,\ - NULL, /* get_alpha_bits */\ - NULL, /* copy_alpha */\ - NULL, /* get_band */\ - NULL, /* copy_rop */\ - gdev_xps_fill_path,\ - gdev_xps_stroke_path,\ - NULL, /* fill_mask */\ - NULL, /* gdev_vector_fill_trapezoid, */ \ - NULL, /* gdev_vector_fill_parallelogram */ \ - NULL, /* gdev_vector_fill_triangle */ \ - NULL, /* draw_thin_line */\ - xps_begin_image, /* begin_image */ \ - NULL, /* image_data */\ - NULL, /* end_image */\ - NULL, /* strip_tile_rectangle */\ - NULL, /* strip_copy_rop */\ - NULL, /* get_clipping_box */\ - NULL, /* begin_typed_image */\ - NULL, /* get_bits_rectangle */\ - NULL, /* map_color_rgb_alpha */\ - NULL, /* create_compositor */\ - NULL, /* get_hardware_params */\ - NULL, /* text_begin */\ - xps_finish_copydevice,\ - NULL,\ -} +static dev_proc_initialize_device_procs(xps_initialize_device_procs); +static dev_proc_begin_typed_image(xps_begin_typed_image); const gx_device_xps gs_xpswrite_device = { - xps_device_body("xpswrite", 24), - xps_device_procs + xps_device_body("xpswrite", 24, xps_initialize_device_procs), }; +static int +xps_initialize_device(gx_device *dev) +{ + gx_device_xps *xps = (gx_device_xps*)dev; + + memset(xps->PrinterName, 0x00, MAXPRINTERNAME); + + return 0; +} + +static void +xps_initialize_device_procs(gx_device *dev) +{ + set_dev_proc(dev, initialize_device, xps_initialize_device); + set_dev_proc(dev, open_device, xps_open_device); + set_dev_proc(dev, output_page, xps_output_page); + set_dev_proc(dev, close_device, xps_close_device); + set_dev_proc(dev, map_rgb_color, gx_default_rgb_map_rgb_color); + set_dev_proc(dev, map_color_rgb, gx_default_rgb_map_color_rgb); + set_dev_proc(dev, fill_rectangle, gdev_vector_fill_rectangle); + set_dev_proc(dev, get_params, xps_get_params); + set_dev_proc(dev, put_params, xps_put_params); + set_dev_proc(dev, get_page_device, gx_page_device_get_page_device); + set_dev_proc(dev, fill_path, gdev_xps_fill_path); + set_dev_proc(dev, stroke_path, gdev_xps_stroke_path); + set_dev_proc(dev, begin_typed_image, xps_begin_typed_image); +} + /* Vector device procedures */ static int xps_beginpage(gx_device_vector *vdev); @@ -1321,14 +1299,6 @@ xps_put_params(gx_device *dev, gs_param_list *plist) return code; } -static int xps_finish_copydevice(gx_device *dev, const gx_device *from_dev) -{ - gx_device_xps *xps = (gx_device_xps*)dev; - - memset(xps->PrinterName, 0x00, MAXPRINTERNAME); - return 0; -} - static int set_state_color(gx_device_vector *vdev, const gx_drawing_color *pdc, gx_color_index *color) { @@ -1898,15 +1868,20 @@ xps_write_profile(const gs_gstate *pgs, char *name, cmm_profile_t *profile, gx_d } static int -xps_begin_image(gx_device *dev, const gs_gstate *pgs, - const gs_image_t *pim, gs_image_format_t format, - const gs_int_rect *prect, const gx_drawing_color *pdcolor, - const gx_clip_path *pcpath, gs_memory_t *mem, - gx_image_enum_common_t **pinfo) +xps_begin_typed_image(gx_device *dev, + const gs_gstate *pgs, + const gs_matrix *pmat, + const gs_image_common_t *pic, + const gs_int_rect *prect, + const gx_drawing_color *pdcolor, + const gx_clip_path *pcpath, + gs_memory_t *mem, + gx_image_enum_common_t **pinfo) { gx_device_vector *vdev = (gx_device_vector *)dev; gx_device_xps *xdev = (gx_device_xps *)dev; - gs_color_space *pcs = pim->ColorSpace; + const gs_image_t *pim = (const gs_image_t *)pic; + gs_color_space *pcs; xps_image_enum_t *pie = NULL; xps_icc_data_t *icc_data; gs_matrix mat; @@ -1922,6 +1897,10 @@ xps_begin_image(gx_device *dev, const gs_gstate *pgs, gsicc_rendering_param_t rendering_params; bool force8bit = false; + if (pic->type->index != 1) + goto use_default; + + pcs = pim->ColorSpace; /* No image mask yet. Also, need a color space */ if (pcs == NULL || ((const gs_image1_t *)pim)->ImageMask) goto use_default; @@ -1939,8 +1918,10 @@ xps_begin_image(gx_device *dev, const gs_gstate *pgs, if (gs_matrix_invert(&pim->ImageMatrix, &mat) < 0) goto use_default; + if (pmat == NULL) + pmat = &ctm_only(pgs); if (pgs) - gs_matrix_multiply(&mat, &ctm_only(pgs), &mat); + gs_matrix_multiply(&mat, pmat, &mat); pie = gs_alloc_struct(mem, xps_image_enum_t, &st_xps_image_enum, "xps_begin_image"); @@ -2078,7 +2059,7 @@ xps_begin_image(gx_device *dev, const gs_gstate *pgs, if (pgs == NULL) return(gs_error_invalidaccess); - code = gdev_vector_begin_image(vdev, pgs, pim, format, prect, + code = gdev_vector_begin_image(vdev, pgs, pim, pim->format, prect, pdcolor, pcpath, mem, &xps_image_enum_procs, (gdev_vector_image_enum_t *)pie); if (code < 0) @@ -2147,8 +2128,8 @@ xps_begin_image(gx_device *dev, const gs_gstate *pgs, return 0; use_default: - return gx_default_begin_image(dev, pgs, pim, format, prect, - pdcolor, pcpath, mem, pinfo); + return gx_default_begin_typed_image(dev, pgs, pmat, pic, prect, + pdcolor, pcpath, mem, pinfo); } /* Handles conversion from decoded DeviceN, Sep or Indexed space to Device color @@ -2329,6 +2310,7 @@ xps_image_end_image(gx_image_enum_common_t * info, bool draw_last) /* Add the image relationship */ code = xps_add_image_relationship(pie); + gs_free_object(pie->memory, pie, "xps_image_end_image"); exit: return code; } |