A Font Library VFlib

VFlib version 3.6.14 User's manual

Final Revision: 26 Feb 2006

Hirotsugu Kakugawa


Copyright

Copyright (C) 1996-2006 Hirotsugu Kakugawa. All rights reserved.

This file is part of the VFlib Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

Copying

GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991

Copyright (C) 1991 Free Software Foundation, Inc.
675 Mass Ave, Cambridge, MA 02139, USA

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

[This is the first released version of the library GPL.  It is
 numbered 2 because it goes with version 2 of the ordinary GPL.]

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.

This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it.

For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights.

Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library.

Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license.

The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such.

Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better.

However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries.

The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library.

Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one.

GNU LIBRARY GENERAL PUBLIC LICENSE

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  1. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
  2. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
  3. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
    1. The modified work must itself be a software library.
    2. You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
    3. You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
    4. If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
  4. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
  5. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
  6. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
  7. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
    1. Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
    2. Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
    3. If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
    4. Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
    For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
  8. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
    1. Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
    2. Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
  9. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
  10. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
  11. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
  12. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
  13. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
  14. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
  15. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

    NO WARRANTY

  16. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
  17. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

END OF TERMS AND CONDITIONS

Appendix: How to Apply These Terms to Your New Libraries

If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).

To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.

one line to give the library's name and a brief idea of what it does.
Copyright (C) year  name of author

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Library General Public License for more details.

You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

Also add information on how to contact you by electronic and paper mail.

