Added a new documentation file that explains how memory management and basic i/o access are performed with FreeType 2. Note that unlike FT 1.x, you don't need to recompile the library if you want to provide your own memory manager or your own i/o streams.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
diff --git a/docs/internals/system-interface.html b/docs/internals/system-interface.html
new file mode 100644
index 0000000..c505bbe
--- /dev/null
+++ b/docs/internals/system-interface.html
@@ -0,0 +1,258 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="David Turner">
+ <meta name="GENERATOR" content="Mozilla/4.5 [fr] (Win98; I) [Netscape]">
+ <title>FreeType 2 Internals</title>
+</head>
+<body>
+
+<body text="#000000"
+ bgcolor="#FFFFFF"
+ link="#0000EF"
+ vlink="#51188E"
+ alink="#FF0000">
+
+<center>
+<h1>
+FreeType 2.0 System Interface</h1></center>
+
+<center>
+<h3>
+© 2000 David Turner (<a href="fichier :///david@freetype.org">david@freetype.org</a>)<br>
+© 2000 The FreeType Development Team (<a href="fichier :///devel@freetype.org">devel@freetype.org</a>)</h3></center>
+
+<p><br>
+<hr WIDTH="100%">
+<br>
+<h2>Introduction:</h2>
+<ul>
+ This document explains how the FreeType 2 library performs the low-level and
+ system-specific operations of memory management and i/o access. It is targetted
+ to FreeType hackers, porters and "advanced" developers who want special
+ features like providing their own memory manager or streams.
+ <p>
+ Note that the only system-specific part of the library is a file
+ named "<tt>ftsystem.c</tt>", normally located in the directory
+ "<tt>freetype2/config/<system></tt>" where <tt><system></tt> designates
+ your platform (e.g. "<tt>config/ansi/ftsystem.c</tt>" or
+ "<tt>config/unix/ftsystem.c</tt>").
+ <p>
+</ul>
+
+<p>
+<hr>
+<p>
+
+<h2>I. Memory Management</h2>
+<ul>
+ Memory allocation and releases are performed through a <tt>FT_Memory</tt> object in
+ FreeType. A <tt>FT_Memory</tt> is nothing more than a table of functions plus
+ an arbitrary user data field. It is defined in the file
+ "<tt>freetype2/include/ftsystem.h</tt>" and has the following structure:
+ <p>
+ <ul>
+ <tt>typedef struct</tt><br>
+ <tt>{</tt>
+ <ul>
+ <table>
+ <tr><td><tt><b>void* user</b></tt> <td> // a user-defined pointer. This is zero by default
+ <tr><td><tt><b>void* (*alloc)( FT_System, int)</b></tt> <td> // a function used to allocate a new block
+ <tr><td><tt><b>void* (*realloc)( FT_System, int, int, void* )</b></tt><td> // a function used to reallocate a given block
+ <tr><td><tt><b>void (*free)( FT_System, void*)</b></tt> <td> // a function used to release a given block
+ </table>
+ </ul>
+ <tt>} FT_MemoryRec, *FT_Memory;</tt><br>
+ </ul>
+ <p>
+ You'll notice that:<p>
+ <ul>
+ <li>The <tt>FT_Memory</tt> type is really a pointer to a <tt>FT_MemoryRec</tt>.
+ This is a normal convention for the FreeType code.
+ <li>The <tt>realloc</tt> takes two integer arguments. The first one is the
+ current block size, the second one its new size.
+ </ul>
+ <p>
+
+ All current implementations of "<tt>ftsystem.c</tt>" provide a very simple
+ implementation of the <tt>FT_Memory</tt> interface by calling directly the
+ standard C <tt>alloc</tt>, <tt>realloc</tt> and <tt>free</tt>.
+ <p>
+ The FreeType source code never invokes directly the function pointers. Rather,
+ it calls <tt>FT_Alloc</tt>, <tt>FT_Realloc</tt> and <tt>FT_Free</tt> functions
+ which are defined in "<tt>freetype2/src/base/ftobjs.c</tt>". These will not be
+ discussed here.
+ <p>
+ <b>If you want to use your own memory allocator</b> rather than the one provided
+ by your build of FreeType, follow these simple steps:<p>
+ <ol>
+ <li>Create your own <tt>FT_Memory</tt> object, with pointers that map to
+ your own memory management routines (beware function signatures though).
+ <p>
+ <li>Call <tt>FT_Build_Library(memory,&library)</tt>. This will create a new
+ <tt>FT_Library</tt> object that uses your own <tt>FT_Memory</tt> exclusively.
+ Note however that this library has no font drivers loaded in !!
+ <p>
+ <li>Load the default font drivers into the new library, either by
+ calling <tt>FT_Default_Drivers(library)</tt>, or by adding them manually
+ through repeated calls to <tt>FT_Add_Driver(library,&driver_interface)</tt>
+ <p>
+ </ol>
+ This will replace the <tt>FT_Init_FreeType(&library)</tt> call that an application
+ must do to initialise one library instance.
+ <p>
+ Notice that you <em>don't need to recompile FreeType 2 to use your own memory
+ manager !!</em>.
+ <p>
+</ul>
+
+<p>
+<hr>
+<p>
+
+<h2>II. Streams</h2>
+<ul>
+ <h3>1. Basic Stream Structure</h3>
+ <p>
+ A stream models the array of bytes found in a font file. FreeType 2 separates
+ streams into two families :<p>
+ <ul>
+ <li><b>memory-based streams:</b><br>
+ when the stream's content is entirely found in memory. This is the
+ case for ROM font files, or memory-mapped files.
+ <p>
+ <li><b>disk-based streams:</b><br>
+ when the stream isn't directly accessible in memory. This is the
+ case for local or remote files.
+ <p>
+ </ul>
+ <p>
+ Note that a stream's nature only determines how FreeType accesses its content, not
+ the way it is effectively stored. For example, in the case of a compressed font file,
+ one implementation may choose to uncompress the font in memory, then provide a memory
+ based stream to access it. Another one might chose a disk based stream to perform
+ on-the-fly decompression of the font data. Similarly, the font file can be stored
+ on a local disk, or obtained from a network. This will be completely transparent to
+ FreeType.
+ <p>
+ The stream structure is:
+ <p>
+ <ul>
+ <tt>typedef struct</tt><br>
+ <tt>{</tt><br>
+ <ul><table>
+ <tr><td><tt><b>char* base</b></tt> <td> for memory-based streams, the address
+ of its first byte.
+
+ <tr><td><tt><b>ulong size</b></tt> <td> the stream's size in bytes.
+
+ <tr><td><tt><b>ulong pos</b></tt> <td> the current stream position in the file
+
+ <tr><td><tt><b>descriptor</b></tt><td> a union field used to hold either an
+ integer file descriptor or pointer.
+ This field is not used by FreeType
+ itself, but is left to implementations
+ of "<tt>ftsystem</tt>"
+ <tr><td><tt><b>pathname</b></tt> <td> a union field that can hold either an
+ integer or pointer. It is not used by
+ FreeType itself, but is left to
+ implementations. These can put the
+ file pathname's during debugging for
+ example.
+
+ <tr><td><tt><b>read</b></tt> <td> a pointer to a function used to seek the
+ stream and/or read a run of bytes from it.
+
+ <tr><td><tt><b>close</b></tt><td> a pointer to a function called when the
+ stream is closed.
+
+ <tr><td><tt><b>memory</b></tt> <td> a <tt>FT_Memory</tt> object, which is used
+ to allocate frames for disk-based streams.
+ This field is set and used by FreeType.
+
+ <tr><td><tt><b>cursor</b></tt> <td> a pointer in memory used when accessing
+ frames. This is set and used by FreeType.
+
+ <tr><td><tt><b>limit</b></tt> <td> a pointer in memory used when accessing
+ frames. This is set and used by FreeType.
+ </table></ul>
+ <tt>} FT_StreamRec, *FT_Stream</tt>
+ </ul>
+ <p>
+
+ The following important things must be noticed here:<p>
+ <ul>
+ <li>The <tt>FT_Stream</tt> type is really a pointer to a <tt>FT_StreamRec</tt>.
+ This is a normal convention for the FreeType source.
+ <p>
+
+ <li>When the <tt>read</tt> field is non NULL, the stream is considered to be
+ disk-based. Otherwise, the stream is memory-based, and the <tt>base</tt>
+ field <em>must</em> be set by "<tt>ftsystem.c</tt>" when the stream is
+ created.
+ <p>
+
+ <li>The <tt>base</tt> field must be set to 0 when a disk-based stream is created.
+ However, this field will later be set and used by the FreeType library when
+ accessing frames of bytes within the font file (of course, this doesn't
+ happen with memory-based streams).
+ </ul>
+
+ <h3>2. Stream lifecyles</h3>
+ <p>
+ Each <tt>FT_Face</tt> needs its own stream to access font data. The most common
+ way to create a new <tt>FT_Stream</tt> object is to call the function
+ <tt>FT_New_Face</tt>. This function takes a <em>file pathname</em> argument that
+ is used to create a new stream object.
+ <p>
+ This is possible because each implementation of "<tt>ftsystem.c</tt>" provides
+ a function called <tt>FT_New_Stream</tt> which takes a file pathname and a
+ <tt>FT_Stream</tt> pointer as an argument. The function simply opens the file
+ and initialises the stream structure accordingly. It is called by <tt>FT_New_Face</tt>
+ to create the face's stream object.
+ <p>
+ A stream is only closed when the face is destroyed through <tt>FT_Done_Face</tt>.
+ Its <tt>close</tt> field function will then be called. Note that the function should
+ <em>never</em> destroy the <tt>FT_Stream</tt>.
+ <p>
+
+
+ <h3>3. Using your own streams</h3>
+ <p>
+ There are cases where it is interesting to provide your own stream to create
+ a new face object, rather than rely on the default implementation. For example,
+ a filepathname, which is a C string, might not be useful on a system where files
+ are named with a UTF-16 string or via an i-node number of memory address (for ROM files).
+ <p>
+ For this purpose, the <tt>FT_Open_Face</tt> is defined. It simply takes a
+ <tt>FT_Stream</tt> pointer as its second argument, instead of a file pathname (the
+ stream must be allocated and initialised by you, so be careful).
+ <p>
+ Actually, the only thing that <tt>FT_New_Face</tt> does is create a new stream
+ through <tt>FT_New_Stream</tt>, then call <tt>FT_Open_Face</tt> to create the
+ face with it.
+ <p>
+ Note also that you can use the function <tt>FT_New_Memory_Face</tt> to create
+ a new font face for a memory-based font file, whose address and size can be passed
+ as arguments. The function automatically creates the corresponding memory-based
+ stream and use it to create the face.
+ <p>
+
+</ul>
+
+
+<p>
+<hr>
+<p>
+
+<h2>III. Thread synchronisation</h2>
+<ul>
+ The FreeType library uses no static data. It can be used concurrently by two
+ thread as long as each one uses its own <tt>FT_Library</tt> instance. Otherwise,
+ one can very simply synchronize access to a single library instance by using a
+ mutex to protect each call to one of FreeType's API functions.
+ <p>
+</ul>
+
+