1 /*
2  * << Haru Free PDF Library >> -- hpdf_encoder.c
3  *
4  * URL: http://libharu.org
5  *
6  * Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
7  * Copyright (c) 2007-2009 Antony Dovgal <tony@daylessday.org>
8  *
9  * Permission to use, copy, modify, distribute and sell this software
10  * and its documentation for any purpose is hereby granted without fee,
11  * provided that the above copyright notice appear in all copies and
12  * that both that copyright notice and this permission notice appear
13  * in supporting documentation.
14  * It is provided "as is" without express or implied warranty.
15  *
16  */
17 
18 #include "hpdf_conf.h"
19 #include "hpdf_utils.h"
20 #include "hpdf_encoder.h"
21 #include "hpdf.h"
22 
23 typedef struct _HPDF_UnicodeGryphPair {
24     HPDF_UNICODE     unicode;
25     const char  *gryph_name;
26 } HPDF_UnicodeGryphPair;
27 
28 #define HPDF_BASIC_ENCODER_FIRST_CHAR  32
29 #define HPDF_BASIC_ENCODER_LAST_CHAR   255
30 
31 static const HPDF_UnicodeGryphPair HPDF_UNICODE_GRYPH_NAME_MAP[] = {
32     {0x0000, char_NOTDEF},
33     {0x0020, "space"},
34     {0x0021, "exclam"},
35     {0x0022, "quotedbl"},
36     {0x0023, "numbersign"},
37     {0x0024, "dollar"},
38     {0x0025, "percent"},
39     {0x0026, "ampersand"},
40     {0x0027, "quotesingle"},
41     {0x0028, "parenleft"},
42     {0x0029, "parenright"},
43     {0x002A, "asterisk"},
44     {0x002B, "plus"},
45     {0x002C, "comma"},
46     {0x002D, "hyphen"},
47     {0x002E, "period"},
48     {0x002F, "slash"},
49     {0x0030, "zero"},
50     {0x0031, "one"},
51     {0x0032, "two"},
52     {0x0033, "three"},
53     {0x0034, "four"},
54     {0x0035, "five"},
55     {0x0036, "six"},
56     {0x0037, "seven"},
57     {0x0038, "eight"},
58     {0x0039, "nine"},
59     {0x003A, "colon"},
60     {0x003B, "semicolon"},
61     {0x003C, "less"},
62     {0x003D, "equal"},
63     {0x003E, "greater"},
64     {0x003F, "question"},
65     {0x0040, "at"},
66     {0x0041, "A"},
67     {0x0042, "B"},
68     {0x0043, "C"},
69     {0x0044, "D"},
70     {0x0045, "E"},
71     {0x0046, "F"},
72     {0x0047, "G"},
73     {0x0048, "H"},
74     {0x0049, "I"},
75     {0x004A, "J"},
76     {0x004B, "K"},
77     {0x004C, "L"},
78     {0x004D, "M"},
79     {0x004E, "N"},
80     {0x004F, "O"},
81     {0x0050, "P"},
82     {0x0051, "Q"},
83     {0x0052, "R"},
84     {0x0053, "S"},
85     {0x0054, "T"},
86     {0x0055, "U"},
87     {0x0056, "V"},
88     {0x0057, "W"},
89     {0x0058, "X"},
90     {0x0059, "Y"},
91     {0x005A, "Z"},
92     {0x005B, "bracketleft"},
93     {0x005C, "backslash"},
94     {0x005D, "bracketright"},
95     {0x005E, "asciicircum"},
96     {0x005F, "underscore"},
97     {0x0060, "grave"},
98     {0x0061, "a"},
99     {0x0062, "b"},
100     {0x0063, "c"},
101     {0x0064, "d"},
102     {0x0065, "e"},
103     {0x0066, "f"},
104     {0x0067, "g"},
105     {0x0068, "h"},
106     {0x0069, "i"},
107     {0x006A, "j"},
108     {0x006B, "k"},
109     {0x006C, "l"},
110     {0x006D, "m"},
111     {0x006E, "n"},
112     {0x006F, "o"},
113     {0x0070, "p"},
114     {0x0071, "q"},
115     {0x0072, "r"},
116     {0x0073, "s"},
117     {0x0074, "t"},
118     {0x0075, "u"},
119     {0x0076, "v"},
120     {0x0077, "w"},
121     {0x0078, "x"},
122     {0x0079, "y"},
123     {0x007A, "z"},
124     {0x007B, "braceleft"},
125     {0x007C, "bar"},
126     {0x007D, "braceright"},
127     {0x007E, "asciitilde"},
128     {0x00A0, "space"},
129     {0x00A1, "exclamdown"},
130     {0x00A2, "cent"},
131     {0x00A3, "sterling"},
132     {0x00A4, "currency"},
133     {0x00A5, "yen"},
134     {0x00A6, "brokenbar"},
135     {0x00A7, "section"},
136     {0x00A8, "dieresis"},
137     {0x00A9, "copyright"},
138     {0x00AA, "ordfeminine"},
139     {0x00AB, "guillemotleft"},
140     {0x00AC, "logicalnot"},
141     {0x00AD, "hyphen"},
142     {0x00AE, "registered"},
143     {0x00AF, "macron"},
144     {0x00B0, "degree"},
145     {0x00B1, "plusminus"},
146     {0x00B2, "twosuperior"},
147     {0x00B3, "threesuperior"},
148     {0x00B4, "acute"},
149     {0x00B5, "mu"},
150     {0x00B6, "paragraph"},
151     {0x00B7, "periodcentered"},
152     {0x00B8, "cedilla"},
153     {0x00B9, "onesuperior"},
154     {0x00BA, "ordmasculine"},
155     {0x00BB, "guillemotright"},
156     {0x00BC, "onequarter"},
157     {0x00BD, "onehalf"},
158     {0x00BE, "threequarters"},
159     {0x00BF, "questiondown"},
160     {0x00C0, "Agrave"},
161     {0x00C1, "Aacute"},
162     {0x00C2, "Acircumflex"},
163     {0x00C3, "Atilde"},
164     {0x00C4, "Adieresis"},
165     {0x00C5, "Aring"},
166     {0x00C6, "AE"},
167     {0x00C7, "Ccedilla"},
168     {0x00C8, "Egrave"},
169     {0x00C9, "Eacute"},
170     {0x00CA, "Ecircumflex"},
171     {0x00CB, "Edieresis"},
172     {0x00CC, "Igrave"},
173     {0x00CD, "Iacute"},
174     {0x00CE, "Icircumflex"},
175     {0x00CF, "Idieresis"},
176     {0x00D0, "Eth"},
177     {0x00D1, "Ntilde"},
178     {0x00D2, "Ograve"},
179     {0x00D3, "Oacute"},
180     {0x00D4, "Ocircumflex"},
181     {0x00D5, "Otilde"},
182     {0x00D6, "Odieresis"},
183     {0x00D7, "multiply"},
184     {0x00D8, "Oslash"},
185     {0x00D9, "Ugrave"},
186     {0x00DA, "Uacute"},
187     {0x00DB, "Ucircumflex"},
188     {0x00DC, "Udieresis"},
189     {0x00DD, "Yacute"},
190     {0x00DE, "Thorn"},
191     {0x00DF, "germandbls"},
192     {0x00E0, "agrave"},
193     {0x00E1, "aacute"},
194     {0x00E2, "acircumflex"},
195     {0x00E3, "atilde"},
196     {0x00E4, "adieresis"},
197     {0x00E5, "aring"},
198     {0x00E6, "ae"},
199     {0x00E7, "ccedilla"},
200     {0x00E8, "egrave"},
201     {0x00E9, "eacute"},
202     {0x00EA, "ecircumflex"},
203     {0x00EB, "edieresis"},
204     {0x00EC, "igrave"},
205     {0x00ED, "iacute"},
206     {0x00EE, "icircumflex"},
207     {0x00EF, "idieresis"},
208     {0x00F0, "eth"},
209     {0x00F1, "ntilde"},
210     {0x00F2, "ograve"},
211     {0x00F3, "oacute"},
212     {0x00F4, "ocircumflex"},
213     {0x00F5, "otilde"},
214     {0x00F6, "odieresis"},
215     {0x00F7, "divide"},
216     {0x00F8, "oslash"},
217     {0x00F9, "ugrave"},
218     {0x00FA, "uacute"},
219     {0x00FB, "ucircumflex"},
220     {0x00FC, "udieresis"},
221     {0x00FD, "yacute"},
222     {0x00FE, "thorn"},
223     {0x00FF, "ydieresis"},
224     {0x0100, "Amacron"},
225     {0x0101, "amacron"},
226     {0x0102, "Abreve"},
227     {0x0103, "abreve"},
228     {0x0104, "Aogonek"},
229     {0x0105, "aogonek"},
230     {0x0106, "Cacute"},
231     {0x0107, "cacute"},
232     {0x0108, "Ccircumflex"},
233     {0x0109, "ccircumflex"},
234     {0x010A, "Cdotaccent"},
235     {0x010B, "cdotaccent"},
236     {0x010C, "Ccaron"},
237     {0x010D, "ccaron"},
238     {0x010E, "Dcaron"},
239     {0x010F, "dcaron"},
240     {0x0110, "Dcroat"},
241     {0x0111, "dcroat"},
242     {0x0112, "Emacron"},
243     {0x0113, "emacron"},
244     {0x0114, "Ebreve"},
245     {0x0115, "ebreve"},
246     {0x0116, "Edotaccent"},
247     {0x0117, "edotaccent"},
248     {0x0118, "Eogonek"},
249     {0x0119, "eogonek"},
250     {0x011A, "Ecaron"},
251     {0x011B, "ecaron"},
252     {0x011C, "Gcircumflex"},
253     {0x011D, "gcircumflex"},
254     {0x011E, "Gbreve"},
255     {0x011F, "gbreve"},
256     {0x0120, "Gdotaccent"},
257     {0x0121, "gdotaccent"},
258     {0x0122, "Gcommaaccent"},
259     {0x0123, "gcommaaccent"},
260     {0x0124, "Hcircumflex"},
261     {0x0125, "hcircumflex"},
262     {0x0126, "Hbar"},
263     {0x0127, "hbar"},
264     {0x0128, "Itilde"},
265     {0x0129, "itilde"},
266     {0x012A, "Imacron"},
267     {0x012B, "imacron"},
268     {0x012C, "Ibreve"},
269     {0x012D, "ibreve"},
270     {0x012E, "Iogonek"},
271     {0x012F, "iogonek"},
272     {0x0130, "Idotaccent"},
273     {0x0131, "dotlessi"},
274     {0x0132, "IJ"},
275     {0x0133, "ij"},
276     {0x0134, "Jcircumflex"},
277     {0x0135, "jcircumflex"},
278     {0x0136, "Kcommaaccent"},
279     {0x0137, "kcommaaccent"},
280     {0x0138, "kgreenlandic"},
281     {0x0139, "Lacute"},
282     {0x013A, "lacute"},
283     {0x013B, "Lcommaaccent"},
284     {0x013C, "lcommaaccent"},
285     {0x013D, "Lcaron"},
286     {0x013E, "lcaron"},
287     {0x013F, "Ldot"},
288     {0x0140, "ldot"},
289     {0x0141, "Lslash"},
290     {0x0142, "lslash"},
291     {0x0143, "Nacute"},
292     {0x0144, "nacute"},
293     {0x0145, "Ncommaaccent"},
294     {0x0146, "ncommaaccent"},
295     {0x0147, "Ncaron"},
296     {0x0148, "ncaron"},
297     {0x0149, "napostrophe"},
298     {0x014A, "Eng"},
299     {0x014B, "eng"},
300     {0x014C, "Omacron"},
301     {0x014D, "omacron"},
302     {0x014E, "Obreve"},
303     {0x014F, "obreve"},
304     {0x0150, "Ohungarumlaut"},
305     {0x0151, "ohungarumlaut"},
306     {0x0152, "OE"},
307     {0x0153, "oe"},
308     {0x0154, "Racute"},
309     {0x0155, "racute"},
310     {0x0156, "Rcommaaccent"},
311     {0x0157, "rcommaaccent"},
312     {0x0158, "Rcaron"},
313     {0x0159, "rcaron"},
314     {0x015A, "Sacute"},
315     {0x015B, "sacute"},
316     {0x015C, "Scircumflex"},
317     {0x015D, "scircumflex"},
318     {0x015E, "Scedilla"},
319     {0x015F, "scedilla"},
320     {0x0160, "Scaron"},
321     {0x0161, "scaron"},
322     {0x0162, "Tcommaaccent"},
323     {0x0163, "tcommaaccent"},
324     {0x0164, "Tcaron"},
325     {0x0165, "tcaron"},
326     {0x0166, "Tbar"},
327     {0x0167, "tbar"},
328     {0x0168, "Utilde"},
329     {0x0169, "utilde"},
330     {0x016A, "Umacron"},
331     {0x016B, "umacron"},
332     {0x016C, "Ubreve"},
333     {0x016D, "ubreve"},
334     {0x016E, "Uring"},
335     {0x016F, "uring"},
336     {0x0170, "Uhungarumlaut"},
337     {0x0171, "uhungarumlaut"},
338     {0x0172, "Uogonek"},
339     {0x0173, "uogonek"},
340     {0x0174, "Wcircumflex"},
341     {0x0175, "wcircumflex"},
342     {0x0176, "Ycircumflex"},
343     {0x0177, "ycircumflex"},
344     {0x0178, "Ydieresis"},
345     {0x0179, "Zacute"},
346     {0x017A, "zacute"},
347     {0x017B, "Zdotaccent"},
348     {0x017C, "zdotaccent"},
349     {0x017D, "Zcaron"},
350     {0x017E, "zcaron"},
351     {0x017F, "longs"},
352     {0x0192, "florin"},
353     {0x01A0, "Ohorn"},
354     {0x01A1, "ohorn"},
355     {0x01AF, "Uhorn"},
356     {0x01B0, "uhorn"},
357     {0x01E6, "Gcaron"},
358     {0x01E7, "gcaron"},
359     {0x01FA, "Aringacute"},
360     {0x01FB, "aringacute"},
361     {0x01FC, "AEacute"},
362     {0x01FD, "aeacute"},
363     {0x01FE, "Oslashacute"},
364     {0x01FF, "oslashacute"},
365     {0x0218, "Scommaaccent"},
366     {0x0219, "scommaaccent"},
367     {0x021A, "Tcommaaccent"},
368     {0x021B, "tcommaaccent"},
369     {0x02BC, "afii57929"},
370     {0x02BD, "afii64937"},
371     {0x02C6, "circumflex"},
372     {0x02C7, "caron"},
373     {0x02C9, "macron"},
374     {0x02D8, "breve"},
375     {0x02D9, "dotaccent"},
376     {0x02DA, "ring"},
377     {0x02DB, "ogonek"},
378     {0x02DC, "tilde"},
379     {0x02DD, "hungarumlaut"},
380     {0x0300, "gravecomb"},
381     {0x0301, "acutecomb"},
382     {0x0303, "tildecomb"},
383     {0x0309, "hookabovecomb"},
384     {0x0323, "dotbelowcomb"},
385     {0x0384, "tonos"},
386     {0x0385, "dieresistonos"},
387     {0x0386, "Alphatonos"},
388     {0x0387, "anoteleia"},
389     {0x0388, "Epsilontonos"},
390     {0x0389, "Etatonos"},
391     {0x038A, "Iotatonos"},
392     {0x038C, "Omicrontonos"},
393     {0x038E, "Upsilontonos"},
394     {0x038F, "Omegatonos"},
395     {0x0390, "iotadieresistonos"},
396     {0x0391, "Alpha"},
397     {0x0392, "Beta"},
398     {0x0393, "Gamma"},
399     {0x0394, "Delta"},
400     {0x0395, "Epsilon"},
401     {0x0396, "Zeta"},
402     {0x0397, "Eta"},
403     {0x0398, "Theta"},
404     {0x0399, "Iota"},
405     {0x039A, "Kappa"},
406     {0x039B, "Lambda"},
407     {0x039C, "Mu"},
408     {0x039D, "Nu"},
409     {0x039E, "Xi"},
410     {0x039F, "Omicron"},
411     {0x03A0, "Pi"},
412     {0x03A1, "Rho"},
413     {0x03A3, "Sigma"},
414     {0x03A4, "Tau"},
415     {0x03A5, "Upsilon"},
416     {0x03A6, "Phi"},
417     {0x03A7, "Chi"},
418     {0x03A8, "Psi"},
419     {0x03A9, "Omega"},
420     {0x03AA, "Iotadieresis"},
421     {0x03AB, "Upsilondieresis"},
422     {0x03AC, "alphatonos"},
423     {0x03AD, "epsilontonos"},
424     {0x03AE, "etatonos"},
425     {0x03AF, "iotatonos"},
426     {0x03B0, "upsilondieresistonos"},
427     {0x03B1, "alpha"},
428     {0x03B2, "beta"},
429     {0x03B3, "gamma"},
430     {0x03B4, "delta"},
431     {0x03B5, "epsilon"},
432     {0x03B6, "zeta"},
433     {0x03B7, "eta"},
434     {0x03B8, "theta"},
435     {0x03B9, "iota"},
436     {0x03BA, "kappa"},
437     {0x03BB, "lambda"},
438     {0x03BC, "mu"},
439     {0x03BD, "nu"},
440     {0x03BE, "xi"},
441     {0x03BF, "omicron"},
442     {0x03C0, "pi"},
443     {0x03C1, "rho"},
444     {0x03C2, "sigma1"},
445     {0x03C3, "sigma"},
446     {0x03C4, "tau"},
447     {0x03C5, "upsilon"},
448     {0x03C6, "phi"},
449     {0x03C7, "chi"},
450     {0x03C8, "psi"},
451     {0x03C9, "omega"},
452     {0x03CA, "iotadieresis"},
453     {0x03CB, "upsilondieresis"},
454     {0x03CC, "omicrontonos"},
455     {0x03CD, "upsilontonos"},
456     {0x03CE, "omegatonos"},
457     {0x03D1, "theta1"},
458     {0x03D2, "Upsilon1"},
459     {0x03D5, "phi1"},
460     {0x03D6, "omega1"},
461     {0x0401, "afii10023"},
462     {0x0402, "afii10051"},
463     {0x0403, "afii10052"},
464     {0x0404, "afii10053"},
465     {0x0405, "afii10054"},
466     {0x0406, "afii10055"},
467     {0x0407, "afii10056"},
468     {0x0408, "afii10057"},
469     {0x0409, "afii10058"},
470     {0x040A, "afii10059"},
471     {0x040B, "afii10060"},
472     {0x040C, "afii10061"},
473     {0x040E, "afii10062"},
474     {0x040F, "afii10145"},
475     {0x0410, "afii10017"},
476     {0x0411, "afii10018"},
477     {0x0412, "afii10019"},
478     {0x0413, "afii10020"},
479     {0x0414, "afii10021"},
480     {0x0415, "afii10022"},
481     {0x0416, "afii10024"},
482     {0x0417, "afii10025"},
483     {0x0418, "afii10026"},
484     {0x0419, "afii10027"},
485     {0x041A, "afii10028"},
486     {0x041B, "afii10029"},
487     {0x041C, "afii10030"},
488     {0x041D, "afii10031"},
489     {0x041E, "afii10032"},
490     {0x041F, "afii10033"},
491     {0x0420, "afii10034"},
492     {0x0421, "afii10035"},
493     {0x0422, "afii10036"},
494     {0x0423, "afii10037"},
495     {0x0424, "afii10038"},
496     {0x0425, "afii10039"},
497     {0x0426, "afii10040"},
498     {0x0427, "afii10041"},
499     {0x0428, "afii10042"},
500     {0x0429, "afii10043"},
501     {0x042A, "afii10044"},
502     {0x042B, "afii10045"},
503     {0x042C, "afii10046"},
504     {0x042D, "afii10047"},
505     {0x042E, "afii10048"},
506     {0x042F, "afii10049"},
507     {0x0430, "afii10065"},
508     {0x0431, "afii10066"},
509     {0x0432, "afii10067"},
510     {0x0433, "afii10068"},
511     {0x0434, "afii10069"},
512     {0x0435, "afii10070"},
513     {0x0436, "afii10072"},
514     {0x0437, "afii10073"},
515     {0x0438, "afii10074"},
516     {0x0439, "afii10075"},
517     {0x043A, "afii10076"},
518     {0x043B, "afii10077"},
519     {0x043C, "afii10078"},
520     {0x043D, "afii10079"},
521     {0x043E, "afii10080"},
522     {0x043F, "afii10081"},
523     {0x0440, "afii10082"},
524     {0x0441, "afii10083"},
525     {0x0442, "afii10084"},
526     {0x0443, "afii10085"},
527     {0x0444, "afii10086"},
528     {0x0445, "afii10087"},
529     {0x0446, "afii10088"},
530     {0x0447, "afii10089"},
531     {0x0448, "afii10090"},
532     {0x0449, "afii10091"},
533     {0x044A, "afii10092"},
534     {0x044B, "afii10093"},
535     {0x044C, "afii10094"},
536     {0x044D, "afii10095"},
537     {0x044E, "afii10096"},
538     {0x044F, "afii10097"},
539     {0x0451, "afii10071"},
540     {0x0452, "afii10099"},
541     {0x0453, "afii10100"},
542     {0x0454, "afii10101"},
543     {0x0455, "afii10102"},
544     {0x0456, "afii10103"},
545     {0x0457, "afii10104"},
546     {0x0458, "afii10105"},
547     {0x0459, "afii10106"},
548     {0x045A, "afii10107"},
549     {0x045B, "afii10108"},
550     {0x045C, "afii10109"},
551     {0x045E, "afii10110"},
552     {0x045F, "afii10193"},
553     {0x0462, "afii10146"},
554     {0x0463, "afii10194"},
555     {0x0472, "afii10147"},
556     {0x0473, "afii10195"},
557     {0x0474, "afii10148"},
558     {0x0475, "afii10196"},
559     {0x0490, "afii10050"},
560     {0x0491, "afii10098"},
561     {0x04D9, "afii10846"},
562     {0x05B0, "afii57799"},
563     {0x05B1, "afii57801"},
564     {0x05B2, "afii57800"},
565     {0x05B3, "afii57802"},
566     {0x05B4, "afii57793"},
567     {0x05B5, "afii57794"},
568     {0x05B6, "afii57795"},
569     {0x05B7, "afii57798"},
570     {0x05B8, "afii57797"},
571     {0x05B9, "afii57806"},
572     {0x05BB, "afii57796"},
573     {0x05BC, "afii57807"},
574     {0x05BD, "afii57839"},
575     {0x05BE, "afii57645"},
576     {0x05BF, "afii57841"},
577     {0x05C0, "afii57842"},
578     {0x05C1, "afii57804"},
579     {0x05C2, "afii57803"},
580     {0x05C3, "afii57658"},
581     {0x05D0, "afii57664"},
582     {0x05D1, "afii57665"},
583     {0x05D2, "afii57666"},
584     {0x05D3, "afii57667"},
585     {0x05D4, "afii57668"},
586     {0x05D5, "afii57669"},
587     {0x05D6, "afii57670"},
588     {0x05D7, "afii57671"},
589     {0x05D8, "afii57672"},
590     {0x05D9, "afii57673"},
591     {0x05DA, "afii57674"},
592     {0x05DB, "afii57675"},
593     {0x05DC, "afii57676"},
594     {0x05DD, "afii57677"},
595     {0x05DE, "afii57678"},
596     {0x05DF, "afii57679"},
597     {0x05E0, "afii57680"},
598     {0x05E1, "afii57681"},
599     {0x05E2, "afii57682"},
600     {0x05E3, "afii57683"},
601     {0x05E4, "afii57684"},
602     {0x05E5, "afii57685"},
603     {0x05E6, "afii57686"},
604     {0x05E7, "afii57687"},
605     {0x05E8, "afii57688"},
606     {0x05E9, "afii57689"},
607     {0x05EA, "afii57690"},
608     {0x05F0, "afii57716"},
609     {0x05F1, "afii57717"},
610     {0x05F2, "afii57718"},
611     {0x060C, "afii57388"},
612     {0x061B, "afii57403"},
613     {0x061F, "afii57407"},
614     {0x0621, "afii57409"},
615     {0x0622, "afii57410"},
616     {0x0623, "afii57411"},
617     {0x0624, "afii57412"},
618     {0x0625, "afii57413"},
619     {0x0626, "afii57414"},
620     {0x0627, "afii57415"},
621     {0x0628, "afii57416"},
622     {0x0629, "afii57417"},
623     {0x062A, "afii57418"},
624     {0x062B, "afii57419"},
625     {0x062C, "afii57420"},
626     {0x062D, "afii57421"},
627     {0x062E, "afii57422"},
628     {0x062F, "afii57423"},
629     {0x0630, "afii57424"},
630     {0x0631, "afii57425"},
631     {0x0632, "afii57426"},
632     {0x0633, "afii57427"},
633     {0x0634, "afii57428"},
634     {0x0635, "afii57429"},
635     {0x0636, "afii57430"},
636     {0x0637, "afii57431"},
637     {0x0638, "afii57432"},
638     {0x0639, "afii57433"},
639     {0x063A, "afii57434"},
640     {0x0640, "afii57440"},
641     {0x0641, "afii57441"},
642     {0x0642, "afii57442"},
643     {0x0643, "afii57443"},
644     {0x0644, "afii57444"},
645     {0x0645, "afii57445"},
646     {0x0646, "afii57446"},
647     {0x0647, "afii57470"},
648     {0x0648, "afii57448"},
649     {0x0649, "afii57449"},
650     {0x064A, "afii57450"},
651     {0x064B, "afii57451"},
652     {0x064C, "afii57452"},
653     {0x064D, "afii57453"},
654     {0x064E, "afii57454"},
655     {0x064F, "afii57455"},
656     {0x0650, "afii57456"},
657     {0x0651, "afii57457"},
658     {0x0652, "afii57458"},
659     {0x0660, "afii57392"},
660     {0x0661, "afii57393"},
661     {0x0662, "afii57394"},
662     {0x0663, "afii57395"},
663     {0x0664, "afii57396"},
664     {0x0665, "afii57397"},
665     {0x0666, "afii57398"},
666     {0x0667, "afii57399"},
667     {0x0668, "afii57400"},
668     {0x0669, "afii57401"},
669     {0x066A, "afii57381"},
670     {0x066D, "afii63167"},
671     {0x0679, "afii57511"},
672     {0x067E, "afii57506"},
673     {0x0686, "afii57507"},
674     {0x0688, "afii57512"},
675     {0x0691, "afii57513"},
676     {0x0698, "afii57508"},
677     {0x06A4, "afii57505"},
678     {0x06AF, "afii57509"},
679     {0x06BA, "afii57514"},
680     {0x06D2, "afii57519"},
681     {0x06D5, "afii57534"},
682     {0x1E80, "Wgrave"},
683     {0x1E81, "wgrave"},
684     {0x1E82, "Wacute"},
685     {0x1E83, "wacute"},
686     {0x1E84, "Wdieresis"},
687     {0x1E85, "wdieresis"},
688     {0x1EF2, "Ygrave"},
689     {0x1EF3, "ygrave"},
690     {0x200C, "afii61664"},
691     {0x200D, "afii301"},
692     {0x200E, "afii299"},
693     {0x200F, "afii300"},
694     {0x2012, "figuredash"},
695     {0x2013, "endash"},
696     {0x2014, "emdash"},
697     {0x2015, "afii00208"},
698     {0x2017, "underscoredbl"},
699     {0x2018, "quoteleft"},
700     {0x2019, "quoteright"},
701     {0x201A, "quotesinglbase"},
702     {0x201B, "quotereversed"},
703     {0x201C, "quotedblleft"},
704     {0x201D, "quotedblright"},
705     {0x201E, "quotedblbase"},
706     {0x2020, "dagger"},
707     {0x2021, "daggerdbl"},
708     {0x2022, "bullet"},
709     {0x2024, "onedotenleader"},
710     {0x2025, "twodotenleader"},
711     {0x2026, "ellipsis"},
712     {0x202C, "afii61573"},
713     {0x202D, "afii61574"},
714     {0x202E, "afii61575"},
715     {0x2030, "perthousand"},
716     {0x2032, "minute"},
717     {0x2033, "second"},
718     {0x2039, "guilsinglleft"},
719     {0x203A, "guilsinglright"},
720     {0x203C, "exclamdbl"},
721     {0x2044, "fraction"},
722     {0x2070, "zerosuperior"},
723     {0x2074, "foursuperior"},
724     {0x2075, "fivesuperior"},
725     {0x2076, "sixsuperior"},
726     {0x2077, "sevensuperior"},
727     {0x2078, "eightsuperior"},
728     {0x2079, "ninesuperior"},
729     {0x207D, "parenleftsuperior"},
730     {0x207E, "parenrightsuperior"},
731     {0x207F, "nsuperior"},
732     {0x2080, "zeroinferior"},
733     {0x2081, "oneinferior"},
734     {0x2082, "twoinferior"},
735     {0x2083, "threeinferior"},
736     {0x2084, "fourinferior"},
737     {0x2085, "fiveinferior"},
738     {0x2086, "sixinferior"},
739     {0x2087, "seveninferior"},
740     {0x2088, "eightinferior"},
741     {0x2089, "nineinferior"},
742     {0x208D, "parenleftinferior"},
743     {0x208E, "parenrightinferior"},
744     {0x20A1, "colonmonetary"},
745     {0x20A3, "franc"},
746     {0x20A4, "lira"},
747     {0x20A7, "peseta"},
748     {0x20AA, "afii57636"},
749     {0x20AB, "dong"},
750     {0x20AC, "Euro"},
751     {0x2105, "afii61248"},
752     {0x2111, "Ifraktur"},
753     {0x2113, "afii61289"},
754     {0x2116, "afii61352"},
755     {0x2118, "weierstrass"},
756     {0x211C, "Rfraktur"},
757     {0x211E, "prescription"},
758     {0x2122, "trademark"},
759     {0x2126, "Omega"},
760     {0x212E, "estimated"},
761     {0x2135, "aleph"},
762     {0x2153, "onethird"},
763     {0x2154, "twothirds"},
764     {0x215B, "oneeighth"},
765     {0x215C, "threeeighths"},
766     {0x215D, "fiveeighths"},
767     {0x215E, "seveneighths"},
768     {0x2190, "arrowleft"},
769     {0x2191, "arrowup"},
770     {0x2192, "arrowright"},
771     {0x2193, "arrowdown"},
772     {0x2194, "arrowboth"},
773     {0x2195, "arrowupdn"},
774     {0x21A8, "arrowupdnbse"},
775     {0x21B5, "carriagereturn"},
776     {0x21D0, "arrowdblleft"},
777     {0x21D1, "arrowdblup"},
778     {0x21D2, "arrowdblright"},
779     {0x21D3, "arrowdbldown"},
780     {0x21D4, "arrowdblboth"},
781     {0x2200, "universal"},
782     {0x2202, "partialdiff"},
783     {0x2203, "existential"},
784     {0x2205, "emptyset"},
785     {0x2206, "Delta"},
786     {0x2207, "gradient"},
787     {0x2208, "element"},
788     {0x2209, "notelement"},
789     {0x220B, "suchthat"},
790     {0x220F, "product"},
791     {0x2211, "summation"},
792     {0x2212, "minus"},
793     {0x2215, "fraction"},
794     {0x2217, "asteriskmath"},
795     {0x2219, "periodcentered"},
796     {0x221A, "radical"},
797     {0x221D, "proportional"},
798     {0x221E, "infinity"},
799     {0x221F, "orthogonal"},
800     {0x2220, "angle"},
801     {0x2227, "logicaland"},
802     {0x2228, "logicalor"},
803     {0x2229, "intersection"},
804     {0x222A, "union"},
805     {0x222B, "integral"},
806     {0x2234, "therefore"},
807     {0x223C, "similar"},
808     {0x2245, "congruent"},
809     {0x2248, "approxequal"},
810     {0x2260, "notequal"},
811     {0x2261, "equivalence"},
812     {0x2264, "lessequal"},
813     {0x2265, "greaterequal"},
814     {0x2282, "propersubset"},
815     {0x2283, "propersuperset"},
816     {0x2284, "notsubset"},
817     {0x2286, "reflexsubset"},
818     {0x2287, "reflexsuperset"},
819     {0x2295, "circleplus"},
820     {0x2297, "circlemultiply"},
821     {0x22A5, "perpendicular"},
822     {0x22C5, "dotmath"},
823     {0x2302, "house"},
824     {0x2310, "revlogicalnot"},
825     {0x2320, "integraltp"},
826     {0x2321, "integralbt"},
827     {0x2329, "angleleft"},
828     {0x232A, "angleright"},
829     {0x2500, "SF100000"},
830     {0x2502, "SF110000"},
831     {0x250C, "SF010000"},
832     {0x2510, "SF030000"},
833     {0x2514, "SF020000"},
834     {0x2518, "SF040000"},
835     {0x251C, "SF080000"},
836     {0x2524, "SF090000"},
837     {0x252C, "SF060000"},
838     {0x2534, "SF070000"},
839     {0x253C, "SF050000"},
840     {0x2550, "SF430000"},
841     {0x2551, "SF240000"},
842     {0x2552, "SF510000"},
843     {0x2553, "SF520000"},
844     {0x2554, "SF390000"},
845     {0x2555, "SF220000"},
846     {0x2556, "SF210000"},
847     {0x2557, "SF250000"},
848     {0x2558, "SF500000"},
849     {0x2559, "SF490000"},
850     {0x255A, "SF380000"},
851     {0x255B, "SF280000"},
852     {0x255C, "SF270000"},
853     {0x255D, "SF260000"},
854     {0x255E, "SF360000"},
855     {0x255F, "SF370000"},
856     {0x2560, "SF420000"},
857     {0x2561, "SF190000"},
858     {0x2562, "SF200000"},
859     {0x2563, "SF230000"},
860     {0x2564, "SF470000"},
861     {0x2565, "SF480000"},
862     {0x2566, "SF410000"},
863     {0x2567, "SF450000"},
864     {0x2568, "SF460000"},
865     {0x2569, "SF400000"},
866     {0x256A, "SF540000"},
867     {0x256B, "SF530000"},
868     {0x256C, "SF440000"},
869     {0x2580, "upblock"},
870     {0x2584, "dnblock"},
871     {0x2588, "block"},
872     {0x258C, "lfblock"},
873     {0x2590, "rtblock"},
874     {0x2591, "ltshade"},
875     {0x2592, "shade"},
876     {0x2593, "dkshade"},
877     {0x25A0, "filledbox"},
878     {0x25A1, "H22073"},
879     {0x25AA, "H18543"},
880     {0x25AB, "H18551"},
881     {0x25AC, "filledrect"},
882     {0x25B2, "triagup"},
883     {0x25BA, "triagrt"},
884     {0x25BC, "triagdn"},
885     {0x25C4, "triaglf"},
886     {0x25CA, "lozenge"},
887     {0x25CB, "circle"},
888     {0x25CF, "H18533"},
889     {0x25D8, "invbullet"},
890     {0x25D9, "invcircle"},
891     {0x25E6, "openbullet"},
892     {0x263A, "smileface"},
893     {0x263B, "invsmileface"},
894     {0x263C, "sun"},
895     {0x2640, "female"},
896     {0x2642, "male"},
897     {0x2660, "spade"},
898     {0x2663, "club"},
899     {0x2665, "heart"},
900     {0x2666, "diamond"},
901     {0x266A, "musicalnote"},
902     {0x266B, "musicalnotedbl"},
903     {0xF6BE, "dotlessj"},
904     {0xF6BF, "LL"},
905     {0xF6C0, "ll"},
906     {0xF6C1, "Scedilla"},
907     {0xF6C2, "scedilla"},
908     {0xF6C3, "commaaccent"},
909     {0xF6C4, "afii10063"},
910     {0xF6C5, "afii10064"},
911     {0xF6C6, "afii10192"},
912     {0xF6C7, "afii10831"},
913     {0xF6C8, "afii10832"},
914     {0xF6C9, "Acute"},
915     {0xF6CA, "Caron"},
916     {0xF6CB, "Dieresis"},
917     {0xF6CC, "DieresisAcute"},
918     {0xF6CD, "DieresisGrave"},
919     {0xF6CE, "Grave"},
920     {0xF6CF, "Hungarumlaut"},
921     {0xF6D0, "Macron"},
922     {0xF6D1, "cyrBreve"},
923     {0xF6D2, "cyrFlex"},
924     {0xF6D3, "dblGrave"},
925     {0xF6D4, "cyrbreve"},
926     {0xF6D5, "cyrflex"},
927     {0xF6D6, "dblgrave"},
928     {0xF6D7, "dieresisacute"},
929     {0xF6D8, "dieresisgrave"},
930     {0xF6D9, "copyrightserif"},
931     {0xF6DA, "registerserif"},
932     {0xF6DB, "trademarkserif"},
933     {0xF6DC, "onefitted"},
934     {0xF6DD, "rupiah"},
935     {0xF6DE, "threequartersemdash"},
936     {0xF6DF, "centinferior"},
937     {0xF6E0, "centsuperior"},
938     {0xF6E1, "commainferior"},
939     {0xF6E2, "commasuperior"},
940     {0xF6E3, "dollarinferior"},
941     {0xF6E4, "dollarsuperior"},
942     {0xF6E5, "hypheninferior"},
943     {0xF6E6, "hyphensuperior"},
944     {0xF6E7, "periodinferior"},
945     {0xF6E8, "periodsuperior"},
946     {0xF6E9, "asuperior"},
947     {0xF6EA, "bsuperior"},
948     {0xF6EB, "dsuperior"},
949     {0xF6EC, "esuperior"},
950     {0xF6ED, "isuperior"},
951     {0xF6EE, "lsuperior"},
952     {0xF6EF, "msuperior"},
953     {0xF6F0, "osuperior"},
954     {0xF6F1, "rsuperior"},
955     {0xF6F2, "ssuperior"},
956     {0xF6F3, "tsuperior"},
957     {0xF6F4, "Brevesmall"},
958     {0xF6F5, "Caronsmall"},
959     {0xF6F6, "Circumflexsmall"},
960     {0xF6F7, "Dotaccentsmall"},
961     {0xF6F8, "Hungarumlautsmall"},
962     {0xF6F9, "Lslashsmall"},
963     {0xF6FA, "OEsmall"},
964     {0xF6FB, "Ogoneksmall"},
965     {0xF6FC, "Ringsmall"},
966     {0xF6FD, "Scaronsmall"},
967     {0xF6FE, "Tildesmall"},
968     {0xF6FF, "Zcaronsmall"},
969     {0xF721, "exclamsmall"},
970     {0xF724, "dollaroldstyle"},
971     {0xF726, "ampersandsmall"},
972     {0xF730, "zerooldstyle"},
973     {0xF731, "oneoldstyle"},
974     {0xF732, "twooldstyle"},
975     {0xF733, "threeoldstyle"},
976     {0xF734, "fouroldstyle"},
977     {0xF735, "fiveoldstyle"},
978     {0xF736, "sixoldstyle"},
979     {0xF737, "sevenoldstyle"},
980     {0xF738, "eightoldstyle"},
981     {0xF739, "nineoldstyle"},
982     {0xF73F, "questionsmall"},
983     {0xF760, "Gravesmall"},
984     {0xF761, "Asmall"},
985     {0xF762, "Bsmall"},
986     {0xF763, "Csmall"},
987     {0xF764, "Dsmall"},
988     {0xF765, "Esmall"},
989     {0xF766, "Fsmall"},
990     {0xF767, "Gsmall"},
991     {0xF768, "Hsmall"},
992     {0xF769, "Ismall"},
993     {0xF76A, "Jsmall"},
994     {0xF76B, "Ksmall"},
995     {0xF76C, "Lsmall"},
996     {0xF76D, "Msmall"},
997     {0xF76E, "Nsmall"},
998     {0xF76F, "Osmall"},
999     {0xF770, "Psmall"},
1000     {0xF771, "Qsmall"},
1001     {0xF772, "Rsmall"},
1002     {0xF773, "Ssmall"},
1003     {0xF774, "Tsmall"},
1004     {0xF775, "Usmall"},
1005     {0xF776, "Vsmall"},
1006     {0xF777, "Wsmall"},
1007     {0xF778, "Xsmall"},
1008     {0xF779, "Ysmall"},
1009     {0xF77A, "Zsmall"},
1010     {0xF7A1, "exclamdownsmall"},
1011     {0xF7A2, "centoldstyle"},
1012     {0xF7A8, "Dieresissmall"},
1013     {0xF7AF, "Macronsmall"},
1014     {0xF7B4, "Acutesmall"},
1015     {0xF7B8, "Cedillasmall"},
1016     {0xF7BF, "questiondownsmall"},
1017     {0xF7E0, "Agravesmall"},
1018     {0xF7E1, "Aacutesmall"},
1019     {0xF7E2, "Acircumflexsmall"},
1020     {0xF7E3, "Atildesmall"},
1021     {0xF7E4, "Adieresissmall"},
1022     {0xF7E5, "Aringsmall"},
1023     {0xF7E6, "AEsmall"},
1024     {0xF7E7, "Ccedillasmall"},
1025     {0xF7E8, "Egravesmall"},
1026     {0xF7E9, "Eacutesmall"},
1027     {0xF7EA, "Ecircumflexsmall"},
1028     {0xF7EB, "Edieresissmall"},
1029     {0xF7EC, "Igravesmall"},
1030     {0xF7ED, "Iacutesmall"},
1031     {0xF7EE, "Icircumflexsmall"},
1032     {0xF7EF, "Idieresissmall"},
1033     {0xF7F0, "Ethsmall"},
1034     {0xF7F1, "Ntildesmall"},
1035     {0xF7F2, "Ogravesmall"},
1036     {0xF7F3, "Oacutesmall"},
1037     {0xF7F4, "Ocircumflexsmall"},
1038     {0xF7F5, "Otildesmall"},
1039     {0xF7F6, "Odieresissmall"},
1040     {0xF7F8, "Oslashsmall"},
1041     {0xF7F9, "Ugravesmall"},
1042     {0xF7FA, "Uacutesmall"},
1043     {0xF7FB, "Ucircumflexsmall"},
1044     {0xF7FC, "Udieresissmall"},
1045     {0xF7FD, "Yacutesmall"},
1046     {0xF7FE, "Thornsmall"},
1047     {0xF7FF, "Ydieresissmall"},
1048     {0xF8E5, "radicalex"},
1049     {0xF8E6, "arrowvertex"},
1050     {0xF8E7, "arrowhorizex"},
1051     {0xF8E8, "registersans"},
1052     {0xF8E9, "copyrightsans"},
1053     {0xF8EA, "trademarksans"},
1054     {0xF8EB, "parenlefttp"},
1055     {0xF8EC, "parenleftex"},
1056     {0xF8ED, "parenleftbt"},
1057     {0xF8EE, "bracketlefttp"},
1058     {0xF8EF, "bracketleftex"},
1059     {0xF8F0, "bracketleftbt"},
1060     {0xF8F1, "bracelefttp"},
1061     {0xF8F2, "braceleftmid"},
1062     {0xF8F3, "braceleftbt"},
1063     {0xF8F4, "braceex"},
1064     {0xF8F5, "integralex"},
1065     {0xF8F6, "parenrighttp"},
1066     {0xF8F7, "parenrightex"},
1067     {0xF8F8, "parenrightbt"},
1068     {0xF8F9, "bracketrighttp"},
1069     {0xF8FA, "bracketrightex"},
1070     {0xF8FB, "bracketrightbt"},
1071     {0xF8FC, "bracerighttp"},
1072     {0xF8FD, "bracerightmid"},
1073     {0xF8FE, "bracerightbt"},
1074     {0xFB00, "ff"},
1075     {0xFB01, "fi"},
1076     {0xFB02, "fl"},
1077     {0xFB03, "ffi"},
1078     {0xFB04, "ffl"},
1079     {0xFB1F, "afii57705"},
1080     {0xFB2A, "afii57694"},
1081     {0xFB2B, "afii57695"},
1082     {0xFB35, "afii57723"},
1083     {0xFB4B, "afii57700"},
1084     {0xFFFF, NULL}
1085 };
1086 
1087 static const HPDF_UNICODE HPDF_UNICODE_MAP_STANDARD[] = {
1088     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
1089     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1090     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1091     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1092     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1093     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1094     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1095     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1096     0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1097     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1098     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1099     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x0000,
1100     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1101     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1102     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1103     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1104     0x0000, 0x00A1, 0x00A2, 0x00A3, 0x2044, 0x00A5, 0x0192, 0x00A7,
1105     0x00A4, 0x0027, 0x201C, 0x00AB, 0x2039, 0x203A, 0xFB01, 0xFB02,
1106     0x0000, 0x2013, 0x2020, 0x2021, 0x00B7, 0x0000, 0x00B6, 0x2022,
1107     0x201A, 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x0000, 0x00BF,
1108     0x0000, 0x0060, 0x00B4, 0x02C6, 0x02DC, 0x00AF, 0x02D8, 0x02D9,
1109     0x00A8, 0x0000, 0x02DA, 0x00B8, 0x0000, 0x02DD, 0x02DB, 0x02C7,
1110     0x2014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1111     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1112     0x0000, 0x00C6, 0x0000, 0x00AA, 0x0000, 0x0000, 0x0000, 0x0000,
1113     0x0141, 0x00D8, 0x0152, 0x00BA, 0x0000, 0x0000, 0x0000, 0x0000,
1114     0x0000, 0x00E6, 0x0000, 0x0000, 0x0000, 0x0131, 0x0000, 0x0000,
1115     0x0142, 0x00F8, 0x0153, 0x00DF, 0x0000, 0x0000, 0x0000, 0x0000
1116 };
1117 
1118 static const HPDF_UNICODE HPDF_UNICODE_MAP_WIN_ANSI[] = {
1119     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1120     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1121     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1122     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1123     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1124     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1125     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1126     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1127     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1128     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1129     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1130     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x0000,
1131     0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
1132     0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000,
1133     0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
1134     0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178,
1135     0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
1136     0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
1137     0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
1138     0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
1139     0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
1140     0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
1141     0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
1142     0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
1143     0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
1144     0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
1145     0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
1146     0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
1147 };
1148 
1149 static const HPDF_UNICODE HPDF_UNICODE_MAP_MAC_ROMAN[] = {
1150     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1151     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1152     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1153     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1154     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1155     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1156     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1157     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1158     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1159     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1160     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1161     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x0000,
1162     0x00C4, 0x00C5, 0x00C7, 0x00C9, 0x00D1, 0x00D6, 0x00DC, 0x00E1,
1163     0x00E0, 0x00E2, 0x00E4, 0x00E3, 0x00E5, 0x00E7, 0x00E9, 0x00E8,
1164     0x00EA, 0x00EB, 0x00ED, 0x00EC, 0x00EE, 0x00EF, 0x00F1, 0x00F3,
1165     0x00F2, 0x00F4, 0x00F6, 0x00F5, 0x00FA, 0x00F9, 0x00FB, 0x00FC,
1166     0x2020, 0x00B0, 0x00A2, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x00DF,
1167     0x00AE, 0x00A9, 0x2122, 0x00B4, 0x00A8, 0x2260, 0x00C6, 0x00D8,
1168     0x221E, 0x00B1, 0x2264, 0x2265, 0x00A5, 0x00B5, 0x2202, 0x2211,
1169     0x220F, 0x03C0, 0x222B, 0x00AA, 0x00BA, 0x03A9, 0x00E6, 0x00F8,
1170     0x00BF, 0x00A1, 0x00AC, 0x221A, 0x0192, 0x2248, 0x2206, 0x00AB,
1171     0x00BB, 0x2026, 0x00A0, 0x00C0, 0x00C3, 0x00D5, 0x0152, 0x0153,
1172     0x2013, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x25CA,
1173     0x00FF, 0x0178, 0x2044, 0x20AC, 0x2039, 0x203A, 0xFB01, 0xFB02,
1174     0x2021, 0x00B7, 0x201A, 0x201E, 0x2030, 0x00C2, 0x00CA, 0x00C1,
1175     0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF, 0x00CC, 0x00D3, 0x00D4,
1176     0xF8FF, 0x00D2, 0x00DA, 0x00DB, 0x00D9, 0x0131, 0x02C6, 0x02DC,
1177     0x00AF, 0x02D8, 0x02D9, 0x02DA, 0x00B8, 0x02DD, 0x02DB, 0x02C7
1178 };
1179 
1180 static const HPDF_UNICODE HPDF_UNICODE_MAP_FONT_SPECIFIC[] = {
1181     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1182     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1183     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1184     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1185     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1186     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1187     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1188     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1189     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1190     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1191     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1192     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1193     0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
1194     0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
1195     0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
1196     0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
1197     0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
1198     0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
1199     0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
1200     0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
1201     0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
1202     0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
1203     0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
1204     0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
1205     0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
1206     0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
1207     0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
1208     0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
1209 };
1210 
1211 #define HPDF_ISO8859_FIRST_CHAR       32
1212 #define HPDF_ISO8859_LAST_CHAR        255
1213 
1214 /*---------------------------------------------------------------------------*/
1215 /*------ ISO8859-2 Encoding -------------------------------------------------*/
1216 
1217 static const HPDF_UNICODE HPDF_UNICODE_MAP_ISO8859_2[] = {
1218     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1219     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1220     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1221     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1222     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1223     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1224     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1225     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1226     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1227     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1228     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1229     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1230     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1231     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1232     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1233     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1234     0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7,
1235     0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B,
1236     0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7,
1237     0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C,
1238     0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,
1239     0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
1240     0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,
1241     0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
1242     0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7,
1243     0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
1244     0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
1245     0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9
1246 };
1247 
1248 /*---------------------------------------------------------------------------*/
1249 /*------ ISO8859-3 Encoding -------------------------------------------------*/
1250 
1251 static const HPDF_UNICODE HPDF_UNICODE_MAP_ISO8859_3[] = {
1252     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1253     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1254     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1255     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1256     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1257     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1258     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1259     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1260     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1261     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1262     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1263     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1264     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1265     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1266     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1267     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1268     0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, 0x0000, 0x0124, 0x00A7,
1269     0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, 0x0000, 0x017B,
1270     0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7,
1271     0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, 0x0000, 0x017C,
1272     0x00C0, 0x00C1, 0x00C2, 0x0000, 0x00C4, 0x010A, 0x0108, 0x00C7,
1273     0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
1274     0x0000, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7,
1275     0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF,
1276     0x00E0, 0x00E1, 0x00E2, 0x0000, 0x00E4, 0x010B, 0x0109, 0x00E7,
1277     0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
1278     0x0000, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7,
1279     0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9
1280 };
1281 
1282 /*---------------------------------------------------------------------------*/
1283 /*------ ISO8859-4 Encoding -------------------------------------------------*/
1284 
1285 static const HPDF_UNICODE HPDF_UNICODE_MAP_ISO8859_4[] = {
1286     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1287     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1288     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1289     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1290     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1291     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1292     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1293     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1294     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1295     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1296     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1297     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1298     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1299     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1300     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1301     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1302     0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7,
1303     0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF,
1304     0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7,
1305     0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B,
1306     0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E,
1307     0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A,
1308     0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
1309     0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF,
1310     0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F,
1311     0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B,
1312     0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
1313     0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9
1314 };
1315 
1316 /*---------------------------------------------------------------------------*/
1317 /*------ ISO8859-5 Encoding -------------------------------------------------*/
1318 
1319 static const HPDF_UNICODE HPDF_UNICODE_MAP_ISO8859_5[] = {
1320     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1321     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1322     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1323     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1324     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1325     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1326     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1327     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1328     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1329     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1330     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1331     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1332     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1333     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1334     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1335     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1336     0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
1337     0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F,
1338     0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
1339     0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
1340     0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
1341     0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
1342     0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
1343     0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
1344     0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
1345     0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
1346     0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
1347     0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F
1348 };
1349 
1350 /*---------------------------------------------------------------------------*/
1351 /*------ ISO8859-6 Encoding -------------------------------------------------*/
1352 
1353 static const HPDF_UNICODE HPDF_UNICODE_MAP_ISO8859_6[] = {
1354     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1355     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1356     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1357     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1358     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1359     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1360     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1361     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1362     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1363     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1364     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1365     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1366     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1367     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1368     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1369     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1370     0x00A0, 0x0000, 0x0000, 0x0000, 0x00A4, 0x0000, 0x0000, 0x0000,
1371     0x0000, 0x0000, 0x0000, 0x0000, 0x060C, 0x00AD, 0x0000, 0x0000,
1372     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1373     0x0000, 0x0000, 0x0000, 0x061B, 0x0000, 0x0000, 0x0000, 0x061F,
1374     0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
1375     0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
1376     0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637,
1377     0x0638, 0x0639, 0x063A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1378     0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647,
1379     0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F,
1380     0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1381     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
1382 };
1383 
1384 /*---------------------------------------------------------------------------*/
1385 /*------ ISO8859-7 Encoding -------------------------------------------------*/
1386 
1387 static const HPDF_UNICODE HPDF_UNICODE_MAP_ISO8859_7[] = {
1388     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1389     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1390     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1391     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1392     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1393     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1394     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1395     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1396     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1397     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1398     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1399     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1400     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1401     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1402     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1403     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1404     0x00A0, 0x2018, 0x2019, 0x00A3, 0x20AC, 0x20AF, 0x00A6, 0x00A7,
1405     0x00A8, 0x00A9, 0x037A, 0x00AB, 0x00AC, 0x00AD, 0x0000, 0x2015,
1406     0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7,
1407     0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
1408     0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
1409     0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
1410     0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
1411     0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
1412     0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
1413     0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
1414     0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
1415     0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000
1416 };
1417 
1418 /*---------------------------------------------------------------------------*/
1419 /*------ ISO8859-8 Encoding -------------------------------------------------*/
1420 
1421 static const HPDF_UNICODE HPDF_UNICODE_MAP_ISO8859_8[] = {
1422     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1423     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1424     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1425     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1426     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1427     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1428     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1429     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1430     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1431     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1432     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1433     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1434     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1435     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1436     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1437     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1438     0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
1439     0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
1440     0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
1441     0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x0000,
1442     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1443     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1444     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1445     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017,
1446     0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7,
1447     0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
1448     0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,
1449     0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000,
1450 };
1451 
1452 /*---------------------------------------------------------------------------*/
1453 /*------ ISO8859-9 Encoding -------------------------------------------------*/
1454 
1455 static const HPDF_UNICODE HPDF_UNICODE_MAP_ISO8859_9[] = {
1456     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1457     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1458     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1459     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1460     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1461     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1462     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1463     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1464     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1465     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1466     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1467     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1468     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1469     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1470     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1471     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1472     0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
1473     0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
1474     0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
1475     0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
1476     0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
1477     0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
1478     0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
1479     0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
1480     0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
1481     0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
1482     0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
1483     0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF
1484 };
1485 
1486 /*---------------------------------------------------------------------------*/
1487 /*------ ISO8859-10 Encoding ------------------------------------------------*/
1488 
1489 static const HPDF_UNICODE HPDF_UNICODE_MAP_ISO8859_10[] = {
1490     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1491     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1492     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1493     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1494     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1495     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1496     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1497     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1498     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1499     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1500     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1501     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1502     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1503     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1504     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1505     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1506     0x00A0, 0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7,
1507     0x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A,
1508     0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7,
1509     0x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2015, 0x016B, 0x014B,
1510     0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E,
1511     0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF,
1512     0x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168,
1513     0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
1514     0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F,
1515     0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF,
1516     0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169,
1517     0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138
1518 };
1519 
1520 /*---------------------------------------------------------------------------*/
1521 /*------ ISO8859-11 Encoding ------------------------------------------------*/
1522 
1523 static const HPDF_UNICODE HPDF_UNICODE_MAP_ISO8859_11[] = {
1524     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1525     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1526     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1527     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1528     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1529     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1530     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1531     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1532     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1533     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1534     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1535     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1536     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1537     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1538     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1539     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1540     0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07,
1541     0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,
1542     0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17,
1543     0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,
1544     0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27,
1545     0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F,
1546     0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37,
1547     0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F,
1548     0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47,
1549     0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F,
1550     0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57,
1551     0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000
1552 };
1553 
1554 /*---------------------------------------------------------------------------*/
1555 /*------ ISO8859-13 Encoding ------------------------------------------------*/
1556 
1557 static const HPDF_UNICODE HPDF_UNICODE_MAP_ISO8859_13[] = {
1558     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1559     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1560     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1561     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1562     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1563     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1564     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1565     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1566     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1567     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1568     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1569     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1570     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1571     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1572     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1573     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1574     0x00A0, 0x201D, 0x00A2, 0x00A3, 0x00A4, 0x201E, 0x00A6, 0x00A7,
1575     0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
1576     0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6, 0x00B7,
1577     0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
1578     0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112,
1579     0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
1580     0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7,
1581     0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
1582     0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113,
1583     0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
1584     0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,
1585     0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019
1586 };
1587 
1588 /*---------------------------------------------------------------------------*/
1589 /*------ ISO8859-14 Encoding ------------------------------------------------*/
1590 
1591 static const HPDF_UNICODE HPDF_UNICODE_MAP_ISO8859_14[] = {
1592     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1593     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1594     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1595     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1596     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1597     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1598     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1599     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1600     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1601     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1602     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1603     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1604     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1605     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1606     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1607     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1608     0x00A0, 0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7,
1609     0x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178,
1610     0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56,
1611     0x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61,
1612     0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
1613     0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
1614     0x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A,
1615     0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF,
1616     0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
1617     0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
1618     0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B,
1619     0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF
1620 };
1621 
1622 /*---------------------------------------------------------------------------*/
1623 /*------ ISO8859-15 Encoding ------------------------------------------------*/
1624 
1625 static const HPDF_UNICODE HPDF_UNICODE_MAP_ISO8859_15[] = {
1626     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1627     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1628     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1629     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1630     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1631     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1632     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1633     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1634     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1635     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1636     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1637     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1638     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1639     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1640     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1641     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1642     0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7,
1643     0x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
1644     0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x00B7,
1645     0x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x0178, 0x00BF,
1646     0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
1647     0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
1648     0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
1649     0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
1650     0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
1651     0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
1652     0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
1653     0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
1654 };
1655 
1656 /*---------------------------------------------------------------------------*/
1657 /*------ ISO8859-16 Encoding ------------------------------------------------*/
1658 
1659 static const HPDF_UNICODE HPDF_UNICODE_MAP_ISO8859_16[] = {
1660     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1661     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1662     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1663     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1664     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1665     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1666     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1667     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1668     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1669     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1670     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1671     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1672     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1673     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1674     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1675     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1676     0x00A0, 0x0104, 0x0105, 0x0141, 0x20AC, 0x201E, 0x0160, 0x00A7,
1677     0x0161, 0x00A9, 0x0218, 0x00AB, 0x0179, 0x00AD, 0x017A, 0x017B,
1678     0x00B0, 0x00B1, 0x010C, 0x0142, 0x017D, 0x201D, 0x00B6, 0x00B7,
1679     0x017E, 0x010D, 0x0219, 0x00BB, 0x0152, 0x0153, 0x0178, 0x017C,
1680     0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0106, 0x00C6, 0x00C7,
1681     0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
1682     0x0110, 0x0143, 0x00D2, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x015A,
1683     0x0170, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0118, 0x021A, 0x00DF,
1684     0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x0107, 0x00E6, 0x00E7,
1685     0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
1686     0x0111, 0x0144, 0x00F2, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x015B,
1687     0x0171, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0119, 0x021B, 0x00FF
1688 };
1689 
1690 #define HPDF_MSCP_FIRST_CHAR       32
1691 #define HPDF_MSCP_LAST_CHAR        255
1692 
1693 
1694 /*---------------------------------------------------------------------------*/
1695 /*------ CP1250 Encoding ----------------------------------------------------*/
1696 
1697 static const HPDF_UNICODE HPDF_UNICODE_MAP_CP1250[] = {
1698     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1699     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1700     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1701     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1702     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1703     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1704     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1705     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1706     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1707     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1708     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1709     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1710     0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021,
1711     0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179,
1712     0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
1713     0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A,
1714     0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7,
1715     0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B,
1716     0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
1717     0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C,
1718     0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,
1719     0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
1720     0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,
1721     0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
1722     0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7,
1723     0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
1724     0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
1725     0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9
1726 };
1727 
1728 /*---------------------------------------------------------------------------*/
1729 /*------ CP1251 Encoding ----------------------------------------------------*/
1730 
1731 static const HPDF_UNICODE HPDF_UNICODE_MAP_CP1251[] = {
1732     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1733     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1734     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1735     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1736     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1737     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1738     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1739     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1740     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1741     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1742     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1743     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1744     0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021,
1745     0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
1746     0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
1747     0x0000, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,
1748     0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7,
1749     0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
1750     0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7,
1751     0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457,
1752     0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
1753     0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
1754     0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
1755     0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
1756     0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
1757     0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
1758     0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
1759     0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F
1760 };
1761 
1762 /*---------------------------------------------------------------------------*/
1763 /*------ CP1252 Encoding ----------------------------------------------------*/
1764 
1765 static const HPDF_UNICODE HPDF_UNICODE_MAP_CP1252[] = {
1766     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1767     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1768     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1769     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1770     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1771     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1772     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1773     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1774     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1775     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1776     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1777     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1778     0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
1779     0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000,
1780     0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
1781     0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178,
1782     0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
1783     0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
1784     0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
1785     0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
1786     0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
1787     0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
1788     0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
1789     0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
1790     0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
1791     0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
1792     0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
1793     0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
1794 };
1795 
1796 /*---------------------------------------------------------------------------*/
1797 /*------ CP1253 Encoding ----------------------------------------------------*/
1798 
1799 static const HPDF_UNICODE HPDF_UNICODE_MAP_CP1253[] = {
1800     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1801     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1802     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1803     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1804     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1805     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1806     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1807     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1808     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1809     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1810     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1811     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1812     0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
1813     0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
1814     0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
1815     0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
1816     0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
1817     0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015,
1818     0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7,
1819     0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
1820     0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
1821     0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
1822     0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
1823     0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
1824     0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
1825     0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
1826     0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
1827     0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000
1828 };
1829 
1830 /*---------------------------------------------------------------------------*/
1831 /*------ CP1254 Encoding ----------------------------------------------------*/
1832 
1833 static const HPDF_UNICODE  HPDF_UNICODE_MAP_CP1254[] = {
1834     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1835     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1836     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1837     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1838     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1839     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1840     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1841     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1842     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1843     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1844     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1845     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1846     0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
1847     0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
1848     0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
1849     0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,
1850     0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
1851     0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
1852     0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
1853     0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
1854     0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
1855     0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
1856     0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
1857     0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
1858     0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
1859     0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
1860     0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
1861     0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF
1862 };
1863 
1864 /*---------------------------------------------------------------------------*/
1865 /*------ CP1255 Encoding ----------------------------------------------------*/
1866 
1867 static const HPDF_UNICODE  HPDF_UNICODE_MAP_CP1255[] = {
1868     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1869     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1870     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1871     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1872     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1873     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1874     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1875     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1876     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1877     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1878     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1879     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1880     0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
1881     0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
1882     0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
1883     0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
1884     0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7,
1885     0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
1886     0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
1887     0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
1888     0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7,
1889     0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF,
1890     0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3,
1891     0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1892     0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7,
1893     0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
1894     0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,
1895     0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000
1896 };
1897 
1898 /*---------------------------------------------------------------------------*/
1899 /*------ CP1256 Encoding ----------------------------------------------------*/
1900 
1901 static const HPDF_UNICODE  HPDF_UNICODE_MAP_CP1256[] = {
1902     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1903     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1904     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1905     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1906     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1907     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1908     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1909     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1910     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1911     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1912     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1913     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1914     0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
1915     0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
1916     0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
1917     0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA,
1918     0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
1919     0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
1920     0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
1921     0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F,
1922     0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
1923     0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
1924     0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7,
1925     0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643,
1926     0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7,
1927     0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF,
1928     0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7,
1929     0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2
1930 };
1931 
1932 /*---------------------------------------------------------------------------*/
1933 /*------ CP1257 Encoding ----------------------------------------------------*/
1934 
1935 static const HPDF_UNICODE  HPDF_UNICODE_MAP_CP1257[] = {
1936     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1937     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1938     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1939     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1940     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1941     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1942     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1943     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1944     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1945     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1946     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1947     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1948     0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021,
1949     0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8,
1950     0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
1951     0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000,
1952     0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7,
1953     0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
1954     0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
1955     0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
1956     0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112,
1957     0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
1958     0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7,
1959     0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
1960     0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113,
1961     0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
1962     0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,
1963     0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9
1964 };
1965 
1966 /*---------------------------------------------------------------------------*/
1967 /*------ CP1258 Encoding ----------------------------------------------------*/
1968 
1969 static const HPDF_UNICODE  HPDF_UNICODE_MAP_CP1258[] = {
1970     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1971     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1972     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1973     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1974     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1975     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1976     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1977     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1978     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1979     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1980     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1981     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
1982     0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
1983     0x02C6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
1984     0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
1985     0x02DC, 0x2122, 0x0000, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,
1986     0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
1987     0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
1988     0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
1989     0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
1990     0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
1991     0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF,
1992     0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7,
1993     0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF,
1994     0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
1995     0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF,
1996     0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7,
1997     0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF
1998 };
1999 
2000 /*---------------------------------------------------------------------------*/
2001 /*------ KOI8-R Encoding ----------------------------------------------------*/
2002 
2003 static const HPDF_UNICODE  HPDF_UNICODE_MAP_KOI8_R[] = {
2004     0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
2005     0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
2006     0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
2007     0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
2008     0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
2009     0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
2010     0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
2011     0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
2012     0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
2013     0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
2014     0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
2015     0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
2016     0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524,
2017     0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590,
2018     0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248,
2019     0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7,
2020     0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556,
2021     0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x255C, 0x255D, 0x255E,
2022     0x255F, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565,
2023     0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x256B, 0x256C, 0x00A9,
2024     0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
2025     0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E,
2026     0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
2027     0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A,
2028     0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
2029     0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E,
2030     0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
2031     0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A
2032 };
2033 
2034 typedef struct _HPDF_BuiltinEncodingData {
2035     const char     *encoding_name;
2036     HPDF_BaseEncodings  base_encoding;
2037     const HPDF_UNICODE  *ovewrride_map;
2038 } HPDF_BuiltinEncodingData;
2039 
2040 
2041 static const HPDF_BuiltinEncodingData  HPDF_BUILTIN_ENCODINGS[] = {
2042     {
2043         HPDF_ENCODING_FONT_SPECIFIC,
2044         HPDF_BASE_ENCODING_FONT_SPECIFIC,
2045         NULL},
2046     {
2047         HPDF_ENCODING_STANDARD,
2048         HPDF_BASE_ENCODING_STANDARD,
2049         NULL},
2050     {
2051         HPDF_ENCODING_MAC_ROMAN,
2052         HPDF_BASE_ENCODING_MAC_ROMAN,
2053         NULL},
2054     {
2055         HPDF_ENCODING_WIN_ANSI,
2056         HPDF_BASE_ENCODING_WIN_ANSI,
2057         NULL
2058     },
2059     {
2060         HPDF_ENCODING_ISO8859_2,
2061         HPDF_BASE_ENCODING_WIN_ANSI,
2062         HPDF_UNICODE_MAP_ISO8859_2
2063     },
2064     {
2065         HPDF_ENCODING_ISO8859_3,
2066         HPDF_BASE_ENCODING_WIN_ANSI,
2067         HPDF_UNICODE_MAP_ISO8859_3
2068     },
2069     {
2070         HPDF_ENCODING_ISO8859_4,
2071         HPDF_BASE_ENCODING_WIN_ANSI,
2072         HPDF_UNICODE_MAP_ISO8859_4
2073     },
2074     {
2075         HPDF_ENCODING_ISO8859_5,
2076         HPDF_BASE_ENCODING_WIN_ANSI,
2077         HPDF_UNICODE_MAP_ISO8859_5
2078     },
2079     {
2080         HPDF_ENCODING_ISO8859_6,
2081         HPDF_BASE_ENCODING_WIN_ANSI,
2082         HPDF_UNICODE_MAP_ISO8859_6
2083     },
2084     {
2085         HPDF_ENCODING_ISO8859_7,
2086         HPDF_BASE_ENCODING_WIN_ANSI,
2087         HPDF_UNICODE_MAP_ISO8859_7
2088     },
2089     {
2090         HPDF_ENCODING_ISO8859_8,
2091         HPDF_BASE_ENCODING_WIN_ANSI,
2092         HPDF_UNICODE_MAP_ISO8859_8
2093     },
2094     {
2095         HPDF_ENCODING_ISO8859_9,
2096         HPDF_BASE_ENCODING_WIN_ANSI,
2097         HPDF_UNICODE_MAP_ISO8859_9
2098     },
2099     {
2100         HPDF_ENCODING_ISO8859_10,
2101         HPDF_BASE_ENCODING_WIN_ANSI,
2102         HPDF_UNICODE_MAP_ISO8859_10
2103     },
2104     {
2105         HPDF_ENCODING_ISO8859_11,
2106         HPDF_BASE_ENCODING_WIN_ANSI,
2107         HPDF_UNICODE_MAP_ISO8859_11
2108     },
2109     {
2110         HPDF_ENCODING_ISO8859_13,
2111         HPDF_BASE_ENCODING_WIN_ANSI,
2112         HPDF_UNICODE_MAP_ISO8859_13
2113     },
2114     {
2115         HPDF_ENCODING_ISO8859_14,
2116         HPDF_BASE_ENCODING_WIN_ANSI,
2117         HPDF_UNICODE_MAP_ISO8859_14
2118     },
2119     {
2120         HPDF_ENCODING_ISO8859_15,
2121         HPDF_BASE_ENCODING_WIN_ANSI,
2122         HPDF_UNICODE_MAP_ISO8859_15
2123     },
2124     {
2125         HPDF_ENCODING_ISO8859_16,
2126         HPDF_BASE_ENCODING_WIN_ANSI,
2127         HPDF_UNICODE_MAP_ISO8859_16
2128     },
2129     {
2130         HPDF_ENCODING_CP1250,
2131         HPDF_BASE_ENCODING_WIN_ANSI,
2132         HPDF_UNICODE_MAP_CP1250
2133     },
2134     {
2135         HPDF_ENCODING_CP1251,
2136         HPDF_BASE_ENCODING_WIN_ANSI,
2137         HPDF_UNICODE_MAP_CP1251
2138     },
2139     {
2140         HPDF_ENCODING_CP1252,
2141         HPDF_BASE_ENCODING_WIN_ANSI,
2142         HPDF_UNICODE_MAP_CP1252
2143     },
2144     {
2145         HPDF_ENCODING_CP1253,
2146         HPDF_BASE_ENCODING_WIN_ANSI,
2147         HPDF_UNICODE_MAP_CP1253
2148     },
2149     {
2150         HPDF_ENCODING_CP1254,
2151         HPDF_BASE_ENCODING_WIN_ANSI,
2152         HPDF_UNICODE_MAP_CP1254
2153     },
2154     {
2155         HPDF_ENCODING_CP1255,
2156         HPDF_BASE_ENCODING_WIN_ANSI,
2157         HPDF_UNICODE_MAP_CP1255
2158     },
2159     {
2160         HPDF_ENCODING_CP1256,
2161         HPDF_BASE_ENCODING_WIN_ANSI,
2162         HPDF_UNICODE_MAP_CP1256
2163     },
2164     {
2165         HPDF_ENCODING_CP1257,
2166         HPDF_BASE_ENCODING_WIN_ANSI,
2167         HPDF_UNICODE_MAP_CP1257
2168     },
2169     {
2170         HPDF_ENCODING_CP1258,
2171         HPDF_BASE_ENCODING_WIN_ANSI,
2172         HPDF_UNICODE_MAP_CP1258
2173     },
2174     {
2175         HPDF_ENCODING_KOI8_R,
2176         HPDF_BASE_ENCODING_WIN_ANSI,
2177         HPDF_UNICODE_MAP_KOI8_R
2178     },
2179     {
2180         NULL,
2181         HPDF_BASE_ENCODING_EOF,
2182         NULL
2183     }
2184 };
2185 
2186 
2187 /*---------------------------------------------------------------------------*/
2188 
2189 const HPDF_BuiltinEncodingData*
2190 HPDF_BasicEncoder_FindBuiltinData  (const char  *encoding_name);
2191 
2192 
2193 void
2194 HPDF_BasicEncoder_CopyMap  (HPDF_Encoder        encoder,
2195                             const HPDF_UNICODE  *map);
2196 
2197 
2198 HPDF_STATUS
2199 HPDF_BasicEncoder_OverrideMap  (HPDF_Encoder        encoder,
2200                                 const HPDF_UNICODE  *map);
2201 
2202 
2203 /*-- HPDF_Encoder ---------------------------------------*/
2204 
2205 HPDF_Encoder
HPDF_BasicEncoder_New(HPDF_MMgr mmgr,const char * encoding_name)2206 HPDF_BasicEncoder_New  (HPDF_MMgr        mmgr,
2207                         const char  *encoding_name)
2208 {
2209     HPDF_Encoder encoder;
2210     HPDF_BasicEncoderAttr encoder_attr;
2211     const HPDF_BuiltinEncodingData *data;
2212     char *eptr;
2213 
2214     HPDF_PTRACE((" HPDF_BasicEncoder_New\n"));
2215 
2216     if (mmgr == NULL)
2217         return NULL;
2218 
2219     data = HPDF_BasicEncoder_FindBuiltinData (encoding_name);
2220     if (!data->encoding_name) {
2221         HPDF_SetError (mmgr->error, HPDF_INVALID_ENCODING_NAME, 0);
2222         return NULL;
2223     }
2224 
2225     encoder = HPDF_GetMem (mmgr, sizeof(HPDF_Encoder_Rec));
2226     if (!encoder)
2227         return NULL;
2228 
2229     HPDF_MemSet (encoder, 0, sizeof(HPDF_Encoder_Rec));
2230 
2231     eptr = encoder->name + HPDF_LIMIT_MAX_NAME_LEN;
2232     HPDF_StrCpy (encoder->name, data->encoding_name, eptr);
2233 
2234     encoder->mmgr = mmgr;
2235     encoder->error = mmgr->error;
2236     encoder->type = HPDF_ENCODER_TYPE_SINGLE_BYTE;
2237     encoder->to_unicode_fn = HPDF_BasicEncoder_ToUnicode;
2238     encoder->encode_text_fn = NULL;
2239     encoder->write_fn = HPDF_BasicEncoder_Write;
2240     encoder->free_fn = HPDF_BasicEncoder_Free;
2241 
2242     encoder_attr = HPDF_GetMem(mmgr, sizeof(HPDF_BasicEncoderAttr_Rec));
2243     if (!encoder_attr) {
2244         HPDF_FreeMem (encoder->mmgr, encoder);
2245         return NULL;
2246     }
2247 
2248     encoder->sig_bytes = HPDF_ENCODER_SIG_BYTES;
2249     encoder->attr = encoder_attr;
2250     HPDF_MemSet (encoder_attr, 0, sizeof(HPDF_BasicEncoderAttr_Rec));
2251 
2252     encoder_attr->first_char = HPDF_BASIC_ENCODER_FIRST_CHAR;
2253     encoder_attr->last_char = HPDF_BASIC_ENCODER_LAST_CHAR;
2254     encoder_attr->has_differences = HPDF_FALSE;
2255 
2256     eptr = encoder_attr->base_encoding + HPDF_LIMIT_MAX_NAME_LEN;
2257 
2258     switch (data->base_encoding) {
2259         case HPDF_BASE_ENCODING_STANDARD:
2260             HPDF_StrCpy (encoder_attr->base_encoding,
2261                      HPDF_ENCODING_STANDARD,  eptr);
2262             HPDF_BasicEncoder_CopyMap (encoder, HPDF_UNICODE_MAP_STANDARD);
2263             break;
2264         case HPDF_BASE_ENCODING_WIN_ANSI:
2265             HPDF_StrCpy (encoder_attr->base_encoding,
2266                      HPDF_ENCODING_WIN_ANSI,  eptr);
2267             HPDF_BasicEncoder_CopyMap (encoder, HPDF_UNICODE_MAP_WIN_ANSI);
2268             break;
2269         case HPDF_BASE_ENCODING_MAC_ROMAN:
2270             HPDF_StrCpy (encoder_attr->base_encoding,
2271                      HPDF_ENCODING_MAC_ROMAN,  eptr);
2272             HPDF_BasicEncoder_CopyMap (encoder, HPDF_UNICODE_MAP_MAC_ROMAN);
2273             break;
2274         default:
2275             HPDF_StrCpy (encoder_attr->base_encoding,
2276                      HPDF_ENCODING_FONT_SPECIFIC,  eptr);
2277             HPDF_BasicEncoder_CopyMap (encoder,
2278                     HPDF_UNICODE_MAP_FONT_SPECIFIC);
2279     }
2280 
2281     if (data->ovewrride_map)
2282         HPDF_BasicEncoder_OverrideMap  (encoder, data->ovewrride_map);
2283 
2284     return encoder;
2285 }
2286 
2287 
2288 
2289 
2290 const HPDF_BuiltinEncodingData*
HPDF_BasicEncoder_FindBuiltinData(const char * encoding_name)2291 HPDF_BasicEncoder_FindBuiltinData  (const char  *encoding_name)
2292 {
2293     HPDF_UINT i = 0;
2294 
2295     HPDF_PTRACE((" HPDF_BasicEncoder_FindBuiltinData\n"));
2296 
2297     while (HPDF_BUILTIN_ENCODINGS[i].encoding_name) {
2298         if (HPDF_StrCmp (HPDF_BUILTIN_ENCODINGS[i].encoding_name,
2299                 encoding_name) == 0)
2300             break;
2301 
2302         i++;
2303     }
2304 
2305     return &HPDF_BUILTIN_ENCODINGS[i];
2306 }
2307 
2308 
2309 HPDF_UNICODE
HPDF_BasicEncoder_ToUnicode(HPDF_Encoder encoder,HPDF_UINT16 code)2310 HPDF_BasicEncoder_ToUnicode (HPDF_Encoder     encoder,
2311                              HPDF_UINT16      code)
2312 {
2313     HPDF_BasicEncoderAttr attr = (HPDF_BasicEncoderAttr)encoder->attr;
2314 
2315     if (code > 255)
2316         return 0;
2317 
2318     return attr->unicode_map[code];
2319 }
2320 
2321 
2322 HPDF_UNICODE
HPDF_Encoder_ToUnicode(HPDF_Encoder encoder,HPDF_UINT16 code)2323 HPDF_Encoder_ToUnicode  (HPDF_Encoder     encoder,
2324                          HPDF_UINT16      code)
2325 {
2326     return encoder->to_unicode_fn (encoder, code);
2327 }
2328 
2329 
2330 void
HPDF_BasicEncoder_CopyMap(HPDF_Encoder encoder,const HPDF_UNICODE * map)2331 HPDF_BasicEncoder_CopyMap  (HPDF_Encoder        encoder,
2332                             const HPDF_UNICODE  *map)
2333 {
2334     HPDF_UINT i;
2335     HPDF_UNICODE* dst = ((HPDF_BasicEncoderAttr)encoder->attr)->unicode_map +
2336         HPDF_BASIC_ENCODER_FIRST_CHAR;
2337 
2338     HPDF_PTRACE((" HPDF_BasicEncoder_CopyMap\n"));
2339 
2340     for (i = 0; i <= HPDF_BASIC_ENCODER_LAST_CHAR -
2341             HPDF_BASIC_ENCODER_FIRST_CHAR; i++)
2342         *dst++ = *map++;
2343 }
2344 
2345 HPDF_STATUS
HPDF_BasicEncoder_OverrideMap(HPDF_Encoder encoder,const HPDF_UNICODE * map)2346 HPDF_BasicEncoder_OverrideMap  (HPDF_Encoder        encoder,
2347                                 const HPDF_UNICODE  *map)
2348 {
2349     HPDF_UINT i;
2350     HPDF_BasicEncoderAttr data = (HPDF_BasicEncoderAttr)encoder->attr;
2351     HPDF_UNICODE* dst;
2352     HPDF_BYTE* flgs;
2353 
2354     HPDF_PTRACE ((" HPDF_BasicEncoder_OverrideMap\n"));
2355 
2356     if (data->has_differences)
2357         return HPDF_SetError (encoder->error, HPDF_INVALID_OPERATION, 0);
2358 
2359     dst = data->unicode_map + HPDF_BASIC_ENCODER_FIRST_CHAR;
2360     flgs = data->differences + HPDF_BASIC_ENCODER_FIRST_CHAR;
2361 
2362     for (i = 0; i <= HPDF_BASIC_ENCODER_LAST_CHAR -
2363             HPDF_BASIC_ENCODER_FIRST_CHAR; i++) {
2364         if (*map != *dst) {
2365             *dst = *map;
2366             *flgs = 1;
2367         }
2368         map++;
2369         dst++;
2370         flgs++;
2371     }
2372     data->has_differences = HPDF_TRUE;
2373 
2374     return HPDF_OK;
2375 }
2376 
2377 void
HPDF_Encoder_Free(HPDF_Encoder encoder)2378 HPDF_Encoder_Free  (HPDF_Encoder  encoder)
2379 {
2380     HPDF_PTRACE ((" HPDF_Encoder_Free\n"));
2381 
2382     if (!encoder)
2383         return;
2384 
2385     if (encoder->free_fn)
2386         encoder->free_fn (encoder);
2387     HPDF_FreeMem (encoder->mmgr, encoder);
2388 }
2389 
2390 
2391 const char*
HPDF_UnicodeToGryphName(HPDF_UNICODE unicode)2392 HPDF_UnicodeToGryphName  (HPDF_UNICODE  unicode)
2393 {
2394     const HPDF_UnicodeGryphPair* map = HPDF_UNICODE_GRYPH_NAME_MAP;
2395 
2396     HPDF_PTRACE ((" HPDF_UnicodeToGryphName\n"));
2397 
2398     while (map->unicode <= unicode) {
2399         if (map->unicode == unicode)
2400             return map->gryph_name;
2401         map++;
2402     }
2403 
2404     return HPDF_UNICODE_GRYPH_NAME_MAP[0].gryph_name;
2405 }
2406 
2407 HPDF_UNICODE
HPDF_GryphNameToUnicode(const char * gryph_name)2408 HPDF_GryphNameToUnicode  (const char  *gryph_name)
2409 {
2410     const HPDF_UnicodeGryphPair* map = HPDF_UNICODE_GRYPH_NAME_MAP;
2411 
2412     HPDF_PTRACE ((" HPDF_GryphNameToUnicode\n"));
2413 
2414     while (map->unicode != 0xFFFF) {
2415         if (HPDF_StrCmp (gryph_name, map->gryph_name) == 0)
2416             return map->unicode;
2417         map++;
2418     }
2419 
2420     return 0x0000;
2421 }
2422 
2423 void
HPDF_BasicEncoder_Free(HPDF_Encoder encoder)2424 HPDF_BasicEncoder_Free (HPDF_Encoder  encoder)
2425 {
2426     HPDF_PTRACE ((" HPDF_BasicEncoder_Free\n"));
2427 
2428     HPDF_FreeMem (encoder->mmgr, encoder->attr);
2429     encoder->attr = NULL;
2430 }
2431 
2432 HPDF_STATUS
HPDF_BasicEncoder_Write(HPDF_Encoder encoder,HPDF_Stream out)2433 HPDF_BasicEncoder_Write  (HPDF_Encoder  encoder,
2434                           HPDF_Stream   out)
2435 {
2436     HPDF_STATUS ret;
2437     HPDF_BasicEncoderAttr attr = (HPDF_BasicEncoderAttr)encoder->attr;
2438 
2439     HPDF_PTRACE ((" HPDF_BasicEncoder_Write\n"));
2440 
2441     /*  if HPDF_ENCODING_FONT_SPECIFIC is selected, no Encoding object will be "
2442      *  written.
2443      */
2444     if (HPDF_StrCmp (attr->base_encoding, HPDF_ENCODING_FONT_SPECIFIC) == 0)
2445         return HPDF_OK;
2446 
2447     /* if encoder has differences-data, encoding object is written as
2448        dictionary-object, otherwise it is written as name-object. */
2449     if (attr->has_differences == HPDF_TRUE) {
2450         ret = HPDF_Stream_WriteStr (out,
2451                 "/Encoding <<\012"
2452                 "/Type /Encoding\012"
2453                 "/BaseEncoding ");
2454         if (ret != HPDF_OK)
2455             return ret;
2456     } else {
2457         ret = HPDF_Stream_WriteStr (out, "/Encoding ");
2458         if (ret != HPDF_OK)
2459             return ret;
2460     }
2461 
2462     ret = HPDF_Stream_WriteEscapeName (out, attr->base_encoding);
2463     if (ret != HPDF_OK)
2464         return ret;
2465 
2466     ret = HPDF_Stream_WriteStr (out, "\012");
2467     if (ret != HPDF_OK)
2468         return ret;
2469 
2470     /* write differences data */
2471     if (attr->has_differences == HPDF_TRUE) {
2472         HPDF_INT i;
2473 
2474         ret = HPDF_Stream_WriteStr (out, "/Differences [");
2475         if (ret != HPDF_OK)
2476             return ret;
2477 
2478         for (i = attr->first_char; i <= attr->last_char; i++) {
2479             if (attr->differences[i] == 1) {
2480                 char tmp[HPDF_TEXT_DEFAULT_LEN];
2481                 char* ptmp = tmp;
2482                 const char* char_name =
2483                     HPDF_UnicodeToGryphName (attr->unicode_map[i]);
2484 
2485                 ptmp = HPDF_IToA (ptmp, i, tmp + HPDF_TEXT_DEFAULT_LEN - 1);
2486                 *ptmp++ = ' ';
2487                 *ptmp++ = '/';
2488                 ptmp = (char *)HPDF_StrCpy (ptmp, char_name, tmp +
2489                         HPDF_TEXT_DEFAULT_LEN - 1);
2490                 *ptmp++ = ' ';
2491                 *ptmp = 0;
2492 
2493                 ret = HPDF_Stream_WriteStr (out, tmp);
2494                 if (ret != HPDF_OK)
2495                     return ret;
2496             }
2497         }
2498 
2499         ret = HPDF_Stream_WriteStr (out, "]\012>>\012");
2500     }
2501 
2502     return ret;
2503 }
2504 
2505 
2506 HPDF_STATUS
HPDF_Encoder_Validate(HPDF_Encoder encoder)2507 HPDF_Encoder_Validate  (HPDF_Encoder  encoder)
2508 {
2509     HPDF_PTRACE ((" HPDF_Encoder_Validate\n"));
2510 
2511     if (!encoder || encoder->sig_bytes != HPDF_ENCODER_SIG_BYTES)
2512         return HPDF_FALSE;
2513     else
2514         return HPDF_TRUE;
2515 }
2516 
2517 
2518 /* At first, CMAP encoder is create as 'virtual' object.
2519  * When init_fn is called, cmap-data is loaded and it becomes to be available
2520  */
2521 
2522 HPDF_Encoder
HPDF_CMapEncoder_New(HPDF_MMgr mmgr,char * name,HPDF_Encoder_Init_Func init_fn)2523 HPDF_CMapEncoder_New  (HPDF_MMgr                mmgr,
2524                        char                    *name,
2525                        HPDF_Encoder_Init_Func   init_fn)
2526 {
2527     HPDF_Encoder encoder;
2528 
2529     HPDF_PTRACE ((" HPDF_CMapEncoder_New\n"));
2530 
2531     if (mmgr == NULL)
2532         return NULL;
2533 
2534     encoder = HPDF_GetMem (mmgr, sizeof(HPDF_Encoder_Rec));
2535     if (!encoder)
2536         return NULL;
2537 
2538     HPDF_MemSet (encoder, 0, sizeof(HPDF_Encoder_Rec));
2539 
2540     HPDF_StrCpy (encoder->name, name, encoder->name + HPDF_LIMIT_MAX_NAME_LEN);
2541     encoder->mmgr = mmgr;
2542     encoder->error = mmgr->error;
2543     encoder->type = HPDF_ENCODER_TYPE_UNINITIALIZED;
2544     encoder->byte_type_fn = HPDF_CMapEncoder_ByteType;
2545     encoder->to_unicode_fn = HPDF_CMapEncoder_ToUnicode;
2546     encoder->write_fn = HPDF_CMapEncoder_Write;
2547     encoder->free_fn = HPDF_CMapEncoder_Free;
2548     encoder->init_fn = init_fn;
2549     encoder->sig_bytes = HPDF_ENCODER_SIG_BYTES;
2550 
2551     return encoder;
2552 }
2553 
2554 
2555 HPDF_STATUS
HPDF_CMapEncoder_InitAttr(HPDF_Encoder encoder)2556 HPDF_CMapEncoder_InitAttr  (HPDF_Encoder  encoder)
2557 {
2558     HPDF_CMapEncoderAttr encoder_attr;
2559     HPDF_UINT i;
2560     HPDF_UINT j;
2561 
2562     HPDF_PTRACE ((" HPDF_CMapEncoder_InitAttr\n"));
2563 
2564     if (encoder->attr)
2565         return HPDF_INVALID_ENCODER;
2566 
2567     encoder_attr = HPDF_GetMem(encoder->mmgr,
2568             sizeof(HPDF_CMapEncoderAttr_Rec));
2569 
2570     if (!encoder_attr)
2571         return encoder->error->error_no;
2572 
2573     HPDF_MemSet (encoder_attr, 0, sizeof(HPDF_CMapEncoderAttr_Rec));
2574     encoder->attr = encoder_attr;
2575 
2576     encoder_attr->writing_mode = HPDF_WMODE_HORIZONTAL;
2577 
2578     for (i = 0; i <= 255; i++) {
2579         for (j = 0; j <= 255; j++) {
2580             /* undefined charactors are replaced to square */
2581             encoder_attr->unicode_map[i][j] = 0x25A1;
2582         }
2583     }
2584 
2585     /* create cmap range */
2586     encoder_attr->cmap_range = HPDF_List_New (encoder->mmgr,
2587                 HPDF_DEF_RANGE_TBL_NUM);
2588     if (!encoder_attr->cmap_range)
2589         return encoder->error->error_no;
2590 
2591     encoder_attr->notdef_range = HPDF_List_New (encoder->mmgr,
2592                 HPDF_DEF_ITEMS_PER_BLOCK);
2593     if (!encoder_attr->notdef_range)
2594         return encoder->error->error_no;
2595 
2596     encoder_attr->code_space_range = HPDF_List_New (encoder->mmgr,
2597                 HPDF_DEF_ITEMS_PER_BLOCK);
2598     if (!encoder_attr->code_space_range)
2599         return encoder->error->error_no;
2600 
2601     return HPDF_OK;
2602 }
2603 
2604 
2605 HPDF_UNICODE
HPDF_CMapEncoder_ToUnicode(HPDF_Encoder encoder,HPDF_UINT16 code)2606 HPDF_CMapEncoder_ToUnicode  (HPDF_Encoder  encoder,
2607                              HPDF_UINT16   code)
2608 {
2609     HPDF_BYTE l = (HPDF_BYTE)code;
2610     HPDF_BYTE h = (HPDF_BYTE)(code >> 8);
2611     HPDF_CMapEncoderAttr attr = (HPDF_CMapEncoderAttr)encoder->attr;
2612 
2613     return attr->unicode_map[l][h];
2614 }
2615 
2616 
2617 HPDF_UINT16
HPDF_CMapEncoder_ToCID(HPDF_Encoder encoder,HPDF_UINT16 code)2618 HPDF_CMapEncoder_ToCID  (HPDF_Encoder  encoder,
2619                          HPDF_UINT16   code)
2620 {
2621     HPDF_BYTE l = (HPDF_BYTE)code;
2622     HPDF_BYTE h = (HPDF_BYTE)(code >> 8);
2623 
2624     HPDF_CMapEncoderAttr attr = (HPDF_CMapEncoderAttr)encoder->attr;
2625 
2626     return attr->cid_map[l][h];
2627 }
2628 
2629 void
HPDF_CMapEncoder_Free(HPDF_Encoder encoder)2630 HPDF_CMapEncoder_Free  (HPDF_Encoder  encoder)
2631 {
2632     HPDF_CMapEncoderAttr attr;
2633     HPDF_UINT i;
2634     HPDF_CidRange_Rec *data;
2635 
2636     HPDF_PTRACE ((" HPDF_CMapEncoder_Free\n"));
2637 
2638     attr = (HPDF_CMapEncoderAttr)encoder->attr;
2639 
2640     if (attr && attr->cmap_range) {
2641         for (i = 0; i < attr->cmap_range->count; i++) {
2642             data = HPDF_List_ItemAt (attr->cmap_range, i);
2643 
2644             HPDF_FreeMem (encoder->mmgr, data);
2645         }
2646 
2647         HPDF_List_Free (attr->cmap_range);
2648     }
2649 
2650     if (attr && attr->notdef_range) {
2651         for (i = 0; i < attr->notdef_range->count; i++) {
2652             data = HPDF_List_ItemAt (attr->notdef_range, i);
2653 
2654             HPDF_FreeMem (encoder->mmgr, data);
2655         }
2656 
2657         HPDF_List_Free (attr->notdef_range);
2658     }
2659 
2660     if (attr && attr->code_space_range) {
2661         for (i = 0; i < attr->code_space_range->count; i++) {
2662             data = HPDF_List_ItemAt (attr->code_space_range, i);
2663 
2664             HPDF_FreeMem (encoder->mmgr, data);
2665         }
2666 
2667         HPDF_List_Free (attr->code_space_range);
2668     }
2669 
2670     HPDF_FreeMem (encoder->mmgr, encoder->attr);
2671     encoder->attr = NULL;
2672 }
2673 
2674 
2675 HPDF_STATUS
HPDF_CMapEncoder_Write(HPDF_Encoder encoder,HPDF_Stream out)2676 HPDF_CMapEncoder_Write  (HPDF_Encoder  encoder,
2677                          HPDF_Stream   out)
2678 {
2679     HPDF_STATUS ret = HPDF_OK;
2680     HPDF_UNUSED (out);
2681     HPDF_UNUSED (encoder);
2682 
2683     return ret;
2684 }
2685 
2686 
2687 void
HPDF_Encoder_SetParseText(HPDF_Encoder encoder,HPDF_ParseText_Rec * state,const HPDF_BYTE * text,HPDF_UINT len)2688 HPDF_Encoder_SetParseText  (HPDF_Encoder        encoder,
2689                             HPDF_ParseText_Rec  *state,
2690                             const HPDF_BYTE     *text,
2691                             HPDF_UINT           len)
2692 {
2693     HPDF_PTRACE ((" HPDF_CMapEncoder_SetParseText\n"));
2694     HPDF_UNUSED (encoder);
2695 
2696     state->text = text;
2697     state->index = 0;
2698     state->len = len;
2699     state->byte_type = HPDF_BYTE_TYPE_SINGLE;
2700 }
2701 
2702 
2703 HPDF_ByteType
HPDF_CMapEncoder_ByteType(HPDF_Encoder encoder,HPDF_ParseText_Rec * state)2704 HPDF_CMapEncoder_ByteType  (HPDF_Encoder        encoder,
2705                             HPDF_ParseText_Rec  *state)
2706 {
2707     HPDF_CMapEncoderAttr attr = (HPDF_CMapEncoderAttr)encoder->attr;
2708 
2709     HPDF_PTRACE ((" HPDF_CMapEncoder_ByteType\n"));
2710 
2711     if (state->index >= state->len)
2712         return HPDF_BYTE_TYPE_UNKNOWN;
2713 
2714     if (state->byte_type == HPDF_BYTE_TYPE_LEAD) {
2715         if (attr->is_trial_byte_fn (encoder, state->text[state->index]))
2716             state->byte_type = HPDF_BYTE_TYPE_TRIAL;
2717         else
2718             state->byte_type = HPDF_BYTE_TYPE_UNKNOWN;
2719    } else {
2720         if (attr->is_lead_byte_fn (encoder, state->text[state->index]))
2721             state->byte_type = HPDF_BYTE_TYPE_LEAD;
2722         else
2723             state->byte_type = HPDF_BYTE_TYPE_SINGLE;
2724    }
2725 
2726    state->index++;
2727 
2728    return state->byte_type;
2729 }
2730 
2731 
2732 HPDF_ByteType
HPDF_Encoder_ByteType(HPDF_Encoder encoder,HPDF_ParseText_Rec * state)2733 HPDF_Encoder_ByteType  (HPDF_Encoder        encoder,
2734                         HPDF_ParseText_Rec  *state)
2735 {
2736     HPDF_PTRACE ((" HPDF_Encoder_ByteType\n"));
2737 
2738     if (encoder->byte_type_fn)
2739         return encoder->byte_type_fn (encoder, state);
2740     else
2741         return HPDF_BYTE_TYPE_SINGLE;
2742 }
2743 
2744 
2745 HPDF_STATUS
HPDF_CMapEncoder_AddCMap(HPDF_Encoder encoder,const HPDF_CidRange_Rec * range)2746 HPDF_CMapEncoder_AddCMap  (HPDF_Encoder             encoder,
2747                            const HPDF_CidRange_Rec  *range)
2748 {
2749     HPDF_CMapEncoderAttr attr = (HPDF_CMapEncoderAttr)encoder->attr;
2750 
2751     HPDF_PTRACE ((" HPDF_CMapEncoder_AddCMap\n"));
2752 
2753     /* Copy specified pdf_cid_range array to fRangeArray. */
2754     while (range->from != 0xffff || range->to != 0xffff) {
2755 	HPDF_CidRange_Rec *prange;
2756 	HPDF_STATUS ret;
2757 
2758 	/*
2759 	 * Only if we have the default to_unicode_fn
2760 	 */
2761 	if (encoder->to_unicode_fn == HPDF_CMapEncoder_ToUnicode) {
2762 	    HPDF_UINT16 code = range->from;
2763 	    HPDF_UINT16 cid = range->cid;
2764 
2765 	    while (code <= range->to) {
2766 		HPDF_BYTE l = code;
2767 		HPDF_BYTE h = code >> 8;
2768 
2769 		attr->cid_map[l][h] = cid;
2770 		code++;
2771 		cid++;
2772 	    }
2773 	}
2774 
2775         prange = HPDF_GetMem (encoder->mmgr, sizeof(HPDF_CidRange_Rec));
2776         if (!prange)
2777             return encoder->error->error_no;
2778 
2779         prange->from = range->from;
2780         prange->to = range->to;
2781         prange->cid = range->cid;
2782 
2783         if ((ret = HPDF_List_Add (attr->cmap_range, prange)) != HPDF_OK) {
2784             HPDF_FreeMem (encoder->mmgr, prange);
2785             return ret;
2786         }
2787 
2788         range++;
2789     }
2790 
2791     return HPDF_OK;
2792 }
2793 
2794 
2795 static HPDF_STATUS
AddCidRainge(HPDF_MMgr mmgr,HPDF_CidRange_Rec range,HPDF_List target)2796 AddCidRainge  (HPDF_MMgr            mmgr,
2797                HPDF_CidRange_Rec    range,
2798                HPDF_List            target)
2799 {
2800     HPDF_CidRange_Rec *prange;
2801     HPDF_STATUS ret;
2802 
2803     prange = HPDF_GetMem (mmgr, sizeof(HPDF_CidRange_Rec));
2804     if (!prange)
2805         return mmgr->error->error_no;
2806 
2807     prange->from = range.from;
2808     prange->to = range.to;
2809     prange->cid = range.cid;
2810 
2811     if ((ret = HPDF_List_Add (target, prange))
2812                 != HPDF_OK) {
2813         HPDF_FreeMem (mmgr, prange);
2814         return ret;
2815     }
2816 
2817     return HPDF_OK;
2818 }
2819 
2820 
2821 HPDF_STATUS
HPDF_CMapEncoder_AddNotDefRange(HPDF_Encoder encoder,HPDF_CidRange_Rec range)2822 HPDF_CMapEncoder_AddNotDefRange  (HPDF_Encoder        encoder,
2823                                   HPDF_CidRange_Rec   range)
2824 {
2825     HPDF_CMapEncoderAttr attr = (HPDF_CMapEncoderAttr)encoder->attr;
2826 
2827     HPDF_PTRACE ((" HPDF_CMapEncoder_AddNotDefRange\n"));
2828 
2829     return AddCidRainge (encoder->mmgr, range, attr->notdef_range);
2830 }
2831 
2832 
2833 HPDF_STATUS
HPDF_CMapEncoder_AddCodeSpaceRange(HPDF_Encoder encoder,HPDF_CidRange_Rec range)2834 HPDF_CMapEncoder_AddCodeSpaceRange  (HPDF_Encoder        encoder,
2835                                      HPDF_CidRange_Rec   range)
2836 {
2837     HPDF_CMapEncoderAttr attr = (HPDF_CMapEncoderAttr)encoder->attr;
2838 
2839     HPDF_PTRACE ((" HPDF_CMapEncoder_AddNotDefRange\n"));
2840 
2841     return AddCidRainge (encoder->mmgr, range, attr->code_space_range);
2842 }
2843 
2844 
2845 void
HPDF_CMapEncoder_SetUnicodeArray(HPDF_Encoder encoder,const HPDF_UnicodeMap_Rec * array)2846 HPDF_CMapEncoder_SetUnicodeArray  (HPDF_Encoder                 encoder,
2847                                    const HPDF_UnicodeMap_Rec   *array)
2848 {
2849     HPDF_CMapEncoderAttr attr = (HPDF_CMapEncoderAttr)encoder->attr;
2850 
2851     HPDF_PTRACE ((" HPDF_CMapEncoder_SetUnicodeArray\n"));
2852 
2853     if (array != NULL)
2854         while (array->unicode != 0xffff) {
2855             HPDF_BYTE l = (HPDF_BYTE)array->code;
2856             HPDF_BYTE h = (HPDF_BYTE)(array->code >> 8);
2857             attr->unicode_map[l][h] = array->unicode;
2858             array++;
2859         }
2860 }
2861 
2862 
2863 HPDF_STATUS
HPDF_CMapEncoder_AddJWWLineHead(HPDF_Encoder encoder,const HPDF_UINT16 * code)2864 HPDF_CMapEncoder_AddJWWLineHead  (HPDF_Encoder        encoder,
2865                                   const HPDF_UINT16  *code)
2866 {
2867     HPDF_CMapEncoderAttr attr = (HPDF_CMapEncoderAttr)encoder->attr;
2868     HPDF_UINT i, j;
2869 
2870     HPDF_PTRACE ((" HPDF_CMapEncoder_AddJWWLineHead\n"));
2871 
2872     for (i = 0; i < HPDF_MAX_JWW_NUM; i++) {
2873         if (*code == 0)
2874             break;
2875 
2876         for (j = 0; j < HPDF_MAX_JWW_NUM; j++) {
2877             if (attr->jww_line_head[j] == *code)
2878                 break;
2879 
2880             if (attr->jww_line_head[j] == 0) {
2881                 attr->jww_line_head[j] = *code;
2882                 break;
2883             }
2884 
2885             if (j == HPDF_MAX_JWW_NUM - 1)
2886                 return HPDF_SetError (encoder->error,
2887                                 HPDF_EXCEED_JWW_CODE_NUM_LIMIT, i);
2888         }
2889 
2890         code++;
2891     }
2892 
2893     return HPDF_OK;
2894 }
2895 
2896 
2897 HPDF_BOOL
HPDF_Encoder_CheckJWWLineHead(HPDF_Encoder encoder,const HPDF_UINT16 code)2898 HPDF_Encoder_CheckJWWLineHead  (HPDF_Encoder        encoder,
2899                                 const HPDF_UINT16   code)
2900 {
2901     HPDF_CMapEncoderAttr attr;
2902     HPDF_UINT j;
2903 
2904     HPDF_PTRACE ((" HPDF_Encoder_CheckJWWLineHead\n"));
2905 
2906     if (!HPDF_Encoder_Validate (encoder))
2907         return HPDF_FALSE;
2908 
2909     if (encoder->type != HPDF_ENCODER_TYPE_DOUBLE_BYTE)
2910         return HPDF_FALSE;
2911 
2912     attr = (HPDF_CMapEncoderAttr)encoder->attr;
2913 
2914     for (j = 0; j < HPDF_MAX_JWW_NUM; j++) {
2915         if (code == attr->jww_line_head[j])
2916             return HPDF_TRUE;
2917 
2918         if (attr->jww_line_head[j] == 0)
2919             return HPDF_FALSE;
2920     }
2921 
2922     return HPDF_FALSE;
2923 }
2924 
2925 
2926 
2927 
2928 
2929 HPDF_EXPORT(HPDF_UNICODE)
HPDF_Encoder_GetUnicode(HPDF_Encoder encoder,HPDF_UINT16 code)2930 HPDF_Encoder_GetUnicode  (HPDF_Encoder   encoder,
2931                           HPDF_UINT16    code)
2932 {
2933     HPDF_PTRACE ((" HPDF_Encoder_GetUnicode\n"));
2934 
2935     if (!HPDF_Encoder_Validate (encoder))
2936         return 0;
2937 
2938     return HPDF_Encoder_ToUnicode (encoder, code);
2939 }
2940 
2941 
2942 HPDF_EXPORT(HPDF_ByteType)
HPDF_Encoder_GetByteType(HPDF_Encoder encoder,const char * text,HPDF_UINT index)2943 HPDF_Encoder_GetByteType  (HPDF_Encoder       encoder,
2944                            const char   *text,
2945                            HPDF_UINT          index)
2946 {
2947     HPDF_ParseText_Rec  parse_state;
2948     HPDF_ByteType btype;
2949 
2950     HPDF_PTRACE ((" HPDF_Encoder_GetByteType\n"));
2951 
2952     if (!HPDF_Encoder_Validate (encoder))
2953         return HPDF_BYTE_TYPE_UNKNOWN;
2954 
2955     if (encoder->type != HPDF_ENCODER_TYPE_DOUBLE_BYTE)
2956         return HPDF_BYTE_TYPE_SINGLE;
2957 
2958     HPDF_Encoder_SetParseText (encoder, &parse_state, (HPDF_BYTE *)text, index + 1);
2959 
2960     for (;;) {
2961         btype = HPDF_CMapEncoder_ByteType (encoder, &parse_state);
2962 
2963         if (index == 0)
2964             break;
2965 
2966         text++;
2967         if (!(*text))
2968             return HPDF_BYTE_TYPE_UNKNOWN;
2969         index--;
2970     }
2971 
2972     return btype;
2973 }
2974 
2975 
2976 HPDF_EXPORT(HPDF_EncoderType)
HPDF_Encoder_GetType(HPDF_Encoder encoder)2977 HPDF_Encoder_GetType  (HPDF_Encoder    encoder)
2978 {
2979     HPDF_PTRACE ((" HPDF_Encoder_GetType\n"));
2980 
2981     if (!HPDF_Encoder_Validate (encoder))
2982         return HPDF_ENCODER_UNKNOWN;
2983 
2984     return encoder->type;
2985 }
2986 
2987 
2988 HPDF_EXPORT(HPDF_WritingMode)
HPDF_Encoder_GetWritingMode(HPDF_Encoder encoder)2989 HPDF_Encoder_GetWritingMode (HPDF_Encoder    encoder)
2990 {
2991     HPDF_PTRACE ((" HPDF_Encoder_GetWritingMode\n"));
2992 
2993     if (!HPDF_Encoder_Validate (encoder))
2994         return HPDF_WMODE_HORIZONTAL;
2995 
2996     if (encoder->type == HPDF_ENCODER_TYPE_DOUBLE_BYTE) {
2997         HPDF_CMapEncoderAttr attr = (HPDF_CMapEncoderAttr)encoder->attr;
2998         return attr->writing_mode;
2999     }
3000 
3001     return HPDF_WMODE_HORIZONTAL;
3002 }
3003