From 66cbc209785593cc6080389fac3f0ae5f7b46b6b Mon Sep 17 00:00:00 2001 From: David Turner Date: Thu, 20 Mar 2003 07:04:40 +0000 Subject: [PATCH] * docs/*: serious rewriting of the documentation * include/freetype/internal/ftobjs.h, src/base/ftobjs.c, src/bdf/bdfdrivr.c, src/pcf/pcfdriver.c, src/pfr/pfrsbit.c, src/sfnt/ttsbit.c, src/type42/t42objs.c, src/winfonts/winfnt.c: introduced three new functions to deal with glyph bitmaps within FT_GlyphSlot objects. these are: ft_glyphslot_free_bitmap ft_glyphslot_alloc_bitmap ft_glyphslot_set_bitmap these are much more convenient to use than managing the FT_GLYPH_OWN_BITMAP flag manually. the font drivers have been modified to use them as well. * src/cache/ftlru.c: fixed an invalid assertion check --- ChangeLog | 5 + Jamfile | 5 +- docs/BUGS | 275 ---------------------------- docs/BUILD | 276 ----------------------------- docs/CHANGES | 8 + docs/CUSTOMIZE | 117 ++++++++++++ docs/{DEBUG.TXT => DEBUG} | 2 +- docs/INSTALL | 226 ++++++----------------- docs/INSTALL.ANY | 96 ++++++++++ docs/INSTALL.GNU | 128 +++++++++++++ docs/INSTALL.UNX | 181 +++++++++++++++++++ docs/{readme.vms => INSTALL.VMS} | 0 docs/TRUETYPE | 23 +++ docs/UPGRADE.UNX | 124 +++++++++++++ docs/license.txt | 31 +++- include/freetype/internal/ftobjs.h | 24 +++ src/base/ftobjs.c | 59 ++++-- src/bdf/bdfdrivr.c | 12 +- src/cache/ftlru.c | 2 +- src/pcf/pcfdriver.c | 5 +- src/pfr/pfrsbit.c | 7 +- src/sfnt/ttsbit.c | 39 ++-- src/type42/t42objs.c | 13 +- src/winfonts/winfnt.c | 20 +-- 24 files changed, 868 insertions(+), 810 deletions(-) delete mode 100644 docs/BUGS delete mode 100644 docs/BUILD create mode 100644 docs/CUSTOMIZE rename docs/{DEBUG.TXT => DEBUG} (99%) create mode 100644 docs/INSTALL.ANY create mode 100644 docs/INSTALL.GNU create mode 100644 docs/INSTALL.UNX rename docs/{readme.vms => INSTALL.VMS} (100%) create mode 100644 docs/TRUETYPE create mode 100644 docs/UPGRADE.UNX diff --git a/ChangeLog b/ChangeLog index f8c12ae71..f2e130b01 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2003-03-20 David Turner + + * docs/*: serious rewriting of the documentation + + 2003-03-15 David Turner * src/truetyoe/ttdriver.c (Set_Char_Sizes): fixed a small rounding bug. diff --git a/Jamfile b/Jamfile index 2ba53bd66..3ba645f6b 100644 --- a/Jamfile +++ b/Jamfile @@ -103,10 +103,9 @@ if $(DEBUG_HINTER) HDRS += $(FT2_INCLUDE) ; -#SubDirHdr += $(FT2_INCLUDE) ; - # Uncomment the following line if you want to build individual source files -# for each FreeType 2 module. +# for each FreeType 2 module. this is only useful during development, and +# is better defined as an environment variable anyway ! # # FT2_MULTI = true ; diff --git a/docs/BUGS b/docs/BUGS deleted file mode 100644 index bb68c68c1..000000000 --- a/docs/BUGS +++ /dev/null @@ -1,275 +0,0 @@ -List of known FreeType 2 Bugs ------------------------------ - -"Identifier" is a string to uniquely identify the bug. A more detailed -description of the bug is found below the table of opened bugs. - -"Date" is the date when the bug was first reported or entered in this -document. Dates are in _European_ format, i.e day/month/year. - -"Opened By" is the name of the person who first spotted the bug. Note that -we can use abbreviations here, like: - - "David" for David Turner - "Werner" for Werner Lemberg - etc. - -"Reproduceable" indicates whether the bug could be reproduced by the -development team or not (it can be specific to a given platform), whether it -always happens, or only sporadically, etc. - - - -I. Open bugs -============ - - -Identifier Date Opened by Reproduceable ------------------------------------------------------------------------------- -NO-CID-CMAPS 13-09-2001 David always -BAD-TT-RENDERING 12-09-2001 Paul Pedriana ? -BAD-THIN-LINES 13-09-2001 David ? -NOT-WINDOWS-METRICS 07-10-2001 David always -ADVANCED-COMPOSITES 25-10-2001 George Williams always - ---------------------END-OF-OPENED-BUGS-TABLE---------------------------------- - - - -II. Closed bugs -=============== - - -Identifier Date Closed by Closure date ------------------------------------------------------------------------------- -BAD-TTNAMEID.H 12-09-2001 Antoine N/A -BAD-T1-CHARMAP 15-06-2001 David 2.0.5 -BAD-UNIXXXX-NAMES 30-07-2001 David 2.0.5 -GLYPH_TO_BITMAP-BUG 05-12-2001 David 05-12-2001 -AUTOHINT-NO-SBITS 13-09-2001 David 2.0.6 -TT-GLYPH-CRASH 01-01-2002 David 2.0.6 -T1-FONT-CRASH 01-01-2002 David 2.0.6 -BAD-ADVANCES 30-11-2001 David 2.0.6 -GLYPH-TO-BITMAP-BUG 15-12-2001 David 2.0.6 ---------------------END-OF-CLOSED-BUGS-TABLE---------------------------------- - - - -III. Bug descriptions -===================== - - ---- START OF OPEN BUGS --- - - -NO-CID-CMAPS - - Not exactly a bug, but the CFF font driver doesn't build a Unicode charmap - from the contents of font files, which prevents efficiently using fonts in - this format. - - - -BAD-TT-RENDERING - - According to Paul Pedriana , there is a rather - important difference between the rendering of TrueType-hinted glyphs of - current FT2 and old betas. - - Tests and comparisons show a _major_ discrepancy of monochrome truetype - bytecode-hinted glyphs! Something seems to be really broken here! - - Some of this has been fixed in 2.0.6; there was a bug in the TrueType - loader that prevented it from loading composites correctly. However, - there are still _subtle_ differences between FT1 and FT2 when it comes to - monochrome TrueType-hinted glyphs (the major differences are gone though). - - - -BAD-THIN-LINES - - It seems that the anti-aliased renderer in FreeType has problems rendering - extremely thin straight lines correctly, at least when using the - FT_Outline_Render() function. - - - -NOT-WINDOWS-METRICS - - FreeType doesn't always return the same metrics as Windows for ascender, - descender, and text height, depending on character pixel sizes. A lot of - testing on Windows is needed to debug this properly. It might be due to a - rounding bug when computing the "x_scale" and "y_scale" values. - - - -ADVANCED-COMPOSITES - - Provided by George Williams : - - I notice that truetype/ttgload.c only supports Apple's definition of - offsets for composite glyphs. Apple and Microsoft behave differently if - there is a scale factor. OpenType defines some bits to disambiguate. - - (A problem in both 2.0.4 and 2.0.5.) - - Apple says (http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html) that if - flags&ARGS_ARE_XY is set then the offsets should be scaled by the scale - factors (as you have done), but they also say something very cryptic - about what happens when the component is rotated at 45° (which you do - not support) -- See the "Important" note at the bottom. - - The old truetype spec from Microsoft did not mention this. The OpenType - spec (http://www.microsoft.com/typography/otspec/glyf.htm, - http://partners.adobe.com/asn/developer/opentype/glyf.html) defines two - new bits to disambiguate: - - SCALED_COMPONENT_OFFSET 11 - Composite designed to have the component offset scaled (designed for - Apple rasterizer) - - UNSCALED_COMPONENT_OFFSET 12 - Composite designed not to have the component offset scaled (designed - for the Microsoft TrueType rasterizer) - - Perhaps you could add a load_flag to allow the user to define the - default setting? - - David says: - - Wow, I was not even aware of this, it will probably take a little time - to implement since I don't have any font that implement these - "features", and also because I believe that we're running out of bits - for "load_flag", some other way to set preferences is probably needed. - - - ---- END OF OPEN BUGS --- - - - -BAD-TTNAMEID.H - - The file "ttnameid.h" contains various constant macro definitions - corresponding to important values defined by the TrueType specification. - - Joe Man reports that: - - According to the information from TrueType v1.66: - - Platform ID = 3 (Microsoft) - the Encoding ID of GB2312 = 4 - the Encoding ID of big5 = 3 - - However, I have found that in ttnameid.h: - - TT_MS_ID_GB2312 = 3 - TT_MS_ID_BIG_5 = 4 - - Which one is correct? - - Antoine replied that this was a bug in the TT 1.66 specification, and that - FreeType followed the most recent TrueType/OpenType specification here. - - - -AUTOHINT-SBITS - - When trying to load a glyph, with the auto-hinter activated (i.e., when - using FT_LOAD_FORCE_AUTOHINT, or when the font driver doesn't provide its - own hinter), embedded bitmaps are _never_ loaded, unlike the default - behaviour described by the API specification. - - This seems to be a bug in FT_Load_Glyph(), but there is no way to solve it - efficiently without making a few important internal changes to the - library's design (more importantly, to the font driver interface). - - This has been corrected with a hack in FT_Load_Glyph(). More important - internal changes should help get rid of it with a clean solution in a - further release like FreeType 2.1. - - - -BAD-T1-CHARMAP - - Type1 driver doesn't read "cacute" and "lslash" characters from iso8859-2 - charset. Those characters are mapped as MAC-one in glnames.py, so they - cannot be shown in Adobe Type1 fonts. - - (This was due to a bug in the "glnames.py" script used to generate the - table of glyph names in 'src/psaux/pstables.h'.) - - - -BAD-UNIXXXX-NAMES - - Glyph names like uniXXXX are not recognized as they should be. It seems - that code in psmodule.c for uniXXXX glyph names was never tested. The - patch is very simple. - - (A simple bug that was left un-noticed due to the fact that I don't have - any Postscript font that use this convention, unfortunately.) - - - -GLYPH_TO_BITMAP-BUG - - Calling FT_Glyph_To_Bitmap() sometimes modifies the original glyph - outline, creating weird alignment artefacts. - - This subtle bug was really in the file `src/smooth/ftsmooth.c'. - Basically, the outline was shifted before rendering it into a new bitmap - buffer. However, it wasn't properly un-shifted after that operation. - - This was only noticeable with certain glyphs or certain fonts; it crept in - a long time ago. - - The same bug has been fixed in src/raster/ftrender1.c also. - - - -TT-GLYPH-CRASH - - The library crashed when trying to load certain glyphs from an - automatically generated TrueType file (tt1095m_.ttf submitted by Scott - Long). - - It turned out that the font contained invalid glyph data (i.e. was - broken), but the TrueType glyph loader in FreeType wasn't paranoid enough, - which resulted in nasty memory overwrites all over the place. - - - -T1-FONT-CRASH - - The library crashed when trying to load the "Stalingrad Regular" face from - the "sadn.pfb" font file provided by Anthony Fok (and the Gnome-Print team - I believe). - - This was due to the fact that the font missed a full font name entry, - though boasted a family name and postscript name. The Type 1 face loader - didn't check for these pathetic cases and seg-faulted. - - - -BAD-ADVANCES - - All scalable font drivers returned un-fitted glyph advances when - FT_LOAD_DEFAULT was used, which was incorrect. This problem was pretty - old but hadn't been spotted because all test programs actually explicitly - or implicitly (i.e. through the cache) rounded the advance widths of - glyphs. - - This resulted in poor rendering of a number of client applications however - (it is strange to see they took so long to notify the FreeType team). - - - -GLYPH-TO-BITMAP-BUG - - FT_Glyph_To_Bitmap() did incorrectly modify the source glyph in certain - cases, which resulted in random behaviour and bad text rendering. This - was spotted to bugs in both the monochrome and smooth rasterizer. - - -=== end of file === diff --git a/docs/BUILD b/docs/BUILD deleted file mode 100644 index b257c4a09..000000000 --- a/docs/BUILD +++ /dev/null @@ -1,276 +0,0 @@ - - FreeType 2 compilation how-to - ============================= - - -Introduction ------------- - -Welcome to the FreeType 2 library. You'll find in this document -instructions on how to compile the library on your favorite platform. - - -I. QUICK COMMAND-LINE GUIDE ---------------------------- - - THE FOLLOWING WILL ONLY WORK WITH GNU MAKE, IT WILL FAIL MISERABLY - WITH OTHER MAKE TOOLS, FOR EXAMPLE "BSD MAKE". - - Install GNU Make (version 3.78.1 or newer), then try the following - on Unix or Cygwin: - - ./configure // this will setup the build - make // this will build the library - - or even: - - make setup unix - make - - On Win32 + Visual C++: - - make setup visualc // setup the build for VisualC++ on Win32 - make // build the library - - Then, go to the `demos' directory and type - - make - - - - If this doesn't work, read the following. - - -II. COMMAND-LINE COMPILATION ----------------------------- - - Note that if you do not want to compile FreeType 2 from a command - line shell, please skip to section III below (DETAILED COMPILATION). - - FreeType 2 includes a powerful and flexible build system that allows - you to easily compile it on a great variety of platforms from the - command line. To do so, just follow these simple instructions: - - a. Install GNU Make - - Because GNU Make is the only Make tool supported to compile - FreeType 2, you should install it on your machine. - - The FreeType 2 build system relies on many features special to GNU - Make -- trying to build the library with any other Make tool will - *fail*. - - NEARLY ALL OTHER MAKE TOOLS WILL FAIL, INCLUDING "BSD MAKE", SO - REALLY INSTALL A RECENT VERSION OF GNU MAKE ON YOUR SYSTEM! - - Make sure that you are invoking GNU Make from the command line, by - typing something like: - - make -v - - to display its version number. - - VERSION 3.78.1 OR NEWER IS NEEDED! - - b. Invoke `make' - - Go to the root directory of FreeType 2, then simply invoke GNU - Make from the command line. This will launch the FreeType 2 host - platform detection routines. A summary will be displayed, for - example, on Win32: - - - ============================================================== - FreeType build system -- automatic system detection - - The following settings are used: - - platform win32 - compiler gcc - configuration directory ./builds/win32 - configuration rules ./builds/win32/w32-gcc.mk - - If this does not correspond to your system or settings please - remove the file 'config.mk' from this directory then read the - INSTALL file for help. - - Otherwise, simply type 'make' again to build the library. - ============================================================= - - - If the detected settings correspond to your platform and compiler, - skip to step e. Note that if your platform is completely alien to - the build system, the detected platform will be `ansi'. - - - c. Configure the build system for a different compiler - - If the build system correctly detected your platform, but you want - to use a different compiler than the one specified in the summary - (for most platforms, gcc is the defaut compiler), invoke GNU Make - with - - make setup - - For example: - - to use Visual C++ on Win32, type: "make setup visualc" - to use LCC-Win32 on Win32, type: "make setup lcc" - to use Cygwin on Win32, type "make setup unix" - - The name to use is platform-dependent. The list of - available compilers for your system is available in the file - `builds//detect.mk' (note that we hope to make the list - displayed at user demand in the final release). - - If you are satisfied by the new configuration summary, skip to - step e. - - d. Configure the build system for an unknown platform/compiler - - The auto-detection/setup phase of the build system copies a file - to the current directory under the name `config.mk'. - - For example, on OS/2+gcc, it would simply copy - `builds/os2/os2-gcc.mk' to `./config.mk'. - - If for some reason your platform isn't correctly detected, copy - manually the configuration sub-makefile to `./config.mk' and go to - step e. - - Note that this file is a sub-Makefile used to specify Make - variables for compiler and linker invocation during the build. - You can easily create your own version from one of the existing - configuration files, then copy it to the current directory under - the name `./config.mk'. - - e. Build the library - - The auto-detection/setup phase should have copied a file in the - current directory, called `./config.mk'. This file contains - definitions of various Make variables used to invoke the compiler - and linker during the build. - - To launch the build, simply invoke GNU Make again: The top - Makefile will detect the configuration file and run the build with - it. - - f. Build the demonstration programs - - -III. DETAILED COMPILATION PROCEDURE ------------------------------------ - - If you don't want to compile FreeType 2 from the command-line (for - example if you use a graphical IDE on a Mac or Windows), you will - need to understand how the FreeType files are organized. - - FreeType 2 has a very modular design, and it is made of several - components. Each component must be compiled as a stand-alone object - file, even if it is really made of several C source files. For - example, the `base layer' component is made of the following C - files: - - src/ - base/ - ftcalc.c - computations - ftextend.c - extensions support - ftlist.c - simple list management - ftobjs.c - object management - ftoutln.c - simple outline processing - ftstream.c - stream input - - However, you can create a single object file by compiling the file - `src/base/ftbase.c', which basically contains - - #include "ftcalc.c" - #include "ftobjs.c" - #include "ftstream.c" - #include "ftlist.c" - #include "ftoutln.c" - #include "ftextend.c" - - Similarly, each component has a single `englobing' C file to compile - it as a stand-alone object: - - src/autohint/autohint.c - the autohinting module - src/base/ftbase.c - the base layer, high-level interface - src/cache/ftcache.c - a glyph and image caching system - (still experimental) - src/cff/cff.c - the OpenType font driver - src/cid/type1cid.c - the CID-keyed font driver - src/psaux/psaux.c - the PS support module - src/psnames/psnames.c - a support module to handle PS glyph - names - src/raster1/raster1.c - the monochrome raster module - src/sfnt/sfnt.c - the `sfnt' module - src/smooth/smooth.c - the anti-aliasing raster module - src/truetype/truetype.c - the TrueType font driver - src/type1/type1.c - the Type 1 font driver - - The last module of FreeType 2, `winfonts' (implementing support for - Windows FNT format), is a single file. - - To compile one component, do the following: - - - Add the top-level `include' directory to your compilation - include path - - - Add the `src/' directory to your compilation include - path, or simply `cd' to the component's source directory. - - - Compile the component `source' file (see list below); you don't - need to be in the component's directory if you added - `src/' to your include path. - - For example, the following line can be used to compile the truetype - driver on Unix: - - cd freetype2/ - cc -c -Iinclude -Isrc/truetype src/truetype/truetype.c - - Alternatively: - - cd freetype2/src/truetype - cc -c -I../../include truetype.c - - Finally, FreeType 2 contains some other components: - - src/base/ftsystem.c - system-specific memory and i/o support - src/base/ftinit.c - initialization layer - src/base/ftdebug.c - debugging component (empty in release - build) - src/base/ftglyph.c - optional convenience functions - - All font drivers are optional. The `sfnt', `psaux', and `psnames' - modules are mandatory for certain drivers. However, you may need to - update the list of drivers that are statically linked to the - library, which is located in the configuration file - `include/freetype/config/ftmodule.h'. - - -IV. Support for flat-directory compilation ------------------------------------------- - - It is possible to put all FreeType 2 source files into a single - directory, with the exception of the `include' hierarchy. - - 1. Copy all files in current directory: - - cp freetype2/src/base/*.[hc] . - cp freetype2/src/raster1/*.[hc] . - cp freetype2/src/smooth/*.[hc] . - etc. - - 2. Compile sources: - - cc -c -Ifreetype2/include ftsystem.c - cc -c -Ifreetype2/include ftinit.c - cc -c -Ifreetype2/include ftdebug.c - cc -c -Ifreetype2/include ftbase.c - etc. - - You don't need to define the FT_FLAT_COMPILATION macro (as this was - required in previous releases of FreeType 2). - -End of file diff --git a/docs/CHANGES b/docs/CHANGES index 673a5e904..0a8e3f8c0 100644 --- a/docs/CHANGES +++ b/docs/CHANGES @@ -33,6 +33,11 @@ LATEST CHANGES BETWEEN 2.1.4 and 2.1.3 - the CMap cache is now capable of managing UCS-4 character codes that are mapped through extended charmaps in recent TrueType/OpenType fonts + - the cache sub-system now properly manages out-of-memory conditions, + instead of blindly reporting them to the caller. This means that it + will try to empty the cache before restarting its allocations to see + if that can help. + - the PFR driver didn't return the list of available embedded bitmaps properly. @@ -72,6 +77,9 @@ LATEST CHANGES BETWEEN 2.1.4 and 2.1.3 with FreeType (i.e. comparing release/libtool/so numbers, and how to use them in Autoconf scripts) + - the installation documentation has been seriously revamped. Everything + is now in the "docs" directory. + ============================================================================== LATEST CHANGES BETWEEN 2.1.3 and 2.1.2 diff --git a/docs/CUSTOMIZE b/docs/CUSTOMIZE new file mode 100644 index 000000000..397c2c33f --- /dev/null +++ b/docs/CUSTOMIZE @@ -0,0 +1,117 @@ +How to customize the compilation of the library: +================================================ + + FreeType is highly customizable to fit various needs, and this document + details how it is possible to select options and components at compilation + time. + + +I. Configuration macros: + + the file found in "include/freetype/config/ftoption.h" contains a list + of commented configuration macros that can be toggled by developers to + indicate which features to activate in their build of the library. + + these options range from debug level to availability of certain + features, like native TrueType hinting through a bytecode interpreter. + + we invite you to read this file for more information. You can change + the file's content to suit your needs, or override it with one of the + techniques described below.. + + +II. Modules list: + + the file found in "include/freetype/config/ftmodule.h" contains a list + of names corresponding to the modules / font drivers to be statically + compiled in the FreeType library during the build. + + you can change it to suit your own preferences. Be aware that certain + modules depend on others, as described by the file "modules.txt" in + this directory. + + you can modify the file's content to suit your needs, or override it + at compile time with one of the methods described below + + +III. System interface: + + FreeType's default interface to the system (i.e. the parts that deal with + memory management and i/o streams) is located in "src/base/ftsystem.c". + + the current implementation uses standard C library calls to manage + memory and read font files. It is however possible to write custom + implementations to suit specific systems. + + to tell the GNU Make-based build system to use a custom system interface, + you'll need to define the environment variable FTSYS_SRC to point to + the relevant implementation, like in: + + on Unix: + ./configure + export FTSYS_SRC=foo/my_ftsystem.c + make + make install + + on Windows: + make setup + set FTSYS_SRC=foo/my_ftsystem.c + make + + +IV. Overriding default configuration and module headers: + + it is possible to over-ride the default configuration and module headers + without changing the original files. There are two ways to do that: + + 1. Using the C include path: + + use the C include path to ensure that your own versions of the + files are used at compile time when the lines: + + #include FT_CONFIG_OPTIONS_H + #include FT_CONFIG_MODULES_H + + are compiled. Their default values being + and , you can do something like: + + custom/ + freetype/ + config/ + ftoption.h => custom options header + ftmodule.h => custom modules list + + include/ => normal FreeType 2 include + freetype/ + ... + + then change the C include path to always give the path to "custom" + before the FreeType 2 "include" + + + 2. Re-defining FT_CONFIG_OPTIONS_H and FT_CONFIG_MODULES_H + + another way to do the same thing is to re-define the macros used + to name the configuration headers. To do so, you'll need a custom + "ft2build.h", whose content can be as simple as: + + #ifndef __FT2_BUILD_GENERIC_H__ + #define __FT2_BUILD_GENERIC_H__ + + #define FT_CONFIG_OPTIONS_H + #define FT_CONFIG_MACROS_H + + #include + + #endif /* __FT2_BUILD_GENERIC_H__ */ + + place them in: + + custom/ + ft2build.h => custom version described above + my-ftoption.h => custom options header + my-ftmodule.h => custom modules list header + + and change the C include path to ensure that "custom" is always placed + before the FT2 "include" during compilation. + diff --git a/docs/DEBUG.TXT b/docs/DEBUG similarity index 99% rename from docs/DEBUG.TXT rename to docs/DEBUG index 8996d6690..03ed70311 100644 --- a/docs/DEBUG.TXT +++ b/docs/DEBUG @@ -14,7 +14,7 @@ located in the file "ftoptions.h". The macros are: #define this macro if you want to compile the FT_ERROR macro calls used to print error messages during program execution. This will not stop the program, but is very useful to spot invalid fonts - during development and code wordarounds for them. + during development and code workarounds for them. FT_DEBUG_LEVEL_TRACE diff --git a/docs/INSTALL b/docs/INSTALL index 22207e383..8f5bc320c 100644 --- a/docs/INSTALL +++ b/docs/INSTALL @@ -1,185 +1,65 @@ -In order to build the library, read the `BUILD' document in the `docs' -directory. This is only a quick starter. +Welcome + +There are several ways to build the FreeType library, depending on your +system and the level of customization you need. Here's a short overview +of the documentation available: + +I. Normal installation and upgrades: + + 1. Native TrueType Hinting: + + Native TrueType hinting is disabled by default[1]. If you really need it, + read the file "TRUETYPE" for information. + + + 2. Unix Systems (as well as Cygwin or MSys on Windows): + + Please read *both* UPGRADE.UNX and INSTALL.UNX to install or upgrade + FreeType 2 on a Unix system. Note that you *will* need GNU Make, since + other make tools won't work (this includes BSD Make !!) + + 3. On VMS with the "mms" build tool: + + see INSTALL.VMS for installation instructions on this platform + + 4. Other systems using GNU Make: + + on non-Unix platforms, it's possible to build the library using + GNU Make utility. Note that *NO OTHER MAKE TOOL WILL WORK* !! + This methods supports several compilers on Windows, OS/2 and BeOS, + including Mingw, Visual C++, Borland C++, and more. + + instructions are provided in the file "INSTALL.GNU" -I. Unix systems ---------------- - - If you have GNU Make installed, simply type - - ./configure - make - make install - - on the command line to configure, build and install FreeType on your - system. Note that the default installation path is "/usr/local". - - Please read the file README.UNX, it contains _critical_ information - regarding the installation of FreeType on many Unix systems. + 5. With an IDE Project File (e.g. for Visual Studio or CodeWarrior): + + we provide a small number of "project files" for various IDEs to + automatically build the library as well. Note that these files are + not supported and sporadically maintained by FreeType developers, + so don't expect them to work in each release. + + to find them, have a look at the content of the "builds/" + directory, where stands for your OS or environment. -II. From the command line -------------------------- - - If you are not using Unix, there are two ways to quickly build - FreeType 2 from the command line. - - The first, and favorite one, is to use the "Jam" build tool. Jam is - a highly portable replacement for Make whose control files do not - depend on the current platform or compiler toolset. - - For more information, please see: - - http://www.freetype.org/jam/index.html - - The second one is to use "GNU Make" (and NO OTHER MAKE TOOL). + 6. From you own IDE, or own Makefiles: + + If you want to create your own project file, follow the instructions + given in the "INSTALL.ANY" document of this directory. - 1. Building FT2 with "Jam" - -------------------------- +II. Custom builds of the library: - Once you've got *our version* of the Jam tool installed on your - system, simply go to the top-level FT2 directory, then type - - "jam" - - on the command line. This will build the library and place it in - the "objs" directory. - - By default, a static library is built. On Unix systems, it is - possible to build a shared library through the "libtool" script. - You need to have libtool installed on your system, then re-define - a few environment variables before invoking Jam, as in - - export CC="libtool --mode=compile cc" - export LINK="libtool --mode=link cc" - jam - - In later releases of FT2, building shared libraries with Jam - should become automatic on Unix systems. + Customizing the compilation of FreeType is easy, and allows you to select + only the components of the font engine that you really need. For more details + read the file "CUSTOMIZE" - 2. Building FT2 with "GNU Make" - ------------------------------- +-------------------------------------------------------------------- - You need to have GNU Make (version 3.78.1 or newer) installed on - your system to compile the library from the command line. This will - _NOT_ work with other make tools (including BSD make)! +[1] More details on: http://www.freetype.org/patents.html - [Well, this is not really correct. Recently, a perl implementation - of make called `makepp' has appeared which can also build FreeType 2 - successfully on Unix platforms. See http://makepp.sourceforge.net - for more details.] +End of file - - Go to the `freetype2' directory. - - - Unix (any C compiler should work): - - - make setup (don't worry, this will invoke a configure script) - - make - - make install - - Alternatively, you can pass parameters to the configure script - within the CFG variable, as in: - - - make setup CFG="--prefix=/usr" - - make - - make install - - If the configure script isn't run, try to add `unix' as a target - on the command line, e.g.: - - - make setup unix CFG="--prefix=/opt/experimental" - - - - Windows: - - We provide a version of GNU Make for Win32 on the FreeType site. - See http://www.freetype.org/download.html for details. - - - gcc (Mingw, _not_ CygWin): - - - make setup - - make - - - - Visual C++: - - - make setup visualc - - make - - - - other compilers: - - - make setup bcc32 -> Borland C++ 32 bits - - make setup intelc -> Intel C++ - - make setup watcom -> Watcom C++ - - make setup lcc -> Win32-LCC - - - If you want to build FreeType 2 in another directory, you must set - two environment variables, `OJB_DIR' and `TOP_DIR'. The former - gives the directory where the object files and the library should be - created (this directory must exist), the latter the top directory of - the FreeType 2 source tree. Example: - - OBJ_DIR=~/freetype2.compiled TOP_DIR=~/freetype2 \ - make -f$TOP_DIR/Makefile setup ansi - OBJ_DIR=~/freetype2.compiled TOP_DIR=~/freetype2 \ - make -f$TOP_DIR/Makefile - - On Unix boxes, calling `configure' from the build directory is - sufficient; it will build a small Makefile which calls the - FreeType 2 Makefile with the necessary parameters. - - -III. In your own environment (IDE) ----------------------------------- - - You need to add the directories "freetype2/include" to your include - path when compiling the library. - - FreeType 2 is made of several components; each one of them is - located in a subdirectory of "freetype2/src". For example, - `freetype2/src/truetype/' contains the TrueType font driver. - - DO NOT COMPILE ALL C FILES! Rather, compile the following ones: - - -- base components (required) - - src/base/ftsystem.c - src/base/ftinit.c - src/base/ftdebug.c - src/base/ftbase.c - src/base/ftglyph.c - src/base/ftbbox.c - src/base/ftmm.c - - src/base/ftmac.c -- only on the Macintosh - - -- other components are optional - - src/autohint/autohint.c -- auto hinting module - src/cache/ftcache.c -- cache sub-system (in beta) - src/sfnt/sfnt.c -- SFNT files support - (TrueType & OpenType) - src/cff/cff.c -- CFF/OpenType font driver - src/psnames/psnames.c -- Postscript glyph names support - src/psaux/psaux.c -- Postscript Type 1 parsing - src/truetype/truetype.c -- TrueType font driver - src/type1/type1.c -- Type 1 font driver - src/cid/type1cid.c -- Type 1 CID-keyed font driver - src/winfonts/winfonts.c -- Windows FONT / FNT font driver - - Note: - - `truetype.c' needs `sfnt.c' and `psnames.c' - `type1.c' needs `psaux.c' and `psnames.c' - `type1cid.c' needs `psaux.c' and `psnames.c' - `cff.c' needs `sfnt.c', `psaux.c', and `psnames.c' - - etc. - -For more information, please consult "docs/BUILD". - ---- end of INSTALL -- + \ No newline at end of file diff --git a/docs/INSTALL.ANY b/docs/INSTALL.ANY new file mode 100644 index 000000000..5e2cf0eea --- /dev/null +++ b/docs/INSTALL.ANY @@ -0,0 +1,96 @@ +Instructions on how to build FreeType with your own build tool: + + see the file "CUSTOMIZE" to learn how to customize FreeType to + specific environments. + + follow these simple steps: + +I. Normal way: +-------------- + + * DISABLE PRE-COMPILED HEADERS ! This is very important for Visual + C++, because FreeType uses lines like: + + #include FT_FREETYPE_H + + which are not correctly supported by this compiler, while being + ISO C compliant !! + + * You need to add the directories "freetype2/include" to your include + path when compiling the library. + + * FreeType 2 is made of several components; each one of them is + located in a subdirectory of "freetype2/src". For example, + 'freetype2/src/truetype/' contains the TrueType font driver. + + * DO NOT COMPILE ALL C FILES! Rather, compile the following ones: + + -- base components (required) + + src/base/ftsystem.c + src/base/ftinit.c + src/base/ftdebug.c + src/base/ftbase.c + src/base/ftglyph.c + src/base/ftbbox.c + src/base/ftmm.c + src/base/ftpfr.c -- optional, see + src/base/ftbdf.c -- optional, see + src/base/ftwinfnt.c -- optional, see + + src/base/ftmac.c -- only on the Macintosh + + -- other components are optional + + src/autohint/autohint.c -- auto hinting module + src/cache/ftcache.c -- cache sub-system (in beta) + src/sfnt/sfnt.c -- SFNT files support + (TrueType & OpenType) + src/cff/cff.c -- CFF/OpenType font driver + src/pfr/pfr.c -- PFR/TrueDoc font driver + src/bdf/bdf.c -- BDF font driver + src/pcf/pcf.c -- PCF font driver + src/psnames/psnames.c -- Postscript glyph names support + src/psaux/psaux.c -- Postscript Type 1 parsing + src/truetype/truetype.c -- TrueType font driver + src/type1/type1.c -- Type 1 font driver + src/cid/type1cid.c -- Type 1 CID-keyed font driver + src/winfonts/winfonts.c -- Windows FONT / FNT font driver + src/raster1/raster1.c -- monochrome rasterizer + src/smooth/smooth.c -- anti-aliasing rasterizer + + Note: + + `truetype.c' needs `sfnt.c' and `psnames.c' + `type1.c' needs `psaux.c' and `psnames.c' + `type1cid.c' needs `psaux.c' and `psnames.c' + `cff.c' needs `sfnt.c', `psaux.c', and `psnames.c' + + that should be it ! in case of problems, see the archives of + the FreeType development mailing list. + + +II. Support for flat-directory compilation +------------------------------------------ + + It is possible to put all FreeType 2 source files into a single + directory, with the *exception* of the `include' hierarchy. + + 1. Copy all files in current directory: + + cp freetype2/src/base/*.[hc] . + cp freetype2/src/raster1/*.[hc] . + cp freetype2/src/smooth/*.[hc] . + etc. + + 2. Compile sources: + + cc -c -Ifreetype2/include ftsystem.c + cc -c -Ifreetype2/include ftinit.c + cc -c -Ifreetype2/include ftdebug.c + cc -c -Ifreetype2/include ftbase.c + etc. + + You don't need to define the FT_FLAT_COMPILATION macro (as this was + required in previous releases of FreeType 2). + diff --git a/docs/INSTALL.GNU b/docs/INSTALL.GNU new file mode 100644 index 000000000..df6f012e3 --- /dev/null +++ b/docs/INSTALL.GNU @@ -0,0 +1,128 @@ +This document contains instructions on how to build the FreeType library +on non-Unix systems with the help of GNU Make. Note that if you're running +Cygwin or MSys in Windows, you should follow the instructions of INSTALL.UNX +instead. + + + FreeType 2 includes a powerful and flexible build system that allows + you to easily compile it on a great variety of platforms from the + command line. To do so, just follow these simple instructions: + + a. Install GNU Make + + Because GNU Make is the only Make tool supported to compile + FreeType 2, you should install it on your machine. + + The FreeType 2 build system relies on many features special to GNU + Make -- trying to build the library with any other Make tool will + *fail*. + + NEARLY ALL OTHER MAKE TOOLS WILL FAIL, INCLUDING "BSD MAKE", SO + REALLY INSTALL A RECENT VERSION OF GNU MAKE ON YOUR SYSTEM! + + Make sure that you are invoking GNU Make from the command line, by + typing something like: + + make -v + + to display its version number. + + VERSION 3.78.1 OR NEWER IS NEEDED! + + + + b. Invoke 'make' + + Go to the root directory of FreeType 2, then simply invoke GNU + Make from the command line. This will launch the FreeType 2 host + platform detection routines. A summary will be displayed, for + example, on Win32: + + + ============================================================== + FreeType build system -- automatic system detection + + The following settings are used: + + platform win32 + compiler gcc + configuration directory ./builds/win32 + configuration rules ./builds/win32/w32-gcc.mk + + If this does not correspond to your system or settings please + remove the file 'config.mk' from this directory then read the + INSTALL file for help. + + Otherwise, simply type 'make' again to build the library. + ============================================================= + + + If the detected settings correspond to your platform and compiler, + skip to step e. Note that if your platform is completely alien to + the build system, the detected platform will be 'ansi'. + + + c. Configure the build system for a different compiler + + If the build system correctly detected your platform, but you want + to use a different compiler than the one specified in the summary + (for most platforms, gcc is the defaut compiler), invoke GNU Make + with + + make setup + + For example: + + to use Visual C++ on Win32, type: "make setup visualc" + to use Borland C++ on Win32, type "make setup bcc32" + to use Watcom C++ on Win32, type "make setup watcom" + to use Intel C++ on Win32, type "make setup intelc" + to use LCC-Win32 on Win32, type: "make setup lcc" + to use Watcom C++ on OS/2, type "make setup watcom" + to use VisualAge C++ on OS/2, type "make setup visualage" + + The name to use is platform-dependent. The list of + available compilers for your system is available in the file + `builds//detect.mk' + + If you are satisfied by the new configuration summary, skip to + step e. + + d. Configure the build system for an unknown platform/compiler + + The auto-detection/setup phase of the build system copies a file + to the current directory under the name `config.mk'. + + For example, on OS/2+gcc, it would simply copy + `builds/os2/os2-gcc.mk' to `./config.mk'. + + If for some reason your platform isn't correctly detected, copy + manually the configuration sub-makefile to `./config.mk' and go to + step e. + + Note that this file is a sub-Makefile used to specify Make + variables for compiler and linker invocation during the build. + You can easily create your own version from one of the existing + configuration files, then copy it to the current directory under + the name `./config.mk'. + + e. Build the library + + The auto-detection/setup phase should have copied a file in the + current directory, called `./config.mk'. This file contains + definitions of various Make variables used to invoke the compiler + and linker during the build. + + To launch the build, simply invoke GNU Make again: The top + Makefile will detect the configuration file and run the build with + it. + + + + Final note: + + the build system builds a statically linked library of the font engine + in the "objs" directory. It does _not_ support the build of DLLs on + Windows and OS/2, if you need these, you'll have to either use + a IDE-specific project file, or follow the instructions in + "INSTALL.ANY" to create your own Makefiles. diff --git a/docs/INSTALL.UNX b/docs/INSTALL.UNX new file mode 100644 index 000000000..6af176dba --- /dev/null +++ b/docs/INSTALL.UNX @@ -0,0 +1,181 @@ +This document contains instructions on how to build the FreeType library +on Unix systems. This also works for emulations like Cygwin or MSys on +Win32: + + + I. Ensure that you are using GNU Make + ------------------------------------- + + The FreeType build system _exclusively_ works with GNU Make. You + will not be able to compile the library with the instructions + below using any other alternative (including BSD Make). + + Trying to compile the library with a different Make tool will + print a message like: + + Sorry, GNU make is required to build FreeType2. + + and the build process will be aborted. If this happens, install + GNU Make on your system, and use the GNUMAKE environment variable + to name it. + + + + IV. Build and install the library + --------------------------------- + + The following should work on all Unix systems where the 'make' + command invokes GNU Make: + + ./configure --prefix= + make + make install (as root) + + where "" must be replaced by the prefix returned by + the "freetype-config" command. + + When using a different command to invoke GNU Make, use the GNUMAKE + variable. For example, if `gmake' is the command to use on your + system, do something like: + + GNUMAKE=gmake ./configure --prefix= + gmake + gmake install (as root) + + If this still doesn't work, something's rotten on your system( + (e.g. you're using a very old version of GNU Make) + + + +I. Unix systems +--------------- + + If you have GNU Make installed, simply type + + ./configure + make + make install + + on the command line to configure, build and install FreeType on your + system. Note that the default installation path is "/usr/local". + + Please read the file README.UNX, it contains _critical_ information + regarding the installation of FreeType on many Unix systems. + + +II. From the command line +------------------------- + + If you are not using Unix, there are two ways to quickly build + FreeType 2 from the command line. + + The first, and favorite one, is to use the "Jam" build tool. Jam is + a highly portable replacement for Make whose control files do not + depend on the current platform or compiler toolset. + + For more information, please see: + + http://www.freetype.org/jam/index.html + + The second one is to use "GNU Make" (and NO OTHER MAKE TOOL). + + + 1. Building FT2 with "Jam" + -------------------------- + + Once you've got *our version* of the Jam tool installed on your + system, simply go to the top-level FT2 directory, then type + + "jam" + + on the command line. This will build the library and place it in + the "objs" directory. + + By default, a static library is built. On Unix systems, it is + possible to build a shared library through the "libtool" script. + You need to have libtool installed on your system, then re-define + a few environment variables before invoking Jam, as in + + export CC="libtool --mode=compile cc" + export LINK="libtool --mode=link cc" + jam + + In later releases of FT2, building shared libraries with Jam + should become automatic on Unix systems. + + + 2. Building FT2 with "GNU Make" + ------------------------------- + + You need to have GNU Make (version 3.78.1 or newer) installed on + your system to compile the library from the command line. This will + _NOT_ work with other make tools (including BSD make)! + + [Well, this is not really correct. Recently, a perl implementation + of make called `makepp' has appeared which can also build FreeType 2 + successfully on Unix platforms. See http://makepp.sourceforge.net + for more details.] + + - Go to the `freetype2' directory. + + - Unix (any C compiler should work): + + - make setup (don't worry, this will invoke a configure script) + - make + - make install + + Alternatively, you can pass parameters to the configure script + within the CFG variable, as in: + + - make setup CFG="--prefix=/usr" + - make + - make install + + If the configure script isn't run, try to add `unix' as a target + on the command line, e.g.: + + - make setup unix CFG="--prefix=/opt/experimental" + + + - Windows: + + We provide a version of GNU Make for Win32 on the FreeType site. + See http://www.freetype.org/download.html for details. + + - gcc (Mingw, _not_ CygWin): + + - make setup + - make + + + - Visual C++: + + - make setup visualc + - make + + + - other compilers: + + - make setup bcc32 -> Borland C++ 32 bits + - make setup intelc -> Intel C++ + - make setup watcom -> Watcom C++ + - make setup lcc -> Win32-LCC + + + If you want to build FreeType 2 in another directory, you must set + two environment variables, `OJB_DIR' and `TOP_DIR'. The former + gives the directory where the object files and the library should be + created (this directory must exist), the latter the top directory of + the FreeType 2 source tree. Example: + + OBJ_DIR=~/freetype2.compiled TOP_DIR=~/freetype2 \ + make -f$TOP_DIR/Makefile setup ansi + OBJ_DIR=~/freetype2.compiled TOP_DIR=~/freetype2 \ + make -f$TOP_DIR/Makefile + + On Unix boxes, calling `configure' from the build directory is + sufficient; it will build a small Makefile which calls the + FreeType 2 Makefile with the necessary parameters. + + +--- end of INSTALL -- diff --git a/docs/readme.vms b/docs/INSTALL.VMS similarity index 100% rename from docs/readme.vms rename to docs/INSTALL.VMS diff --git a/docs/TRUETYPE b/docs/TRUETYPE new file mode 100644 index 000000000..4ec4001b2 --- /dev/null +++ b/docs/TRUETYPE @@ -0,0 +1,23 @@ +How to enable the TrueType native hinter if you need it +-------------------------------------------------------- + + The TrueType bytecode interpreter is disabled in all public + releases of the FreeType packages for patents reasons (see + http://www.freetype.org/patents.html for more details). + + However, many Linux distributions do enable the interpreter in the + FreeType packages (DEB/RPM/etc.) they produce for their platforms. + If you are using TrueType fonts on your system, you most probably + want to enable it manually by doing the following: + + - open the file "include/freetype/config/ftoption.h" + + - locate a line that says: + + #undef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + - change it to: + + #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + of course, this must be done _before_ compiling the library diff --git a/docs/UPGRADE.UNX b/docs/UPGRADE.UNX new file mode 100644 index 000000000..0e67f9077 --- /dev/null +++ b/docs/UPGRADE.UNX @@ -0,0 +1,124 @@ + +SPECIAL NOTE FOR UNIX USERS +=========================== + + If you are installing this release of FreeType on a system that + already uses release 2.0.5 (or even an older version), you have to + perform a few special steps to ensure that everything goes well. + + + I. Enable the TrueType bytecode hinter if you need it + ----------------------------------------------------- + + See the instructions in the file "TRUETYPE" of this directory. + + Note that FreeType supports TrueType fonts without the bytecode + interpreter through its auto-hinter, which now generate relatively good + results with most fonts. + + + II. Determine the correct installation path + -------------------------------------------- + + By default, the source package will install the library in + "/usr/local". However, many Unix distributions now install the + library in "/usr", since FreeType is becoming a critical system + component. + + If FreeType is already installed on your system, type + + freetype-config --prefix + + on the command line. This should return the installation path to + use below (e.g. "/usr" or "/usr/local"). Otherwise, simply use + "/usr" (or what you think is adequate for your installation). + + + + III. Ensure that you are using GNU Make + --------------------------------------- + + The FreeType build system _exclusively_ works with GNU Make. You + will not be able to compile the library with the instructions + below using any other alternative (including BSD Make). + + Trying to compile the library with a different Make tool will + print a message like: + + Sorry, GNU make is required to build FreeType2. + + and the build process will be aborted. If this happens, install + GNU Make on your system, and use the GNUMAKE environment variable + to name it. + + + + IV. Build and install the library + --------------------------------- + + The following should work on all Unix systems where the `make' + command invokes GNU Make: + + ./configure --prefix= + make + make install (as root) + + where "" must be replaced by the prefix returned by + the "freetype-config" command. + + When using a different command to invoke GNU Make, use the GNUMAKE + variable. For example, if `gmake' is the command to use on your + system, do something like: + + GNUMAKE=gmake ./configure --prefix= + gmake + gmake install (as root) + + If this still doesn't work, read the detailed compilation + procedure available in the file "docs/BUILD" for troubleshooting. + + + V. Take care of XFree86 version 4 + --------------------------------- + + Certain recent Linux distributions will install _several_ versions + of FreeType on your system. For example, on a fresh Mandrake 8.1 + system, you can find the following files: + + /usr/lib/libfreetype.so which links to + /usr/lib/libfreetype.6.1.0.so + + and + + /usr/X11R6/lib/libfreetype.so which links to + /usr/X11R6/lib/libfreetype.6.0.so + + Note that these files correspond to two distinct versions of the + library! It seems that this surprising issue is due to the + install scripts of recent XFree86 servers (from 4.1.0) which + irremediably install their own (dated) version of the library in + "/usr/X11R6/lib". + + In certain _rare_ cases you may experience minor problems if you + install this release of the library in "/usr" only, namely, that + certain applications will not benefit from the bug fixes and + rendering improvements you'd expect. + + There are two good ways to deal with this situation: + + - Install the library _twice_, in "/usr" and in "/usr/X11R6" + (you have to do that each time you install a new FreeType + release though). + + - Change the link in /usr/X11R6/lib/libfreetype.so to point to + + /usr/lib/libfreetype.so, + + and get rid of + + /usr/X11R6/lib/libfreetype.6.0.so + + The FreeType Team is not responsible for this problem, so please + contact either the XFree86 development team or your Linux + distributor to help clear this issue in case the information given + here doesn't help. diff --git a/docs/license.txt b/docs/license.txt index c95318d1b..51b52bf87 100644 --- a/docs/license.txt +++ b/docs/license.txt @@ -1,11 +1,28 @@ -FreeType comes with two licenses from which you can choose the one which -fits your needs best: + The FreeType 2 font engine is copyrighted work, and cannot be + used legally without a software license. In order to make this + project usable to a vast majority of developers, we distribute it + under two dual licenses. - . The FreeType License, in file `docs/FTL.txt'. + What this means is that *you* must choose *one* license among those + described below, then obey all its terms and conditions when using + FreeType 2 in any of your projects or products: - . The GNU General Public License, in file `docs/GPL.txt'. -The contributed PCF driver comes with a license similar to that of X Window -System which is compatible to the above two licenses (see file -src/pcf/readme). + - The FreeType License, found in the file "FTL.TXT", which is + an BSD-style open-source license *with* an advertising + clause that forces you to explicitely cite the + FreeType project in your product's documentation. All + details are in the license file + + + - The GNU General Public License, found in "GPL.TXT", which is + the traditionnal and "viral" GPL license, that + forces you to redistribute the _complete_ sources of all + your products that simply use FreeType 2. + + + Note that the contributed PCF driver comes with a license similar to + that of X Window System which is compatible to the above two + licenses (see file src/pcf/readme). + diff --git a/include/freetype/internal/ftobjs.h b/include/freetype/internal/ftobjs.h index 759d121bd..927615086 100644 --- a/include/freetype/internal/ftobjs.h +++ b/include/freetype/internal/ftobjs.h @@ -536,6 +536,30 @@ FT_BEGIN_HEADER FT_BASE( void ) FT_Done_GlyphSlot( FT_GlyphSlot slot ); + /* */ + + /* + * free the bitmap of a given glyphslot when needed + * (i.e. only when it was allocated with ft_glyphslot_alloc_bitmap) + */ + FT_BASE( void ) + ft_glyphslot_free_bitmap( FT_GlyphSlot slot ); + + /* + * allocate a new bitmap buffer in a glyph slot + */ + FT_BASE( FT_Error ) + ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, + FT_ULong size ); + + /* + * set the bitmap buffer in a glyph slot to a given pointer. + * the buffer will not be freed by a later call to ft_glyphslot_free_bitmap + */ + FT_BASE( void ) + ft_glyphslot_set_bitmap( FT_GlyphSlot slot, + FT_Pointer buffer ); + /*************************************************************************/ /*************************************************************************/ diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c index 433ebdb5f..32ae99b28 100644 --- a/src/base/ftobjs.c +++ b/src/base/ftobjs.c @@ -198,19 +198,59 @@ return error; } + FT_BASE_DEF( void ) + ft_glyphslot_free_bitmap( FT_GlyphSlot slot ) + { + if ( slot->flags & FT_GLYPH_OWN_BITMAP ) + { + FT_Memory memory = FT_FACE_MEMORY( slot->face ); + + + FT_FREE( slot->bitmap.buffer ); + slot->flags &= ~FT_GLYPH_OWN_BITMAP; + } + else + { + /* assume that the bitmap buffer was stolen or not */ + /* allocated from the heap */ + slot->bitmap.buffer = NULL; + } + } + + + FT_BASE_DEF( void ) + ft_glyphslot_set_bitmap( FT_GlyphSlot slot, + FT_Pointer buffer ) + { + ft_glyphslot_free_bitmap( slot ); + + slot->bitmap.buffer = buffer; + + FT_ASSERT( (slot->flags & FT_GLYPH_OWN_BITMAP) == 0 ); + } + + + FT_BASE_DEF( FT_Error ) + ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, + FT_ULong size ) + { + FT_Memory memory = FT_FACE_MEMORY( slot->face ); + + + if ( slot->flags & FT_GLYPH_OWN_BITMAP ) + FT_FREE( slot->bitmap.buffer ); + else + slot->flags |= FT_GLYPH_OWN_BITMAP; + + return FT_MEM_ALLOC( slot->bitmap.buffer, size ); + } + static void ft_glyphslot_clear( FT_GlyphSlot slot ) { /* free bitmap if needed */ - if ( slot->flags & FT_GLYPH_OWN_BITMAP ) - { - FT_Memory memory = FT_FACE_MEMORY( slot->face ); - - - FT_FREE( slot->bitmap.buffer ); - slot->flags &= ~FT_GLYPH_OWN_BITMAP; - } + ft_glyphslot_free_bitmap( slot ); /* clear all public fields in the glyph slot */ FT_ZERO( &slot->metrics ); @@ -248,8 +288,7 @@ clazz->done_slot( slot ); /* free bitmap buffer if needed */ - if ( slot->flags & FT_GLYPH_OWN_BITMAP ) - FT_FREE( slot->bitmap.buffer ); + ft_glyphslot_free_bitmap( slot ); /* free glyph loader */ if ( FT_DRIVER_USES_OUTLINES( driver ) ) diff --git a/src/bdf/bdfdrivr.c b/src/bdf/bdfdrivr.c index c156bd8ac..4f60266cb 100644 --- a/src/bdf/bdfdrivr.c +++ b/src/bdf/bdfdrivr.c @@ -489,8 +489,6 @@ THE SOFTWARE. int i, j, count; unsigned char *p, *pp; - FT_Memory memory = face->bdffont->memory; - FT_UNUSED( load_flags ); @@ -514,9 +512,9 @@ THE SOFTWARE. bitmap->pixel_mode = FT_PIXEL_MODE_MONO; bitmap->pitch = glyph.bpr; - if ( FT_NEW_ARRAY( bitmap->buffer, glyph.bytes ) ) - goto Exit; - FT_MEM_COPY( bitmap->buffer, glyph.bitmap, glyph.bytes ); + /* note: we don't allocate a new array to hold the bitmap, we */ + /* can simply point to it */ + ft_glyphslot_set_bitmap( slot, glyph.bitmap ); } else { @@ -524,7 +522,8 @@ THE SOFTWARE. bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; bitmap->pitch = bitmap->width; - if ( FT_NEW_ARRAY( bitmap->buffer, bitmap->rows * bitmap->pitch ) ) + error = ft_glyphslot_alloc_bitmap( slot, bitmap->rows * bitmap->pitch ); + if ( error ) goto Exit; switch ( bpp ) @@ -625,7 +624,6 @@ THE SOFTWARE. slot->linearHoriAdvance = (FT_Fixed)glyph.dwidth << 16; slot->format = FT_GLYPH_FORMAT_BITMAP; - slot->flags = FT_GLYPH_OWN_BITMAP; Exit: return error; diff --git a/src/cache/ftlru.c b/src/cache/ftlru.c index 47d656224..4eab0d9b4 100644 --- a/src/cache/ftlru.c +++ b/src/cache/ftlru.c @@ -236,7 +236,7 @@ goto Exit; } - FT_ASSERT( list->nodes > 0 ); + FT_ASSERT( list->num_nodes > 0 ); while ( node->next ) { diff --git a/src/pcf/pcfdriver.c b/src/pcf/pcfdriver.c index ab2fef527..6f0b9e18f 100644 --- a/src/pcf/pcfdriver.c +++ b/src/pcf/pcfdriver.c @@ -355,7 +355,6 @@ THE SOFTWARE. PCF_Face face = (PCF_Face)FT_SIZE_FACE( size ); FT_Stream stream = face->root.stream; FT_Error error = PCF_Err_Ok; - FT_Memory memory = FT_FACE( face )->memory; FT_Bitmap* bitmap = &slot->bitmap; PCF_Metric metric; int bytes; @@ -411,7 +410,8 @@ THE SOFTWARE. /* XXX: to do: are there cases that need repadding the bitmap? */ bytes = bitmap->pitch * bitmap->rows; - if ( FT_ALLOC( bitmap->buffer, bytes ) ) + error = ft_glyphslot_alloc_bitmap( slot, bytes ); + if ( error ) goto Exit; if ( FT_STREAM_SEEK( metric->bits ) || @@ -451,7 +451,6 @@ THE SOFTWARE. slot->linearHoriAdvance = (FT_Fixed)bitmap->width << 16; slot->format = FT_GLYPH_FORMAT_BITMAP; - slot->flags = FT_GLYPH_OWN_BITMAP; FT_TRACE4(( " --- ok\n" )); diff --git a/src/pfr/pfrsbit.c b/src/pfr/pfrsbit.c index 3a6e235f4..408b06323 100644 --- a/src/pfr/pfrsbit.c +++ b/src/pfr/pfrsbit.c @@ -645,11 +645,10 @@ /* Allocate and read bitmap data */ { - FT_Memory memory = face->root.memory; - FT_Long len = glyph->root.bitmap.pitch * ysize; + FT_ULong len = glyph->root.bitmap.pitch * ysize; - - if ( !FT_ALLOC( glyph->root.bitmap.buffer, len ) ) + error = ft_glyphslot_alloc_bitmap( &glyph->root, len ); + if ( !error ) { error = pfr_load_bitmap_bits( p, stream->limit, diff --git a/src/sfnt/ttsbit.c b/src/sfnt/ttsbit.c index a554060d1..9cfa92be6 100644 --- a/src/sfnt/ttsbit.c +++ b/src/sfnt/ttsbit.c @@ -1212,14 +1212,16 @@ TT_SBit_Range range, FT_ULong ebdt_pos, FT_ULong glyph_offset, - FT_Bitmap* map, + FT_GlyphSlot slot, FT_Int x_offset, FT_Int y_offset, FT_Stream stream, - TT_SBit_Metrics metrics ) + TT_SBit_Metrics metrics, + FT_Int depth ) { - FT_Memory memory = stream->memory; - FT_Error error; + FT_Memory memory = stream->memory; + FT_Bitmap* map = &slot->bitmap; + FT_Error error; /* place stream at beginning of glyph data and read metrics */ @@ -1230,11 +1232,10 @@ if ( error ) goto Exit; - /* this function is recursive. At the top-level call, the */ - /* field map.buffer is NULL. We thus begin by finding the */ - /* dimensions of the higher-level glyph to allocate the */ - /* final pixmap buffer */ - if ( map->buffer == 0 ) + /* this function is recursive. At the top-level call, we */ + /* compute the dimensions of the higher-level glyph to */ + /* allocate the final pixmap buffer */ + if ( depth == 0 ) { FT_Long size; @@ -1274,7 +1275,8 @@ if ( size == 0 ) goto Exit; /* exit successfully! */ - if ( FT_ALLOC( map->buffer, size ) ) + error = ft_glyphslot_alloc_bitmap( slot, size ); + if (error) goto Exit; } @@ -1348,11 +1350,12 @@ elem_range, ebdt_pos, elem_offset, - map, + slot, x_offset + comp->x_offset, y_offset + comp->y_offset, stream, - &elem_metrics ); + &elem_metrics, + depth+1 ); if ( error ) goto Fail_Memory; } @@ -1409,7 +1412,6 @@ TT_SBit_MetricsRec *metrics ) { FT_Error error; - FT_Memory memory = stream->memory; FT_ULong ebdt_pos, glyph_offset; TT_SBit_Strike strike; @@ -1432,20 +1434,11 @@ ebdt_pos = FT_STREAM_POS(); - /* clear the bitmap & load the bitmap */ - if ( face->root.glyph->flags & FT_GLYPH_OWN_BITMAP ) - FT_FREE( map->buffer ); - - map->rows = map->pitch = map->width = 0; - error = Load_SBit_Image( strike, range, ebdt_pos, glyph_offset, - map, 0, 0, stream, metrics ); + face->root.glyph, 0, 0, stream, metrics, 0 ); if ( error ) goto Exit; - /* the glyph slot owns this bitmap buffer */ - face->root.glyph->flags |= FT_GLYPH_OWN_BITMAP; - /* setup vertical metrics if needed */ if ( strike->flags & 1 ) { diff --git a/src/type42/t42objs.c b/src/type42/t42objs.c index dcc807701..c4856344b 100644 --- a/src/type42/t42objs.c +++ b/src/type42/t42objs.c @@ -560,17 +560,10 @@ static void - ft_glyphslot_clear( FT_GlyphSlot slot ) + t42_glyphslot_clear( FT_GlyphSlot slot ) { /* free bitmap if needed */ - if ( slot->flags & FT_GLYPH_OWN_BITMAP ) - { - FT_Memory memory = FT_FACE_MEMORY( slot->face ); - - - FT_FREE( slot->bitmap.buffer ); - slot->flags &= ~FT_GLYPH_OWN_BITMAP; - } + ft_glyphslot_free_bitmap( slot ); /* clear all public fields in the glyph slot */ FT_ZERO( &slot->metrics ); @@ -603,7 +596,7 @@ FT_Driver_Class ttclazz = ((T42_Driver)glyph->face->driver)->ttclazz; - ft_glyphslot_clear( t42slot->ttslot ); + t42_glyphslot_clear( t42slot->ttslot ); error = ttclazz->load_glyph( t42slot->ttslot, t42size->ttsize, glyph_index, diff --git a/src/winfonts/winfnt.c b/src/winfonts/winfnt.c index 7b2a0e498..a82f5ebee 100644 --- a/src/winfonts/winfnt.c +++ b/src/winfonts/winfnt.c @@ -618,32 +618,18 @@ /* allocate and build bitmap */ { - FT_Memory memory = FT_FACE_MEMORY( slot->face ); FT_Int pitch = ( bitmap->width + 7 ) >> 3; - FT_Byte* column; - FT_Byte* write; bitmap->pitch = pitch; bitmap->rows = font->header.pixel_height; bitmap->pixel_mode = FT_PIXEL_MODE_MONO; - if ( FT_ALLOC( bitmap->buffer, pitch * bitmap->rows ) ) - goto Exit; - - column = (FT_Byte*)bitmap->buffer; - - for ( ; pitch > 0; pitch--, column++ ) - { - FT_Byte* limit = p + bitmap->rows; - - - for ( write = column; p < limit; p++, write += bitmap->pitch ) - write[0] = p[0]; - } + /* note: we don't allocate a new buffer for the bitmap since we */ + /* already store the images in the FT_Face */ + ft_glyphslot_set_bitmap( slot, p ); } - slot->flags = FT_GLYPH_OWN_BITMAP; slot->bitmap_left = 0; slot->bitmap_top = font->header.ascent; slot->format = FT_GLYPH_FORMAT_BITMAP;