summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2009-05-07 15:22:02 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2009-05-07 15:22:02 +0000
commita98d8fb5e49436c6fedea37797225293284b9894 (patch)
treef140662044f20668b937c9f3b451c56345678108
downloadttf2f-a98d8fb5e49436c6fedea37797225293284b9894.tar.gz
ttf2f-a98d8fb5e49436c6fedea37797225293284b9894.tar.bz2
Import TTF2f. Don't expect this to link; I've prevented it building main.c.
svn path=/trunk/tools/ttf2f/; revision=7427
-rw-r--r--!TTF2f/!Boot11
-rw-r--r--!TTF2f/!Help193
-rw-r--r--!TTF2f/!Run31
-rw-r--r--!TTF2f/!Sprites22bin0 -> 2504 bytes
-rw-r--r--!TTF2f/Glyphs1406
-rw-r--r--!TTF2f/History27
-rw-r--r--!TTF2f/Messages4
-rw-r--r--!TTF2f/Resbin0 -> 1644 bytes
-rw-r--r--Makefile31
-rw-r--r--src/Makefile4
-rw-r--r--src/encoding.c71
-rw-r--r--src/encoding.h11
-rw-r--r--src/fm.h31
-rw-r--r--src/ft.c569
-rw-r--r--src/ft.h20
-rw-r--r--src/glyph.h39
-rw-r--r--src/glyphs.c101
-rw-r--r--src/glyphs.h8
-rw-r--r--src/intmetrics.c154
-rw-r--r--src/intmetrics.h12
-rw-r--r--src/main.c456
-rw-r--r--src/outlines.c297
-rw-r--r--src/outlines.h58
-rw-r--r--src/utils.c39
-rw-r--r--src/utils.h12
25 files changed, 3585 insertions, 0 deletions
diff --git a/!TTF2f/!Boot b/!TTF2f/!Boot
new file mode 100644
index 0000000..7d939d1
--- /dev/null
+++ b/!TTF2f/!Boot
@@ -0,0 +1,11 @@
+Set TTF2f$Dir <Obey$Dir>
+
+| Application system variables
+Set TTF2f$Help <TTF2f$Dir>.!Help
+Set TTF2f$Version "0.01 (07 Sep 2004)"
+Set TTF2f$Title "TTF2f"
+Set TTF2f$Publisher "J-M Bell"
+Set TTF2f$Description "Font conversion utility"
+
+| IconSprites
+IconSprites <TTF2f$Dir>.!Sprites
diff --git a/!TTF2f/!Help b/!TTF2f/!Help
new file mode 100644
index 0000000..1c7125f
--- /dev/null
+++ b/!TTF2f/!Help
@@ -0,0 +1,193 @@
+TTF2f
+-----
+
+TTF2f converts TTF and other font formats supported by FreeType2
+(http://www.freetype.org) to RISC OS format fonts suitable for use with
+the Unicode Font Manager.
+
+NOTE: Please read the section "Converting a font" as a minimum _before_
+ using this software.
+
+Contents
+========
+
+1. Converting a font
+2. Progress Bar
+3. Future Enhancements
+4. Known Issues
+5. Licence
+6. Credits and Copyrights
+
+
+1. Converting a font
+====================
+
+ In order to convert a font, follow the following process:
+
+ 1) Run the application and open the main window.
+ 2) Drag the source font file to the window - the file path will appear
+ in the Converting display field.
+ 3) Choose a RISC OS font name for the font and enter it into the
+ Fontname writable field.
+ 4) Select the location to save the output font from the drop down menu
+ (this is comprised of all entries in your current Font$Path)
+ 5) Click convert and wait for conversion to complete.
+
+2. Progress Bar
+===============
+
+ During the conversion process, the progress bar will be filled three
+ times - once per file being created. This is indicated by the colour of
+ the bar:
+
+ Dark Green indicates that the glyph metrics are being extracted.
+ Red indicates that the IntMetrics file is being written.
+ Blue indicates that the Outlines file is being written.
+ Green indicates that the Encoding file is being written.
+
+
+3. Future Enhancements
+======================
+
+ There are a number of possible enhancements which could be made to TTF2f.
+
+ 1) Kerning data.
+
+ At present, any kerning data present in the source font is ignored. It
+ may be desirable to copy this data across into the RISC OS IntMetrics
+ file.
+
+ 2) Improve conversion speed.
+
+ TTF2f is not particularly fast at conversion, although in most cases
+ conversion time should be acceptable. Particularly large fonts do take
+ some time to convert (for example; BitStream.Cyberbit (a font
+ containing about 30,000 glyphs which cover much of the common Unicode
+ character range) takes approximately 25 minutes to convert on my
+ Iyonix).
+
+
+4. Known Issues
+===============
+
+ At the time of writing there is one known issue.
+
+ 1) Attempts to quit TTF2f whilst conversion is occuring will be ignored
+ (this includes use of Alt-Break).
+
+
+5. Licence
+==========
+
+ Copyright (c) 2004-5, J-M Bell <jmb202@ecs.soton.ac.uk>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS
+ BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ THE POSSIBILITY OF SUCH DAMAGE.
+
+
+6. Credits & Copyrights
+=======================
+
+Section Contents
+----------------
+
+ 1) TTF2PT1 licence
+ 2a) FreeType declaration
+ 2b) FreeType PCF driver licence
+
+1) TTF2PT1 Licence
+~~~~~~~~~~~~~~~~~~
+This product includes software developed by the TTF2PT1 Project and its
+contributors under the following licence:
+
+ Copyright (c) 1997-2003 by the AUTHORS:
+ Andrew Weeks <ccsaw@bath.ac.uk>
+ Frank M. Siegert <fms@this.net>
+ Mark Heath <mheath@netspace.net.au>
+ Thomas Henlich <thenlich@rcs.urz.tu-dresden.de>
+ Sergey Babkin <babkin@users.sourceforge.net>, <sab123@hotmail.com>
+ Turgut Uyar <uyar@cs.itu.edu.tr>
+ Rihardas Hepas <rch@WriteMe.Com>
+ Szalay Tamas <tomek@elender.hu>
+ Johan Vromans <jvromans@squirrel.nl>
+ Petr Titera <P.Titera@sh.cvut.cz>
+ Lei Wang <lwang@amath8.amt.ac.cn>
+ Chen Xiangyang <chenxy@sun.ihep.ac.cn>
+ Zvezdan Petkovic <z.petkovic@computer.org>
+ Rigel <rigel863@yahoo.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. All advertising materials mentioning features or use of this software
+ must display the following acknowledgement:
+ This product includes software developed by the TTF2PT1 Project
+ and its contributors.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+2a) FreeType Declaration
+~~~~~~~~~~~~~~~~~~~~~~~~
+ Portions of this software are copyright © 1996-2002 The FreeType Project
+ (www.freetype.org). All rights reserved.
+
+2b) FreeType PCF driver licence
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The PCF driver component of libfreetype is distributed under the following
+licence:
+
+ Copyright (C) 2000 by Francesco Zappa Nardelli
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/!TTF2f/!Run b/!TTF2f/!Run
new file mode 100644
index 0000000..0d0b457
--- /dev/null
+++ b/!TTF2f/!Run
@@ -0,0 +1,31 @@
+<Obey$Dir>.!Boot
+
+RMEnsure UtilityModule 3.00 Error TTF2f needs RISC OS 3 or later
+
+RMEnsure WindowManager 3.98 Error TTF2f requires the Nested WIMP
+
+| Ensure CallASWI etc is installed
+| http://www.iyonix.com/32bit/
+RMEnsure UtilityModule 3.70 RMEnsure CallASWI 0.02 RMLoad System:Modules.CallASWI
+RMEnsure UtilityModule 3.70 RMEnsure CallASWI 0.02 Error TTF2f requires the CallASWI module. This can be downloaded from http://www.iyonix.com/32bit/system.shtml
+
+RMEnsure FPEmulator 4.03 RMLoad System:Modules.FPEmulator
+RMEnsure FPEmulator 4.03 Error TTF2f requires FPEmulator 4.03 or later
+
+RMEnsure SharedCLibrary 5.17 RMLoad System:Modules.CLib
+RMEnsure SharedCLibrary 5.34 Error TTF2f requires SharedCLibrary 5.34 or later
+
+| Toolbox modules - version numbers correspond to those distributed with 5.03
+RMEnsure Toolbox 0.00 RMLoad System:Modules.Toolbox.Toolbox
+RMEnsure Toolbox 1.52 Error TTF2f requires the Toolbox module
+RMEnsure Window 0.00 RMLoad System:Modules.Toolbox.Window
+RMEnsure Window 1.69 Error TTF2f requires the Window module
+RMEnsure Iconbar 0.00 RMLoad System:Modules.Toolbox.Iconbar
+RMEnsure Iconbar 1.20 Error TTF2f requires the Iconbar module
+RMEnsure Menu 0.00 RMLoad System:Modules.Toolbox.Menu
+RMEnsure Menu 0.36 Error TTF2f requires the Menu module
+RMEnsure ProgInfo 0.00 RMLoad System:Modules.Toolbox.ProgInfo
+RMEnsure ProgInfo 0.17 Error TTF2f requires the ProgInfo module
+
+WimpSlot -min 400k -max 400k
+/<TTF2f$Dir>.!RunImage %*0 2>null: \ No newline at end of file
diff --git a/!TTF2f/!Sprites22 b/!TTF2f/!Sprites22
new file mode 100644
index 0000000..c63ecfd
--- /dev/null
+++ b/!TTF2f/!Sprites22
Binary files differ
diff --git a/!TTF2f/Glyphs b/!TTF2f/Glyphs
new file mode 100644
index 0000000..d39fa0a
--- /dev/null
+++ b/!TTF2f/Glyphs
@@ -0,0 +1,1406 @@
+#
+# Name: Adobe Glyph List
+# Table version: 1.2
+# Date: 22 Oct 1998
+#
+# Description:
+#
+# The Adobe Glyph List (AGL) list relates Unicode values (UVs) to glyph
+# names, and should be used only as described in the document "Unicode and
+# Glyph Names," at
+# http://www.adobe.com/supportservice/devrelations/typeforum/unicodegn.html .
+#
+# The glyph name to UV relation is one to many. 12 glyph names are mapped to
+# two UVs each; each UV has a separate entry. All other glyph names are
+# mapped to one UV each.
+#
+# The Unicode Standard version 2.1 is used for all UVs outside of the Private
+# Use area, except for 4 entries (see Revision History for 1.2 below).
+#
+# There are 1051 entries in this list, 171 of which are in the Corporate Use
+# subarea (CUS). Refer to the document "Unicode Corporate Use Subarea as used
+# by Adobe Systems," at
+# http://www.adobe.com/supportservice/devrelations/typeforum/corporateuse.txt
+# for compatibility decompositions for these characters, and to the document
+# "Unicode and Glyph Names" for more information the CUS.
+#
+# Format: Semicolon-delimited fields:
+#
+# (1) Standard UV or CUS UV. (4 uppercase hexadecimal digits)
+#
+# (2) Glyph name. (upper- and lowercase letters, digits)
+#
+# (3) Character names: Unicode character names for standard UVs, and
+# descriptive names for CUS UVs. (uppercase letters, hyphen, space)
+#
+# (4) [optional] Comment. A comment of "Duplicate" indicates one of two
+# UVs of a double-mapping. It is the UV that may be given a uni<CODE>
+# override, or the UV that is in the CUS, as described in the document
+# "Unicode and Glyph Names."
+#
+# The entries are sorted by glyph name in increasing ASCII order; entries
+# with the same glyph name are sorted in decreasing priority order.
+#
+# Lines starting with "#" are comments; blank lines should be ignored.
+#
+# Revision History:
+#
+# 1.2 [22 Oct 1998]
+#
+# Some Central European glyph names were remapped and the glyph "dotlessj"
+# was added. Some entries in the table below have not changed but are
+# included to provide a complete context for other glyphs that have been
+# remapped or double-mapped. "-" means that the entry for that UV does not
+# exist in the AGL.
+#
+# -------- ---------------------- ---------------- --------------
+# UV Character name AGL 1.1 AGL 1.2
+# (shortened) glyph name glyph name
+# -------- ---------------------- ---------------- --------------
+# 015E/F S/s with cedilla S/scommaaccent S/scedilla
+# 0162/3 T/t with cedilla T/tcommaaccent T/tcommaaccent
+# 0218/9 S/s with comma below - S/scommaaccent
+# 021A/B T/t with comma below - T/tcommaaccent
+# 1E9E/F S/s with comma below S/scedilla -
+# F6C1/2 S/s with cedilla S/scedilla S/scedilla
+# F6BE dotless j - dotlessj
+# -------- ---------------------- ---------------- --------------
+#
+# The characters at U+1E9E/F in AGL 1.1, LATIN CAPITAL/SMALL LETTER S WITH
+# COMMA BELOW, which are proposed new characters (see (b) in the notes for
+# AGL 1.1 below), have since been reassigned by the Unicode Standard to new
+# proposed values of U+0218/9. These characters, as well as U+021A/B, LATIN
+# CAPITAL/SMALL LETTER T WITH COMMA BELOW, are not in the Unicode Standard
+# 2.1.
+#
+# Entries with the same glyph name are now sorted in decreasing priority
+# order instead of in increasing UV order.
+#
+# 1.1 [24 Nov 1997]
+#
+# a. The "Euro" glyph's UV assignment is changed from U+20A0 (EURO-CURRENCY
+# SIGN) to U+20AC (EURO SIGN). While U+20AC is not defined in the
+# Unicode Standard 2.0, it has been accepted by the Unicode Technical
+# Committee for the next version of the Standard; it has not yet passed
+# the ISO approval process as of 7 November '97.
+#
+# b. Glyphs "Scedilla" and "scedilla", which were assigned in the Corporate
+# Use Subarea in AGL 1.0, are now additionally mapped to U+1E9E and
+# U+1E9F respectively. These two UVs share the same Unicode approval
+# status as the Euro glyph (see a. above).
+#
+# c. The "fraction" glyph is now additionally mapped to U+2215, to match
+# Windows Glyph List 4.
+#
+# d. The descriptive name for glyph "onefitted", in the Corporate Use
+# subarea, is changed from "TABULAR DIGIT ONE" to "PROPORTIONAL DIGIT
+# ONE".
+#
+# 1.0 [17 Jul 1997] Original version
+#
+0041;A;LATIN CAPITAL LETTER A
+00C6;AE;LATIN CAPITAL LETTER AE
+01FC;AEacute;LATIN CAPITAL LETTER AE WITH ACUTE
+F7E6;AEsmall;LATIN SMALL CAPITAL LETTER AE
+00C1;Aacute;LATIN CAPITAL LETTER A WITH ACUTE
+F7E1;Aacutesmall;LATIN SMALL CAPITAL LETTER A WITH ACUTE
+0102;Abreve;LATIN CAPITAL LETTER A WITH BREVE
+00C2;Acircumflex;LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+F7E2;Acircumflexsmall;LATIN SMALL CAPITAL LETTER A WITH CIRCUMFLEX
+F6C9;Acute;CAPITAL ACUTE ACCENT
+F7B4;Acutesmall;SMALL CAPITAL ACUTE ACCENT
+00C4;Adieresis;LATIN CAPITAL LETTER A WITH DIAERESIS
+F7E4;Adieresissmall;LATIN SMALL CAPITAL LETTER A WITH DIAERESIS
+00C0;Agrave;LATIN CAPITAL LETTER A WITH GRAVE
+F7E0;Agravesmall;LATIN SMALL CAPITAL LETTER A WITH GRAVE
+0391;Alpha;GREEK CAPITAL LETTER ALPHA
+0386;Alphatonos;GREEK CAPITAL LETTER ALPHA WITH TONOS
+0100;Amacron;LATIN CAPITAL LETTER A WITH MACRON
+0104;Aogonek;LATIN CAPITAL LETTER A WITH OGONEK
+00C5;Aring;LATIN CAPITAL LETTER A WITH RING ABOVE
+01FA;Aringacute;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+F7E5;Aringsmall;LATIN SMALL CAPITAL LETTER A WITH RING ABOVE
+F761;Asmall;LATIN SMALL CAPITAL LETTER A
+00C3;Atilde;LATIN CAPITAL LETTER A WITH TILDE
+F7E3;Atildesmall;LATIN SMALL CAPITAL LETTER A WITH TILDE
+0042;B;LATIN CAPITAL LETTER B
+0392;Beta;GREEK CAPITAL LETTER BETA
+F6F4;Brevesmall;SMALL CAPITAL BREVE
+F762;Bsmall;LATIN SMALL CAPITAL LETTER B
+0043;C;LATIN CAPITAL LETTER C
+0106;Cacute;LATIN CAPITAL LETTER C WITH ACUTE
+F6CA;Caron;CAPITAL CARON
+F6F5;Caronsmall;SMALL CAPITAL CARON
+010C;Ccaron;LATIN CAPITAL LETTER C WITH CARON
+00C7;Ccedilla;LATIN CAPITAL LETTER C WITH CEDILLA
+F7E7;Ccedillasmall;LATIN SMALL CAPITAL LETTER C WITH CEDILLA
+0108;Ccircumflex;LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+010A;Cdotaccent;LATIN CAPITAL LETTER C WITH DOT ABOVE
+F7B8;Cedillasmall;SMALL CAPITAL CEDILLA
+03A7;Chi;GREEK CAPITAL LETTER CHI
+F6F6;Circumflexsmall;SMALL CAPITAL MODIFIER LETTER CIRCUMFLEX ACCENT
+F763;Csmall;LATIN SMALL CAPITAL LETTER C
+0044;D;LATIN CAPITAL LETTER D
+010E;Dcaron;LATIN CAPITAL LETTER D WITH CARON
+0110;Dcroat;LATIN CAPITAL LETTER D WITH STROKE
+2206;Delta;INCREMENT
+0394;Delta;GREEK CAPITAL LETTER DELTA;Duplicate
+F6CB;Dieresis;CAPITAL DIAERESIS
+F6CC;DieresisAcute;CAPITAL DIAERESIS ACUTE ACCENT
+F6CD;DieresisGrave;CAPITAL DIAERESIS GRAVE ACCENT
+F7A8;Dieresissmall;SMALL CAPITAL DIAERESIS
+F6F7;Dotaccentsmall;SMALL CAPITAL DOT ABOVE
+F764;Dsmall;LATIN SMALL CAPITAL LETTER D
+0045;E;LATIN CAPITAL LETTER E
+00C9;Eacute;LATIN CAPITAL LETTER E WITH ACUTE
+F7E9;Eacutesmall;LATIN SMALL CAPITAL LETTER E WITH ACUTE
+0114;Ebreve;LATIN CAPITAL LETTER E WITH BREVE
+011A;Ecaron;LATIN CAPITAL LETTER E WITH CARON
+00CA;Ecircumflex;LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+F7EA;Ecircumflexsmall;LATIN SMALL CAPITAL LETTER E WITH CIRCUMFLEX
+00CB;Edieresis;LATIN CAPITAL LETTER E WITH DIAERESIS
+F7EB;Edieresissmall;LATIN SMALL CAPITAL LETTER E WITH DIAERESIS
+0116;Edotaccent;LATIN CAPITAL LETTER E WITH DOT ABOVE
+00C8;Egrave;LATIN CAPITAL LETTER E WITH GRAVE
+F7E8;Egravesmall;LATIN SMALL CAPITAL LETTER E WITH GRAVE
+0112;Emacron;LATIN CAPITAL LETTER E WITH MACRON
+014A;Eng;LATIN CAPITAL LETTER ENG
+0118;Eogonek;LATIN CAPITAL LETTER E WITH OGONEK
+0395;Epsilon;GREEK CAPITAL LETTER EPSILON
+0388;Epsilontonos;GREEK CAPITAL LETTER EPSILON WITH TONOS
+F765;Esmall;LATIN SMALL CAPITAL LETTER E
+0397;Eta;GREEK CAPITAL LETTER ETA
+0389;Etatonos;GREEK CAPITAL LETTER ETA WITH TONOS
+00D0;Eth;LATIN CAPITAL LETTER ETH
+F7F0;Ethsmall;LATIN SMALL CAPITAL LETTER ETH
+20AC;Euro;EURO SIGN
+0046;F;LATIN CAPITAL LETTER F
+F766;Fsmall;LATIN SMALL CAPITAL LETTER F
+0047;G;LATIN CAPITAL LETTER G
+0393;Gamma;GREEK CAPITAL LETTER GAMMA
+011E;Gbreve;LATIN CAPITAL LETTER G WITH BREVE
+01E6;Gcaron;LATIN CAPITAL LETTER G WITH CARON
+011C;Gcircumflex;LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+0122;Gcommaaccent;LATIN CAPITAL LETTER G WITH CEDILLA
+0120;Gdotaccent;LATIN CAPITAL LETTER G WITH DOT ABOVE
+F6CE;Grave;CAPITAL GRAVE ACCENT
+F760;Gravesmall;SMALL CAPITAL GRAVE ACCENT
+F767;Gsmall;LATIN SMALL CAPITAL LETTER G
+0048;H;LATIN CAPITAL LETTER H
+25CF;H18533;BLACK CIRCLE
+25AA;H18543;BLACK SMALL SQUARE
+25AB;H18551;WHITE SMALL SQUARE
+25A1;H22073;WHITE SQUARE
+0126;Hbar;LATIN CAPITAL LETTER H WITH STROKE
+0124;Hcircumflex;LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+F768;Hsmall;LATIN SMALL CAPITAL LETTER H
+F6CF;Hungarumlaut;CAPITAL DOUBLE ACUTE ACCENT
+F6F8;Hungarumlautsmall;SMALL CAPITAL DOUBLE ACUTE ACCENT
+0049;I;LATIN CAPITAL LETTER I
+0132;IJ;LATIN CAPITAL LIGATURE IJ
+00CD;Iacute;LATIN CAPITAL LETTER I WITH ACUTE
+F7ED;Iacutesmall;LATIN SMALL CAPITAL LETTER I WITH ACUTE
+012C;Ibreve;LATIN CAPITAL LETTER I WITH BREVE
+00CE;Icircumflex;LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+F7EE;Icircumflexsmall;LATIN SMALL CAPITAL LETTER I WITH CIRCUMFLEX
+00CF;Idieresis;LATIN CAPITAL LETTER I WITH DIAERESIS
+F7EF;Idieresissmall;LATIN SMALL CAPITAL LETTER I WITH DIAERESIS
+0130;Idotaccent;LATIN CAPITAL LETTER I WITH DOT ABOVE
+2111;Ifraktur;BLACK-LETTER CAPITAL I
+00CC;Igrave;LATIN CAPITAL LETTER I WITH GRAVE
+F7EC;Igravesmall;LATIN SMALL CAPITAL LETTER I WITH GRAVE
+012A;Imacron;LATIN CAPITAL LETTER I WITH MACRON
+012E;Iogonek;LATIN CAPITAL LETTER I WITH OGONEK
+0399;Iota;GREEK CAPITAL LETTER IOTA
+03AA;Iotadieresis;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+038A;Iotatonos;GREEK CAPITAL LETTER IOTA WITH TONOS
+F769;Ismall;LATIN SMALL CAPITAL LETTER I
+0128;Itilde;LATIN CAPITAL LETTER I WITH TILDE
+004A;J;LATIN CAPITAL LETTER J
+0134;Jcircumflex;LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+F76A;Jsmall;LATIN SMALL CAPITAL LETTER J
+004B;K;LATIN CAPITAL LETTER K
+039A;Kappa;GREEK CAPITAL LETTER KAPPA
+0136;Kcommaaccent;LATIN CAPITAL LETTER K WITH CEDILLA
+F76B;Ksmall;LATIN SMALL CAPITAL LETTER K
+004C;L;LATIN CAPITAL LETTER L
+F6BF;LL;LATIN CAPITAL LETTER LL
+0139;Lacute;LATIN CAPITAL LETTER L WITH ACUTE
+039B;Lambda;GREEK CAPITAL LETTER LAMDA
+013D;Lcaron;LATIN CAPITAL LETTER L WITH CARON
+013B;Lcommaaccent;LATIN CAPITAL LETTER L WITH CEDILLA
+013F;Ldot;LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0141;Lslash;LATIN CAPITAL LETTER L WITH STROKE
+F6F9;Lslashsmall;LATIN SMALL CAPITAL LETTER L WITH STROKE
+F76C;Lsmall;LATIN SMALL CAPITAL LETTER L
+004D;M;LATIN CAPITAL LETTER M
+F6D0;Macron;CAPITAL MACRON
+F7AF;Macronsmall;SMALL CAPITAL MACRON
+F76D;Msmall;LATIN SMALL CAPITAL LETTER M
+039C;Mu;GREEK CAPITAL LETTER MU
+004E;N;LATIN CAPITAL LETTER N
+0143;Nacute;LATIN CAPITAL LETTER N WITH ACUTE
+0147;Ncaron;LATIN CAPITAL LETTER N WITH CARON
+0145;Ncommaaccent;LATIN CAPITAL LETTER N WITH CEDILLA
+F76E;Nsmall;LATIN SMALL CAPITAL LETTER N
+00D1;Ntilde;LATIN CAPITAL LETTER N WITH TILDE
+F7F1;Ntildesmall;LATIN SMALL CAPITAL LETTER N WITH TILDE
+039D;Nu;GREEK CAPITAL LETTER NU
+004F;O;LATIN CAPITAL LETTER O
+0152;OE;LATIN CAPITAL LIGATURE OE
+F6FA;OEsmall;LATIN SMALL CAPITAL LIGATURE OE
+00D3;Oacute;LATIN CAPITAL LETTER O WITH ACUTE
+F7F3;Oacutesmall;LATIN SMALL CAPITAL LETTER O WITH ACUTE
+014E;Obreve;LATIN CAPITAL LETTER O WITH BREVE
+00D4;Ocircumflex;LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+F7F4;Ocircumflexsmall;LATIN SMALL CAPITAL LETTER O WITH CIRCUMFLEX
+00D6;Odieresis;LATIN CAPITAL LETTER O WITH DIAERESIS
+F7F6;Odieresissmall;LATIN SMALL CAPITAL LETTER O WITH DIAERESIS
+F6FB;Ogoneksmall;SMALL CAPITAL OGONEK
+00D2;Ograve;LATIN CAPITAL LETTER O WITH GRAVE
+F7F2;Ogravesmall;LATIN SMALL CAPITAL LETTER O WITH GRAVE
+01A0;Ohorn;LATIN CAPITAL LETTER O WITH HORN
+0150;Ohungarumlaut;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+014C;Omacron;LATIN CAPITAL LETTER O WITH MACRON
+2126;Omega;OHM SIGN
+03A9;Omega;GREEK CAPITAL LETTER OMEGA;Duplicate
+038F;Omegatonos;GREEK CAPITAL LETTER OMEGA WITH TONOS
+039F;Omicron;GREEK CAPITAL LETTER OMICRON
+038C;Omicrontonos;GREEK CAPITAL LETTER OMICRON WITH TONOS
+00D8;Oslash;LATIN CAPITAL LETTER O WITH STROKE
+01FE;Oslashacute;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+F7F8;Oslashsmall;LATIN SMALL CAPITAL LETTER O WITH STROKE
+F76F;Osmall;LATIN SMALL CAPITAL LETTER O
+00D5;Otilde;LATIN CAPITAL LETTER O WITH TILDE
+F7F5;Otildesmall;LATIN SMALL CAPITAL LETTER O WITH TILDE
+0050;P;LATIN CAPITAL LETTER P
+03A6;Phi;GREEK CAPITAL LETTER PHI
+03A0;Pi;GREEK CAPITAL LETTER PI
+03A8;Psi;GREEK CAPITAL LETTER PSI
+F770;Psmall;LATIN SMALL CAPITAL LETTER P
+0051;Q;LATIN CAPITAL LETTER Q
+F771;Qsmall;LATIN SMALL CAPITAL LETTER Q
+0052;R;LATIN CAPITAL LETTER R
+0154;Racute;LATIN CAPITAL LETTER R WITH ACUTE
+0158;Rcaron;LATIN CAPITAL LETTER R WITH CARON
+0156;Rcommaaccent;LATIN CAPITAL LETTER R WITH CEDILLA
+211C;Rfraktur;BLACK-LETTER CAPITAL R
+03A1;Rho;GREEK CAPITAL LETTER RHO
+F6FC;Ringsmall;SMALL CAPITAL RING ABOVE
+F772;Rsmall;LATIN SMALL CAPITAL LETTER R
+0053;S;LATIN CAPITAL LETTER S
+250C;SF010000;BOX DRAWINGS LIGHT DOWN AND RIGHT
+2514;SF020000;BOX DRAWINGS LIGHT UP AND RIGHT
+2510;SF030000;BOX DRAWINGS LIGHT DOWN AND LEFT
+2518;SF040000;BOX DRAWINGS LIGHT UP AND LEFT
+253C;SF050000;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+252C;SF060000;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+2534;SF070000;BOX DRAWINGS LIGHT UP AND HORIZONTAL
+251C;SF080000;BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+2524;SF090000;BOX DRAWINGS LIGHT VERTICAL AND LEFT
+2500;SF100000;BOX DRAWINGS LIGHT HORIZONTAL
+2502;SF110000;BOX DRAWINGS LIGHT VERTICAL
+2561;SF190000;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+2562;SF200000;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+2556;SF210000;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+2555;SF220000;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+2563;SF230000;BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+2551;SF240000;BOX DRAWINGS DOUBLE VERTICAL
+2557;SF250000;BOX DRAWINGS DOUBLE DOWN AND LEFT
+255D;SF260000;BOX DRAWINGS DOUBLE UP AND LEFT
+255C;SF270000;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+255B;SF280000;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+255E;SF360000;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+255F;SF370000;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+255A;SF380000;BOX DRAWINGS DOUBLE UP AND RIGHT
+2554;SF390000;BOX DRAWINGS DOUBLE DOWN AND RIGHT
+2569;SF400000;BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+2566;SF410000;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+2560;SF420000;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+2550;SF430000;BOX DRAWINGS DOUBLE HORIZONTAL
+256C;SF440000;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+2567;SF450000;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+2568;SF460000;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+2564;SF470000;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+2565;SF480000;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+2559;SF490000;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+2558;SF500000;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+2552;SF510000;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+2553;SF520000;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+256B;SF530000;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+256A;SF540000;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+015A;Sacute;LATIN CAPITAL LETTER S WITH ACUTE
+0160;Scaron;LATIN CAPITAL LETTER S WITH CARON
+F6FD;Scaronsmall;LATIN SMALL CAPITAL LETTER S WITH CARON
+015E;Scedilla;LATIN CAPITAL LETTER S WITH CEDILLA
+F6C1;Scedilla;LATIN CAPITAL LETTER S WITH CEDILLA;Duplicate
+015C;Scircumflex;LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+0218;Scommaaccent;LATIN CAPITAL LETTER S WITH COMMA BELOW
+03A3;Sigma;GREEK CAPITAL LETTER SIGMA
+F773;Ssmall;LATIN SMALL CAPITAL LETTER S
+0054;T;LATIN CAPITAL LETTER T
+03A4;Tau;GREEK CAPITAL LETTER TAU
+0166;Tbar;LATIN CAPITAL LETTER T WITH STROKE
+0164;Tcaron;LATIN CAPITAL LETTER T WITH CARON
+0162;Tcommaaccent;LATIN CAPITAL LETTER T WITH CEDILLA
+021A;Tcommaaccent;LATIN CAPITAL LETTER T WITH COMMA BELOW;Duplicate
+0398;Theta;GREEK CAPITAL LETTER THETA
+00DE;Thorn;LATIN CAPITAL LETTER THORN
+F7FE;Thornsmall;LATIN SMALL CAPITAL LETTER THORN
+F6FE;Tildesmall;SMALL CAPITAL SMALL TILDE
+F774;Tsmall;LATIN SMALL CAPITAL LETTER T
+0055;U;LATIN CAPITAL LETTER U
+00DA;Uacute;LATIN CAPITAL LETTER U WITH ACUTE
+F7FA;Uacutesmall;LATIN SMALL CAPITAL LETTER U WITH ACUTE
+016C;Ubreve;LATIN CAPITAL LETTER U WITH BREVE
+00DB;Ucircumflex;LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+F7FB;Ucircumflexsmall;LATIN SMALL CAPITAL LETTER U WITH CIRCUMFLEX
+00DC;Udieresis;LATIN CAPITAL LETTER U WITH DIAERESIS
+F7FC;Udieresissmall;LATIN SMALL CAPITAL LETTER U WITH DIAERESIS
+00D9;Ugrave;LATIN CAPITAL LETTER U WITH GRAVE
+F7F9;Ugravesmall;LATIN SMALL CAPITAL LETTER U WITH GRAVE
+01AF;Uhorn;LATIN CAPITAL LETTER U WITH HORN
+0170;Uhungarumlaut;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+016A;Umacron;LATIN CAPITAL LETTER U WITH MACRON
+0172;Uogonek;LATIN CAPITAL LETTER U WITH OGONEK
+03A5;Upsilon;GREEK CAPITAL LETTER UPSILON
+03D2;Upsilon1;GREEK UPSILON WITH HOOK SYMBOL
+03AB;Upsilondieresis;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+038E;Upsilontonos;GREEK CAPITAL LETTER UPSILON WITH TONOS
+016E;Uring;LATIN CAPITAL LETTER U WITH RING ABOVE
+F775;Usmall;LATIN SMALL CAPITAL LETTER U
+0168;Utilde;LATIN CAPITAL LETTER U WITH TILDE
+0056;V;LATIN CAPITAL LETTER V
+F776;Vsmall;LATIN SMALL CAPITAL LETTER V
+0057;W;LATIN CAPITAL LETTER W
+1E82;Wacute;LATIN CAPITAL LETTER W WITH ACUTE
+0174;Wcircumflex;LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+1E84;Wdieresis;LATIN CAPITAL LETTER W WITH DIAERESIS
+1E80;Wgrave;LATIN CAPITAL LETTER W WITH GRAVE
+F777;Wsmall;LATIN SMALL CAPITAL LETTER W
+0058;X;LATIN CAPITAL LETTER X
+039E;Xi;GREEK CAPITAL LETTER XI
+F778;Xsmall;LATIN SMALL CAPITAL LETTER X
+0059;Y;LATIN CAPITAL LETTER Y
+00DD;Yacute;LATIN CAPITAL LETTER Y WITH ACUTE
+F7FD;Yacutesmall;LATIN SMALL CAPITAL LETTER Y WITH ACUTE
+0176;Ycircumflex;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0178;Ydieresis;LATIN CAPITAL LETTER Y WITH DIAERESIS
+F7FF;Ydieresissmall;LATIN SMALL CAPITAL LETTER Y WITH DIAERESIS
+1EF2;Ygrave;LATIN CAPITAL LETTER Y WITH GRAVE
+F779;Ysmall;LATIN SMALL CAPITAL LETTER Y
+005A;Z;LATIN CAPITAL LETTER Z
+0179;Zacute;LATIN CAPITAL LETTER Z WITH ACUTE
+017D;Zcaron;LATIN CAPITAL LETTER Z WITH CARON
+F6FF;Zcaronsmall;LATIN SMALL CAPITAL LETTER Z WITH CARON
+017B;Zdotaccent;LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0396;Zeta;GREEK CAPITAL LETTER ZETA
+F77A;Zsmall;LATIN SMALL CAPITAL LETTER Z
+0061;a;LATIN SMALL LETTER A
+00E1;aacute;LATIN SMALL LETTER A WITH ACUTE
+0103;abreve;LATIN SMALL LETTER A WITH BREVE
+00E2;acircumflex;LATIN SMALL LETTER A WITH CIRCUMFLEX
+00B4;acute;ACUTE ACCENT
+0301;acutecomb;COMBINING ACUTE ACCENT
+00E4;adieresis;LATIN SMALL LETTER A WITH DIAERESIS
+00E6;ae;LATIN SMALL LETTER AE
+01FD;aeacute;LATIN SMALL LETTER AE WITH ACUTE
+2015;afii00208;HORIZONTAL BAR
+0410;afii10017;CYRILLIC CAPITAL LETTER A
+0411;afii10018;CYRILLIC CAPITAL LETTER BE
+0412;afii10019;CYRILLIC CAPITAL LETTER VE
+0413;afii10020;CYRILLIC CAPITAL LETTER GHE
+0414;afii10021;CYRILLIC CAPITAL LETTER DE
+0415;afii10022;CYRILLIC CAPITAL LETTER IE
+0401;afii10023;CYRILLIC CAPITAL LETTER IO
+0416;afii10024;CYRILLIC CAPITAL LETTER ZHE
+0417;afii10025;CYRILLIC CAPITAL LETTER ZE
+0418;afii10026;CYRILLIC CAPITAL LETTER I
+0419;afii10027;CYRILLIC CAPITAL LETTER SHORT I
+041A;afii10028;CYRILLIC CAPITAL LETTER KA
+041B;afii10029;CYRILLIC CAPITAL LETTER EL
+041C;afii10030;CYRILLIC CAPITAL LETTER EM
+041D;afii10031;CYRILLIC CAPITAL LETTER EN
+041E;afii10032;CYRILLIC CAPITAL LETTER O
+041F;afii10033;CYRILLIC CAPITAL LETTER PE
+0420;afii10034;CYRILLIC CAPITAL LETTER ER
+0421;afii10035;CYRILLIC CAPITAL LETTER ES
+0422;afii10036;CYRILLIC CAPITAL LETTER TE
+0423;afii10037;CYRILLIC CAPITAL LETTER U
+0424;afii10038;CYRILLIC CAPITAL LETTER EF
+0425;afii10039;CYRILLIC CAPITAL LETTER HA
+0426;afii10040;CYRILLIC CAPITAL LETTER TSE
+0427;afii10041;CYRILLIC CAPITAL LETTER CHE
+0428;afii10042;CYRILLIC CAPITAL LETTER SHA
+0429;afii10043;CYRILLIC CAPITAL LETTER SHCHA
+042A;afii10044;CYRILLIC CAPITAL LETTER HARD SIGN
+042B;afii10045;CYRILLIC CAPITAL LETTER YERU
+042C;afii10046;CYRILLIC CAPITAL LETTER SOFT SIGN
+042D;afii10047;CYRILLIC CAPITAL LETTER E
+042E;afii10048;CYRILLIC CAPITAL LETTER YU
+042F;afii10049;CYRILLIC CAPITAL LETTER YA
+0490;afii10050;CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0402;afii10051;CYRILLIC CAPITAL LETTER DJE
+0403;afii10052;CYRILLIC CAPITAL LETTER GJE
+0404;afii10053;CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0405;afii10054;CYRILLIC CAPITAL LETTER DZE
+0406;afii10055;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0407;afii10056;CYRILLIC CAPITAL LETTER YI
+0408;afii10057;CYRILLIC CAPITAL LETTER JE
+0409;afii10058;CYRILLIC CAPITAL LETTER LJE
+040A;afii10059;CYRILLIC CAPITAL LETTER NJE
+040B;afii10060;CYRILLIC CAPITAL LETTER TSHE
+040C;afii10061;CYRILLIC CAPITAL LETTER KJE
+040E;afii10062;CYRILLIC CAPITAL LETTER SHORT U
+F6C4;afii10063;CYRILLIC SMALL LETTER GHE VARIANT
+F6C5;afii10064;CYRILLIC SMALL LETTER BE VARIANT
+0430;afii10065;CYRILLIC SMALL LETTER A
+0431;afii10066;CYRILLIC SMALL LETTER BE
+0432;afii10067;CYRILLIC SMALL LETTER VE
+0433;afii10068;CYRILLIC SMALL LETTER GHE
+0434;afii10069;CYRILLIC SMALL LETTER DE
+0435;afii10070;CYRILLIC SMALL LETTER IE
+0451;afii10071;CYRILLIC SMALL LETTER IO
+0436;afii10072;CYRILLIC SMALL LETTER ZHE
+0437;afii10073;CYRILLIC SMALL LETTER ZE
+0438;afii10074;CYRILLIC SMALL LETTER I
+0439;afii10075;CYRILLIC SMALL LETTER SHORT I
+043A;afii10076;CYRILLIC SMALL LETTER KA
+043B;afii10077;CYRILLIC SMALL LETTER EL
+043C;afii10078;CYRILLIC SMALL LETTER EM
+043D;afii10079;CYRILLIC SMALL LETTER EN
+043E;afii10080;CYRILLIC SMALL LETTER O
+043F;afii10081;CYRILLIC SMALL LETTER PE
+0440;afii10082;CYRILLIC SMALL LETTER ER
+0441;afii10083;CYRILLIC SMALL LETTER ES
+0442;afii10084;CYRILLIC SMALL LETTER TE
+0443;afii10085;CYRILLIC SMALL LETTER U
+0444;afii10086;CYRILLIC SMALL LETTER EF
+0445;afii10087;CYRILLIC SMALL LETTER HA
+0446;afii10088;CYRILLIC SMALL LETTER TSE
+0447;afii10089;CYRILLIC SMALL LETTER CHE
+0448;afii10090;CYRILLIC SMALL LETTER SHA
+0449;afii10091;CYRILLIC SMALL LETTER SHCHA
+044A;afii10092;CYRILLIC SMALL LETTER HARD SIGN
+044B;afii10093;CYRILLIC SMALL LETTER YERU
+044C;afii10094;CYRILLIC SMALL LETTER SOFT SIGN
+044D;afii10095;CYRILLIC SMALL LETTER E
+044E;afii10096;CYRILLIC SMALL LETTER YU
+044F;afii10097;CYRILLIC SMALL LETTER YA
+0491;afii10098;CYRILLIC SMALL LETTER GHE WITH UPTURN
+0452;afii10099;CYRILLIC SMALL LETTER DJE
+0453;afii10100;CYRILLIC SMALL LETTER GJE
+0454;afii10101;CYRILLIC SMALL LETTER UKRAINIAN IE
+0455;afii10102;CYRILLIC SMALL LETTER DZE
+0456;afii10103;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0457;afii10104;CYRILLIC SMALL LETTER YI
+0458;afii10105;CYRILLIC SMALL LETTER JE
+0459;afii10106;CYRILLIC SMALL LETTER LJE
+045A;afii10107;CYRILLIC SMALL LETTER NJE
+045B;afii10108;CYRILLIC SMALL LETTER TSHE
+045C;afii10109;CYRILLIC SMALL LETTER KJE
+045E;afii10110;CYRILLIC SMALL LETTER SHORT U
+040F;afii10145;CYRILLIC CAPITAL LETTER DZHE
+0462;afii10146;CYRILLIC CAPITAL LETTER YAT
+0472;afii10147;CYRILLIC CAPITAL LETTER FITA
+0474;afii10148;CYRILLIC CAPITAL LETTER IZHITSA
+F6C6;afii10192;CYRILLIC SMALL LETTER DE VARIANT
+045F;afii10193;CYRILLIC SMALL LETTER DZHE
+0463;afii10194;CYRILLIC SMALL LETTER YAT
+0473;afii10195;CYRILLIC SMALL LETTER FITA
+0475;afii10196;CYRILLIC SMALL LETTER IZHITSA
+F6C7;afii10831;CYRILLIC SMALL LETTER PE VARIANT
+F6C8;afii10832;CYRILLIC SMALL LETTER TE VARIANT
+04D9;afii10846;CYRILLIC SMALL LETTER SCHWA
+200E;afii299;LEFT-TO-RIGHT MARK
+200F;afii300;RIGHT-TO-LEFT MARK
+200D;afii301;ZERO WIDTH JOINER
+066A;afii57381;ARABIC PERCENT SIGN
+060C;afii57388;ARABIC COMMA
+0660;afii57392;ARABIC-INDIC DIGIT ZERO
+0661;afii57393;ARABIC-INDIC DIGIT ONE
+0662;afii57394;ARABIC-INDIC DIGIT TWO
+0663;afii57395;ARABIC-INDIC DIGIT THREE
+0664;afii57396;ARABIC-INDIC DIGIT FOUR
+0665;afii57397;ARABIC-INDIC DIGIT FIVE
+0666;afii57398;ARABIC-INDIC DIGIT SIX
+0667;afii57399;ARABIC-INDIC DIGIT SEVEN
+0668;afii57400;ARABIC-INDIC DIGIT EIGHT
+0669;afii57401;ARABIC-INDIC DIGIT NINE
+061B;afii57403;ARABIC SEMICOLON
+061F;afii57407;ARABIC QUESTION MARK
+0621;afii57409;ARABIC LETTER HAMZA
+0622;afii57410;ARABIC LETTER ALEF WITH MADDA ABOVE
+0623;afii57411;ARABIC LETTER ALEF WITH HAMZA ABOVE
+0624;afii57412;ARABIC LETTER WAW WITH HAMZA ABOVE
+0625;afii57413;ARABIC LETTER ALEF WITH HAMZA BELOW
+0626;afii57414;ARABIC LETTER YEH WITH HAMZA ABOVE
+0627;afii57415;ARABIC LETTER ALEF
+0628;afii57416;ARABIC LETTER BEH
+0629;afii57417;ARABIC LETTER TEH MARBUTA
+062A;afii57418;ARABIC LETTER TEH
+062B;afii57419;ARABIC LETTER THEH
+062C;afii57420;ARABIC LETTER JEEM
+062D;afii57421;ARABIC LETTER HAH
+062E;afii57422;ARABIC LETTER KHAH
+062F;afii57423;ARABIC LETTER DAL
+0630;afii57424;ARABIC LETTER THAL
+0631;afii57425;ARABIC LETTER REH
+0632;afii57426;ARABIC LETTER ZAIN
+0633;afii57427;ARABIC LETTER SEEN
+0634;afii57428;ARABIC LETTER SHEEN
+0635;afii57429;ARABIC LETTER SAD
+0636;afii57430;ARABIC LETTER DAD
+0637;afii57431;ARABIC LETTER TAH
+0638;afii57432;ARABIC LETTER ZAH
+0639;afii57433;ARABIC LETTER AIN
+063A;afii57434;ARABIC LETTER GHAIN
+0640;afii57440;ARABIC TATWEEL
+0641;afii57441;ARABIC LETTER FEH
+0642;afii57442;ARABIC LETTER QAF
+0643;afii57443;ARABIC LETTER KAF
+0644;afii57444;ARABIC LETTER LAM
+0645;afii57445;ARABIC LETTER MEEM
+0646;afii57446;ARABIC LETTER NOON
+0648;afii57448;ARABIC LETTER WAW
+0649;afii57449;ARABIC LETTER ALEF MAKSURA
+064A;afii57450;ARABIC LETTER YEH
+064B;afii57451;ARABIC FATHATAN
+064C;afii57452;ARABIC DAMMATAN
+064D;afii57453;ARABIC KASRATAN
+064E;afii57454;ARABIC FATHA
+064F;afii57455;ARABIC DAMMA
+0650;afii57456;ARABIC KASRA
+0651;afii57457;ARABIC SHADDA
+0652;afii57458;ARABIC SUKUN
+0647;afii57470;ARABIC LETTER HEH
+06A4;afii57505;ARABIC LETTER VEH
+067E;afii57506;ARABIC LETTER PEH
+0686;afii57507;ARABIC LETTER TCHEH
+0698;afii57508;ARABIC LETTER JEH
+06AF;afii57509;ARABIC LETTER GAF
+0679;afii57511;ARABIC LETTER TTEH
+0688;afii57512;ARABIC LETTER DDAL
+0691;afii57513;ARABIC LETTER RREH
+06BA;afii57514;ARABIC LETTER NOON GHUNNA
+06D2;afii57519;ARABIC LETTER YEH BARREE
+06D5;afii57534;ARABIC LETTER AE
+20AA;afii57636;NEW SHEQEL SIGN
+05BE;afii57645;HEBREW PUNCTUATION MAQAF
+05C3;afii57658;HEBREW PUNCTUATION SOF PASUQ
+05D0;afii57664;HEBREW LETTER ALEF
+05D1;afii57665;HEBREW LETTER BET
+05D2;afii57666;HEBREW LETTER GIMEL
+05D3;afii57667;HEBREW LETTER DALET
+05D4;afii57668;HEBREW LETTER HE
+05D5;afii57669;HEBREW LETTER VAV
+05D6;afii57670;HEBREW LETTER ZAYIN
+05D7;afii57671;HEBREW LETTER HET
+05D8;afii57672;HEBREW LETTER TET
+05D9;afii57673;HEBREW LETTER YOD
+05DA;afii57674;HEBREW LETTER FINAL KAF
+05DB;afii57675;HEBREW LETTER KAF
+05DC;afii57676;HEBREW LETTER LAMED
+05DD;afii57677;HEBREW LETTER FINAL MEM
+05DE;afii57678;HEBREW LETTER MEM
+05DF;afii57679;HEBREW LETTER FINAL NUN
+05E0;afii57680;HEBREW LETTER NUN
+05E1;afii57681;HEBREW LETTER SAMEKH
+05E2;afii57682;HEBREW LETTER AYIN
+05E3;afii57683;HEBREW LETTER FINAL PE
+05E4;afii57684;HEBREW LETTER PE
+05E5;afii57685;HEBREW LETTER FINAL TSADI
+05E6;afii57686;HEBREW LETTER TSADI
+05E7;afii57687;HEBREW LETTER QOF
+05E8;afii57688;HEBREW LETTER RESH
+05E9;afii57689;HEBREW LETTER SHIN
+05EA;afii57690;HEBREW LETTER TAV
+FB2A;afii57694;HEBREW LETTER SHIN WITH SHIN DOT
+FB2B;afii57695;HEBREW LETTER SHIN WITH SIN DOT
+FB4B;afii57700;HEBREW LETTER VAV WITH HOLAM
+FB1F;afii57705;HEBREW LIGATURE YIDDISH YOD YOD PATAH
+05F0;afii57716;HEBREW LIGATURE YIDDISH DOUBLE VAV
+05F1;afii57717;HEBREW LIGATURE YIDDISH VAV YOD
+05F2;afii57718;HEBREW LIGATURE YIDDISH DOUBLE YOD
+FB35;afii57723;HEBREW LETTER VAV WITH DAGESH
+05B4;afii57793;HEBREW POINT HIRIQ
+05B5;afii57794;HEBREW POINT TSERE
+05B6;afii57795;HEBREW POINT SEGOL
+05BB;afii57796;HEBREW POINT QUBUTS
+05B8;afii57797;HEBREW POINT QAMATS
+05B7;afii57798;HEBREW POINT PATAH
+05B0;afii57799;HEBREW POINT SHEVA
+05B2;afii57800;HEBREW POINT HATAF PATAH
+05B1;afii57801;HEBREW POINT HATAF SEGOL
+05B3;afii57802;HEBREW POINT HATAF QAMATS
+05C2;afii57803;HEBREW POINT SIN DOT
+05C1;afii57804;HEBREW POINT SHIN DOT
+05B9;afii57806;HEBREW POINT HOLAM
+05BC;afii57807;HEBREW POINT DAGESH OR MAPIQ
+05BD;afii57839;HEBREW POINT METEG
+05BF;afii57841;HEBREW POINT RAFE
+05C0;afii57842;HEBREW PUNCTUATION PASEQ
+02BC;afii57929;MODIFIER LETTER APOSTROPHE
+2105;afii61248;CARE OF
+2113;afii61289;SCRIPT SMALL L
+2116;afii61352;NUMERO SIGN
+202C;afii61573;POP DIRECTIONAL FORMATTING
+202D;afii61574;LEFT-TO-RIGHT OVERRIDE
+202E;afii61575;RIGHT-TO-LEFT OVERRIDE
+200C;afii61664;ZERO WIDTH NON-JOINER
+066D;afii63167;ARABIC FIVE POINTED STAR
+02BD;afii64937;MODIFIER LETTER REVERSED COMMA
+00E0;agrave;LATIN SMALL LETTER A WITH GRAVE
+2135;aleph;ALEF SYMBOL
+03B1;alpha;GREEK SMALL LETTER ALPHA
+03AC;alphatonos;GREEK SMALL LETTER ALPHA WITH TONOS
+0101;amacron;LATIN SMALL LETTER A WITH MACRON
+0026;ampersand;AMPERSAND
+F726;ampersandsmall;SMALL CAPITAL AMPERSAND
+2220;angle;ANGLE
+2329;angleleft;LEFT-POINTING ANGLE BRACKET
+232A;angleright;RIGHT-POINTING ANGLE BRACKET
+0387;anoteleia;GREEK ANO TELEIA
+0105;aogonek;LATIN SMALL LETTER A WITH OGONEK
+2248;approxequal;ALMOST EQUAL TO
+00E5;aring;LATIN SMALL LETTER A WITH RING ABOVE
+01FB;aringacute;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+2194;arrowboth;LEFT RIGHT ARROW
+21D4;arrowdblboth;LEFT RIGHT DOUBLE ARROW
+21D3;arrowdbldown;DOWNWARDS DOUBLE ARROW
+21D0;arrowdblleft;LEFTWARDS DOUBLE ARROW
+21D2;arrowdblright;RIGHTWARDS DOUBLE ARROW
+21D1;arrowdblup;UPWARDS DOUBLE ARROW
+2193;arrowdown;DOWNWARDS ARROW
+F8E7;arrowhorizex;HORIZONTAL ARROW EXTENDER
+2190;arrowleft;LEFTWARDS ARROW
+2192;arrowright;RIGHTWARDS ARROW
+2191;arrowup;UPWARDS ARROW
+2195;arrowupdn;UP DOWN ARROW
+21A8;arrowupdnbse;UP DOWN ARROW WITH BASE
+F8E6;arrowvertex;VERTICAL ARROW EXTENDER
+005E;asciicircum;CIRCUMFLEX ACCENT
+007E;asciitilde;TILDE
+002A;asterisk;ASTERISK
+2217;asteriskmath;ASTERISK OPERATOR
+F6E9;asuperior;SUPERSCRIPT LATIN SMALL LETTER A
+0040;at;COMMERCIAL AT
+00E3;atilde;LATIN SMALL LETTER A WITH TILDE
+0062;b;LATIN SMALL LETTER B
+005C;backslash;REVERSE SOLIDUS
+007C;bar;VERTICAL LINE
+03B2;beta;GREEK SMALL LETTER BETA
+2588;block;FULL BLOCK
+F8F4;braceex;CURLY BRACKET EXTENDER
+007B;braceleft;LEFT CURLY BRACKET
+F8F3;braceleftbt;LEFT CURLY BRACKET BOTTOM
+F8F2;braceleftmid;LEFT CURLY BRACKET MID
+F8F1;bracelefttp;LEFT CURLY BRACKET TOP
+007D;braceright;RIGHT CURLY BRACKET
+F8FE;bracerightbt;RIGHT CURLY BRACKET BOTTOM
+F8FD;bracerightmid;RIGHT CURLY BRACKET MID
+F8FC;bracerighttp;RIGHT CURLY BRACKET TOP
+005B;bracketleft;LEFT SQUARE BRACKET
+F8F0;bracketleftbt;LEFT SQUARE BRACKET BOTTOM
+F8EF;bracketleftex;LEFT SQUARE BRACKET EXTENDER
+F8EE;bracketlefttp;LEFT SQUARE BRACKET TOP
+005D;bracketright;RIGHT SQUARE BRACKET
+F8FB;bracketrightbt;RIGHT SQUARE BRACKET BOTTOM
+F8FA;bracketrightex;RIGHT SQUARE BRACKET EXTENDER
+F8F9;bracketrighttp;RIGHT SQUARE BRACKET TOP
+02D8;breve;BREVE
+00A6;brokenbar;BROKEN BAR
+F6EA;bsuperior;SUPERSCRIPT LATIN SMALL LETTER B
+2022;bullet;BULLET
+0063;c;LATIN SMALL LETTER C
+0107;cacute;LATIN SMALL LETTER C WITH ACUTE
+02C7;caron;CARON
+21B5;carriagereturn;DOWNWARDS ARROW WITH CORNER LEFTWARDS
+010D;ccaron;LATIN SMALL LETTER C WITH CARON
+00E7;ccedilla;LATIN SMALL LETTER C WITH CEDILLA
+0109;ccircumflex;LATIN SMALL LETTER C WITH CIRCUMFLEX
+010B;cdotaccent;LATIN SMALL LETTER C WITH DOT ABOVE
+00B8;cedilla;CEDILLA
+00A2;cent;CENT SIGN
+F6DF;centinferior;SUBSCRIPT CENT SIGN
+F7A2;centoldstyle;OLDSTYLE CENT SIGN
+F6E0;centsuperior;SUPERSCRIPT CENT SIGN
+03C7;chi;GREEK SMALL LETTER CHI
+25CB;circle;WHITE CIRCLE
+2297;circlemultiply;CIRCLED TIMES
+2295;circleplus;CIRCLED PLUS
+02C6;circumflex;MODIFIER LETTER CIRCUMFLEX ACCENT
+2663;club;BLACK CLUB SUIT
+003A;colon;COLON
+20A1;colonmonetary;COLON SIGN
+002C;comma;COMMA
+F6C3;commaaccent;COMMA BELOW
+F6E1;commainferior;SUBSCRIPT COMMA
+F6E2;commasuperior;SUPERSCRIPT COMMA
+2245;congruent;APPROXIMATELY EQUAL TO
+00A9;copyright;COPYRIGHT SIGN
+F8E9;copyrightsans;COPYRIGHT SIGN SANS SERIF
+F6D9;copyrightserif;COPYRIGHT SIGN SERIF
+00A4;currency;CURRENCY SIGN
+F6D1;cyrBreve;CAPITAL CYRILLIC BREVE
+F6D2;cyrFlex;CAPITAL CYRILLIC CIRCUMFLEX
+F6D4;cyrbreve;CYRILLIC BREVE
+F6D5;cyrflex;CYRILLIC CIRCUMFLEX
+0064;d;LATIN SMALL LETTER D
+2020;dagger;DAGGER
+2021;daggerdbl;DOUBLE DAGGER
+F6D3;dblGrave;CAPITAL DOUBLE GRAVE ACCENT
+F6D6;dblgrave;DOUBLE GRAVE ACCENT
+010F;dcaron;LATIN SMALL LETTER D WITH CARON
+0111;dcroat;LATIN SMALL LETTER D WITH STROKE
+00B0;degree;DEGREE SIGN
+03B4;delta;GREEK SMALL LETTER DELTA
+2666;diamond;BLACK DIAMOND SUIT
+00A8;dieresis;DIAERESIS
+F6D7;dieresisacute;DIAERESIS ACUTE ACCENT
+F6D8;dieresisgrave;DIAERESIS GRAVE ACCENT
+0385;dieresistonos;GREEK DIALYTIKA TONOS
+00F7;divide;DIVISION SIGN
+2593;dkshade;DARK SHADE
+2584;dnblock;LOWER HALF BLOCK
+0024;dollar;DOLLAR SIGN
+F6E3;dollarinferior;SUBSCRIPT DOLLAR SIGN
+F724;dollaroldstyle;OLDSTYLE DOLLAR SIGN
+F6E4;dollarsuperior;SUPERSCRIPT DOLLAR SIGN
+20AB;dong;DONG SIGN
+02D9;dotaccent;DOT ABOVE
+0323;dotbelowcomb;COMBINING DOT BELOW
+0131;dotlessi;LATIN SMALL LETTER DOTLESS I
+F6BE;dotlessj;LATIN SMALL LETTER DOTLESS J
+22C5;dotmath;DOT OPERATOR
+F6EB;dsuperior;SUPERSCRIPT LATIN SMALL LETTER D
+0065;e;LATIN SMALL LETTER E
+00E9;eacute;LATIN SMALL LETTER E WITH ACUTE
+0115;ebreve;LATIN SMALL LETTER E WITH BREVE
+011B;ecaron;LATIN SMALL LETTER E WITH CARON
+00EA;ecircumflex;LATIN SMALL LETTER E WITH CIRCUMFLEX
+00EB;edieresis;LATIN SMALL LETTER E WITH DIAERESIS
+0117;edotaccent;LATIN SMALL LETTER E WITH DOT ABOVE
+00E8;egrave;LATIN SMALL LETTER E WITH GRAVE
+0038;eight;DIGIT EIGHT
+2088;eightinferior;SUBSCRIPT EIGHT
+F738;eightoldstyle;OLDSTYLE DIGIT EIGHT
+2078;eightsuperior;SUPERSCRIPT EIGHT
+2208;element;ELEMENT OF
+2026;ellipsis;HORIZONTAL ELLIPSIS
+0113;emacron;LATIN SMALL LETTER E WITH MACRON
+2014;emdash;EM DASH
+2205;emptyset;EMPTY SET
+2013;endash;EN DASH
+014B;eng;LATIN SMALL LETTER ENG
+0119;eogonek;LATIN SMALL LETTER E WITH OGONEK
+03B5;epsilon;GREEK SMALL LETTER EPSILON
+03AD;epsilontonos;GREEK SMALL LETTER EPSILON WITH TONOS
+003D;equal;EQUALS SIGN
+2261;equivalence;IDENTICAL TO
+212E;estimated;ESTIMATED SYMBOL
+F6EC;esuperior;SUPERSCRIPT LATIN SMALL LETTER E
+03B7;eta;GREEK SMALL LETTER ETA
+03AE;etatonos;GREEK SMALL LETTER ETA WITH TONOS
+00F0;eth;LATIN SMALL LETTER ETH
+0021;exclam;EXCLAMATION MARK
+203C;exclamdbl;DOUBLE EXCLAMATION MARK
+00A1;exclamdown;INVERTED EXCLAMATION MARK
+F7A1;exclamdownsmall;SMALL CAPITAL INVERTED EXCLAMATION MARK
+F721;exclamsmall;SMALL CAPITAL EXCLAMATION MARK
+2203;existential;THERE EXISTS
+0066;f;LATIN SMALL LETTER F
+2640;female;FEMALE SIGN
+FB00;ff;LATIN SMALL LIGATURE FF
+FB03;ffi;LATIN SMALL LIGATURE FFI
+FB04;ffl;LATIN SMALL LIGATURE FFL
+FB01;fi;LATIN SMALL LIGATURE FI
+2012;figuredash;FIGURE DASH
+25A0;filledbox;BLACK SQUARE
+25AC;filledrect;BLACK RECTANGLE
+0035;five;DIGIT FIVE
+215D;fiveeighths;VULGAR FRACTION FIVE EIGHTHS
+2085;fiveinferior;SUBSCRIPT FIVE
+F735;fiveoldstyle;OLDSTYLE DIGIT FIVE
+2075;fivesuperior;SUPERSCRIPT FIVE
+FB02;fl;LATIN SMALL LIGATURE FL
+0192;florin;LATIN SMALL LETTER F WITH HOOK
+0034;four;DIGIT FOUR
+2084;fourinferior;SUBSCRIPT FOUR
+F734;fouroldstyle;OLDSTYLE DIGIT FOUR
+2074;foursuperior;SUPERSCRIPT FOUR
+2044;fraction;FRACTION SLASH
+2215;fraction;DIVISION SLASH;Duplicate
+20A3;franc;FRENCH FRANC SIGN
+0067;g;LATIN SMALL LETTER G
+03B3;gamma;GREEK SMALL LETTER GAMMA
+011F;gbreve;LATIN SMALL LETTER G WITH BREVE
+01E7;gcaron;LATIN SMALL LETTER G WITH CARON
+011D;gcircumflex;LATIN SMALL LETTER G WITH CIRCUMFLEX
+0123;gcommaaccent;LATIN SMALL LETTER G WITH CEDILLA
+0121;gdotaccent;LATIN SMALL LETTER G WITH DOT ABOVE
+00DF;germandbls;LATIN SMALL LETTER SHARP S
+2207;gradient;NABLA
+0060;grave;GRAVE ACCENT
+0300;gravecomb;COMBINING GRAVE ACCENT
+003E;greater;GREATER-THAN SIGN
+2265;greaterequal;GREATER-THAN OR EQUAL TO
+00AB;guillemotleft;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BB;guillemotright;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+2039;guilsinglleft;SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A;guilsinglright;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0068;h;LATIN SMALL LETTER H
+0127;hbar;LATIN SMALL LETTER H WITH STROKE
+0125;hcircumflex;LATIN SMALL LETTER H WITH CIRCUMFLEX
+2665;heart;BLACK HEART SUIT
+0309;hookabovecomb;COMBINING HOOK ABOVE
+2302;house;HOUSE
+02DD;hungarumlaut;DOUBLE ACUTE ACCENT
+002D;hyphen;HYPHEN-MINUS
+00AD;hyphen;SOFT HYPHEN;Duplicate
+F6E5;hypheninferior;SUBSCRIPT HYPHEN-MINUS
+F6E6;hyphensuperior;SUPERSCRIPT HYPHEN-MINUS
+0069;i;LATIN SMALL LETTER I
+00ED;iacute;LATIN SMALL LETTER I WITH ACUTE
+012D;ibreve;LATIN SMALL LETTER I WITH BREVE
+00EE;icircumflex;LATIN SMALL LETTER I WITH CIRCUMFLEX
+00EF;idieresis;LATIN SMALL LETTER I WITH DIAERESIS
+00EC;igrave;LATIN SMALL LETTER I WITH GRAVE
+0133;ij;LATIN SMALL LIGATURE IJ
+012B;imacron;LATIN SMALL LETTER I WITH MACRON
+221E;infinity;INFINITY
+222B;integral;INTEGRAL
+2321;integralbt;BOTTOM HALF INTEGRAL
+F8F5;integralex;INTEGRAL EXTENDER
+2320;integraltp;TOP HALF INTEGRAL
+2229;intersection;INTERSECTION
+25D8;invbullet;INVERSE BULLET
+25D9;invcircle;INVERSE WHITE CIRCLE
+263B;invsmileface;BLACK SMILING FACE
+012F;iogonek;LATIN SMALL LETTER I WITH OGONEK
+03B9;iota;GREEK SMALL LETTER IOTA
+03CA;iotadieresis;GREEK SMALL LETTER IOTA WITH DIALYTIKA
+0390;iotadieresistonos;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+03AF;iotatonos;GREEK SMALL LETTER IOTA WITH TONOS
+F6ED;isuperior;SUPERSCRIPT LATIN SMALL LETTER I
+0129;itilde;LATIN SMALL LETTER I WITH TILDE
+006A;j;LATIN SMALL LETTER J
+0135;jcircumflex;LATIN SMALL LETTER J WITH CIRCUMFLEX
+006B;k;LATIN SMALL LETTER K
+03BA;kappa;GREEK SMALL LETTER KAPPA
+0137;kcommaaccent;LATIN SMALL LETTER K WITH CEDILLA
+0138;kgreenlandic;LATIN SMALL LETTER KRA
+006C;l;LATIN SMALL LETTER L
+013A;lacute;LATIN SMALL LETTER L WITH ACUTE
+03BB;lambda;GREEK SMALL LETTER LAMDA
+013E;lcaron;LATIN SMALL LETTER L WITH CARON
+013C;lcommaaccent;LATIN SMALL LETTER L WITH CEDILLA
+0140;ldot;LATIN SMALL LETTER L WITH MIDDLE DOT
+003C;less;LESS-THAN SIGN
+2264;lessequal;LESS-THAN OR EQUAL TO
+258C;lfblock;LEFT HALF BLOCK
+20A4;lira;LIRA SIGN
+F6C0;ll;LATIN SMALL LETTER LL
+2227;logicaland;LOGICAL AND
+00AC;logicalnot;NOT SIGN
+2228;logicalor;LOGICAL OR
+017F;longs;LATIN SMALL LETTER LONG S
+25CA;lozenge;LOZENGE
+0142;lslash;LATIN SMALL LETTER L WITH STROKE
+F6EE;lsuperior;SUPERSCRIPT LATIN SMALL LETTER L
+2591;ltshade;LIGHT SHADE
+006D;m;LATIN SMALL LETTER M
+00AF;macron;MACRON
+02C9;macron;MODIFIER LETTER MACRON;Duplicate
+2642;male;MALE SIGN
+2212;minus;MINUS SIGN
+2032;minute;PRIME
+F6EF;msuperior;SUPERSCRIPT LATIN SMALL LETTER M
+00B5;mu;MICRO SIGN
+03BC;mu;GREEK SMALL LETTER MU;Duplicate
+00D7;multiply;MULTIPLICATION SIGN
+266A;musicalnote;EIGHTH NOTE
+266B;musicalnotedbl;BEAMED EIGHTH NOTES
+006E;n;LATIN SMALL LETTER N
+0144;nacute;LATIN SMALL LETTER N WITH ACUTE
+0149;napostrophe;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+0148;ncaron;LATIN SMALL LETTER N WITH CARON
+0146;ncommaaccent;LATIN SMALL LETTER N WITH CEDILLA
+0039;nine;DIGIT NINE
+2089;nineinferior;SUBSCRIPT NINE
+F739;nineoldstyle;OLDSTYLE DIGIT NINE
+2079;ninesuperior;SUPERSCRIPT NINE
+2209;notelement;NOT AN ELEMENT OF
+2260;notequal;NOT EQUAL TO
+2284;notsubset;NOT A SUBSET OF
+207F;nsuperior;SUPERSCRIPT LATIN SMALL LETTER N
+00F1;ntilde;LATIN SMALL LETTER N WITH TILDE
+03BD;nu;GREEK SMALL LETTER NU
+0023;numbersign;NUMBER SIGN
+006F;o;LATIN SMALL LETTER O
+00F3;oacute;LATIN SMALL LETTER O WITH ACUTE
+014F;obreve;LATIN SMALL LETTER O WITH BREVE
+00F4;ocircumflex;LATIN SMALL LETTER O WITH CIRCUMFLEX
+00F6;odieresis;LATIN SMALL LETTER O WITH DIAERESIS
+0153;oe;LATIN SMALL LIGATURE OE
+02DB;ogonek;OGONEK
+00F2;ograve;LATIN SMALL LETTER O WITH GRAVE
+01A1;ohorn;LATIN SMALL LETTER O WITH HORN
+0151;ohungarumlaut;LATIN SMALL LETTER O WITH DOUBLE ACUTE
+014D;omacron;LATIN SMALL LETTER O WITH MACRON
+03C9;omega;GREEK SMALL LETTER OMEGA
+03D6;omega1;GREEK PI SYMBOL
+03CE;omegatonos;GREEK SMALL LETTER OMEGA WITH TONOS
+03BF;omicron;GREEK SMALL LETTER OMICRON
+03CC;omicrontonos;GREEK SMALL LETTER OMICRON WITH TONOS
+0031;one;DIGIT ONE
+2024;onedotenleader;ONE DOT LEADER
+215B;oneeighth;VULGAR FRACTION ONE EIGHTH
+F6DC;onefitted;PROPORTIONAL DIGIT ONE
+00BD;onehalf;VULGAR FRACTION ONE HALF
+2081;oneinferior;SUBSCRIPT ONE
+F731;oneoldstyle;OLDSTYLE DIGIT ONE
+00BC;onequarter;VULGAR FRACTION ONE QUARTER
+00B9;onesuperior;SUPERSCRIPT ONE
+2153;onethird;VULGAR FRACTION ONE THIRD
+25E6;openbullet;WHITE BULLET
+00AA;ordfeminine;FEMININE ORDINAL INDICATOR
+00BA;ordmasculine;MASCULINE ORDINAL INDICATOR
+221F;orthogonal;RIGHT ANGLE
+00F8;oslash;LATIN SMALL LETTER O WITH STROKE
+01FF;oslashacute;LATIN SMALL LETTER O WITH STROKE AND ACUTE
+F6F0;osuperior;SUPERSCRIPT LATIN SMALL LETTER O
+00F5;otilde;LATIN SMALL LETTER O WITH TILDE
+0070;p;LATIN SMALL LETTER P
+00B6;paragraph;PILCROW SIGN
+0028;parenleft;LEFT PARENTHESIS
+F8ED;parenleftbt;LEFT PAREN BOTTOM
+F8EC;parenleftex;LEFT PAREN EXTENDER
+208D;parenleftinferior;SUBSCRIPT LEFT PARENTHESIS
+207D;parenleftsuperior;SUPERSCRIPT LEFT PARENTHESIS
+F8EB;parenlefttp;LEFT PAREN TOP
+0029;parenright;RIGHT PARENTHESIS
+F8F8;parenrightbt;RIGHT PAREN BOTTOM
+F8F7;parenrightex;RIGHT PAREN EXTENDER
+208E;parenrightinferior;SUBSCRIPT RIGHT PARENTHESIS
+207E;parenrightsuperior;SUPERSCRIPT RIGHT PARENTHESIS
+F8F6;parenrighttp;RIGHT PAREN TOP
+2202;partialdiff;PARTIAL DIFFERENTIAL
+0025;percent;PERCENT SIGN
+002E;period;FULL STOP
+00B7;periodcentered;MIDDLE DOT
+2219;periodcentered;BULLET OPERATOR;Duplicate
+F6E7;periodinferior;SUBSCRIPT FULL STOP
+F6E8;periodsuperior;SUPERSCRIPT FULL STOP
+22A5;perpendicular;UP TACK
+2030;perthousand;PER MILLE SIGN
+20A7;peseta;PESETA SIGN
+03C6;phi;GREEK SMALL LETTER PHI
+03D5;phi1;GREEK PHI SYMBOL
+03C0;pi;GREEK SMALL LETTER PI
+002B;plus;PLUS SIGN
+00B1;plusminus;PLUS-MINUS SIGN
+211E;prescription;PRESCRIPTION TAKE
+220F;product;N-ARY PRODUCT
+2282;propersubset;SUBSET OF
+2283;propersuperset;SUPERSET OF
+221D;proportional;PROPORTIONAL TO
+03C8;psi;GREEK SMALL LETTER PSI
+0071;q;LATIN SMALL LETTER Q
+003F;question;QUESTION MARK
+00BF;questiondown;INVERTED QUESTION MARK
+F7BF;questiondownsmall;SMALL CAPITAL INVERTED QUESTION MARK
+F73F;questionsmall;SMALL CAPITAL QUESTION MARK
+0022;quotedbl;QUOTATION MARK
+201E;quotedblbase;DOUBLE LOW-9 QUOTATION MARK
+201C;quotedblleft;LEFT DOUBLE QUOTATION MARK
+201D;quotedblright;RIGHT DOUBLE QUOTATION MARK
+2018;quoteleft;LEFT SINGLE QUOTATION MARK
+201B;quotereversed;SINGLE HIGH-REVERSED-9 QUOTATION MARK
+2019;quoteright;RIGHT SINGLE QUOTATION MARK
+201A;quotesinglbase;SINGLE LOW-9 QUOTATION MARK
+0027;quotesingle;APOSTROPHE
+0072;r;LATIN SMALL LETTER R
+0155;racute;LATIN SMALL LETTER R WITH ACUTE
+221A;radical;SQUARE ROOT
+F8E5;radicalex;RADICAL EXTENDER
+0159;rcaron;LATIN SMALL LETTER R WITH CARON
+0157;rcommaaccent;LATIN SMALL LETTER R WITH CEDILLA
+2286;reflexsubset;SUBSET OF OR EQUAL TO
+2287;reflexsuperset;SUPERSET OF OR EQUAL TO
+00AE;registered;REGISTERED SIGN
+F8E8;registersans;REGISTERED SIGN SANS SERIF
+F6DA;registerserif;REGISTERED SIGN SERIF
+2310;revlogicalnot;REVERSED NOT SIGN
+03C1;rho;GREEK SMALL LETTER RHO
+02DA;ring;RING ABOVE
+F6F1;rsuperior;SUPERSCRIPT LATIN SMALL LETTER R
+2590;rtblock;RIGHT HALF BLOCK
+F6DD;rupiah;RUPIAH SIGN
+0073;s;LATIN SMALL LETTER S
+015B;sacute;LATIN SMALL LETTER S WITH ACUTE
+0161;scaron;LATIN SMALL LETTER S WITH CARON
+015F;scedilla;LATIN SMALL LETTER S WITH CEDILLA
+F6C2;scedilla;LATIN SMALL LETTER S WITH CEDILLA;Duplicate
+015D;scircumflex;LATIN SMALL LETTER S WITH CIRCUMFLEX
+0219;scommaaccent;LATIN SMALL LETTER S WITH COMMA BELOW
+2033;second;DOUBLE PRIME
+00A7;section;SECTION SIGN
+003B;semicolon;SEMICOLON
+0037;seven;DIGIT SEVEN
+215E;seveneighths;VULGAR FRACTION SEVEN EIGHTHS
+2087;seveninferior;SUBSCRIPT SEVEN
+F737;sevenoldstyle;OLDSTYLE DIGIT SEVEN
+2077;sevensuperior;SUPERSCRIPT SEVEN
+2592;shade;MEDIUM SHADE
+03C3;sigma;GREEK SMALL LETTER SIGMA
+03C2;sigma1;GREEK SMALL LETTER FINAL SIGMA
+223C;similar;TILDE OPERATOR
+0036;six;DIGIT SIX
+2086;sixinferior;SUBSCRIPT SIX
+F736;sixoldstyle;OLDSTYLE DIGIT SIX
+2076;sixsuperior;SUPERSCRIPT SIX
+002F;slash;SOLIDUS
+263A;smileface;WHITE SMILING FACE
+0020;space;SPACE
+00A0;space;NO-BREAK SPACE;Duplicate
+2660;spade;BLACK SPADE SUIT
+F6F2;ssuperior;SUPERSCRIPT LATIN SMALL LETTER S
+00A3;sterling;POUND SIGN
+220B;suchthat;CONTAINS AS MEMBER
+2211;summation;N-ARY SUMMATION
+263C;sun;WHITE SUN WITH RAYS
+0074;t;LATIN SMALL LETTER T
+03C4;tau;GREEK SMALL LETTER TAU
+0167;tbar;LATIN SMALL LETTER T WITH STROKE
+0165;tcaron;LATIN SMALL LETTER T WITH CARON
+0163;tcommaaccent;LATIN SMALL LETTER T WITH CEDILLA
+021B;tcommaaccent;LATIN SMALL LETTER T WITH COMMA BELOW;Duplicate
+2234;therefore;THEREFORE
+03B8;theta;GREEK SMALL LETTER THETA
+03D1;theta1;GREEK THETA SYMBOL
+00FE;thorn;LATIN SMALL LETTER THORN
+0033;three;DIGIT THREE
+215C;threeeighths;VULGAR FRACTION THREE EIGHTHS
+2083;threeinferior;SUBSCRIPT THREE
+F733;threeoldstyle;OLDSTYLE DIGIT THREE
+00BE;threequarters;VULGAR FRACTION THREE QUARTERS
+F6DE;threequartersemdash;THREE QUARTERS EM DASH
+00B3;threesuperior;SUPERSCRIPT THREE
+02DC;tilde;SMALL TILDE
+0303;tildecomb;COMBINING TILDE
+0384;tonos;GREEK TONOS
+2122;trademark;TRADE MARK SIGN
+F8EA;trademarksans;TRADE MARK SIGN SANS SERIF
+F6DB;trademarkserif;TRADE MARK SIGN SERIF
+25BC;triagdn;BLACK DOWN-POINTING TRIANGLE
+25C4;triaglf;BLACK LEFT-POINTING POINTER
+25BA;triagrt;BLACK RIGHT-POINTING POINTER
+25B2;triagup;BLACK UP-POINTING TRIANGLE
+F6F3;tsuperior;SUPERSCRIPT LATIN SMALL LETTER T
+0032;two;DIGIT TWO
+2025;twodotenleader;TWO DOT LEADER
+2082;twoinferior;SUBSCRIPT TWO
+F732;twooldstyle;OLDSTYLE DIGIT TWO
+00B2;twosuperior;SUPERSCRIPT TWO
+2154;twothirds;VULGAR FRACTION TWO THIRDS
+0075;u;LATIN SMALL LETTER U
+00FA;uacute;LATIN SMALL LETTER U WITH ACUTE
+016D;ubreve;LATIN SMALL LETTER U WITH BREVE
+00FB;ucircumflex;LATIN SMALL LETTER U WITH CIRCUMFLEX
+00FC;udieresis;LATIN SMALL LETTER U WITH DIAERESIS
+00F9;ugrave;LATIN SMALL LETTER U WITH GRAVE
+01B0;uhorn;LATIN SMALL LETTER U WITH HORN
+0171;uhungarumlaut;LATIN SMALL LETTER U WITH DOUBLE ACUTE
+016B;umacron;LATIN SMALL LETTER U WITH MACRON
+005F;underscore;LOW LINE
+2017;underscoredbl;DOUBLE LOW LINE
+222A;union;UNION
+2200;universal;FOR ALL
+0173;uogonek;LATIN SMALL LETTER U WITH OGONEK
+2580;upblock;UPPER HALF BLOCK
+03C5;upsilon;GREEK SMALL LETTER UPSILON
+03CB;upsilondieresis;GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+03B0;upsilondieresistonos;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+03CD;upsilontonos;GREEK SMALL LETTER UPSILON WITH TONOS
+016F;uring;LATIN SMALL LETTER U WITH RING ABOVE
+0169;utilde;LATIN SMALL LETTER U WITH TILDE
+0076;v;LATIN SMALL LETTER V
+0077;w;LATIN SMALL LETTER W
+1E83;wacute;LATIN SMALL LETTER W WITH ACUTE
+0175;wcircumflex;LATIN SMALL LETTER W WITH CIRCUMFLEX
+1E85;wdieresis;LATIN SMALL LETTER W WITH DIAERESIS
+2118;weierstrass;SCRIPT CAPITAL P
+1E81;wgrave;LATIN SMALL LETTER W WITH GRAVE
+0078;x;LATIN SMALL LETTER X
+03BE;xi;GREEK SMALL LETTER XI
+0079;y;LATIN SMALL LETTER Y
+00FD;yacute;LATIN SMALL LETTER Y WITH ACUTE
+0177;ycircumflex;LATIN SMALL LETTER Y WITH CIRCUMFLEX
+00FF;ydieresis;LATIN SMALL LETTER Y WITH DIAERESIS
+00A5;yen;YEN SIGN
+1EF3;ygrave;LATIN SMALL LETTER Y WITH GRAVE
+007A;z;LATIN SMALL LETTER Z
+017A;zacute;LATIN SMALL LETTER Z WITH ACUTE
+017E;zcaron;LATIN SMALL LETTER Z WITH CARON
+017C;zdotaccent;LATIN SMALL LETTER Z WITH DOT ABOVE
+0030;zero;DIGIT ZERO
+2080;zeroinferior;SUBSCRIPT ZERO
+F730;zerooldstyle;OLDSTYLE DIGIT ZERO
+2070;zerosuperior;SUPERSCRIPT ZERO
+03B6;zeta;GREEK SMALL LETTER ZETA
+
+#
+# Name: ITC Zapf Dingbats encoding, Unicode values, and
+# glyph names
+# Table version: 1.0
+# Date: 17 July 1997
+#
+# Version of ITC Zapf Dingbats:
+#
+# ITC Zapf Dingbats (PostScript FontName: ZapfDingbats) contains 202
+# of the 379 glyphs in PCL Zapf Dingbats.
+#
+# Versions of ZapfDingbats previous to 002.000 do not encode 14 out of the
+# 202 available glyphs in their PostScript encoding (though these 14 glyphs
+# can be accessed on the Macintosh due to the FOND's reencoding of the
+# glyphs). ZapfDingbats version 002.000 encodes all of the 202 glyphs in its
+# PostScript encoding.
+#
+# Unicode encoding of ZapfDingbats:
+#
+# The 188 glyphs in the PostScript encoding of versions of ZapfDingbats
+# previous to 002.000 have regular Unicode values (160 in the Dingbats block
+# and 28 in other blocks). The remaining 14 glyphs have been assigned
+# Unicode values in the Corporate Use subarea, and coincide exactly with
+# Apple's MacOS Dingbats assignments in that area.
+#
+# Format: Four tab-separated columns:
+#
+# (1) The PostScript encoding. (2 uppercase hexadecimal digits)
+# 202 code points are defined.
+# Source: Adobe Systems.
+#
+# (2) The Unicode value. (4 uppercase hexadecimal digits)
+# The 14 glyphs at code points 0x80-8D have Corporate Use subarea
+# values.
+# Source: ftp://unicode.org/pub/UNIX/MAPPINGS/VENDORS/APPLE/DINGBAT.TXT
+# [as of 25 February 1997]
+#
+# (3) The glyph name. (upper- and lowercase letters, digits)
+# Source: Adobe Systems.
+#
+# (4) The Unicode 2.0 character name. (uppercase letters, hyphen, space)
+# Source: The Unicode Standard, Version 2.0
+#
+# The 14 Corporate Use subarea glyphs obviously don't have a
+# Unicode 2.0 character name. A descriptive name (in lowercase
+# letters) taken from the source for (2) above is used instead.
+#
+# The entries are in PostScript encoding order.
+#
+# Lines starting with "#" are comments; blank lines are to be ignored.
+#
+
+0020;space;SPACE
+2701;a1;UPPER BLADE SCISSORS
+2702;a2;BLACK SCISSORS
+2703;a202;LOWER BLADE SCISSORS
+2704;a3;WHITE SCISSORS
+260E;a4;BLACK TELEPHONE
+2706;a5;TELEPHONE LOCATION SIGN
+2707;a119;TAPE DRIVE
+2708;a118;AIRPLANE
+2709;a117;ENVELOPE
+261B;a11;BLACK RIGHT POINTING INDEX
+261E;a12;WHITE RIGHT POINTING INDEX
+270C;a13;VICTORY HAND
+270D;a14;WRITING HAND
+270E;a15;LOWER RIGHT PENCIL
+270F;a16;PENCIL
+2710;a105;UPPER RIGHT PENCIL
+2711;a17;WHITE NIB
+2712;a18;BLACK NIB
+2713;a19;CHECK MARK
+2714;a20;HEAVY CHECK MARK
+2715;a21;MULTIPLICATION X
+2716;a22;HEAVY MULTIPLICATION X
+2717;a23;BALLOT X
+2718;a24;HEAVY BALLOT X
+2719;a25;OUTLINED GREEK CROSS
+271A;a26;HEAVY GREEK CROSS
+271B;a27;OPEN CENTRE CROSS
+271C;a28;HEAVY OPEN CENTRE CROSS
+271D;a6;LATIN CROSS
+271E;a7;SHADOWED WHITE LATIN CROSS
+271F;a8;OUTLINED LATIN CROSS
+2720;a9;MALTESE CROSS
+2721;a10;STAR OF DAVID
+2722;a29;FOUR TEARDROP-SPOKED ASTERISK
+2723;a30;FOUR BALLOON-SPOKED ASTERISK
+2724;a31;HEAVY FOUR BALLOON-SPOKED ASTERISK
+2725;a32;FOUR CLUB-SPOKED ASTERISK
+2726;a33;BLACK FOUR POINTED STAR
+2727;a34;WHITE FOUR POINTED STAR
+2605;a35;BLACK STAR
+2729;a36;STRESS OUTLINED WHITE STAR
+272A;a37;CIRCLED WHITE STAR
+272B;a38;OPEN CENTRE BLACK STAR
+272C;a39;BLACK CENTRE WHITE STAR
+272D;a40;OUTLINED BLACK STAR
+272E;a41;HEAVY OUTLINED BLACK STAR
+272F;a42;PINWHEEL STAR
+2730;a43;SHADOWED WHITE STAR
+2731;a44;HEAVY ASTERISK
+2732;a45;OPEN CENTRE ASTERISK
+2733;a46;EIGHT SPOKED ASTERISK
+2734;a47;EIGHT POINTED BLACK STAR
+2735;a48;EIGHT POINTED PINWHEEL STAR
+2736;a49;SIX POINTED BLACK STAR
+2737;a50;EIGHT POINTED RECTILINEAR BLACK STAR
+2738;a51;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+2739;a52;TWELVE POINTED BLACK STAR
+273A;a53;SIXTEEN POINTED ASTERISK
+273B;a54;TEARDROP-SPOKED ASTERISK
+273C;a55;OPEN CENTRE TEARDROP-SPOKED ASTERISK
+273D;a56;HEAVY TEARDROP-SPOKED ASTERISK
+273E;a57;SIX PETALLED BLACK AND WHITE FLORETTE
+273F;a58;BLACK FLORETTE
+2740;a59;WHITE FLORETTE
+2741;a60;EIGHT PETALLED OUTLINED BLACK FLORETTE
+2742;a61;CIRCLED OPEN CENTRE EIGHT POINTED STAR
+2743;a62;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+2744;a63;SNOWFLAKE
+2745;a64;TIGHT TRIFOLIATE SNOWFLAKE
+2746;a65;HEAVY CHEVRON SNOWFLAKE
+2747;a66;SPARKLE
+2748;a67;HEAVY SPARKLE
+2749;a68;BALLOON-SPOKED ASTERISK
+274A;a69;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274B;a70;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+25CF;a71;BLACK CIRCLE
+274D;a72;SHADOWED WHITE CIRCLE
+25A0;a73;BLACK SQUARE
+274F;a74;LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+2750;a203;UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+2751;a75;LOWER RIGHT SHADOWED WHITE SQUARE
+2752;a204;UPPER RIGHT SHADOWED WHITE SQUARE
+25B2;a76;BLACK UP-POINTING TRIANGLE
+25BC;a77;BLACK DOWN-POINTING TRIANGLE
+25C6;a78;BLACK DIAMOND
+2756;a79;BLACK DIAMOND MINUS WHITE X
+25D7;a81;RIGHT HALF BLACK CIRCLE
+2758;a82;LIGHT VERTICAL BAR
+2759;a83;MEDIUM VERTICAL BAR
+275A;a84;HEAVY VERTICAL BAR
+275B;a97;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+275C;a98;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+275D;a99;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+275E;a100;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+F8D7;a89;MEDIUM LEFT PARENTHESIS ORNAMENT
+F8D8;a90;MEDIUM RIGHT PARENTHESIS ORNAMENT
+F8D9;a93;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+F8DA;a94;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+F8DB;a91;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+F8DC;a92;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+F8DD;a205;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+F8DE;a85;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+F8DF;a206;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+F8E0;a86;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+F8E1;a87;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+F8E2;a88;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+F8E3;a95;MEDIUM LEFT CURLY BRACKET ORNAMENT
+F8E4;a96;MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2761;a101;CURVED STEM PARAGRAPH SIGN ORNAMENT
+2762;a102;HEAVY EXCLAMATION MARK ORNAMENT
+2763;a103;HEAVY HEART EXCLAMATION MARK ORNAMENT
+2764;a104;HEAVY BLACK HEART
+2765;a106;ROTATED HEAVY BLACK HEART BULLET
+2766;a107;FLORAL HEART
+2767;a108;ROTATED FLORAL HEART BULLET
+2663;a112;BLACK CLUB SUIT
+2666;a111;BLACK DIAMOND SUIT
+2665;a110;BLACK HEART SUIT
+2660;a109;BLACK SPADE SUIT
+2460;a120;CIRCLED DIGIT ONE
+2461;a121;CIRCLED DIGIT TWO
+2462;a122;CIRCLED DIGIT THREE
+2463;a123;CIRCLED DIGIT FOUR
+2464;a124;CIRCLED DIGIT FIVE
+2465;a125;CIRCLED DIGIT SIX
+2466;a126;CIRCLED DIGIT SEVEN
+2467;a127;CIRCLED DIGIT EIGHT
+2468;a128;CIRCLED DIGIT NINE
+2469;a129;CIRCLED NUMBER TEN
+2776;a130;DINGBAT NEGATIVE CIRCLED DIGIT ONE
+2777;a131;DINGBAT NEGATIVE CIRCLED DIGIT TWO
+2778;a132;DINGBAT NEGATIVE CIRCLED DIGIT THREE
+2779;a133;DINGBAT NEGATIVE CIRCLED DIGIT FOUR
+277A;a134;DINGBAT NEGATIVE CIRCLED DIGIT FIVE
+277B;a135;DINGBAT NEGATIVE CIRCLED DIGIT SIX
+277C;a136;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
+277D;a137;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
+277E;a138;DINGBAT NEGATIVE CIRCLED DIGIT NINE
+277F;a139;DINGBAT NEGATIVE CIRCLED NUMBER TEN
+2780;a140;DINGBAT CIRCLED SANS-SERIF DIGIT ONE
+2781;a141;DINGBAT CIRCLED SANS-SERIF DIGIT TWO
+2782;a142;DINGBAT CIRCLED SANS-SERIF DIGIT THREE
+2783;a143;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR
+2784;a144;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE
+2785;a145;DINGBAT CIRCLED SANS-SERIF DIGIT SIX
+2786;a146;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN
+2787;a147;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT
+2788;a148;DINGBAT CIRCLED SANS-SERIF DIGIT NINE
+2789;a149;DINGBAT CIRCLED SANS-SERIF NUMBER TEN
+278A;a150;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE
+278B;a151;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO
+278C;a152;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE
+278D;a153;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR
+278E;a154;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE
+278F;a155;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX
+2790;a156;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN
+2791;a157;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT
+2792;a158;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE
+2793;a159;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+2794;a160;HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2192;a161;RIGHTWARDS ARROW
+2194;a163;LEFT RIGHT ARROW
+2195;a164;UP DOWN ARROW
+2798;a196;HEAVY SOUTH EAST ARROW
+2799;a165;HEAVY RIGHTWARDS ARROW
+279A;a192;HEAVY NORTH EAST ARROW
+279B;a166;DRAFTING POINT RIGHTWARDS ARROW
+279C;a167;HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+279D;a168;TRIANGLE-HEADED RIGHTWARDS ARROW
+279E;a169;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+279F;a170;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A0;a171;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A1;a172;BLACK RIGHTWARDS ARROW
+27A2;a173;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+27A3;a162;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+27A4;a174;BLACK RIGHTWARDS ARROWHEAD
+27A5;a175;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+27A6;a176;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+27A7;a177;SQUAT BLACK RIGHTWARDS ARROW
+27A8;a178;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+27A9;a179;RIGHT-SHADED WHITE RIGHTWARDS ARROW
+27AA;a193;LEFT-SHADED WHITE RIGHTWARDS ARROW
+27AB;a180;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AC;a199;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AD;a181;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AE;a200;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AF;a182;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1;a201;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B2;a183;CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+27B3;a184;WHITE-FEATHERED RIGHTWARDS ARROW
+27B4;a197;BLACK-FEATHERED SOUTH EAST ARROW
+27B5;a185;BLACK-FEATHERED RIGHTWARDS ARROW
+27B6;a194;BLACK-FEATHERED NORTH EAST ARROW
+27B7;a198;HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+27B8;a186;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+27B9;a195;HEAVY BLACK-FEATHERED NORTH EAST ARROW
+27BA;a187;TEARDROP-BARBED RIGHTWARDS ARROW
+27BB;a188;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+27BC;a189;WEDGE-TAILED RIGHTWARDS ARROW
+27BD;a190;HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+27BE;a191;OPEN-OUTLINED RIGHTWARDS ARROW
diff --git a/!TTF2f/History b/!TTF2f/History
new file mode 100644
index 0000000..7461cb9
--- /dev/null
+++ b/!TTF2f/History
@@ -0,0 +1,27 @@
+TTF2f Changelog
+===============
+
+0.03 (15-Aug-2005)
+~~~~~~~~~~~~~~~~~~
+No longer create language fonts, as the font manager appears capable
+of handling encoding files with /uniXXXX for symbol fonts. Quite why
+this behaviour didn't appear to work when originally tested, I've no
+idea. This change avoids any necessity to move Encodings files around.
+
+0.02 (10-Sep-2004)
+~~~~~~~~~~~~~~~~~~
+Remove buggy metrics code which caused fonts with <= 256 different
+horiAdvance values to have broken glyph spacings. All fonts now use
+the extended table format where the glyph number is the table index.
+(Thanks to Paul Sprangers for reporting this)
+
+Fix for fonts which don't embed glyph names (or use incorrect ones).
+The glyph names are now retrieved from the Glyphs file. The format
+of the Glyphs file is as per the Adobe Glyph List comment. TTF2f
+uses only columns 1 and 2.
+
+Improve multitasking when extracting glyph metrics.
+
+0.01 (07-Sep-2004)
+~~~~~~~~~~~~~~~~~~
+Initial release \ No newline at end of file
diff --git a/!TTF2f/Messages b/!TTF2f/Messages
new file mode 100644
index 0000000..2718a66
--- /dev/null
+++ b/!TTF2f/Messages
@@ -0,0 +1,4 @@
+# Messages file for TTF2f
+
+# Taskname - for the toolbox.
+_TaskName:TTF2f
diff --git a/!TTF2f/Res b/!TTF2f/Res
new file mode 100644
index 0000000..5a10a54
--- /dev/null
+++ b/!TTF2f/Res
Binary files differ
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..06c9866
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,31 @@
+# Component settings
+COMPONENT := ttf2f
+COMPONENT_VERSION := 0.0.3
+# We produce an application binary
+COMPONENT_TYPE := binary
+
+# Setup the tooling
+include build/makefiles/Makefile.tools
+
+# Toolchain flags
+WARNFLAGS := -Wall -Wextra -Wundef -Wpointer-arith -Wcast-align \
+ -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes \
+ -Wmissing-declarations -Wnested-externs -Werror -pedantic
+CFLAGS := $(CFLAGS) -std=c99 -D_BSD_SOURCE -I$(CURDIR)/include/ \
+ -I$(CURDIR)/src $(WARNFLAGS) -Dasm="__asm"
+
+# Freetype2
+ifneq ($(findstring clean,$(MAKECMDGOALS)),clean)
+ ifneq ($(PKGCONFIG),)
+ CFLAGS := $(CFLAGS) $(shell $(PKGCONFIG) freetype2 --cflags)
+ LDFLAGS := $(LDFLAGS) $(shell $(PKGCONFIG) freetype2 --libs)
+ else
+ CFLAGS := $(CFLAGS) -I$(PREFIX)/include/freetype2
+ LDFLAGS := $(LDFLAGS) -lfreetype -lz
+ endif
+endif
+
+include build/makefiles/Makefile.top
+
+# Extra installation rules
+
diff --git a/src/Makefile b/src/Makefile
new file mode 100644
index 0000000..4f16a84
--- /dev/null
+++ b/src/Makefile
@@ -0,0 +1,4 @@
+# Sources
+DIR_SOURCES := encoding.c ft.c glyphs.c intmetrics.c outlines.c utils.c
+
+include build/makefiles/Makefile.subdir
diff --git a/src/encoding.c b/src/encoding.c
new file mode 100644
index 0000000..4d5bcde
--- /dev/null
+++ b/src/encoding.c
@@ -0,0 +1,71 @@
+#include <stdio.h>
+#include <string.h>
+
+#include "encoding.h"
+#include "fm.h"
+#include "glyph.h"
+#include "utils.h"
+
+/**
+ * Write font encoding file (UCS style sparse encoding)
+ *
+ * \param savein Location to save in
+ * \param name The font name
+ * \param glyph_list List of all glyphs in the font
+ * \param list_size Size of glyph list
+ * \param type File format to use - 0 = full; 1 = sparse
+ * \param callback Progress callback function
+ */
+void write_encoding(const char *savein, const char *name,
+ struct glyph *glyph_list, int list_size, int type,
+ void (*callback)(int progress))
+{
+ FILE *output;
+ struct glyph *g;
+ int i;
+ char out[1024];
+
+ snprintf(out, 1024, "%s.Encoding", savein);
+ output = fopen(out, "w+");
+
+ fprintf(output, "%% %sEncoding 1.00\n", name);
+ fprintf(output, "%% Encoding file for font '%s'\n\n", name);
+
+ if (!type) {
+ for (i = 0; i != 32; i++) {
+ fprintf(output, "/.notdef\n");
+ }
+ }
+
+ for (i = 0; i != list_size; i++) {
+ g = &glyph_list[i];
+
+ callback(i * 100 / list_size);
+ ttf2f_poll(1);
+
+ if (type) {
+ if (g->name != 0) {
+ /* .notdef is implicit */
+ if (strcmp(g->name, ".notdef") == 0)
+ continue;
+ fprintf(output, "%4.4X;%s;COMMENT\n", i+32,
+ g->name);
+ } else if (g->code != (unsigned int) -1)
+ fprintf(output, "%4.4X;uni%04X;COMMENT\n",
+ i+32, g->code);
+ else
+ fprintf(output, "# Skipping %4.4X\n", i+32);
+ }
+ else {
+ if (g->name != 0) {
+ fprintf(output, "/%s\n", g->name);
+ } else if (g->code != (unsigned int) -1)
+ fprintf(output, "/uni%4.4X\n", g->code);
+ else
+ fprintf(output, "/.NotDef\n");
+ }
+ }
+
+ fclose(output);
+}
+
diff --git a/src/encoding.h b/src/encoding.h
new file mode 100644
index 0000000..3a88cad
--- /dev/null
+++ b/src/encoding.h
@@ -0,0 +1,11 @@
+#ifndef _TTF2F_ENCODING_H_
+#define _TTF2F_ENCODING_H_
+
+struct glyph;
+
+void write_encoding(const char *savein, const char *name,
+ struct glyph *glyph_list, int list_size, int type,
+ void (*callback)(int progress));
+
+#endif
+
diff --git a/src/fm.h b/src/fm.h
new file mode 100644
index 0000000..f8e024e
--- /dev/null
+++ b/src/fm.h
@@ -0,0 +1,31 @@
+#ifndef _TTF2F_FM_H_
+#define _TTF2F_FM_H_
+
+struct font_metrics {
+ /* post */
+ double italic_angle;
+ short underline_position;
+ short underline_thickness;
+ short is_fixed_pitch;
+
+ /* hhea */
+ short ascender;
+ short descender;
+
+ /* head */
+ unsigned short units_per_em;
+ short bbox[4];
+
+ /* name */
+ char *name_copyright;
+ char *name_family;
+ char *name_style;
+ char *name_full;
+ char *name_version;
+ char *name_ps;
+
+ /* other */
+ int force_bold;
+};
+
+#endif
diff --git a/src/ft.c b/src/ft.c
new file mode 100644
index 0000000..b8f548b
--- /dev/null
+++ b/src/ft.c
@@ -0,0 +1,569 @@
+/*
+ * The font parser using the FreeType library version 2.
+ *
+ * based in part upon the ft.c source file in TTF2PT1
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include "ft2build.h"
+#include FT_FREETYPE_H
+#include "freetype/freetype.h"
+#include "freetype/ftglyph.h"
+#include "freetype/ftsnames.h"
+#include "freetype/ttnameid.h"
+#include "freetype/ftoutln.h"
+#include "freetype/tttables.h"
+
+#include "ft.h"
+#include "fm.h"
+#include "glyph.h"
+#include "glyphs.h"
+#include "utils.h"
+
+/* statics */
+
+static FT_Library library;
+static FT_Face face;
+
+void ft_init(void)
+{
+ if (FT_Init_FreeType(&library)) {
+ fprintf(stderr, "** FreeType initialization failed\n");
+ exit(1);
+ }
+}
+
+void ft_fini(void)
+{
+ if (face)
+ close_font();
+
+ if (FT_Done_FreeType(library)) {
+ fprintf(stderr, "Errors when stopping FreeType, ignored\n");
+ }
+}
+
+/*
+ * Open font and prepare to return information to the main driver.
+ * May print error and warning messages.
+ */
+
+int open_font(char *fname)
+{
+ FT_Error error;
+
+ if ((error = FT_New_Face(library, fname, 0, &face)) != 0) {
+ if (error == FT_Err_Unknown_File_Format)
+ fprintf(stderr, "**** %s has format unknown to FreeType\n", fname);
+ else
+ fprintf(stderr, "**** Cannot access %s ****\n", fname);
+ return 1;
+ }
+
+ return 0;
+}
+
+/*
+ * Close font.
+ * Exit on error.
+ */
+
+void close_font(void)
+{
+ if (FT_Done_Face(face)) {
+ fprintf(stderr, "Errors when closing the font file, ignored\n");
+ }
+
+ face = 0;
+}
+
+/*
+ * Get the number of glyphs in font.
+ */
+
+int count_glyphs(void)
+{
+ return (int)face->num_glyphs;
+}
+
+/*
+ * Get the names of the glyphs.
+ * Returns 0 if the names were assigned, non-zero on error
+ */
+
+int glnames(struct glyph *glyph_list)
+{
+#define MAX_NAMELEN 1024
+// unsigned char bf[1024];
+ int i;
+
+// if (!FT_HAS_GLYPH_NAMES(face)) {
+// fprintf(stderr, "Font has no glyph names\n");
+// return 0;
+// }
+
+// for (i = 0; i < face->num_glyphs; i++) {
+// if (FT_Get_Glyph_Name(face, i, bf, MAX_NAMELEN) || bf[0]==0) {
+// sprintf((char*)bf, "_g_%d", i);
+// fprintf(stderr,
+// "Glyph No. %d has no postscript name, becomes %s\n", i, bf);
+// }
+
+// /* don't copy .notdef across when not necessary */
+// if (i == 0 || strcmp((char*)bf, ".notdef") != 0) {
+// glyph_list[i].name = strdup((char*)bf);
+
+// if (glyph_list[i].name == NULL) {
+// fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__);
+// return 1;
+// }
+// }
+// }
+
+ for (i = 0; i != face->num_glyphs; i++) {
+ ttf2f_poll(1);
+ glyph_list[i].name = glyph_name(glyph_list[i].code);
+ }
+
+ return 0;
+}
+
+/*
+ * Get the metrics of the glyphs.
+ */
+
+void glmetrics(struct glyph *glyph_list, void (*callback)(int progress))
+{
+ struct glyph *g;
+ int i;
+ FT_Glyph_Metrics *met;
+ FT_BBox bbox;
+ FT_Glyph gly;
+
+ for (i = 0; i < face->num_glyphs; i++) {
+ g = &(glyph_list[i]);
+
+ callback(i * 100 / face->num_glyphs);
+ ttf2f_poll(1);
+
+ if (FT_Load_Glyph(face, i, FT_LOAD_NO_BITMAP|FT_LOAD_NO_SCALE)) {
+ fprintf(stderr, "Can't load glyph %s, skipped\n", g->name);
+ continue;
+ }
+
+ met = &face->glyph->metrics;
+
+ if (FT_HAS_HORIZONTAL(face)) {
+ g->width = convert_units(met->horiAdvance,
+ face->units_per_EM);
+ g->lsb = convert_units(met->horiBearingX,
+ face->units_per_EM);
+ } else {
+ fprintf(stderr, "Glyph %s has no horizontal metrics, guessed them\n", g->name);
+ g->width = convert_units(met->width,
+ face->units_per_EM);
+ g->lsb = 0;
+ }
+
+ if (FT_Get_Glyph(face->glyph, &gly)) {
+ fprintf(stderr, "Can't access glyph %s bbox, skipped\n", g->name);
+ continue;
+ }
+
+ FT_Glyph_Get_CBox(gly, ft_glyph_bbox_unscaled, &bbox);
+ g->xMin = convert_units(bbox.xMin, face->units_per_EM);
+ g->yMin = convert_units(bbox.yMin, face->units_per_EM);
+ g->xMax = convert_units(bbox.xMax, face->units_per_EM);
+ g->yMax = convert_units(bbox.yMax, face->units_per_EM);
+
+ g->ttf_pathlen = face->glyph->outline.n_points;
+
+ FT_Done_Glyph(gly);
+ }
+}
+
+/*
+ * Map charcodes to glyph ids using the unicode encoding
+ */
+
+int glenc(struct glyph *glyph_list)
+{
+ unsigned charcode, glyphid;
+
+ if (!face->charmaps || FT_Select_Charmap(face, FT_ENCODING_UNICODE)) {
+ fprintf(stderr, "**** Cannot set charmap in FreeType ****\n");
+ return 1;
+ }
+
+ charcode = FT_Get_First_Char(face, &glyphid);
+ while (glyphid != 0) {
+ ttf2f_poll(1);
+ glyph_list[glyphid].code = charcode;
+ charcode = FT_Get_Next_Char(face, charcode, &glyphid);
+ }
+
+ return 0;
+}
+
+/*
+ * Get the font metrics
+ */
+int fnmetrics(struct font_metrics *fm)
+{
+ char *str;
+ static char *fieldstocheck[3];
+ FT_SfntName sn;
+ TT_Postscript *post;
+ int i, j, len;
+
+ fm->underline_position = convert_units(face->underline_position,
+ face->units_per_EM);
+ fm->underline_thickness = convert_units(face->underline_thickness,
+ face->units_per_EM);
+ fm->is_fixed_pitch = FT_IS_FIXED_WIDTH(face);
+
+ fm->ascender = convert_units(face->ascender, face->units_per_EM);
+ fm->descender = convert_units(face->descender, face->units_per_EM);
+
+ fm->units_per_em = face->units_per_EM;
+
+ fm->bbox[0] = convert_units(face->bbox.xMin, face->units_per_EM);
+ fm->bbox[1] = convert_units(face->bbox.yMin, face->units_per_EM);
+ fm->bbox[2] = convert_units(face->bbox.xMax, face->units_per_EM);
+ fm->bbox[3] = convert_units(face->bbox.yMax, face->units_per_EM);
+
+ if ((post = (TT_Postscript*)FT_Get_Sfnt_Table(face, ft_sfnt_post)) != NULL)
+ fm->italic_angle = post->italicAngle;
+ else {
+ fprintf(stderr, "hidden");
+ fm->italic_angle = 0.0; /* FreeType hides the angle */
+ }
+
+ if (FT_Get_Sfnt_Name(face, TT_NAME_ID_COPYRIGHT, &sn))
+ fm->name_copyright = (char *) "";
+ else
+ fm->name_copyright = strndup((const char*)sn.string, sn.string_len);
+
+ fm->name_family = face->family_name;
+
+ fm->name_style = face->style_name;
+ if (fm->name_style == NULL)
+ fm->name_style = (char *) "";
+
+ if (FT_Get_Sfnt_Name(face, TT_NAME_ID_FULL_NAME, &sn)) {
+ int len;
+
+ len = strlen(fm->name_family) + strlen(fm->name_style) + 2;
+ if ((fm->name_full = malloc(len)) == NULL) {
+ fprintf(stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__);
+ return 1;
+ }
+ strcpy(fm->name_full, fm->name_family);
+ if (strlen(fm->name_style) != 0) {
+ strcat(fm->name_full, " ");
+ strcat(fm->name_full, fm->name_style);
+ }
+ }
+ else
+ fm->name_full = strndup((const char*)sn.string, sn.string_len);
+
+ if (FT_Get_Sfnt_Name(face, TT_NAME_ID_VERSION_STRING, &sn))
+ fm->name_version = (char *) "1.0";
+ else
+ fm->name_version = strndup((const char*)sn.string, sn.string_len);
+
+ if (FT_Get_Sfnt_Name(face, TT_NAME_ID_PS_NAME , &sn)) {
+ if ((fm->name_ps = strdup(fm->name_full)) == NULL) {
+ fprintf(stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__);
+ return 1;
+ }
+ } else
+ fm->name_ps = strndup((const char*)sn.string, sn.string_len);
+ for (i = 0; fm->name_ps[i]!=0; i++)
+ if (fm->name_ps[i] == ' ')
+ fm->name_ps[i] = '_'; /* no spaces in the Postscript name */
+
+ /* guess the boldness from the font names */
+ fm->force_bold=0;
+
+ fieldstocheck[0] = fm->name_style;
+ fieldstocheck[1] = fm->name_full;
+ fieldstocheck[2] = fm->name_ps;
+
+ for (i = 0; !fm->force_bold && i < (int) (sizeof fieldstocheck / sizeof(fieldstocheck[0])); i++) {
+ str=fieldstocheck[i];
+ len = strlen(str);
+ for (j = 0; j < len; j++) {
+ if ((str[j]=='B'
+ || str[j]=='b')
+ && (j==0 || !isalpha(str[j-1]))
+ && !strncmp("old",&str[j+1],3)
+ && (j+4 >= len || !islower(str[j+4]))) {
+ fm->force_bold=1;
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * Functions to decompose the outlines
+ */
+
+static struct glyph *curg;
+static struct outline *cur_outline_entry;
+static long lastx, lasty;
+
+static int outl_moveto(const FT_Vector *to, void *unused)
+{
+ struct outline *o;
+
+ UNUSED(unused);
+
+ o = calloc(1, sizeof(struct outline));
+ if (!o) {
+ fprintf(stderr, "malloc failed\n");
+ return 1;
+ }
+
+ o->type = MOVE_TO;
+ o->data.move_to.x = convert_units(to->x, face->units_per_EM);
+ o->data.move_to.y = convert_units(to->y, face->units_per_EM);
+
+ if (cur_outline_entry)
+ cur_outline_entry->next = o;
+ else
+ curg->outline = o;
+ cur_outline_entry = o;
+
+ lastx = convert_units(to->x, face->units_per_EM);
+ lasty = convert_units(to->y, face->units_per_EM);
+
+/* fprintf(stderr, "\tmoving to: (%x, %x)(%x, %x)\n", o->data.move_to.x, o->data.move_to.y, to->x, to->y);
+*/
+ return 0;
+}
+
+static int outl_lineto(const FT_Vector *to, void *unused)
+{
+ struct outline *o;
+
+ UNUSED(unused);
+
+ o = calloc(1, sizeof(struct outline));
+ if (!o) {
+ fprintf(stderr, "malloc failed\n");
+ return 1;
+ }
+
+ o->type = LINE_TO;
+ o->data.line_to.x = convert_units(to->x, face->units_per_EM);
+ o->data.line_to.y = convert_units(to->y, face->units_per_EM);
+
+ if (cur_outline_entry)
+ cur_outline_entry->next = o;
+ else
+ curg->outline = o;
+ cur_outline_entry = o;
+
+ lastx = convert_units(to->x, face->units_per_EM);
+ lasty = convert_units(to->y, face->units_per_EM);
+
+/* fprintf(stderr, "\tdrawing line to: (%x, %x)(%x, %x)\n", o->data.line_to.x, o->data.line_to.y, to->x, to->y);
+*/
+ return 0;
+}
+
+static int outl_conicto(const FT_Vector *control1, const FT_Vector *to,
+ void *unused)
+{
+ struct outline *o;
+ double c1x, c1y;
+
+ UNUSED(unused);
+
+ o = calloc(1, sizeof(struct outline));
+ if (!o) {
+ fprintf(stderr, "malloc failed\n");
+ return 1;
+ }
+
+ c1x = (double)lastx + 2.0 *
+ ((double)convert_units(control1->x, face->units_per_EM) -
+ (double)lastx) / 3.0;
+ c1y = (double)lasty + 2.0 *
+ ((double)convert_units(control1->y, face->units_per_EM) -
+ (double)lasty) / 3.0;
+
+ o->type = CURVE;
+ o->data.curve.x1 = (int)c1x;
+ o->data.curve.y1 = (int)c1y;
+ o->data.curve.x2 = (int)(c1x +
+ ((double)convert_units(to->x, face->units_per_EM) -
+ (double)lastx) / 3.0);
+ o->data.curve.y2 = (int)(c1y +
+ ((double)convert_units(to->y, face->units_per_EM) -
+ (double)lasty) / 3.0);
+ o->data.curve.x3 = convert_units(to->x, face->units_per_EM);
+ o->data.curve.y3 = convert_units(to->y, face->units_per_EM);
+
+ if (cur_outline_entry)
+ cur_outline_entry->next = o;
+ else
+ curg->outline = o;
+ cur_outline_entry = o;
+
+/* fprintf(stderr, "\tdrawing conic curve to: (%x, %x)(%x, %x) ctrl1: (%x, %x)(%f, %f) ctrl2: (%x, %x)(%f, %f) qctrl: (%x, %x)\n",
+ o->data.curve.x3, o->data.curve.y3, to->x, to->y,
+ o->data.curve.x1, o->data.curve.y1, c1x, c1y,
+ o->data.curve.x2, o->data.curve.y2,
+ (c1x + (double)(to->x - lastx) / 3.0),
+ (c1y + (double)(to->y - lasty) / 3.0),
+ control1->x, control1->y);
+*/
+ lastx = convert_units(to->x, face->units_per_EM);
+ lasty = convert_units(to->y, face->units_per_EM);
+
+ return 0;
+}
+
+static int outl_cubicto(const FT_Vector *control1, const FT_Vector *control2,
+ const FT_Vector *to, void *unused)
+{
+ struct outline *o;
+
+ UNUSED(unused);
+
+ o = calloc(1, sizeof(struct outline));
+ if (!o) {
+ fprintf(stderr, "malloc failed\n");
+ return 1;
+ }
+
+ o->type = CURVE;
+ o->data.curve.x1 = convert_units(control1->x, face->units_per_EM);
+ o->data.curve.y1 = convert_units(control1->y, face->units_per_EM);
+ o->data.curve.x2 = convert_units(control2->x, face->units_per_EM);
+ o->data.curve.y2 = convert_units(control2->y, face->units_per_EM);
+ o->data.curve.x3 = convert_units(to->x, face->units_per_EM);
+ o->data.curve.y3 = convert_units(to->y, face->units_per_EM);
+
+ if (cur_outline_entry)
+ cur_outline_entry->next = o;
+ else
+ curg->outline = o;
+ cur_outline_entry = o;
+
+ lastx = convert_units(to->x, face->units_per_EM);
+ lasty = convert_units(to->y, face->units_per_EM);
+
+/* fprintf(stderr, "\tdrawing cubic curve to: (%x, %x)(%x, %x) ctrl1: (%x, %x)(%x, %x) ctrl2: (%x, %x)(%x, %x)\n", o->data.curve.x3, o->data.curve.y3, to->x, to->y, o->data.curve.x1, o->data.curve.y1, control1->x, control1->y, o->data.curve.x2, o->data.curve.y2, control2->x, control2->y);
+*/
+ return 0;
+}
+
+static FT_Outline_Funcs ft_outl_funcs = {
+ outl_moveto,
+ outl_lineto,
+ outl_conicto,
+ outl_cubicto,
+ 0,
+ 0
+};
+
+/*
+ * Get the path of contrours for a glyph.
+ */
+
+void glpath(int glyphno, struct glyph *glyf_list)
+{
+ FT_Outline *ol;
+ FT_Glyph gly;
+ struct outline *o;
+
+ curg = &glyf_list[glyphno];
+ cur_outline_entry = 0;
+
+ if (FT_Load_Glyph(face, glyphno, FT_LOAD_NO_BITMAP|FT_LOAD_NO_SCALE|FT_LOAD_NO_HINTING)
+ || face->glyph->format != ft_glyph_format_outline) {
+ fprintf(stderr, "Can't load glyph %s, skipped\n", curg->name);
+ return;
+ }
+
+ ol = &face->glyph->outline;
+ lastx = 0; lasty = 0;
+
+/* fprintf(stderr, "Decomposing outline of %s (%d):\n", curg->name,
+ glyphno);
+*/
+ if (FT_Outline_Decompose(ol, &ft_outl_funcs, NULL)) {
+ fprintf(stderr, "Can't decompose outline of glyph %s, skipped\n", curg->name);
+ return;
+ }
+
+ o = calloc(1, sizeof(struct outline));
+ if (!o) {
+ fprintf(stderr, "malloc failed\n");
+ return;
+ }
+
+ o->type = TERMINATE;
+ /* todo - handle composite glyphs */
+ o->data.terminate.composite = 0;
+
+ if (cur_outline_entry)
+ cur_outline_entry->next = o;
+ else
+ curg->outline = o;
+ cur_outline_entry = o;
+
+ if (FT_Get_Glyph(face->glyph, &gly)) {
+ fprintf(stderr, "Can't access glyph %s bbox, skipped\n", curg->name);
+ return;
+ }
+
+ FT_Done_Glyph(gly);
+
+// fprintf(stderr, "done\n\n");
+}
+
+#if 0
+/*
+ * Get the kerning data.
+ */
+
+void kerning(struct glyph *glyph_list)
+{
+ int i, j, n;
+ int nglyphs = face->num_glyphs;
+ FT_Vector k;
+ struct glyph *gl;
+
+ if (nglyphs == 0 || !FT_HAS_KERNING(face)) {
+ fputs("No Kerning data\n", stderr);
+ return;
+ }
+
+ for (i = 0; i < nglyphs; i++) {
+ if ((glyph_list[i].flags & GF_USED) == 0)
+ continue;
+ for (j = 0; j < nglyphs; j++) {
+ if ((glyph_list[j].flags & GF_USED) == 0)
+ continue;
+ if (FT_Get_Kerning(face, i, j, ft_kerning_unscaled, &k))
+ continue;
+ if (k.x == 0)
+ continue;
+
+ addkernpair(i, j, k.x);
+ }
+ }
+}
+
+#endif
diff --git a/src/ft.h b/src/ft.h
new file mode 100644
index 0000000..eb9c9ad
--- /dev/null
+++ b/src/ft.h
@@ -0,0 +1,20 @@
+#ifndef _TTF2F_FT_H_
+#define _TTF2F_FT_H_
+
+struct font_metrics;
+struct glyph;
+
+void ft_init(void);
+void ft_fini(void);
+int open_font(char *fname);
+void close_font(void);
+int count_glyphs(void);
+int glnames(struct glyph *glyph_list);
+void glmetrics(struct glyph *glyph_list, void (*callback)(int progress));
+int glenc(struct glyph *glyph_list);
+int fnmetrics(struct font_metrics *fm);
+void glpath(int glyphno, struct glyph *glyph_list);
+void kerning(struct glyph *glyph_list);
+
+#endif
+
diff --git a/src/glyph.h b/src/glyph.h
new file mode 100644
index 0000000..fe91bc8
--- /dev/null
+++ b/src/glyph.h
@@ -0,0 +1,39 @@
+#ifndef _TTF2F_GLYPH_H_
+#define _TTF2F_GLYPH_H_
+
+struct outline {
+ enum { TERMINATE, MOVE_TO, LINE_TO, CURVE } type;
+ union {
+ struct { int composite; } terminate;
+ struct { int x:12, y:12; } move_to;
+ struct { int x:12, y:12; } line_to;
+ struct { int x1:12, y1:12;
+ int x2:12, y2:12;
+ int x3:12, y3:12; } curve;
+ } data;
+
+ struct outline *next;
+};
+
+struct composite {
+ short code;
+ short x;
+ short y;
+ struct composite *next;
+};
+
+struct glyph {
+ unsigned int code; /* glyph code */
+ char *name; /* glyph name */
+ int xMin:12, yMin:12;
+ int xMax:12, yMax:12; /* glyph control box */
+ int lsb; /* left side bearing of glyph,
+ relative to origin */
+ int ttf_pathlen; /* number of points in glyph */
+ short width; /* advance width of glyph */
+ struct outline *outline; /* outline of glyph */
+ struct composite *composite; /* list of composite inclusions */
+};
+
+#endif
+
diff --git a/src/glyphs.c b/src/glyphs.c
new file mode 100644
index 0000000..71a8775
--- /dev/null
+++ b/src/glyphs.c
@@ -0,0 +1,101 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "glyphs.h"
+
+struct glyph_entry {
+ unsigned short code;
+ char *name;
+ struct glyph_entry *next;
+};
+
+struct glyph_entry glyphs[256];
+
+void load_glyph_list(void)
+{
+ FILE *fp;
+ char line[1024];
+ char *semi, *name;
+ struct glyph_entry *g, *cur;
+
+ fp = fopen("<TTF2f$Dir>.Glyphs", "r");
+ if (!fp) {
+ fprintf(stderr, "Failed opening glyphs file\n");
+ exit(255);
+ }
+
+ while(fgets(line, 1024, fp)) {
+ /* skip comments & blank lines */
+ if (line[0] == 0 || line[0] == '#')
+ continue;
+
+ /* strip cr from end */
+ line[strlen(line) - 1] = 0;
+
+ semi = strchr(line, ';');
+ if (!semi)
+ continue;
+ *semi = 0;
+ name = semi+1;
+ semi = strchr(name, ';');
+ if (semi)
+ *semi = 0;
+
+ g = calloc(1, sizeof(struct glyph_entry));
+ if (!g) {
+ fprintf(stderr, "malloc failed\n");
+ exit(255);
+ }
+
+ g->code = (unsigned short)strtoul(line, NULL, 16);
+ g->name = strdup(name);
+
+// fprintf(stderr, "%04.4X: %s\n", g->code, g->name);
+
+ for (cur = &glyphs[g->code / 256];
+ cur->next && cur->code < g->code;
+ cur = cur->next)
+ ;
+
+ if (cur->code == g->code) {
+ free(g->name);
+ free(g);
+ continue;
+ }
+
+ if (cur->next)
+ g->next = cur->next;
+ cur->next = g;
+ }
+
+ fclose(fp);
+}
+
+char *glyph_name(unsigned short code)
+{
+ struct glyph_entry *g;
+
+ for (g = &glyphs[code / 256]; g; g = g->next)
+ if (g->code == code)
+ break;
+
+ if (!g)
+ return NULL;
+
+ return g->name;
+}
+
+void destroy_glyphs(void)
+{
+ int i;
+ struct glyph_entry *a, *b;
+
+ for (i = 0; i != 256; i++) {
+ for (a = (&glyphs[i])->next; a; a = b) {
+ b = a->next;
+ free(a->name);
+ free(a);
+ }
+ }
+}
diff --git a/src/glyphs.h b/src/glyphs.h
new file mode 100644
index 0000000..39c3426
--- /dev/null
+++ b/src/glyphs.h
@@ -0,0 +1,8 @@
+#ifndef _TTF2F_GLYPHS_H_
+#define _TTF2F_GLYPHS_H_
+
+void load_glyph_list(void);
+char *glyph_name(unsigned short code);
+void destroy_glyphs(void);
+
+#endif
diff --git a/src/intmetrics.c b/src/intmetrics.c
new file mode 100644
index 0000000..c5dbbca
--- /dev/null
+++ b/src/intmetrics.c
@@ -0,0 +1,154 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "swis.h"
+
+#include "fm.h"
+#include "glyph.h"
+#include "intmetrics.h"
+#include "utils.h"
+
+struct intmetrics_header {
+ char name[40];
+ int a;
+ int b;
+ char nlo;
+ char version;
+ char flags;
+ char nhi;
+};
+
+static short mapsize;
+
+static char *character_map = 0;
+
+/* we don't use these */
+// static short *x0;
+// static short *y0;
+// static short *x1;
+// static short *y1;
+
+static short *xwidthtab = 0;
+// static short *ywidthtab;
+
+struct extra_data_offsets {
+ short misc;
+ short kern;
+ short res1;
+ short res2;
+};
+
+struct misc_area {
+ short x0;
+ short y0;
+ short x1;
+ short y1;
+ short default_x_offset;
+ short default_y_offset;
+ short italic_h_offset;
+ char underline_position;
+ char underline_thickness;
+ short cap_height;
+ short xheight;
+ short descender;
+ short ascender;
+ int reserved;
+};
+
+struct kern_pair_8 {
+ char left;
+ char right;
+ short x_kern;
+ short y_kern;
+ char list_end;
+ char area_end;
+};
+
+struct kern_pair_16 {
+ short left;
+ short right;
+ short x_kern;
+ short y_kern;
+ short list_end;
+ short area_end;
+};
+
+/**
+ * Write font metrics to file
+ *
+ * \param savein Location to save in
+ * \param name Font name
+ * \param glyph_list List of all glyphs in font
+ * \param list_size Size of glyph list
+ * \param metrics Global font metrics
+ */
+void write_intmetrics(const char *savein, const char *name,
+ struct glyph *glyph_list, int list_size,
+ struct font_metrics *metrics,
+ void (*callback)(int progress))
+{
+ struct intmetrics_header header;
+ int charmap_size = 0;
+ unsigned int xwidthtab_size = 0;
+ int i;
+ struct glyph *g;
+ char out[1024];
+ FILE *output;
+
+ UNUSED(metrics);
+
+ /* allow for chunk 0 */
+ xwidthtab = calloc(33, sizeof(short));
+ if (!xwidthtab) {
+ fprintf(stderr, "malloc failed\n");
+ return;
+ }
+ xwidthtab_size = 32;
+
+ /* create xwidthtab - char code is now the index */
+ for (i = 0; i != list_size; i++) {
+ g = &glyph_list[i];
+
+ callback((i * 100) / list_size);
+ ttf2f_poll(1);
+
+ xwidthtab_size++;
+ xwidthtab[i+32] = g->width;
+ xwidthtab = realloc(xwidthtab,
+ (xwidthtab_size+1) * sizeof(short));
+ if (!xwidthtab) {
+ fprintf(stderr, "malloc failed\n");
+ return;
+ }
+ }
+
+ /* fill in header */
+ snprintf(header.name, 40, "%s", name);
+ memset(header.name + (strlen(name) >= 40 ? 39 : strlen(name)), 0xD,
+ 40 - (strlen(name) >= 40 ? 39 : strlen(name)));
+ header.a = header.b = 16;
+ header.version = 0x2;
+ header.flags = 0x25;
+ header.nhi = xwidthtab_size / 256;
+ header.nlo = xwidthtab_size % 256;
+
+ mapsize = charmap_size;
+
+ snprintf(out, 1024, "%s.IntMetrics", savein);
+ output = fopen(out, "wb+");
+ fwrite((void*)&header, sizeof(struct intmetrics_header), 1, output);
+ fputc(mapsize & 0xFF, output);
+ fputc((mapsize & 0xFF00) >> 8, output);
+ fwrite(character_map, sizeof(char), charmap_size, output);
+ fwrite(xwidthtab, sizeof(short), xwidthtab_size, output);
+ fclose(output);
+
+ /* set type */
+ _swix(OS_File, _INR(0,2), 18, out, 0xFF6);
+
+ if (character_map)
+ free(character_map);
+ free(xwidthtab);
+}
+
diff --git a/src/intmetrics.h b/src/intmetrics.h
new file mode 100644
index 0000000..0aaf1be
--- /dev/null
+++ b/src/intmetrics.h
@@ -0,0 +1,12 @@
+#ifndef _TTF2F_INTMETRICS_H_
+#define _TTF2F_INTMETRICS_H_
+
+struct glyph;
+struct font_metrics;
+
+void write_intmetrics(const char *savein, const char *name,
+ struct glyph *glyph_list, int list_size,
+ struct font_metrics *metrics,
+ void (*callback)(int progress));
+
+#endif
diff --git a/src/main.c b/src/main.c
new file mode 100644
index 0000000..5de9982
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,456 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <time.h>
+
+#include "swis.h"
+
+#include "tboxlibs/event.h"
+#include "tboxlibs/gadgets.h"
+#include "tboxlibs/quit.h"
+#include "tboxlibs/toolbox.h"
+#include "tboxlibs/wimp.h"
+#include "tboxlibs/wimplib.h"
+
+#include "encoding.h"
+#include "ft.h"
+#include "fm.h"
+#include "glyph.h"
+#include "glyphs.h"
+#include "intmetrics.h"
+#include "outlines.h"
+#include "utils.h"
+
+#define Convert_Font 0x101
+
+int ttf2f_quit = 0;
+MessagesFD messages_file;
+ObjectId main_window;
+int converting = 0;
+
+/* Wimp Messages we're interested in */
+static int messages [] ={
+ Wimp_MDataLoad,
+ Wimp_MQuit,
+ 0};
+
+/* Toolbox events we're interested in */
+static int tbcodes [] ={
+ Convert_Font,
+ Quit_Quit,
+ Toolbox_Error,
+ 0};
+
+static void ttf2f_init(int argc, char **argv);
+static void ttf2f_exit(void);
+static void register_toolbox_handlers(void);
+static int toolbox_event_quit(int event_code, ToolboxEvent *event,
+ IdBlock *id_block, void *handle);
+static int toolbox_event_error(int event_code, ToolboxEvent *event,
+ IdBlock *id_block, void *handle);
+static int convert_font(int event_code, ToolboxEvent *event,
+ IdBlock *id_block, void *handle);
+static void register_message_handlers(void);
+static int wimp_message_quit(WimpMessage *message,void *handle);
+static int wimp_message_dataload(WimpMessage *message,void *handle);
+static void progress_bar(int value);
+
+int main(int argc, char **argv)
+{
+ ttf2f_init(argc, argv);
+
+ while (!ttf2f_quit)
+ ttf2f_poll(0);
+
+ ttf2f_exit();
+
+ return 0;
+}
+
+
+void ttf2f_init(int argc, char **argv)
+{
+ _kernel_oserror *error;
+ IdBlock toolbox_block;
+ char *stringset;
+
+ ft_init();
+ load_glyph_list();
+
+ error = event_initialise(&toolbox_block);
+ if (error) {
+ fprintf(stderr, "event_initialise: 0x%x: %s\n",
+ error->errnum, error->errmess);
+ exit(1);
+ }
+
+ event_set_mask(Wimp_Poll_NullMask |
+ Wimp_Poll_PointerLeavingWindowMask |
+ Wimp_Poll_PointerEnteringWindowMask |
+ Wimp_Poll_MouseClickMask |
+ Wimp_Poll_KeyPressedMask |
+ Wimp_Poll_LoseCaretMask |
+ Wimp_Poll_GainCaretMask);
+
+ register_toolbox_handlers();
+ register_message_handlers();
+
+ error = toolbox_initialise(0, 310, messages, tbcodes,
+ "<TTF2F$Dir>", &messages_file,
+ &toolbox_block, NULL, NULL, NULL);
+ if (error) {
+ fprintf(stderr, "toolbox_initialise: 0x%x: %s\n",
+ error->errnum, error->errmess);
+ exit(1);
+ }
+
+ error = toolbox_create_object(0, "main", &main_window);
+ if (error) {
+ fprintf(stderr, "toolbox_create_object: 0x%x: %s\n",
+ error->errnum, error->errmess);
+ exit(1);
+ }
+
+ stringset = getenv("Font$Path");
+ if (stringset) {
+ error = stringset_set_available(0, main_window, 7,
+ stringset);
+ if (error) {
+ fprintf(stderr,
+ "stringset_set_available: 0x%x: %s\n",
+ error->errnum, error->errmess);
+ exit(1);
+ }
+ }
+}
+
+void ttf2f_poll(int active)
+{
+ _kernel_oserror *error;
+ int event;
+ unsigned int mask;
+ WimpPollBlock block;
+
+ if (active || converting) {
+ event_set_mask(0x3972);
+ error = event_poll(&event, &block, 0);
+ } else {
+ event_get_mask(&mask);
+ event_set_mask(mask | Wimp_Poll_NullMask);
+ error = event_poll(&event, &block, 0);
+ }
+ if (error)
+ fprintf(stderr, "event_poll: 0x%x: %s\n",
+ error->errnum, error->errmess);
+}
+
+void ttf2f_exit(void)
+{
+ _kernel_oserror *error;
+
+ ft_fini();
+ destroy_glyphs();
+
+ error = event_finalise();
+ if (error)
+ fprintf(stderr, "event_finalise: 0x%x: %s\n",
+ error->errnum, error->errmess);
+}
+
+/**
+ * Register event handlers with the toolbox
+ */
+void register_toolbox_handlers(void)
+{
+ _kernel_oserror *error;
+
+ error = event_register_toolbox_handler(-1, Quit_Quit,
+ toolbox_event_quit, 0);
+ if (error)
+ fprintf(stderr, "registering Quit_Quit: 0x%x: %s\n",
+ error->errnum, error->errmess);
+
+ error = event_register_toolbox_handler(-1, Toolbox_Error,
+ toolbox_event_error, 0);
+ if (error)
+ fprintf(stderr, "registering Quit_Quit: 0x%x: %s\n",
+ error->errnum, error->errmess);
+
+ error = event_register_toolbox_handler(-1, Convert_Font,
+ convert_font, 0);
+ if (error)
+ fprintf(stderr, "registering Convert_Font: 0x%x: %s\n",
+ error->errnum, error->errmess);
+}
+
+/**
+ * Handle quit events
+ */
+int toolbox_event_quit(int event_code, ToolboxEvent *event,
+ IdBlock *id_block, void *handle)
+{
+ ttf2f_quit = 1;
+
+ return 1;
+}
+
+/**
+ * Handle toolbox errors
+ */
+int toolbox_event_error(int event_code, ToolboxEvent *event,
+ IdBlock *id_block, void *handle)
+{
+ ToolboxErrorEvent *error = (ToolboxErrorEvent *)event;
+
+ fprintf(stderr, "toolbox error: 0x%x: %s\n",
+ error->errnum, error->errmess);
+
+ return 1;
+}
+
+/**
+ * Register message handlers
+ */
+void register_message_handlers(void)
+{
+ _kernel_oserror *error;
+
+ error = event_register_message_handler(Wimp_MQuit, wimp_message_quit,
+ 0);
+ if (error)
+ fprintf(stderr, "registering Wimp_MQuit handler: 0x%x: %s\n",
+ error->errnum, error->errmess);
+
+ error = event_register_message_handler(Wimp_MDataLoad,
+ wimp_message_dataload,
+ 0);
+ if (error)
+ fprintf(stderr,
+ "registering Wimp_MDataLoad handler: 0x%x: %s\n",
+ error->errnum, error->errmess);
+}
+
+/**
+ * Handle quit messages
+ */
+int wimp_message_quit(WimpMessage *message,void *handle)
+{
+ ttf2f_quit = 1;
+
+ return 1;
+}
+
+/**
+ * Handle dataload messages
+ */
+int wimp_message_dataload(WimpMessage *message,void *handle)
+{
+ _kernel_oserror *error;
+ WimpDataLoadMessage *dl = &message->data.data_load;
+
+ error = displayfield_set_value(0, main_window, 0, dl->leaf_name);
+ if (error) {
+ fprintf(stderr, "displayfield_set_value: 0x%x: %s\n",
+ error->errnum, error->errmess);
+ }
+
+ message->hdr.action_code = Wimp_MDataLoadAck;
+ message->hdr.your_ref = message->hdr.my_ref;
+ error = wimp_send_message(17, message, message->hdr.sender, 0, 0);
+ if (error) {
+ fprintf(stderr, "wimp_send_message: 0x%x: %s\n",
+ error->errnum, error->errmess);
+ }
+
+ return 1;
+}
+
+
+
+
+int convert_font(int event_code, ToolboxEvent *event,
+ IdBlock *id_block, void *handle)
+{
+ _kernel_oserror *error, erblock = { 123456, "Invalid Parameters" };
+ char ifilename[256], ofilename[256], save_in[1024];
+ char *token;
+ int count = 0;
+ int nglyphs, i;
+ struct glyph *glyph_list, *g;
+ struct font_metrics *metrics;
+
+ if (converting)
+ return 1;
+
+ converting = 1;
+
+ /* get input file */
+ error = displayfield_get_value(0, main_window, 0, ifilename, 256, 0);
+ if (error) {
+ fprintf(stderr, "displayfield_get_value: 0x%x: %s\n",
+ error->errnum, error->errmess);
+ }
+
+ /* read font name */
+ error = writablefield_get_value(0, main_window, 3, ofilename, 256, 0);
+ if (error) {
+ fprintf(stderr, "writablefield_get_value: 0x%x: %s\n",
+ error->errnum, error->errmess);
+ }
+
+ /* read save location */
+ error = stringset_get_selected(0, main_window, 7, save_in, 1024, 0);
+ if (error) {
+ fprintf(stderr, "stringset_get_selected: 0x%x: %s\n",
+ error->errnum, error->errmess);
+ }
+
+ /* sanity check */
+ if (strcmp(save_in, "Save in") == 0 || strcmp(ofilename, "") == 0 ||
+ strcmp(ifilename, "Filename") == 0) {
+ wimp_report_error(&erblock, 0x5, "TTF2f");
+ converting = 0;
+ return 1;
+ }
+
+ /* create output directories */
+ token = strtok(ofilename, ".");
+ while (token) {
+ if (count)
+ strcat(save_in, ".");
+ strcat(save_in, token);
+ error = _swix(OS_File, _INR(0,1) | _IN(4), 8, save_in, 0);
+ if (error) {
+ fprintf(stderr, "os_file: 0x%x: %s\n",
+ error->errnum, error->errmess);
+ wimp_report_error(error, 0x5, "TTF2f");
+ converting = 0;
+ return 1;
+ }
+ token = strtok(NULL, ".");
+ count++;
+ }
+
+ /* re-read font name - previously corrupted by strtok */
+ error = writablefield_get_value(0, main_window, 3, ofilename, 256, 0);
+ if (error) {
+ fprintf(stderr, "writablefield_get_value: 0x%x: %s\n",
+ error->errnum, error->errmess);
+ }
+
+ if (open_font(ifilename)) {
+ snprintf(erblock.errmess, 252, "Unknown font format");
+ wimp_report_error(&erblock, 0x5, "TTF2f");
+ converting = 0;
+ return 1;
+ }
+
+ nglyphs = count_glyphs();
+
+ fprintf(stderr, "%d x %d = %d\n", nglyphs, sizeof(struct glyph), nglyphs * sizeof(struct glyph));
+
+ glyph_list = (struct glyph *)calloc(nglyphs, sizeof(struct glyph));
+ if (!glyph_list) {
+ fprintf(stderr, "malloc failed\n");
+ snprintf(erblock.errmess, 252, "Insufficient memory");
+ wimp_report_error(&erblock, 0x5, "TTF2f");
+ converting = 0;
+ return 1;
+ }
+
+ /* Initialise glyph list */
+ for (i = 0; i != nglyphs; i++) {
+ g = &glyph_list[i];
+
+ g->code = -1;
+ }
+
+ /* create buffer for font metrics data */
+ metrics = calloc(1, sizeof(struct font_metrics));
+ if (!metrics) {
+ free(glyph_list);
+ close_font();
+ fprintf(stderr, "malloc failed\n");
+ snprintf(erblock.errmess, 252, "Insufficient memory");
+ wimp_report_error(&erblock, 0x5, "TTF2f");
+ converting = 0;
+ return 1;
+ }
+
+ /* read global font metrics */
+ if (fnmetrics(metrics)) {
+ free(glyph_list);
+ free(metrics);
+ close_font();
+ snprintf(erblock.errmess, 252, "Insufficient memory");
+ wimp_report_error(&erblock, 0x5, "TTF2f");
+ converting = 0;
+ return 1;
+ }
+
+ /* map glyph ids to charcodes */
+ if (glenc(glyph_list)) {
+ free(glyph_list);
+ free(metrics);
+ close_font();
+ snprintf(erblock.errmess, 252, "Unknown encoding");
+ wimp_report_error(&erblock, 0x5, "TTF2f");
+ converting = 0;
+ return 1;
+ }
+
+ /* extract glyph names */
+ if (glnames(glyph_list)) {
+ free(glyph_list);
+ free(metrics);
+ close_font();
+ snprintf(erblock.errmess, 252, "Insufficient memory");
+ wimp_report_error(&erblock, 0x5, "TTF2f");
+ converting = 0;
+ return 1;
+ }
+
+ /* olive */
+ slider_set_colour(0, main_window, 8, 13, 0);
+
+ /* extract glyph metrics */
+ glmetrics(glyph_list, progress_bar);
+
+ /* red */
+ slider_set_colour(0, main_window, 8, 11, 13);
+
+ /* write intmetrics file */
+ write_intmetrics(save_in, ofilename, glyph_list, nglyphs, metrics, progress_bar);
+
+ /* blue */
+ slider_set_colour(0, main_window, 8, 8, 11);
+
+ /* write outlines file */
+ write_outlines(save_in, ofilename, glyph_list, nglyphs, metrics, progress_bar);
+
+ /* green */
+ slider_set_colour(0, main_window, 8, 10, 8);
+
+ /* write encoding file */
+ write_encoding(save_in, ofilename, glyph_list, nglyphs, 0, progress_bar);
+
+ /* reset slider */
+ slider_set_colour(0, main_window, 8, 8, 0);
+ slider_set_value(0, main_window, 8, 0);
+
+ free(glyph_list);
+ free(metrics);
+
+ close_font();
+
+ converting = 0;
+
+ return 1;
+}
+
+void progress_bar(int value)
+{
+ slider_set_value(0, main_window, 8, value);
+}
+
diff --git a/src/outlines.c b/src/outlines.c
new file mode 100644
index 0000000..ffdad4f
--- /dev/null
+++ b/src/outlines.c
@@ -0,0 +1,297 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "swis.h"
+
+#include "fm.h"
+#include "ft.h"
+#include "glyph.h"
+#include "outlines.h"
+#include "utils.h"
+
+static unsigned int write_chunk(FILE* file, int chunk_no,
+ struct glyph *glyph_list, int list_size);
+
+/**
+ * Write the font outlines to file
+ *
+ * \param savein Location to save in
+ * \param name Font name
+ * \param glyph_list List of all glyphs in font
+ * \param list_size Size of glyph list
+ * \param metrics Global font metrics
+ */
+void write_outlines(const char *savein, const char *name,
+ struct glyph *glyph_list, int list_size,
+ struct font_metrics *metrics,
+ void (*callback)(int progress))
+{
+ struct outlines_header header;
+ int table_end_len, i;
+ unsigned int current_chunk_offset;
+ unsigned int chunk_table_entry;
+ FILE *output;
+ char out[1024];
+
+ /* length of name + \0 + "Outlines" + \0 */
+ table_end_len = strlen(name) + 10;
+
+ /* fill in file header */
+ header.id = 'F' + ('O' << 8) + ('N' << 16) + ('T' << 24);
+ header.bpp = 0;
+ header.version = 8;
+ header.flags = 1000; /* design size of converted font */
+ header.x0 = metrics->bbox[0];
+ header.y0 = metrics->bbox[1];
+ header.X = metrics->bbox[2] - metrics->bbox[0];
+ header.Y = metrics->bbox[3] - metrics->bbox[1];
+ header.chunk_data.chunk_table_offset =
+ sizeof(struct outlines_header) + ((table_end_len + 6) & ~3);
+ header.chunk_data.nchunks = (list_size / 32) + 2;
+ header.chunk_data.num_scaffold = 1; /* no scaffold lines */
+ header.chunk_data.scaffold_flags = OUTLINES_SCAFFOLD_16BIT |
+ OUTLINES_SCAFFOLD_NON_ZERO_WINDING;
+ header.chunk_data.reserved[0] = 0;
+ header.chunk_data.reserved[1] = 0;
+ header.chunk_data.reserved[2] = 0;
+ header.chunk_data.reserved[3] = 0;
+ header.chunk_data.reserved[4] = 0;
+
+ snprintf(out, 1024, "%s.Outlines", savein);
+ output = fopen(out, "wb+");
+ /* write file header */
+ fwrite((void*)&header, sizeof(struct outlines_header), 1, output);
+ /* write scaffold table */
+ fputc(0x3, output);
+ fputc(0x0, output);
+ fputc(0x0, output);
+ /* table end */
+ fprintf(output, "%s", name);
+ fputc(0x0, output);
+ fprintf(output, "Outlines");
+ fputc(0x0, output);
+ /* word align */
+ i = table_end_len + 3 + sizeof(struct outlines_header);
+ while (i++ < header.chunk_data.chunk_table_offset)
+ fputc(0x0, output);
+
+ /* write chunk table */
+ chunk_table_entry = 1;
+ current_chunk_offset = header.chunk_data.chunk_table_offset +
+ header.chunk_data.nchunks * 4 + 4;
+
+ /* initialise chunk table */
+ for (i = 0; i <= header.chunk_data.nchunks; i++) {
+ fwrite((void*)&current_chunk_offset, sizeof(int),
+ 1, output);
+ }
+
+ /* write copyright information to file */
+ fputc(0x0, output);
+ fprintf(output,
+ "\n\n\n%s is %s\nConverted to RISC OS by TTF2F\n\n\n",
+ metrics->name_full, metrics->name_copyright);
+ fputc(0x0, output);
+ current_chunk_offset += 42 + strlen(metrics->name_full) +
+ strlen(metrics->name_copyright);
+
+ while(current_chunk_offset % 4) {
+ fputc(0x0, output);
+ current_chunk_offset++;
+ }
+
+ /* fill in offsets 0 and 1 */
+ fseek(output, header.chunk_data.chunk_table_offset, SEEK_SET);
+ fwrite((void*)&current_chunk_offset, sizeof(int), 1, output);
+ fwrite((void*)&current_chunk_offset, sizeof(int), 1, output);
+
+ for (; header.chunk_data.nchunks > 1; header.chunk_data.nchunks--) {
+
+ callback((chunk_table_entry * 100) / ((list_size / 32) + 2));
+ ttf2f_poll(1);
+
+ /* seek to start of current chunk */
+ fseek(output, current_chunk_offset, SEEK_SET);
+
+ /* write chunk */
+ current_chunk_offset += write_chunk(output,
+ chunk_table_entry - 1, glyph_list,
+ list_size);
+
+ /* align to word boundary */
+ while (current_chunk_offset % 4) {
+ fputc(0x0, output);
+ current_chunk_offset++;
+ }
+
+ /* fill in next chunk table entry */
+ fseek(output, header.chunk_data.chunk_table_offset +
+ (chunk_table_entry+1) * 4, SEEK_SET);
+ fwrite((void*)&current_chunk_offset, sizeof(int), 1,
+ output);
+
+ chunk_table_entry++;
+ }
+
+ fclose(output);
+
+ /* set type */
+ _swix(OS_File, _INR(0,2), 18, out, 0xFF6);
+}
+
+/**
+ * Write chunk to outlines file
+ *
+ * \param file Stream handle
+ * \param chunk_no The current chunk number (0..nchunks-1)
+ * \param glyph_list List of all glyphs in font
+ * \param list_size Size of glyph list
+ * \return Size of this chunk, or 0 on failure
+ */
+unsigned int write_chunk(FILE* file, int chunk_no, struct glyph *glyph_list,
+ int list_size)
+{
+ struct glyph *g;
+ struct chunk *chunk;
+ unsigned int chunk_size;
+ struct outline *o, *next;
+ struct char_data *character;
+ int i;
+
+ /* create chunk */
+ chunk = calloc(1, sizeof(struct chunk));
+ if (!chunk)
+ return 0;
+
+ chunk->flags = 0x80000000;
+
+ chunk_size = sizeof(struct chunk);
+
+ /* 32 chars in each chunk */
+ for (i = 0; i != 32; i++) {
+
+ ttf2f_poll(1);
+
+ if ((chunk_no * 32) + i >= list_size)
+ /* exit if we've reached the end of the input */
+ break;
+
+ /* get glyph */
+ g = &glyph_list[(chunk_no * 32) + i];
+
+ /* no path => skip character */
+ if (g->ttf_pathlen == 0) {
+ chunk->offset[i] = 0;
+ continue;
+ }
+
+ /* offset from index start */
+ chunk->offset[i] = chunk_size - 4;
+
+ chunk = realloc((char*)chunk,
+ chunk_size+sizeof(struct char_data));
+ if (!chunk)
+ return 0;
+ character = (struct char_data*)(void*)((char*)chunk + chunk_size);
+
+ chunk_size += sizeof(struct char_data);
+
+ character->flags = CHAR_12BIT_COORDS | CHAR_OUTLINE;
+ /* character x0, y0 */
+ character->x0y0[0] = g->xMin & 0xFF;
+ character->x0y0[1] = ((g->yMin << 4) & 0xF0) |
+ ((g->xMin >> 8) & 0xF);
+ character->x0y0[2] = (g->yMin >> 4) & 0xFF;
+ /* character width, height */
+ character->xsys[0] = (g->xMax - g->xMin) & 0xFF;
+ character->xsys[1] = (((g->yMax - g->yMin) << 4) & 0xF) |
+ (((g->xMax - g->xMin) >> 8) & 0xF);
+ character->xsys[2] = ((g->yMax - g->yMin) >> 4) & 0xFF;
+
+ /* decompose glyph path */
+ glpath((chunk_no * 32) + i, glyph_list);
+
+ for (o = g->outline; o; o = next) {
+ if (!o)
+ break;
+
+ /* movement type */
+ switch (o->type) {
+ case TERMINATE:
+ /* end of outline */
+ chunk = realloc((char*)chunk,
+ chunk_size+1);
+ if (!chunk)
+ return 0;
+ *((char*)chunk+chunk_size-1) = 0;
+ chunk_size += 1;
+ break;
+ case MOVE_TO:
+ /* move to point */
+ chunk = realloc((char*)chunk,
+ chunk_size+4);
+ if (!chunk)
+ return 0;
+ /* id, no scaffold */
+ *((char*)chunk+chunk_size-1) = 1;
+ /* x, y */
+ *((char*)chunk+chunk_size) = o->data.move_to.x & 0xFF;
+ *((char*)chunk+chunk_size+1) = (((o->data.move_to.y << 4) & 0xF0) | ((o->data.move_to.x >> 8) & 0xF));
+ *((char*)chunk+chunk_size+2) = (o->data.move_to.y >> 4) & 0xFF;
+ chunk_size += 4;
+ break;
+ case LINE_TO:
+ /* draw line to point */
+ chunk = realloc((char*)chunk,
+ chunk_size+4);
+ if (!chunk)
+ return 0;
+ /* id, no scaffold */
+ *((char*)chunk+chunk_size-1) = 2;
+ /* x, y */
+ *((char*)chunk+chunk_size) = o->data.line_to.x & 0xFF;
+ *((char*)chunk+chunk_size+1) = (((o->data.line_to.y << 4) & 0xF0) | ((o->data.line_to.x >> 8) & 0xF));
+ *((char*)chunk+chunk_size+2) = (o->data.line_to.y >> 4) & 0xFF;
+ chunk_size += 4;
+ break;
+ case CURVE:
+ /* draw bezier curve to point */
+ chunk = realloc((char*)chunk,
+ chunk_size+10);
+ if (!chunk)
+ return 0;
+ /* id, no scaffold */
+ *((char*)chunk+chunk_size-1) = 3;
+ /* x1, y1 */
+ *((char*)chunk+chunk_size) = o->data.curve.x1 & 0xFF;
+ *((char*)chunk+chunk_size+1) = (((o->data.curve.y1 << 4) & 0xF0) | ((o->data.curve.x1 >> 8) & 0xF));
+ *((char*)chunk+chunk_size+2) = (o->data.curve.y1 >> 4) & 0xFF;
+ /* x2, y2 */
+ *((char*)chunk+chunk_size+3) = o->data.curve.x2 & 0xFF;
+ *((char*)chunk+chunk_size+4) = (((o->data.curve.y2 << 4) & 0xF0) | ((o->data.curve.x2 >> 8) & 0xF));
+ *((char*)chunk+chunk_size+5) = (o->data.curve.y2 >> 4) & 0xFF;
+ /* x3, y3 */
+ *((char*)chunk+chunk_size+6) = o->data.curve.x3 & 0xFF;
+ *((char*)chunk+chunk_size+7) = (((o->data.curve.y3 << 4) & 0xF0) | ((o->data.curve.x3 >> 8) & 0xF));
+ *((char*)chunk+chunk_size+8) = (o->data.curve.y3 >> 4) & 0xFF;
+ chunk_size += 10;
+ break;
+ }
+
+ next = o->next;
+ free(o);
+ }
+
+ /* shift chunk end pointer to end of character */
+ chunk_size -= 1;
+ }
+
+ /* write chunk to file */
+ fwrite((void*)chunk, chunk_size, 1, file);
+
+ free(chunk);
+
+ return chunk_size;
+}
+
diff --git a/src/outlines.h b/src/outlines.h
new file mode 100644
index 0000000..99a916b
--- /dev/null
+++ b/src/outlines.h
@@ -0,0 +1,58 @@
+#ifndef _TTF2F_OUTLINES_H_
+#define _TTF2F_OUTLINES_H_
+
+struct chunk_data {
+ int chunk_table_offset;
+ int nchunks;
+ int num_scaffold;
+ int scaffold_flags;
+ int reserved[5];
+};
+
+struct outlines_header {
+ int id;
+ char bpp;
+ char version;
+ short flags;
+ short x0;
+ short y0;
+ short X;
+ short Y;
+ struct chunk_data chunk_data;
+};
+
+#define OUTLINES_SCAFFOLD_16BIT 0x1
+#define OUTLINES_SCAFFOLD_NO_AA 0x2
+#define OUTLINES_SCAFFOLD_NON_ZERO_WINDING 0x4
+#define OUTLINES_SCAFFOLD_BIG_TABLE 0x8
+
+struct chunk {
+ unsigned int flags;
+ unsigned int offset[32];
+ unsigned char depend[4];
+};
+
+struct char_data {
+ char flags;
+ char x0y0[3];
+ char xsys[3];
+};
+
+#define CHAR_12BIT_COORDS 0x01
+#define CHAR_1BPP 0x02
+#define CHAR_BLACK 0x04
+#define CHAR_OUTLINE 0x08
+#define CHAR_COMPOSITE 0x10
+#define CHAR_HAS_ACCENT 0x20
+#define CHAR_16BIT_ASCII 0x40
+#define CHAR_RESERVED 0x80
+
+struct glyph;
+struct font_metrics;
+
+void write_outlines(const char *savein, const char *name,
+ struct glyph *glyph_list, int list_size,
+ struct font_metrics *metrics,
+ void (*callback)(int progress));
+
+#endif
diff --git a/src/utils.c b/src/utils.c
new file mode 100644
index 0000000..1aea66f
--- /dev/null
+++ b/src/utils.c
@@ -0,0 +1,39 @@
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "utils.h"
+
+char *strndup(const char *s, size_t n)
+{
+ /* this assumes s is NUL terminated - if not,
+ * some silly value will be returned */
+ size_t len = strlen(s);
+ char *res;
+
+ /* limit to n */
+ if (len > n || n == 0)
+ len = n;
+
+ res = (char *) malloc(len + 1);
+ if (res == NULL)
+ return NULL;
+
+ res[len] = '\0';
+ return (char *) memcpy(res, s, len);
+}
+
+/**
+ * Convert raw font units to units normalised with a design size of 1000
+ *
+ * \param raw Raw value from file
+ * \param ppem Design size of font
+ * \return Converted value
+ */
+long convert_units(long raw, long ppem)
+{
+ if (ppem == 1000)
+ return raw;
+
+ return (raw * 1000) / ppem;
+}
diff --git a/src/utils.h b/src/utils.h
new file mode 100644
index 0000000..8837255
--- /dev/null
+++ b/src/utils.h
@@ -0,0 +1,12 @@
+#ifndef _TTF2F_UTILS_H_
+#define _TTF2F_UTILS_H_
+
+#ifndef UNUSED
+#define UNUSED(x) ((x)=(x))
+#endif
+
+void ttf2f_poll(int active);
+char *strndup(const char *s, size_t n);
+long convert_units(long raw, long ppem);
+
+#endif