summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'devices/vector')
-rw-r--r--devices/vector/doc_common.c2
-rw-r--r--devices/vector/gdevagl.c4312
-rw-r--r--devices/vector/gdevagl.h42
-rw-r--r--devices/vector/gdevdocxw.c130
-rw-r--r--devices/vector/gdevpdf.c67
-rw-r--r--devices/vector/gdevpdfb.h83
-rw-r--r--devices/vector/gdevpdfd.c161
-rw-r--r--devices/vector/gdevpdfg.c28
-rw-r--r--devices/vector/gdevpdfi.c258
-rw-r--r--devices/vector/gdevpdfj.c3
-rw-r--r--devices/vector/gdevpdfm.c29
-rw-r--r--devices/vector/gdevpdfp.c19
-rw-r--r--devices/vector/gdevpdft.c4
-rw-r--r--devices/vector/gdevpdfu.c2
-rw-r--r--devices/vector/gdevpdfv.c6
-rw-r--r--devices/vector/gdevpdfx.h11
-rw-r--r--devices/vector/gdevpdtb.c11
-rw-r--r--devices/vector/gdevpdtc.c9
-rw-r--r--devices/vector/gdevpdte.c24
-rw-r--r--devices/vector/gdevpdts.c46
-rw-r--r--devices/vector/gdevpdtt.c35
-rw-r--r--devices/vector/gdevpdtw.c3
-rw-r--r--devices/vector/gdevpsdf.h11
-rw-r--r--devices/vector/gdevpsdi.c8
-rw-r--r--devices/vector/gdevpsdp.c7
-rw-r--r--devices/vector/gdevpsdu.c17
-rw-r--r--devices/vector/gdevpx.c151
-rw-r--r--devices/vector/gdevtxtw.c149
-rw-r--r--devices/vector/gdevxps.c128
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, &params, pim, pgs, resolution, lossless);
} else {
code = setup_image_compression(pbw, &params, 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(&params, pim, resolution)) {
pdev->JPEG_PassThrough = 0;
+ pdev->JPX_PassThrough = 0;
code = setup_downsampling(pbw, &params, pim, pgs, resolution, lossless);
} else {
code = setup_image_compression(pbw, &params, 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, &params, psdf_param_items);
+ code = gs_param_read_items(plist, &params, 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;
}