diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2009-05-07 15:22:02 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2009-05-07 15:22:02 +0000 |
commit | a98d8fb5e49436c6fedea37797225293284b9894 (patch) | |
tree | f140662044f20668b937c9f3b451c56345678108 | |
download | ttf2f-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/!Boot | 11 | ||||
-rw-r--r-- | !TTF2f/!Help | 193 | ||||
-rw-r--r-- | !TTF2f/!Run | 31 | ||||
-rw-r--r-- | !TTF2f/!Sprites22 | bin | 0 -> 2504 bytes | |||
-rw-r--r-- | !TTF2f/Glyphs | 1406 | ||||
-rw-r--r-- | !TTF2f/History | 27 | ||||
-rw-r--r-- | !TTF2f/Messages | 4 | ||||
-rw-r--r-- | !TTF2f/Res | bin | 0 -> 1644 bytes | |||
-rw-r--r-- | Makefile | 31 | ||||
-rw-r--r-- | src/Makefile | 4 | ||||
-rw-r--r-- | src/encoding.c | 71 | ||||
-rw-r--r-- | src/encoding.h | 11 | ||||
-rw-r--r-- | src/fm.h | 31 | ||||
-rw-r--r-- | src/ft.c | 569 | ||||
-rw-r--r-- | src/ft.h | 20 | ||||
-rw-r--r-- | src/glyph.h | 39 | ||||
-rw-r--r-- | src/glyphs.c | 101 | ||||
-rw-r--r-- | src/glyphs.h | 8 | ||||
-rw-r--r-- | src/intmetrics.c | 154 | ||||
-rw-r--r-- | src/intmetrics.h | 12 | ||||
-rw-r--r-- | src/main.c | 456 | ||||
-rw-r--r-- | src/outlines.c | 297 | ||||
-rw-r--r-- | src/outlines.h | 58 | ||||
-rw-r--r-- | src/utils.c | 39 | ||||
-rw-r--r-- | src/utils.h | 12 |
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 Binary files differnew file mode 100644 index 0000000..c63ecfd --- /dev/null +++ b/!TTF2f/!Sprites22 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 Binary files differnew file mode 100644 index 0000000..5a10a54 --- /dev/null +++ b/!TTF2f/Res 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*)¤t_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*)¤t_chunk_offset, sizeof(int), 1, output); + fwrite((void*)¤t_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*)¤t_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 |