You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the
  library `Frob' (a library for tweaking knobs) written by James Random Hacker.

  signature of Ty Coon, 1 April 1990
  Ty Coon, President of Vice

That's all there is to it!

Introduction

Today many font files are available in various font file formats. When we need a software to display or print characters which does not depend on a windowing system and/or an operating system, we must write interface routines for accessing font files in each application software again and again. To do this, programmers must have knowledge on font file formats; it will be a hard task for programmers if the number of font formats that an application software supports becomes large.

VFlib is a font library written in C providing several functions to obtain bitmaps of characters. VFlib hides the font format of font files and provides a unified API for all supported font formats. Thus, programmers for application software need not have knowledge on font file formats. Instead, any software using VFlib can support various font file formats immediately.

This document describes the fundamental concepts of VFlib and gives a brief introduction in writing programs using VFlib.

As described above, VFlib supports many font file formats and absorbs differences between font file formats. Currently, VFlib supports the following font file formats: PCF, BDF, HBF, TrueType, Type1, GF, PK, Virtual Fonts, TFM, SyotaiKurabu (a vector font format for Japanese Kanji characters), JG (another vector font format for Japanese Kanji characters), and eKanji (a bitmap font format for Kanji characters).

The VFlib system consists of two parts:

A library (`libVFlib.a' and/or `libVFlib.so')
It provides several C functions. Any application software using VFlib must link this library. VFlib (optionally) uses kpathsea, FreeType, and T1Lib libraries. Application software linked with VFlib must be linked with these external libraries, if you want to use them. Application software must be linked against kpathsea, FreeType and T1Lib in addition to VFlib if you configured VFlib to use them.
A font database file (`vflibcap')
When we open a font, information about the font file (font format, location, possibly necessary glyph modifications etc.) is necessary. This file describes such information; it is read when the initialization function of VFlib is called.

Basic concept of VFlib

Font Classes and Font Drivers
VFlib can handle multiple font file formats. Reading a font file according to its font file format is done by an internal module in VFlib corresponding to its font file format. This internal module is called a font driver. Service units provided by a font driver is called font class. From an end-user's point of view, various font formats are distinguished by various names of font classes. Font drivers themselves are internal of VFlib and invisible for end-users. Some font drivers may not read font files on disk; they may generate glyph and outlines by internal computation only. In addition, some font drivers may return glyph which are obtained as glyph by another font class (hence the name `Virtual Font library').
A View of VFlib Font From The End-User
Each (virtual) font by VFlib has its inherent information of point size, pixel size, and resolution of the target device. In addition to these font metrics are defined for each glyph. Some font file formats does not have such concepts; in such case, (1) lacking information is given in a font database file `vflibcap' or (2) the specific font driver gives such information as default values. For instance, a TrueType font file is a vector font file and does not has information on point size and resolution of the target device (such information is unnecessary since vector fonts can be scaled at any size). SyotaiKurabu font format (a vector font for Japanese Kanji) does not have font metric information at all. A font driver for this font format virtually generates font metrics by information given in a vflibcap file.
Font Names and Font Searching Mechanism
In VFlib, a font is specified by a font name when a font is requested to open. First, VFlib checks whether the font name is given in vflibcap or not. If the font name is found, VFlib reads the description for the font in vflibcap. The description contains a font class name; VFlib then invokes a font driver corresponding to the font class name. Finally the font driver opens the font file (if necessary). If the font name is not given in a vflibcap file, a font searching mechanism is invoked. Since there are many font files for X Window and TeX, this feature is introduced to avoid writing an entry for each font file. Various font drivers will be called to see whether the font can be opened. If a font driver succeeds in opening the font, font searching finishes and the VFlib font opening function returns successfully. Otherwise, font open fails. Fonts described in a vflibcap file are called explicit fonts and fonts that are searched for by the font search feature are called implicit fonts. Support for explicit and implicit fonts depends on font driver.
Obtaining Bitmaps (Glyph)
Two interfaces are provided to obtain glyph (bitmaps) of a font.
High resolution device oriented glyph
This method is suitable for devices of high resolution such as laser printers. The size of glyph is specified by the physical size of glyph and device resolution. When the size of a glyph in the source font is different from the target size, VFlib scales the source glyph internally.
Low resolution device oriented glyph
This method is suitable for low resolution devices such as CRT displays. Glyph sizes are specified by pixel size rather than by device resolution. When the size of a glyph in the source font is different from the target size, VFlib scales the source glyph internally.

Installing VFlib

VFlib uses GNU autoconf and GNU libtool to compile. According to the following procedure, compile and install VFlib.

VFlib (optionally) uses FreeType 1.3.0 or later, T1Lib 5.1 or later, and kpathsea 3.2 libraries. They must be installed before compiling VFlib if you want use them. They are available from the following sites:

  1. VFlib is tested on the following platforms: Porting to Unix-like system is easy since the source code is not specific system dependent. Porting to non-Unix-like system is not difficult; please try.
  2. Go into the directory `VFlib3-3.6.14'.
  3. Run the @command{configure} script.
    % ./configure  [RET]
    
    By default, VFlib does not support for TrueType and Type1 fonts and TeX font searching by kpathsea library for searching TeX-related font files such as GF, PK, TFM, VF. For such features, VFlib (optionally) uses FreeType library version 1.2 or later for rendering TrueType font files, T1Lib library version 5.1 or later for rendering Type 1 font files, and kpathsea library version 3.2. VFlib can be built to use these libraries by giving options when you run @command{configure} script. Probably, the following is the typical options to configure script to use TrueType and Type 1 fonts and font search feature by kpathsea library.
    % ./configure \
           --with-kpathsea \
           --with-kpathsea-includedir=/usr/local/include \
           --with-kpathsea-libdir=/usr/local/lib
           --with-freetype \
           --with-freetype-includedir=/usr/local/include/freetype \
           --with-freetype-libdir=/usr/local/lib"
           --with-t1lib \
           --with-t1lib-includedir=/usr/local/include \
           --with-t1lib-libdir=/usr/local/lib            [RET]
    
    Note: See the @command{configure-site} script; it invokes the @command{configure} script with typical settings shown above. Options for configure script is as follows:
    --enable-shared
    Enable to build a shared library version of VFlib. By default, shared library version is created, if the target system supports shared library.
    --disable-shared
    Disable to build a shared library version of VFlib.
    --disable-static
    Disable to build a static library version of VFlib. By default, static library version is not created, if the target system supports shared library.
    --enable-static
    Enable to build a shared library version of VFlib.
    --disable-bdf
    VFlib is built without the BDF font driver.
    --disable-pcf
    VFlib is built without the PCF font driver.
    --disable-hbf
    VFlib is built without the HBF font driver.
    --disable-gf
    VFlib is built without the TeX GF font driver.
    --disable-pk
    VFlib is built without the TeX PK font driver.
    --disable-tfm
    VFlib is built without the TeX TFM font driver.
    --disable-jtex
    VFlib is built without the Japanese TeX Kanji font driver.
    --disable-tex-fonts
    VFlib is built without all TeX-related font drivers, i.e., GF, PK, VF, TFM, and ASCII Japanese TeX Kanji.
    --disable-zeit
    VFlib is built without the Zeit (Syotai Kurabu) font driver.
    --disable-jg
    VFlib is built without the JG font driver.
    --disable-ekanji
    VFlib is built without the eKanji font driver.
    --disable-comic
    VFlib is built without the Japanese comic font driver.
    --disable-try
    VFlib is built without the Try font driver.
    --disable-mojikmap
    VFlib is built without the Mojikyo font mapping driver.
    --with-freetype[=LIB]
    FreeType library file is LIB. Default value is ttf. (Application programs must be linked against `libLIB.a' or `libLIB.so'.)
    --with-freetype-includedir=DIR
    FreeType include files are in DIR.
    --with-freetype-libdir=DIR
    FreeType library files are in DIR.
    --with-t1lib[=LIB]
    T1Lib library file is LIB. Default value is t1. (Application programs must be linked against `libLIB.a' or `libLIB.so'.)
    --with-t1lib-includedir=DIR
    T1Lib include files are in DIR.
    --with-t1lib-libdir=DIR
    T1lib library files are in DIR.
    --with-kpathsea=LIB
    Kpathsea library file is LIB. Default value is kpathsea. (Application programs must be linked against `libLIB.a' or `libLIB.so'.)
    --with-kpathsea-includedir=DIR
    Kpathsea include files are in DIR.
    --with-kpathsea-libdir=DIR
    Kpathsea library files are in DIR.
  4. Run @command{make} to compile VFlib.
    % make  [RET]
    
  5. Become a super user (root) and run @command{make} with @option{install} option to install. (Run @command{make} with @option{uninstall} option to uninstall.)
    # make  install [RET]
    
  6. If installation is successful, the following has been created:
    `libVFlib.a' and/or `libVFlib.so'
    These are the library files and linked with application programs.
    @command{vflserver, @command{vflmkcaptex}, @command{vflx11}, @command{vfltest}, etc.}
    -- A VFlib server and test programs on X11 By @command{vflserver}, the functionality of VFlib is available via network if @command{vflserver} is registered in `/etc/inetd.conf'. It can be used interactively by invocation from shell. Interactive use of VFlib is useful for testing or debugging purposes. @command{vflx11} is a test program that displays characters on X Window System. You can use it to test if a font is correctly configured in vflibcap file. @command{vflmkcaptex} is an automatic vflibcap generator for TeX DVI drivers, especially software in the TeX-Guy package. It is a Unix Shell script, and it invokes many subprograms (written in C) to generate font definitions for each font format. @command{vfltest} is a test program that displays characters on terminal by ascii-art form.

Installation directories are as follows:

`/usr/local/share/VFlib/3.6.14/' (= `$prefix/share/VFlib/3.6.14/')
Runtime files such as vflibcap are installed here. This runtime root directory can be changed on runtime by an environment variable VFLIB_RUNTIME_DIRECTORY. If this environment variable is not set, the default directory (`/usr/local/share/VFlib/3.6.14/') is used. Under this directory, there are following subdirectories:
`ccv'
In this directory, code conversion files are installed. This directory can be changed on runtime by setting an environment variable VFLIB_CCV_DIRECTORY. If this variable is set, default runtime directory and the value by VFLIB_RUNTIME_DIRECTORY variable are ignored.
`t1lib'
Encoding vector files for T1Lib (for Type 1 fonts) are stored in this directory. Note that the file format for encoding vector files used by T1Lib is different from those used by standard PostScript. To convert standard PostScript encoding vector files into T1Lib format, use `mkt1enc.sh' program in this directory. By default, this directory contains files converted from encoding vector files in the @command{dvips} distribution.
`ascii-jtex'
In this directory, runtime files for Japanese TeX by ASCII Coop. are installed. This directory can be changed on runtime by setting an environment variable VFLIB_ASCII_JTEX_DIRECTORY. If this variable is set, default runtime directory and the value by VFLIB_RUNTIME_DIRECTORY variable are ignored.
`doc'
This directory contains several papers on VFlib, written by Hirotsugu Kakugawa.
`/usr/local/share/VFlib/site/'
Runtime files (vflibcap, ccv files, etc.) that are created by each site should be placed here. For each versiion of VFlib, it has own runtime directory (`/usr/local/share/VFlib/x.y.z/') for default settings; and therefore, the directory where runtime files such as vflibcap in differs by versions of VFlib. In oder to use your own runtime files regardless VFlib versions, runtime files modified for your system environment should be installed in `/usr/local/share/VFlib/site/', which is called "site directory". Before searching in `/usr/local/share/VFlib/x.y.z/', VFlib searches a runtime file in site directory. Note that there is no directory hierarchy in site directory; all runtime files are in the same directory. The site directory can be changed by an environment variable VFLIB_RUNTIME_SITE_DIRECTORY.
`/usr/local/bin/'
Binary programs such as @command{vflserver}, @command{vflx11}, etc are installed here.
`/usr/local/include/'
Include file for C programs `VFlib-3_6.h' is installed here.
`/usr/local/lib/'
VFlib library files such as `libVFlib.a', `libVFlib.so' are installed here.

Install directories can be changed when you run configure script by the @option{--prefix=} option, for example. Invoke @command{configure} with @option{--help} option for details.

Programming with VFlib

Data types

bitmap type

A bitmap object is a structure of the following:

struct vf_s_bitmap {
  int              bbx_width, bbx_height; /* in pixels */
  int              off_x, off_y;          /* in pixels */
  int              mv_x,  mv_y;           /* in pixels */
  unsigned char*   bitmap;
  int              raster;
};
typedef struct vf_s_bitmap*  VF_BITMAP;

bbx_width and bbx_height are the bitmap width and height. A pair of off_x and off_y) forms a vector to the left-upper corner of the bitmap from the reference point. A pair of mv_x and mv_y is a vector to the next reference point from the current reference point. (Positive values indicate a move into the right and upper direction respectively.)

The unit of bbx_width, bbx_height, off_x, off_y, mv_x, and mv_y is pixels. bitmap is a pointer to the bitmap data; one pixel corresponds to one bit.

The left upper corner is the beginning of the bitmap data, and a raster line is defined as a horizontal line from the left to the right corner of the glyph bitmap. bitmap is a sequence of raster lines starting from the top to the bottom. The distance (in bytes) of two consecutive raster lines in memory is given by raster. Although the raster line length of a bitmap is (bbx_width+7)/8, it is not guaranteed that this value is the same as raster. The type of bitmap is a pointer to unsigned char data object, and each unsigned char data object contains eight pixels. Let P[0] be the start address of a raster line. The x-th pixel counted from the leftmost pixel (which is pixel 0) is 1 if and only if P[x/8] & (0x80>>(x%8)) is non-zero.

If bbx_width is not a multiple of 8, there exist bits that do not correspond to any pixels but their values are always zero. Even if bbx_width and/or bbx_height are zero, at least one byte is allocated for the bitmap data. Thus, bitmap is always non-NULL.

metric1 type

A metric1 object is a structure of the following:

struct vf_s_metric1 {
  double    bbx_width, bbx_height;  /* in points */
  double    off_x, off_y;           /* in points */
  double    mv_x, mv_y;             /* in points */
};
typedef struct vf_s_metric1*  VF_METRIC1;

The members of this structure are the same as the members of a bitmap object but the members' unit is point.

metric2 type

A metric2 object is a structure of the following:

struct vf_s_metric2 {
  int    bbx_width, bbx_height;     /* in pixels */
  int    off_x, off_y;              /* in pixels */
  int    mv_x, mv_y;                /* in pixels */
};
typedef struct vf_s_metric2*  VF_METRIC2;

The members of this structure are the same as the members of a bitmap object, and the members' unit is pixel also.

outline type

VFlib defines its private outline data formats for presenting vector data of characters. This data format is used by VFlib API functions VF_GetOutline() and VF_OutlineToBitmap().

Each font driver returns a outline data of a character of a font if a font driver of that font supports VF_GetOutline() function. Even if data format of a font is different from VFlib-format, a font driver converts outline data to VFlib-format data. For instance, the PCF font driver (note that PCF is a bitmap font format) supports VF_GetOutline() function and it constructs and return an outline data which is a set of square; each square corresponds to a pixel of a bitmap.

Note that not all font drivers support VF_GetOutline() function, but most of them do. The developer of font drivers are strongly recommented to implement this feature even if the font font format is bitmap-based. (The function is supported by BDF, PCF, HBF, PK, GF, TFM, Zeit, JG, TrueType, and Type 1 font drivers.)

Outline data is defined as follows:

/* Outline data */
typedef long              VF_OUTLINE_ELEM;
typedef VF_OUTLINE_ELEM   *VF_OUTLINE;

According to CPU architecture, VF_OUTLINE_ELEM is defined as int if size of long is 8.

typedef long              VF_OUTLINE_ELEM;

Outline data is an array of VF_OUTLINE_ELEM type (long or int type). Outline data consists from two parts: header and outline. The header part contains metric data and outline part contains outline representation of a character.

Documentation for this feature is not finished. See the source code (e.g., VFlib-3_6.h, raster.c, bm2ol, for example) for further information.

Functions and variables

VF_Init()

int  VF_Init(char* vflibcap, char* variable_list)

Functionality
Initialization of VFlib.
Arguments
vflibcap is a file name of vflibcap (this file is a font database). If the null pointer is given, the default path name given on compile time is used (a typical default value is /usr/local/lib/VFlib/3.6.14/vflibcap). Searching of a vflibcap file is done in the following way. First, VFlib try to open a file as given to the first argument. (That is, VFlib searches it relative to current working directory.) If not found, then VFlib try to open the file under default runtime directory (e.g., /usr/local/lib/VFlib/3.6.14/). For example, vflibcap-tex is given, VFlib first look for vflibcap-tex in current directory, and then, it looks for the file under runtime directory. Default runtime directory can be changed by an environment variable VFLIB_RUNTIME_DIRECTORY on runtime. If an environment variable VFLIB_VFLIBCAP_PATH is set, the first argument of this function is ignored and its value is used. If an environment variable VFLIB_VFLIBCAP_DIRECTORY is set, a vflibcap file is searched under a directory sepecified by this environment variable. variable_list is a list of parameters passed to VFlib. This is used to specify values of parameterized vflibcap files. (See basic.txt for parameterized vflibcap file.) The type of this argument is a string and its syntax is a sequence of Variable=Value, separated by a comma ,. For example, DPI=400, LEVEL=1, FOO=bar.
Return value
If initialization succeeds, a non-negative integer is returned. If initialization fails, a negative integer is returned.

vf_error

int  vf_error 
Functionality
This is a global variable. Holding the error code of VFlib. If no error, it keeps 0. If an error occurs, the corresponding error code is set.

VF_ClearError()

void  VF_ClearError(void)
Functionality
Clear the error code variable of VFlib.

VF_OpenFont1()

int  VF_OpenFont1(char* font_name,
                  double dpi_x, double dpi_y, double point_size, 
                  double mag_x, double mag_y)
Functionality
Open a font. (If the same font is opened multiple times, VFlib keeps track of the number of opened font instances of the font.) Since the font is opened with device resolution, point size and magnification, a font opened by this function may be useful for high resolution devices such as laser printers.
Arguments
The argument font_name is a name of the font to be opened. The device resolution of the target device is specified by dpi_x (horizontal) dpi_y (vertical). These values are given in DPI (dots per inch). The argument point_size specifies the size of the bitmap. If this argument is negative the bitmap size will be the inherent size of the font. To obtain a magnified bitmap, give a magnification factor to the argument mag_x (horizontal) and mag_y (vertical). If the argument point_size is non-negative, font size will be point_size times mag_x (mag_y) large for horizontal (vertical) direction.
Return Value
A non-negative integer is returned on success. This value is a font identifier (font id); it is used to specify a font for further font operations. If VF_OpenFont1() fails, a negative integer is returned.

VF_OpenFont2()

int  VF_OpenFont2(char* font_name,
                  int pixel_size, double mag_x, double mag_y)
Functionality
Open a font. (If the same font is opened multiple times, VFlib keeps track of the number of opened font instances of the font.) Since the font is opened with pixel size and magnification, a font opened by this function may be useful for low resolution devices such as CRT display.
Arguments
The argument font is a name of the font to be opened. The argument pixel_size specifies the size of the bitmap. If this argument is negative the bitmap size will be the inherent size of the font. To obtain a magnified bitmap, give a magnification factor to the argument mag_x (horizontal) and mag_y (vertical). If the argument point_size is non-negative, font size will be pixel_size times mag_x (mag_y) large for horizontal (vertical) direction.
Return Value
A non-negative integer is returned on success. This value is a font identifier (font id); it is used to specify a font for further font operations. If VF_OpenFont2() fails, a negative integer is returned.

VF_CloseFont()

int  VF_CloseFont(int font_id)
Functionality
Close a font.
Arguments
The argument font_id is a font id to be closed.
Return Value
A non-negative integer is returned on success. A negative integer is returned on failure.

VF_GetBitmap1()

VF_BITMAP  VF_GetBitmap1(int font_id, long code_point,
                         double mag_x, double mag_y)
Functionality
Obtain a glyph bitmap of given font id and code point. The font id font_id must be an id by VF_OpenFont1(). Size of bitmap to be obtained can be specified by mag_x and mag_y arguments.
Arguments
font_id specifies the font; code_point specifies the code point of a character. To obtain a magnified bitmap, give a magnification factor to the argument mag_x (horizontal) and mag_y (vertical). If a font is opened with magnification factor 2 and an bitmap is obtained by this function with magnification factor 2, then the size of yielding bitmap will be 4 times larger than the original size.
Return Value
The return value is a pointer to a newly allocated bitmap object. If it fails to obtain a bitmap, the null pointer is returned. If the bitmap object is no longer needed, it must be released by the function VF_FreeBitmap(). The font may not have the specified size; in such case, VFlib internally enlarges or shrinks the glyph to obtain a bitmap of the requested size.

VF_GetBitmap2()

VF_BITMAP  VF_GetBitmap2(int font_id, long code_point,
                         double mag_x, double mag_y)
Functionality
Obtain a glyph bitmap of given font id and code point. The font id 'font_id' must be an id by VF_OpenFont2(). Size of bitmap to be obtained can be specified by pixel_size, mag_x and mag_y arguments.
Arguments
font_id specifies the font; code_point specifies the code point of a character. To obtain a magnified bitmap, give a magnification factor to the argument mag_x (horizontal) and mag_y (vertical). If a font is opened with magnification factor 2 and an bitmap is obtained by this function with magnification factor 2, then the size of yielding bitmap will be 4 times larger than the original size.
Return Value
The return value is a pointer to a newly allocated bitmap object. If it fails to obtain a bitmap, the null pointer is returned. If the bitmap object is no longer needed, it must be released by the function VF_FreeBitmap(). The font may not have the specified size; in such case, VFlib internally enlarges or shrinks the glyph to obtain a bitmap of the requested size.

VF_GetMetric1()

VF_METRIC1  VF_GetMetric1(int font_id, long code_point,
                          VF_METRIC1 metric1,
                          double mag_x, double mag_y)
Functionality
Obtain font metrics of a given font and code point.
Arguments
Same arguments as of VF_GetBitmap1().
Return Value
A pointer to a metric1 object is returned. If an error occurs, the NULL pointer is returned. The obtained metric is a metric for a bitmap obtained by VF_GetBitmap1() with the same arguments, but the unit of the obtained metric is point. If the metric1 object is no longer needed it must be released by the function VF_FreeMetric1().

VF_GetMetric2()

VF_METRIC2  VF_GetMetric2(int font_id, long code_point,
                          VF_METRIC2 metric2,
                          double mag_x, double mag_y)
Functionality
Obtain font metrics of a given font and code point.
Arguments
Same arguments as of VF_GetBitmap2().
Return Value
A pointer to a metric2 object is returned. If an error occurs, the NULL pointer is returned. The obtained metric is a metric for a bitmap obtained by VF_GetBitmap2() with the same arguments, but the unit of the obtained metric is pixel. If the metric2 object is no longer needed, it must be released by the function VF_FreeMetric2().

VF_GetOutline()

VF_OUTLINE  VF_GetOutline(int font_id, long code_point,
                          double mag_x, double mag_y)
Functionality
Obtain outline data from a given font and code point.
Arguments
Same as VF_GetBitmap1().
Return Value
Return value is a pointer to a newly allocated outline data object. If it fails to obtain a outline data, the NULL pointer is returned. Even if the original font is a bitmap, VFlib internally creates outline data from the bitmap. If the source font is a vector font, VFlib internally converts the data format to VFlib outline data style. A bitmap of any specified size can be obtained from outline data by the function VF_Outline2Bitmap(). (Default point size and device resolution is also kept in the outline data.)

VF_OutlineToBitmap()

VF_OUTLINE  VF_OutlineToBitmap(VF_OUTLINE outline,
                               double dpi_x, double dpi_y, 
                               double point_size,
                               double mag_x, double mag_y)
Functionality
Obtain a bitmap from outline data.
Arguments
The argument outline is a pointer to an outline object to be rasterised. The arguments dpi_x, dpi_y, point_size, mag_x and mag_y are the same as the corresponding arguments of VF_GetBitmap1(). The outline data contains information on device resolution and point size specified by VF_GetOutline(). (If not specified, default values are used. Thus, bitmaps with a default size can be obtained by giving -1 for the arguments).
Return Value
A pointer to a bitmap object is returned. The NULL pointer is returned on failure. If the bitmap object is no longer needed it must be released by the function VF_FreeBitmap().

VF_GetFontBoundingBox1()

int  VF_GetFontBoundingBox1(int font_id, 
                            double mag_x, double mag_y,
                            double* w, double* h,
                            double* xoff, double* yoff)
Functionality
Obtain font bounding box information of a given font.
Arguments
The argument font_id specify a font in interest. The function writes the bounding box information to the locations pointed by w, h, xoff, and yoff. w and h point to data objects for width and height of bounding box, respectively. xoff and yoff point to data objects for largest horizontal and vertical displacement of lower left corner of bounding box from reference points. Note that these values does not guarantee the minimality; they only guarantee that all characters can be contained in a box descrived by them. If some values of w, h, xoff, or yoff are not in interest, NULL pointer can be given. The argument mag_x and mag_y are maginification factor to be scaled for a given font font_id.
Return Value
If font bounding information is successfully obtained, a non-negative integer is returned; otherwize, negative integer is returned. Units of bounding box information is in point.

VF_GetFontBoundingBox2()

int  VF_GetFontBoundingBox2(int font_id, 
                            double mag_x, double mag_y,
                            int* w, int* h,
                            int* xoff, int* yoff)

Same as VF_GetFontBoundingBox1() except units of font bounding box parameters are pixel.

VF_GetProp()

char*  VF_GetProp(int font_id, char* prop_name)
Functionality
Obtain a property of given font. (This function is font class dependent. You must be very careful to use it!)
Arguments
The argument font_id specifies a font from which to obtain a property. property_name specifies the property name.
Return Value
If the given property exists, its value is returned as a string. The string for the property value is newly allocated and must be released by free() if it is no longer needed. If the given property is undefined, the NULL pointer is returned.

VF_CopyBitmap()

VF_BITMAP  VF_CopyBitmap(VF_BITMAP bm)
Functionality
Make a copy of a bitmap object.
Arguments
The argument bm is a pointer to a bitmap object to be copied.
Return Value
A new bitmap object is allocated; all values are copied. Return value is a pointer to a new bitmap. The source bitmap bm remains unaffected. If an error occurs, the NULL pointer is returned. The obtained bitmap object must be released by VF_FreeBitmap() if it is no longer needed.

VF_MakeScaledBitmap()

VF_BITMAP  VF_MakeScaledBitmap(VF_BITMAP bm, 
                               double mag_x, double mag_y)
Functionality
Make an enlarged or shrinked bitmap.
Arguments
The argument bm specifies the source bitmap object, mag_x and mag_y give the magnification factor in the horizontal and vertical direction respectively. If the magnification factor is less than 1, a shrinked bitmap is obtained. Values for mag_x and mag_y can be arbitrary such as (mag_x > 1 and mag_y < 1) or (mag_x < 1 and mag_y > 1).
Return Value
A bitmap object whose bitmap is enlarged or shrinked is created and a pointer to the new bitmap is returned. If an error occurs, the NULL pointer is returned. The source bitmap bm remains unaffected. Use VF_FreeBitmap() if the returned bitmap object is no longer necessary.

VF_ReflectedBitmap()

VF_BITMAP  VF_ReflectedBitmap(VF_BITMAP bm, 
                              int refl_x, double refl_y)
Functionality
Make a bitmap with horizontally and/or vertically reflected image.
Arguments
The argument bm specifies the source bitmap object, refl_x and refl_y specify the reflection, respectively. If refl_x is non-zero, the image is holizontally reflected; if refl_y is non-zero, the image is vertically reflected. In case relf_x and refl_y are both zero, the effect is the same as VF_CopyBitmap().
Return Value
A new bitmap object is created and a pointer to the new bitmap is returned. If an error occurs, the NULL pointer is returned. Metrics of created bitmap is the same as that of the original bitmap. The source bitmap bm remains unaffected. Use VF_FreeBitmap() if the returned bitmap object is no longer necessary.

VF_RotatedBitmap()

VF_BITMAP  VF_RotatedBitmap(VF_BITMAP bm, int angle)
Functionality
Make a bitmap image with rotated image.
Arguments
The argument bm specifies the source bitmap object, angle gives rotation angle in degree. By the limitation of implementation, rotatin angle must be multiple of 90. The rotation angle angle must be one of the following:
VF_BM_ROTATE_0
Rotation angle is zero. Thus, the effect is the same as VF_CopyBitmap().
VF_BM_ROTATE_90
Rotation angle is 90 degree.
VF_BM_ROTATE_180
Rotation angle is 180 degree.
VF_BM_ROTATE_270
Rotation angle is 270 degree.
Return Value
A bitmap object whose bitmap is rotated is created and a pointer to the new bitmap is returned. If an error occurs, the NULL pointer is returned. The source bitmap bm remains unaffected. Use VF_FreeBitmap() if the bitmap object is no longer necessary. This function rotates a bitmap with the reference point as origin. The vector to the next reference point is also rotated. Therefore, position of the reference point and a vector to the next reference point of VF_RotatedBitmap(bm, VF_BM_ROTATE_180) and that of VF_ReflectedBitmap(bm, 1, 1) are different.

VF_DumpBitmap()

void  VF_DumpBitmap(VF_BITMAP bm)
Functionality
Print a bitmap in ASCII-art-style to stdout.
Arguments
The argument bm specifies a bitmap to be displayed.

VF_ImageOut_PBMAscii()

int  VF_ImageOut_PBMAscii(VF_BITMAP bm, FILE *fp, 
                          int image_width, int image_height,
                          int position_x, int position_y, 
                          int margin_l, int margin_r,
                          int margin_t, int margin_b,
                          int reverse, int shrink,
                          char *prog, char *title)
Functionality
Print a bitmap bm in PBM ASCII format to a file stream fp.
Arguments
bm is a bitmap to be written to a file stream fp. Size of output image (in pixel) is specified by image_width and image_height. If -1 is given for these arguments, the image size should be minimum to contain the bitmap bm. Arguments position_x and position_y specifies the horizontal and vertical position of a source bitmap bm in an output image file, respectively. These parameters have effect when image_width and image_height are specified. Possible values for position_x is
VF_IMAGEOUT_POSITION_NONE
Same as VF_IMAGEOUT_POSITION_LEFT.
VF_IMAGEOUT_POSITION_CENTER
bm is centered in output image.
VF_IMAGEOUT_POSITION_LEFT
bm is flushed left in output image.
VF_IMAGEOUT_POSITION_RIGHT
bm is flushed righted in output image.
Possible values for position_y is
VF_IMAGEOUT_POSITION_NONE
Same as VF_IMAGEOUT_POSITION_TOP.
VF_IMAGEOUT_POSITION_CENTER
bm is centered in output image.
VF_IMAGEOUT_POSITION_TOP
bm is placed at the top in output image.
VF_IMAGEOUT_POSITION_BOTTOM
bm is placed at the bottom in output image.
Arguments margin_l, int margin_r are used to speficy left and right margins, respectively. Arguments margin_t, int margin_b are used to speficy top and bottom margins, respectively. If the argument reverse is not 0, black and white in an output image is reversed. Argument shrink specifys shrink factor of image bm. (If this value is 1, bm is not shrinked. Note: Currently, shrinking image is not supported in PBM ASCII format.) Arguments prog and title are used to emmbed program name and title in an image file.

VF_ImageOut_PGMAscii()

int  VF_ImageOut_PGMAscii(VF_BITMAP bm, FILE *fp, 
                          int image_width, int image_height,
                          int position_x, int position_y, 
                          int margin_l, int margin_r,
                          int margin_t, int margin_b,
                          int reverse, int shrink,
                          char *prog, char *title)
Functionality
Print a bitmap bm in PGM ASCII format to a file stream fp.
Arguments
Arguments are the same as that of VF_ImageOut_PGMAscii(). If shrink is greater than 1, output image is anti-aliased (gray-scaled).

VF_ImageOut_PGMRaw()

int  VF_ImageOut_PGMRaw(VF_BITMAP bm, FILE *fp, 
                        int image_width, int image_height,
                        int position_x, int position_y, 
                        int margin_l, int margin_r,
                        int margin_t, int margin_b,
                        int reverse, int shrink,
                        char *prog, char *title)
Functionality
Print a bitmap bm in PGM Raw format to a file stream fp.
Arguments
Arguments are the same as that of VF_ImageOut_PGMAscii(). If shrink is greater than 1, output image is anti-aliased (gray-scaled).

VF_ImageOut_EPS()

int  VF_ImageOut_EPS(VF_BITMAP bm, FILE *fp, 
                     int image_width, int image_height,
                     int position_x, int position_y, 
                     int margin_l, int margin_r,
                     int margin_t, int margin_b,
                     int reverse, int shrink,
                     char *prog, char *title,
                     double ptsize, int pixsize)
Functionality
Print a bitmap bm in EPS (Encapsulated PostScript) format to a file stream fp.
Arguments
Arguments are the same as that of VF_ImageOut_PGMAscii(). If shrink is greater than 1, output image is anti-aliased (gray-scaled). Arguments ptsize and pixsize specify size of EPS bounding box; pixsize pixels occupy ptsize points in physical paper.

VF_ImageOut_ASCIIArt()

int  VF_ImageOut_ASCIIArt(VF_BITMAP bm, FILE *fp, 
                          int image_width, int image_height,
                          int position_x, int position_y, 
                          int margin_l, int margin_r,
                          int margin_t, int margin_b,
                          int reverse, int shrink)
Functionality
Print a bitmap bm in ASCII art format to a file stream fp.
Arguments
Arguments are the same as that of VF_ImageOut_PGMAscii().

VF_ImageOut_ASCIIArtV()

int  VF_ImageOut_ASCIIArtV(VF_BITMAP bm, FILE *fp, 
                           int image_width, int image_height,
                           int position_x, int position_y, 
                           int margin_l, int margin_r,
                           int margin_t, int margin_b,
                           int reverse, int shrink)
Functionality
Print a bitmap bm in ASCII art format to a file stream fp. Image is rotated in clockwise, 90 degree.
Arguments
Arguments are the same as that of VF_ImageOut_PGMAscii().

VF_FreeBitmap()

void  VF_FreeBitmap(VF_BITMAP bm)
Functionality
Release a bitmap object.
Arguments
The argument bm is a pointer to a bitmap object to be released.

VF_FreeMetric1()

void  VF_FreeMetric1(VF_METRIC1 metric)
Functionality
Release a metric1 object.
Arguments
The argument metric is a pointer to a metric1 object.

VF_FreeMetric2()

void  VF_FreeMetric2(VF_METRIC2 metric)
Functionality
Release a metric2 object.
Arguments
The argument metric is a pointer to a metric2 object.

VF_InstallFontDriver()

int  VF_InstallFontDriver(char* class_name, 
                          int(*driver)(VF_FONT font, 
                                       char* class_name,
                                       char* font_name,
                                       int implicit_flag));
Functionality
Install a font driver.
Arguments
class_name is a font class name, driver is a pointer to a function of a font driver of the font class. The function given by driver is called when a font of this font class is opened by VF_OpenFont1() and VF_OpenFont2(). The function driver is called with parameters of the font to be opened: font is a data object for font management defined by VFlib internally. class_name is the font class name. font_name is the name of the font to be opened. This argument is the same as the argument of VF_OpenFont1() and VF_OpenFont2(). implicit_font is a flag whose value is 1 if a font is to be opened as an implicit font (a font which does not explicitly appear in vflibcap) and 0 if it is to be opened as an explicit font (a font that does appear in vflibcap).
Return Value
If successful, a non-negative integer is returned. A negative integer is returned if the installation of the font driver fails.

Building an application software with VFlib

An application software that use VFlib must include a header file `VFlib-3_6.h'. Typically, this file is installed `/usr/local/include/' directory.

Never forget, that application software that uses VFlib must be linked against FreeType 1.2 or later (`libttf.a' or `libttf.so'), T1Lib 5.1 or later (`libt1.a' or `libt1.so'), and kpathsea 3.2 (`libkpathsea.a' or `libkpathsea.so'), if you configure VFlib to use them. (If VFlib is configured not to use them, they are not necessary.)

I recommend shared library versions for these optional libraries if you built a shared library version of VFlib.

#include <VFlib-3_6.h>

VFlib must be initialized before it is used.

char* vflibcap = "vflibcap";
char* params =  "TeX_DPI=300, KPATHSEA_MODE=cx";

if (VF_Init(vflibcap, params) < 0){
  fprintf(stderr, "Initializing VFlib: failed\n");
  exit(1);
}

Following program fragment opens a font, obtains a bitmap, and print obtained bitmap.

int         fid;
VF_BITMAP   bm;

if ((fid = VF_OpenFont2("timR24.pcf", -1, 1.0, 1.0)) < 0){
  fprintf(stderr, "Opening font: failed\n");
  exit(1);
}

bm = VF_GetBitmap2(fid, 0x67, 1.0, 1.0);

VF_DumpBitmap(bm);

A simple example

The following program code is a "banner" like using VFlib. For simplicity, this program accepts only 1-byte encoded characters. It reads an input from standard input and prints characters in ascii-art form to standard output.

/* 
 * vflbanner.c - a banner by VFlib
 * by Hirotsugu Kakugawa
 *
 *
 */
/*
 * Copyright (C) 1998 Hirotsugu Kakugawa. 
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  
 */

#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "VFlib-3_6.h"

#define  DEFAULT_FONT  "timR18.pcf"

char    *vflibcap;
char    *fontname;

void  usage(void);
void  vflbanner(FILE *fp);

int
main(int argc, char **argv)
{
  vflibcap = NULL;
  fontname = DEFAULT_FONT;

  --argc; argv++;
  while (argc > 0){
    if ((argc >= 1)
        && ((strcmp(argv[0], "-h") == 0) || (strcmp(argv[0], "--help") == 0))){
      usage();
      exit(0);
    } else if ((argc >= 2) && (strcmp(argv[0], "-v") == 0)){
      --argc; argv++;
      vflibcap = argv[0];
      --argc; argv++;
    } else if ((argc >= 2) && (strcmp(argv[0], "-f") == 0)){
      --argc; argv++;
      fontname = argv[0];
      --argc; argv++;
    } else {
      break;
    }
  }

  vflbanner(stdin);

  return 0;
}

void usage(void)
{
  printf("vflbanner - a banner program using VFlib\n");
  printf("Usage: vflbanner [-v vflibcap] [-f fontname]\n"); 
  printf("This program reads a text from standard input.  It supports\n");
  printf("1-bit encoded font only. Thus, `ctextpgm' is better than this.\n");
}

void
vflbanner(FILE  *fp)
{
  int  fid;
  int  ch; 
  int  pos_x, pos_y; 
  VF_BITMAP  bm, page_bm;
  struct vf_s_bitmaplist  PageBuff;

  if (VF_Init(vflibcap, NULL) < 0){
    printf("VFlib initialization error");
    switch (vf_error){
    case VF_ERR_INTERNAL:
      printf(" - Internal error.\n"); break;
    case VF_ERR_NO_MEMORY:
      printf(" - Server runs out of memory.\n"); break;
    case VF_ERR_NO_VFLIBCAP:
      printf(" -  No vflibcap.\n"); break;
    default: 
      printf(" -  Error code %d\n", vf_error); break;
    }
    fflush(stdout);
    exit(1);
  }

  if ((fid = VF_OpenFont1(fontname, -1, -1, -1, 1, 1)) < 0)
    return;
    
  VF_BitmapListInit(&PageBuff);

  pos_x = pos_y = 0; 
  while ((ch = getc(fp)) != EOF){
    if (!isprint(ch))
      ch = ' ';
    if ((bm = VF_GetBitmap1(fid, (long)ch, 1, 1)) == NULL)
      continue;
    VF_BitmapListPut(&PageBuff, bm, pos_x, pos_y);
    pos_x = pos_x + bm->mv_x;
  }

  page_bm = VF_BitmapListCompose(&PageBuff);
  VF_DumpBitmap(page_bm);
  VF_BitmapListFinish(&PageBuff);
  VF_FreeBitmap(page_bm);

  VF_CloseFont(fid);
}

/*EOF*/

By the following commands is used to comple the program.

% gcc -c `VFlib3-config --cflags` vflbanner.c
% gcc -o vflbanner vflbanner.o `VFlib3-config --libs` 

@command{VFlib3-config} is a program to print misc information on configuration of VFlib. It prints C compiler option to specify include directory (@option{--cflags}), dependent libraries (@option{--libs}), for example. Run @command{VFlib3-config} with @option{--help} option for detail.

Writing a vflibcap

Introduction to vflibcap

A vflibcap file is a database of font definitions for the VFlib library. A vflibcap font definition is described in a format similar to termcap and printcap. Vflibcap provides logical font names and logical font names may not corresponds to font files to be accessed. In this document, we simply say "font" to denote logical fonts.

Each VFlib fonts have its own parameters listed below:

These parameters may not be available in font file. For instance, these parameters are lacking in TrueType fonts. Lacking information is given in vflibcap file, or it is given by a font driver as default values.

Note: If you want to use VFlib for TeX DVI drivers, such as previewers and pronter driver, use @command{vflmkcaptex} program to generate vflibcap file automatically.

Syntax of vflibcap

The syntax of vflibcap file is lisp-like form. A semicolon ; starts a comment and following text is ignored until the end of line. A colon in a string which is enclosed by double colons is not considered as a comment character and forms a part of string. In the following explanation, we ignore comments.

A vflibcap file is a sequence of expressions called s-expressions. Basic data item of s-expression is string. Unlike lisp, there is no "number" type. A sequence of digits is parsed as a string. To include a special characters in a string such as double quotation, control code, and parenthesis, escape sequence can be used. String is a sequence of characters of the following form:

String Form 1:
Sequence of characters enclosed by double quotations. Examples:
   "hello world"
   "a, b, c, d"
   "He said \"Thanks!\"."
   "a*(b+c)"
String Form 2:
Sequence of characters except space, tab, newline, and closing parenthesis. A start character must not be a double quotation. Examples:
   font-file
   hello\ world
   He\ said\ \"Thanks!\".
   a*\(b+c\)

Unlink lisp, there is no distinction between string and symbol in vflibcap; they are the same data type. That is, HELLO and "HELLO" are the same.

Parentheses is used to form a "list" like in lisp. For example, (A B C) is a list of three strings. List can be nested any depth, e.g., (A (B1 B2 B3) (C1 (C21 C22) C3)).

A vflibcap must be a sequence of s-expression of the following forms:

(define-default FONT-CLASS CAPABILITY-DEF ... )
This expression defines a default values for a font class.
(define-font NAME CAPABILITY-DEF ... )
This expression defines a font.
(define-macro NAME CAPABILITY-DEF ... )
This expression defines a macro NAME.

CAPABILITY-DEF must be a list of form (CAPABILITY-NAME VALUE), e.g., (font-file "/usr/local/share/fonts/". Each font class defines its own set of capabilities and capability sets can be different by font classes.

This is an example of vflibcap file.

;; vflibcap
(define-default VFlib
  (extension-hints         (".bdf" bdf) (".pcf" pcf))
  (uncompression-programs  (".Z" "zcat") (".gz" "gzip -cd")
                           ("pk" ascii-jtex-kanji))
  (implicit-font-classes   bdf pcf hbf ascii-jtex-kanji)
  (variable-values     ("TeX_DPI" "300"))

(define-default bdf
  (filename-extensions ".bdf")
  (font-directories
     "/usr/X11R6/lib/X11/fonts//" "/usr/local/share/fonts/X11//")
  (compression-extensions ".gz" ".Z"))

(define-font timR24  ; times roman 24
  (font-class bdf)
  (font-file "timR24.bdf"))

(define-font timR18  ; times roman 18
  (font-class bdf)
  (font-file "timR18.bdf"))

Macros in vflibcap

To avoid writing the same capabilities, macro feature is provided in vflib. In case of CAPABILITY-DEF is a string, it is treated as a macro and a macro definition for it is expanded. For instance,

(define-font timR18
  MACRO-NAME
  (font-file "timR18.bdf"))

is a font definition using a macro MACRO-NAME. Suppose a macro MACRO-NAME is defined as follows.

(define-macro MACRO-NAME
  (font-class bdf)
  (dpi 300))

Then, the font definition for timR24 is the same as follow.

(define-font timR18
  (font-class bdf)
  (dpi 300))
  (font-file "timR18.bdf"))

The rule of macr expand is as following procedure.

  1. Looks for use of macros. From the first CAPABILITY-DEF to the last one, it is checked if it is a string (thus a macro) or not in order. If it is a macro, corresponding macro definition is substituted. Then, next CAPABILITY-DEF is checked.
  2. Macro expand is done recursively. Thus, a macro can be used in another macro.

Searching font files

Some font classes (e.g., BDF, PCF) defines a font-directories capability in vflibcap file. This capability specifies a list of font directories, for instance, (font-directories "/usr/local/fonts/" "/opt/fonts" "/usr/local/share/fonts//"). A font file can be searched recursively in a directory tree if a font directory name ends by double slashes //.

Some font drivers support file search by kpathsea. Typically, font files are located under `/usr/local/share/texmf'. This directory is used to hold TeX-related files. If a font driver supports searching by kpathsea, a special name TEXMF can be given in a list of font-directories capability. For instance, suppose that (font-directories "/opt1/fonts//" "TEXMF" "/opt2/fonts//") is specified. Then files are searched under /opt1/fonts, by kpathsea, and then /opt2/fonts, in this order.

Currently, pk, gf, tfm, vf, truetype, and type1 font classes suport searcing files by kpathsea.

Fast font file search

In case there are many font directories and sub-directory which contains many font file, searching a font file take long time, since font directories are traversed to find a requested font file. For fast font file search, font file hint database (FDB for short) can be used. It is placed in a root of a font directory, and it contains pairs of font file name and relative pathname of the font file from the font directory. The file name of FDB is VFlib.fdb.

The following is an example of FDB file.

times__m.pfb	type1/t/times__m.pfb
times__m.afm	type1/t/times__m.afm
zac_____.ttf	ttf/z/zac_____.ttf
zalescap.ttf	ttf/z/zalescap.ttf

Suppose that this FDB file is located in `/foo/bar/', for instance. The file tells us that there is a file `times__m.pfb' and absolute path name of the file is `/foo/bar/type1/t/times__m.pfb'.

If FDB file is found in a root directory of font directory, the FDB file is opened to find a requested font file. If a requested font file is not found, other font directory is searched, i.e., the directory is not traversed at all. In case FDB file is not found, a font directory is traversed to find a requested font file.

It is important to remember that you must not forget to update FDB file after you added new font files in a font directory. If you forget, installed font files are not found evenif they are in a font directory. To update a FDB file, run the utility program vflmkfdb. See section vflmkfdb, for details of the program.

A FDB file must be located in a root of a font directory and its name must be `VFlib.fdb'. Even if there is a FDB file in a sub-directory of a font directory, VFlib does not look for it.

Compressed font files

To reduce disk storage, compressed font files and uncompression on the fly is supported by some font class. Note that this feature is font class dependent and not all font class support this.

In a vflibcap file, a font file name need not have a compressed type extension, such as .gz. When VFlib searches a font file, it internally adds compressed type extension and finds a file.

Explicit and implicit fonts

Fonts explicitly defined in a vflibcap file are called explicit fonts. Fonts does not appear vflibcap file and searched by font drivers on demand are called implicit fonts.

Variables in vflibcap

In a vflibcap file, variables can be used as capability values. A capability value can be a value of a variable if a dollar sign ($) followed by a variable name is given.

For instance, (dpi $TeX_DPI) can be used instead of (dpi 300). The value for a variable must be defined somewhere. Default value can be given in (define-default VFlib ...), which will be explained later.

Default values can be overridden on initialization function of VFlib VF_Init(), or Unix environment variables VFLIBCAP_PARAM_var. For example, VFLIBCAP_PARAM_TeX_DPI is defined, its value becomes the value of the vflibcap variable TeX_DPI.

The value of an environment variable VFLIBCAP_PARAM_var is parsed as an S-expression, not as an string. Thus, if you want to specify a string ABC 123, the value of an environment variablue must be \"abc 123\". (Without double quotation, it will be a sequence of two strings. Only the first one is effective and the second one is ignored.)

VFlib defaults

To specify global behavior of VFlib, (virtual) font class VFlib is defined.

The following capability are defined.

implicit-font-classes (optional)
--- A list of implicit font classes. Font classes listed by this capability is candidates for implicit font searching. example: (implicit-font-classes "bdf" "pcf" "gf")
extension-hints (optional)
--- A list of paris of font name postfix and corresponding font class name. This is hint information to find font class from a font name in case of searching an implicit font. If an implicit font name matches with a postfix given by this capability, specified font class is invoked to search an implicit font. This is effective to reduce time to search an implicit font. example: (extension-hints (".pcf" pcf) (".bdf" bdf) ("gf" gf))
variable-values (optional)
--- A list of pairs of a name of vflibcap variable and its default value. example: (variable-values ("TeX_DPI" "300") ("TeX_KPATHSEA_MODE" "cx") (v ("p1" "v1")
uncompression-programs (optional)
--- A list of pairs of file name extension and corresponding uncompression program. This is used for reading compressed font files. An uncompression program must output uncompressed data to standard output. This capability is just defines relations of an extension and an uncompression program. A list of supported compressed types of a font class is given in a font class default description of each font class. example: (uncompression-programs (".Z" "zcat") (".gz" "gzip -cd")
code-conversion-files (optional)
--- A list of file names for encoding conversion. Currently, TrueType font class uses this. See section Code conversion system. example: (code-conversion-files "iso8859-1_unicode.ccv".ccv")
use-kpathsea (optional)
--- A flag whether kpathsea is used or not to search TeX font files. Value of this capability must be one of "Yes" or "No". example: (use-kpathsea "Yes")
kpathsea-mode (optional)
--- A device mode name for kpathsea library. example: (kpathsea-mode "cx")
kpathsea-dpi (optional)
--- Device resolution (in dpi) of a device mode for kpathsea library. example: (kpathsea-mode 300)
kpathsea-program-name (optional)
--- An application program name for kpathsea library. example: (kpathsea-mode "xgdvi")

BDF font class

The BDF format is a bitmap font format encoded in human-readable, platform independent format for distributing X Window fonts.

This font class supports compressed font files and implicit fonts.

Font class name: bdf

Capabilities for font class default:

font-directories (optional)
--- A list of font directories for searching font files. Recursive searching of font files is support.
compression-extensions (optional)
--- A list of supported compression type for this font class. This font class supports only compression type given by this capability. When a font is searched, a file followed by a compression extension is searched if given font file is not found. (Note that uncompression-programs capability of VFlib class default description gives a uncompression programs.) example: (compression-extensions ".gz" ".Z")
dpi (optional)
--- Defualt device resolution. Default horizontal and vertical resolutions will be the same value. example: (dpi 300)
dpi-x (optional)
--- Default horizontal device resolution. example: (dpi-x 300)
dpi-y (optional)
--- Default vertical device resolution. example: (dpi-y 300)
aspect-ratio (optional)
--- Aspect ratio of characters. If this value is 0.5 then width is half, and if 2 then width is doubled. example: (aspect-ratio 0.8)
properties (optional)
--- A list of pairs of a property name and its value. Property values given by this parameter is used by VF_GetProp() example: (properties ("PROP-1" "value-1") ("PROP-2" "value-2"))
variable-values (optional)
--- A list of pairs of a vflibcap variable name and its default value. example: (variable-values ("TeX_DPI" "300") ("TeX_KPATHSEA_MODE" "cx") ("TeX_KPATHSEA_PROGRAM" "/usr/X11R6/xldvi"))


Capabilities for font definition:

font-class (essential)
--- A font class name. This value must be bdf.
font-directories (optional)
--- A list of font directories for searching font files. Recursive searching of font files is support. A font file is searched in the directories given by this capability. If this capability is not given, the font directory specified by the class default is used to search fonts. If this capability is given, the font directory specified by the class default is not used to search fonts.
font-file (optional)
--- A font file name string. If this capability is not specified, the font name is used as the font file name. Multiple font file names can be listed in this capability. The driver tries to open a font listed first. If it is impossible to open, then it tries to open the second font. This is repeated until a font is successfully opened. If all fonts are impossible to open, font open fails. example: (font-file "timI24.bdf" "timR24.bdf")
point-size (optional)
--- font size in points. If the size is different from the size defined in the BDF font file, the bitmap is enlarged or shrinked to yield the specified size. This capability has effect for the VFlib functions VF_GetBitmap1() and VF_GetMetric1(). example: (point-size 24.0)
pixel-size (optional)
--- font size in pixels. If the size is different from the size defined in the BDF font file, the bitmap is enlarged or shrinked to yield the specified size. This capability has effect for the VFlib functions VF_GetBitmap2() and VF_GetMetric2(). example: (pixel-size 24)
magnification (optional)
--- magnification factor. The font is magnified by this factor. example: (magnification 1.20)
character-set (optional)
--- This is used for code point conversion. Value of this capability gives an external view of a character set of a font. Code conversion (ccv) is determined by this value and the following three capabilities.
encoding (optional)
--- This is used for code point conversion. Value of this capability gives an external view of an encoding of a font.
font-character-set (optional)
--- This is used for code point conversion. Value of this capability gives an internal view of a character set of a font. Therefore, this value must match the character set of the font file given by font-file capability.
font-encoding (optional)
--- This is used for code point conversion. Value of this capability gives an internal view of an encoding of a font. Therefore, this value must match the encoding of the font file given by font-file capability. The following example defines a font named iso8859_5-font with ISO-8859-5 encoding by using a KOI8-R encoded font file.
(define-font iso8859_5-font
  (font-class pcf)
  (character-set "ISO8859-5")   (encoding "ISO")
  (font-character-set "KOI8-R") (font-encoding "KOI8-R")
  (font-file "koi8x13.pcf"))
Code conversion is done by a subsystem named CCV. See section Code conversion system for detail.

PCF font class

Font class name: pcf

Other specification is the same as BDF font class except font class name is pcf.

HBF font class

Font class name: hbf

Other specification is the same as BDF font class except font class name is hbf.

TrueType font class

TrueType is a vector font font format. This font class supports implicit fonts but does not support compressed font files. TrueType font driver uses FreeType library version 1.2 developed by David Turner, Robert Wilhelm, and Werner Lemberg. See http://www.freetype.org/ for detail.

Font class name: truetype

Capabilities for font class default:

font-directories (optional)
--- A list of font directories. This driver supports font file search by kpathsea. To search a font file by kpathsea, use TEXMF for a directory name.
point-size (optional)
pixel-size (optional)
dpi (optional)
dpi-x (optional)
dpi-y (optional)
aspect-ratio (optional)
hinting (optional)
--- If the value of capability on, "hinting" information is used to render characters. This is effective when small characters are rendered. If the value is off, hinting is disabled. Hinting information is used by default. Note that enabling hinting has effect when obtaining bitmaps. It has no effect when you obtain and rasterize outline data in VFlib format, since VFlib outline format does not supports hinting information.
platform-id (optional)
--- A TrueType font can have multiple character code - glyph mapping tables. A mapping table is selected by specifying a pair of platform ID (Microsoft, Macintosh, etc) and encoding ID (Unicode, Shift-JIS, etc). This capability is used to specify platform ID of a mapping table to be selected. Value of this capability is one of strings below:
apple
Apple platform
macintosh, mac
Macintosh platform
ascii, iso
ISO platform
microsoft, windows, ms
Microsoft platform
any, ?, *
Any platform
Default value for this capability is Microsoft platform. example: (platform-id "microsoft")
encoding-id (optional)
--- Together with platform id, this capability is used to specify a mapping table. When ISO platform is selected by the encoding-id capability, value of this encoding-id capability is one of strings below:
ascii
ASCII encoding.
iso10464
ISO 10464 encoding.
iso8859-1
ISO8859-1 encoding.
any, ?, *
Any encoding.

When Apple platform is selected by the encoding-id capability, value of this encoding-id capability is one of strings below:
unicode1.1
Unicode 1.1 encoding.
unicode2.0
Unicode 2.0 encoding.
iso10464
ISO 10464 encoding.
any, ?, *
Any encoding

When Microsoft platform is selected by the encoding-id capability, value of this encoding-id capability is one of strings below:
symbol
unicode
Unicode encoding.
shift-jis, sjis, ms-kanji
Shift JIS encoding.
big5
Big5 encoding.
rpc
wansung
johab
any, ?, *
Any encoding

When Macintosh platform is selected by the encoding-id capability, value of this encoding-id capability is one of strings below:
roman
japanese
traditional-chinese
korean
arabic
hebrew
greek
russian
any, ?, *
Any encoding
example: (encoding-id "any")
properties (optional)
variable-values (optional)


Capabilities for font definition:

font-class (essential)
This value must be "truetype".
font-directories (optional)
--- A list of font directories for searching font files. Recursive searching of font files is support. A font file is searched in the directories by this capability. If not found, then a font is searched in a directories given by the class default. To search a font file by kpathsea, use TEXMF for a directory name.
font-file (optional)
point-size (optional)
pixel-size (optional)
dpi (optional)
dpi-x (optional)
dpi-y (optional)
magnification (optional)
aspect-ratio (optional)
hinting (optional)
font-number (optional)
encoding-force (optional)
--- In case encoding id data is broken in a TrueType font, its value can be overridden by this capability. example (encoding-force "unicode")
character-set (optional)
--- Together with encoding capability, this capability is used to change "external view" of a font. A font would be a font of a character set given by this capability and encoding given by encoding capability. Conversion of font internal character set and encoding to an external view is determined by these capability. Conversion is done by by code conversion system, called CCV. section Code conversion system Code conversion files are specified in code-conversion-files in VFlib font class default. See section VFlib defaults. For example, a font of JIS X 0208 character set (a Japanese character set) in Shift-JIS encoding fonts can be accessed as a JIS encoding font.
encoding (optional)
--- Together with character-set capability, this capability defines a external view of a font. section Code conversion system
properties (optional)
jisx0212-row47-empty-sjis (optional)
--- This capability is used for an ad-hoc solution to handle JIS X 0212 fonts with non-standard encoding such that row 47 is empty and followed rows are shifted by one. (That is, Kanjis in row 48 of JIS X 0212 appeard in row 49 in such fonts.) JIS X 0212 fonts of Ricoh TrueTypeWorld ValueFont DX are such fonts. If yes is given to this capability, buggy encoding is virtually fixed. This capability can apply to other products of buggy encoded JIS X 0212 fonts whose internal encoding is Shift JIS. (Use ftdump utility of FreeType package to check internal encoding scheme of fonts.)

Type1 font class

Type1 is a vector font font format used by PostScript. This font class supports implicit fonts but does not support compressed font files. This Type1 font driver uses T1Lib library version 5.1 or later developed by Rainer Menzner. See http://www.neuroinformatik.ruhr-uni-bochum.de/ini/PEOPLE/rmz/t1lib/t1lib.html for detail.

Be careful, VFlib does not work with old T1Lib. Obtain and install T1Lib 5.1 or later.

Currently, this font driver supports only 8-bit encoded fonts, i.e., it does not support for fonts of Japanese Kanji characters.

The function VF_GetOutline() for Type1 font files is supported but the result is ugly. Since T1Lib does not have a function to obtain outline data of a character in Type1 font, this font driver creates an outline data from a bitmap (for compatibility). Thus, it is very ugly. If your applica