shithub: freetype+ttf2subf

Download patch

ref: 61c2c33ac63bf86754f078faec747627670d0112
parent: c740c19112373983c5ef56d653f9d19515b61f09
author: Werner Lemberg <[email protected]>
date: Fri Mar 25 17:18:01 EST 2005

Update of the Amiga port.

* builds/amiga/makefile, builds/amiga/smakefile: Handle new modules.

* builds/amiga/makefile.os4: Makefile for AmigaOS4 SDK.

* builds/amiga/README: Updated.

* builds/amiga/include/freetype/config/ftconfig.h: Handle gcc for
AmigaOS4.

* builds/amiga/include/freetype/config/ftmodule.h: Handle new
modules.

* builds/amiga/src/base/ftdebug.c: Updated to current version of
default ftdebug.c.
Add various include files and macros to have proper support for
both AmigaOS4 and older AmigaOS versions.
Don't declare KVPrintF explicitly.
Replace getenv with GetVar.
Actually enable debugging code.

* builds/amiga/src/base/ftsystem.c: Major rewrite.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2005-03-25  Detlef W�rkner  <[email protected]>
+
+	Update of the Amiga port.
+
+	* builds/amiga/makefile, builds/amiga/smakefile: Handle new modules.
+
+	* builds/amiga/makefile.os4: Makefile for AmigaOS4 SDK.
+
+	* builds/amiga/README: Updated.
+
+	* builds/amiga/include/freetype/config/ftconfig.h: Handle gcc for
+	AmigaOS4.
+
+	* builds/amiga/include/freetype/config/ftmodule.h: Handle new
+	modules.
+
+	* builds/amiga/src/base/ftdebug.c: Updated to current version of
+	default ftdebug.c.
+	Add various include files and macros to have proper support for
+	both AmigaOS4 and older AmigaOS versions.
+	Don't declare KVPrintF explicitly.
+	Replace getenv with GetVar.
+	Actually enable debugging code.
+
+	* builds/amiga/src/base/ftsystem.c: Major rewrite.
+
 2005-03-23  Werner Lemberg  <[email protected]>
 
 	* tests/*: Removed.
--- a/builds/amiga/README
+++ b/builds/amiga/README
@@ -1,3 +1,6 @@
+The   makefile.os4  is  for  the  AmigaOS4  SDK.  To  use   it,   type
+"make -f makefile.os4", it produces a link library libft2_ppc.a.
+
 The makefile is  for ppc-morphos-gcc-2.95.3-bin.tgz (gcc 2.95.3 hosted
 on       68k-Amiga      producing       MorphOS-PPC-binaries      from
 http://www.morphos.de).  To  use it, type "make  assign", then "make";
@@ -43,7 +46,7 @@
   exit().  For  debugging of  Amiga run-time shared  system libraries.
   Source code is in src/base/ftdebug.c.
 
-- NO ftinit.o.   Since linking  with a link  library should  result in
+- NO ftinit.o. Because  linking  with a link library should  result in
   linking  only  the  needed   object  modules  in  it,  but  standard
   ftsystem.o would  force ALL FreeType2  modules to be linked  to your
   program,  I decided  to use  a different  scheme: You  must #include
@@ -59,7 +62,7 @@
   the #define statements for the FreeType2 modules you need.
 
 - You  can  use  either  PARAMETERS=REGISTER or  PARAMETERS=STACK  for
-  calling  the FreeType2  functions, since  the link  library  and the
+  calling  the FreeType2 functions, because the link  library  and the
   object files are compiled with PARAMETERS=BOTH.
 
 - "smake assign" (assign "FT:" to the FreeType2 main directory).
--- a/builds/amiga/include/freetype/config/ftconfig.h
+++ b/builds/amiga/include/freetype/config/ftconfig.h
@@ -9,7 +9,11 @@
 
 // TetiSoft: now include original file
 #ifndef __MORPHOS__
+#ifdef __SASC
 #include "FT:include/freetype/config/ftconfig.h"
+#else
+#include "/FT/include/freetype/config/ftconfig.h"
+#endif
 #else
 // We must define that, it seems that
 // lib/gcc-lib/ppc-morphos/2.95.3/include/syslimits.h is missing in 
--- a/builds/amiga/include/freetype/config/ftmodule.h
+++ b/builds/amiga/include/freetype/config/ftmodule.h
@@ -1,23 +1,24 @@
-// TetiSoft: To specify which modules you need,
+// To specify which modules you need,
 // insert the following in your source file and uncomment as needed:
 
 /*
-//#define FT_USE_AUTOHINT       // autohinter
-//#define FT_USE_RASTER         // monochrome rasterizer
-//#define FT_USE_SMOOTH         // anti-aliasing rasterizer
-//#define FT_USE_TT             // truetype font driver
-//#define FT_USE_T1             // type1 font driver
-//#define FT_USE_T42            // type42 font driver
-//#define FT_USE_T1CID          // cid-keyed type1 font driver  // no cmap support
-//#define FT_USE_CFF            // opentype font driver
-//#define FT_USE_BDF            // bdf bitmap font driver
-//#define FT_USE_PCF            // pcf bitmap font driver
-//#define FT_USE_PFR            // pfr font driver
-//#define FT_USE_WINFNT         // windows .fnt|.fon bitmap font driver
+//#define FT_USE_AUTOFIT // autofitter
+//#define FT_USE_RASTER  // monochrome rasterizer
+//#define FT_USE_SMOOTH  // anti-aliasing rasterizer
+//#define FT_USE_TT      // truetype font driver
+//#define FT_USE_T1      // type1 font driver
+//#define FT_USE_T42     // type42 font driver
+//#define FT_USE_T1CID   // cid-keyed type1 font driver  // no cmap support
+//#define FT_USE_CFF     // opentype font driver
+//#define FT_USE_BDF     // bdf bitmap font driver
+//#define FT_USE_PCF     // pcf bitmap font driver
+//#define FT_USE_PFR     // pfr font driver
+//#define FT_USE_WINFNT  // windows .fnt|.fon bitmap font driver
+//#define FT_USE_OTV     // opentype validator
 #include "FT:src/base/ftinit.c"
 */
 
-// TetiSoft: make sure that needed support modules are built in.
+// Make sure that needed support modules are built in.
 // Dependencies can be found by searching for FT_Get_Module.
 
 #ifdef FT_USE_T42
@@ -54,16 +55,20 @@
 #define FT_USE_PSNAMES
 #endif
 
-// TetiSoft: Now include the modules
+// Now include the modules
 
-#ifdef FT_USE_AUTOHINT
-FT_USE_MODULE(autohint_module_class)
+#ifdef FT_USE_AUTOFIT
+FT_USE_MODULE(autofit_module_class)
 #endif
 
-#ifdef FT_USE_PSHINT
-FT_USE_MODULE(pshinter_module_class)
+#ifdef FT_USE_TT
+FT_USE_MODULE(tt_driver_class)
 #endif
 
+#ifdef FT_USE_T1
+FT_USE_MODULE(t1_driver_class)
+#endif
+
 #ifdef FT_USE_CFF
 FT_USE_MODULE(cff_driver_class)
 #endif
@@ -72,18 +77,22 @@
 FT_USE_MODULE(t1cid_driver_class)
 #endif
 
-#ifdef FT_USE_BDF
-FT_USE_MODULE(bdf_driver_class)
+#ifdef FT_USE_PFR
+FT_USE_MODULE(pfr_driver_class)
 #endif
 
-#ifdef FT_USE_PCF
-FT_USE_MODULE(pcf_driver_class)
+#ifdef FT_USE_T42
+FT_USE_MODULE(t42_driver_class)
 #endif
 
-#ifdef FT_USE_PFR
-FT_USE_MODULE(pfr_driver_class)
+#ifdef FT_USE_WINFNT
+FT_USE_MODULE(winfnt_driver_class)
 #endif
 
+#ifdef FT_USE_PCF
+FT_USE_MODULE(pcf_driver_class)
+#endif
+
 #ifdef FT_USE_PSAUX
 FT_USE_MODULE(psaux_module_class)
 #endif
@@ -92,6 +101,10 @@
 FT_USE_MODULE(psnames_module_class)
 #endif
 
+#ifdef FT_USE_PSHINT
+FT_USE_MODULE(pshinter_module_class)
+#endif
+
 #ifdef FT_USE_RASTER
 FT_USE_MODULE(ft_raster1_renderer_class)
 #endif
@@ -106,18 +119,10 @@
 FT_USE_MODULE(ft_smooth_lcdv_renderer_class)
 #endif
 
-#ifdef FT_USE_TT
-FT_USE_MODULE(tt_driver_class)
+#ifdef FT_USE_OTV
+FT_USE_MODULE(otv_module_class)
 #endif
 
-#ifdef FT_USE_T1
-FT_USE_MODULE(t1_driver_class)
-#endif
-
-#ifdef FT_USE_T42
-FT_USE_MODULE(t42_driver_class)
-#endif
-
-#ifdef FT_USE_WINFNT
-FT_USE_MODULE(winfnt_driver_class)
+#ifdef FT_USE_BDF
+FT_USE_MODULE(bdf_driver_class)
 #endif
--- a/builds/amiga/makefile
+++ b/builds/amiga/makefile
@@ -11,18 +11,19 @@
 # Your programs source code should start with this
 # (uncomment the parts you do not need to keep the program small):
 # ---8<---
-#define FT_USE_AUTOHINT // autohinter
-#define FT_USE_RASTER   // monochrome rasterizer
-#define FT_USE_SMOOTH   // anti-aliasing rasterizer
-#define FT_USE_TT       // truetype font driver
-#define FT_USE_T1       // type1 font driver
-#define FT_USE_T42      // type42 font driver
-#define FT_USE_T1CID    // cid-keyed type1 font driver
-#define FT_USE_CFF      // opentype font driver
-#define FT_USE_BDF      // bdf bitmap font driver
-#define FT_USE_PCF      // pcf bitmap font driver
-#define FT_USE_PFR      // pfr font driver
-#define FT_USE_WINFNT   // windows .fnt|.fon bitmap font driver
+#define FT_USE_AUTOFIT // autofitter
+#define FT_USE_RASTER  // monochrome rasterizer
+#define FT_USE_SMOOTH  // anti-aliasing rasterizer
+#define FT_USE_TT      // truetype font driver
+#define FT_USE_T1      // type1 font driver
+#define FT_USE_T42     // type42 font driver
+#define FT_USE_T1CID   // cid-keyed type1 font driver
+#define FT_USE_CFF     // opentype font driver
+#define FT_USE_BDF     // bdf bitmap font driver
+#define FT_USE_PCF     // pcf bitmap font driver
+#define FT_USE_PFR     // pfr font driver
+#define FT_USE_WINFNT  // windows .fnt|.fon bitmap font driver
+#define FT_USE_OTV     // opentype validator
 #include "FT:src/base/ftinit.c"
 # ---8<---
 #
@@ -69,12 +70,15 @@
 #
 # FreeType2 library base extensions
 #
-ftglyph.ppc.o: $(FTSRC)/base/ftglyph.c
+ftbbox.ppc.o: $(FTSRC)/base/ftbbox.c
 	$(CC) -c $(CFLAGS) -o $@ $<
 
-ftbbox.ppc.o: $(FTSRC)/base/ftbbox.c
+ftbdf.ppc.o: $(FTSRC)/base/ftbdf.c
 	$(CC) -c $(CFLAGS) -o $@ $<
 
+ftglyph.ppc.o: $(FTSRC)/base/ftglyph.c
+	$(CC) -c $(CFLAGS) -o $@ $<
+
 ftmm.ppc.o: $(FTSRC)/base/ftmm.c
 	$(CC) -c $(CFLAGS) -o $@ $<
 
@@ -81,16 +85,16 @@
 ftsynth.ppc.o: $(FTSRC)/base/ftsynth.c
 	$(CC) -c $(CFLAGS) -o $@ $<
 
-#
-# FreeType2 library autohinting module
-#
-autohint.ppc.o: $(FTSRC)/autohint/autohint.c
+fttype1.ppc.o: $(FTSRC)/base/fttype1.c
 	$(CC) -c $(CFLAGS) -o $@ $<
 
+ftwinfnt.ppc.o: $(FTSRC)/base/ftwinfnt.c
+	$(CC) -c $(CFLAGS) -o $@ $<
+
 #
-# FreeType2 library autohinting module extensions
+# FreeType2 library autofitting module
 #
-ahoptim.ppc.o: $(FTSRC)/autohint/ahoptim.c
+autofit.ppc.o: $(FTSRC)/autofit/autofit.c
 	$(CC) -c $(CFLAGS) -o $@ $<
 
 #
@@ -130,7 +134,7 @@
 	$(CC) -c $(CFLAGS) -o $@ $<
 
 #
-# FreeType2 library glyph and image caching system (still experimental)
+# FreeType2 library glyph and image caching system
 #
 ftcache.ppc.o: $(FTSRC)/cache/ftcache.c
 	$(CC) -c $(CFLAGS) -o $@ $<
@@ -178,6 +182,18 @@
 	$(CC) -c $(CFLAGS) -o $@ $<
 
 #
+# FreeType2 library gzip support for compressed PCF bitmap fonts
+#
+gzip.ppc.o: $(FTSRC)/gzip/ftgzip.c
+	$(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library compress support for compressed PCF bitmap fonts
+#
+lzw.ppc.o: $(FTSRC)/lzw/ftlzw.c
+	$(CC) -c $(CFLAGS) -o $@ $<
+
+#
 # FreeType2 library PFR font driver
 #
 pfr.ppc.o: $(FTSRC)/pfr/pfr.c
@@ -189,12 +205,21 @@
 winfnt.ppc.o: $(FTSRC)/winfonts/winfnt.c
 	$(CC) -c $(CFLAGS) -o $@ $<
 
-BASEPPC = ftbase.ppc.o ftglyph.ppc.o ftbbox.ppc.o ftmm.ppc.o ftsynth.ppc.o
+#
+# FreeType2 library OpenType validator
+#
+otvalid.ppc.o: $(FTSRC)/otvalid/otvalid.c
+	$(CC) -c $(CFLAGS) -o $@ $<
 
+BASEPPC = ftbase.ppc.o ftbdf.ppc.o ftglyph.ppc.o ftbbox.ppc.o ftmm.ppc.o\
+	  ftsynth.ppc.o fttype1.ppc.o ftwinfnt.ppc.o
+
 DEBUGPPC = ftdebug.ppc.o ftdebugpure.ppc.o
 
-AHINTPPC = autohint.ppc.o ahoptim.ppc.o
+AFITPPC = autofit.ppc.o
 
+OTVPPC = otvalid.ppc.o
+
 PSPPC = psaux.ppc.o psnames.ppc.o pshinter.ppc.o
 
 RASTERPPC = raster.ppc.o smooth.ppc.o
@@ -202,6 +227,6 @@
 FONTDPPC = cff.ppc.o type1.ppc.o type42.ppc.o type1cid.ppc.o truetype.ppc.o\
 	   bdf.ppc.o pcf.ppc.o pfr.ppc.o winfnt.ppc.o
 
-libft2_ppc.a:    $(BASEPPC) $(AHINTPPC) $(PSPPC) $(RASTERPPC) sfnt.ppc.o ftcache.ppc.o $(FONTDPPC)
-	$(AR) $@ $(BASEPPC) $(AHINTPPC) $(PSPPC) $(RASTERPPC) sfnt.ppc.o ftcache.ppc.o $(FONTDPPC)
+libft2_ppc.a:    $(BASEPPC) $(AFITPPC) $(OTVPPC) $(PSPPC) $(RASTERPPC) sfnt.ppc.o ftcache.ppc.o $(FONTDPPC) gzip.ppc.o lzw.ppc.o
+	$(AR) $@ $(BASEPPC) $(AFITPPC) $(OTVPPC) $(PSPPC) $(RASTERPPC) sfnt.ppc.o ftcache.ppc.o $(FONTDPPC) gzip.ppc.o lzw.ppc.o
 	-@ ($(RANLIB) $@ || true) >/dev/null 2>&1
--- /dev/null
+++ b/builds/amiga/makefile.os4
@@ -1,0 +1,238 @@
+#
+# Makefile for FreeType2 link library using gcc 3.4.3 from the
+# AmigaOS4 SDK
+#
+# to build from the builds/amiga directory call
+#
+#  make
+#
+# Your programs source code should start with this
+# (uncomment the parts you do not need to keep the program small):
+# ---8<---
+#define FT_USE_AUTOFIT // autofitter
+#define FT_USE_RASTER  // monochrome rasterizer
+#define FT_USE_SMOOTH  // anti-aliasing rasterizer
+#define FT_USE_TT      // truetype font driver
+#define FT_USE_T1      // type1 font driver
+#define FT_USE_T42     // type42 font driver
+#define FT_USE_T1CID   // cid-keyed type1 font driver
+#define FT_USE_CFF     // opentype font driver
+#define FT_USE_BDF     // bdf bitmap font driver
+#define FT_USE_PCF     // pcf bitmap font driver
+#define FT_USE_PFR     // pfr font driver
+#define FT_USE_WINFNT  // windows .fnt|.fon bitmap font driver
+#define FT_USE_OTV     // opentype validator
+#include "FT:src/base/ftinit.c"
+# ---8<---
+#
+# link your programs with libft2_ppc.a and either ftsystem.ppc.o or ftsystempure.ppc.o
+# (and either ftdebug.ppc.o or ftdebugpure.ppc.o if you enabled FT_DEBUG_LEVEL_ERROR or
+# FT_DEBUG_LEVEL_TRACE in include/freetype/config/ftoption.h).
+
+all:	assign libft2_ppc.a ftsystem.ppc.o ftsystempure.ppc.o
+
+assign:
+	assign FT: //
+
+CC =     ppc-amigaos-gcc
+AR =     ppc-amigaos-ar
+RANLIB = ppc-amigaos-ranlib
+
+DIRFLAGS  = -Iinclude -I/FT/src -I/FT/include -I/SDK/include
+
+WARNINGS = -Wall -W -Wundef -Wpointer-arith -Wbad-function-cast \
+	   -Waggregate-return -Wshadow -fno-strict-aliasing
+
+CPU      = -mcpu=604e
+
+OPTIONS  = -DNDEBUG -fno-builtin
+OPTIMIZE = -O2 -fomit-frame-pointer -fstrength-reduce -finline-functions
+
+CFLAGS   = $(DIRFLAGS) $(WARNINGS) $(FT2FLAGS) $(CPU) $(OPTIONS) $(OPTIMIZE)
+
+#
+# FreeType2 library base
+#
+ftbase.ppc.o: FT:src/base/ftbase.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbase.c
+
+ftinit.ppc.o: FT:src/base/ftinit.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftinit.c
+
+ftsystem.ppc.o: FT:src/base/ftsystem.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftsystem.c
+
+# pure version for use in run-time library etc
+ftsystempure.ppc.o: src/base/ftsystem.c
+	$(CC) -c $(CFLAGS) -o $@ src/base/ftsystem.c
+
+#
+# FreeType2 library base extensions
+#
+ftbbox.ppc.o: FT:src/base/ftbbox.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbbox.c
+
+ftbdf.ppc.o: FT:src/base/ftbdf.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbdf.c
+
+ftdebug.ppc.o: FT:src/base/ftdebug.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftdebug.c
+
+# pure version for use in run-time library etc
+ftdebugpure.ppc.o: src/base/ftdebug.c
+	$(CC) -c $(CFLAGS) -o $@ src/base/ftdebug.c
+
+ftglyph.ppc.o: FT:src/base/ftglyph.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftglyph.c
+
+ftmm.ppc.o: FT:src/base/ftmm.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftmm.c
+
+ftsynth.ppc.o: FT:src/base/ftsynth.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftsynth.c
+
+fttype1.ppc.o: FT:src/base/fttype1.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/base/fttype1.c
+
+ftwinfnt.ppc.o: FT:src/base/ftwinfnt.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftwinfnt.c
+
+#
+# FreeType2 library autofitting module
+#
+autofit.ppc.o: FT:src/autofit/autofit.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/autofit/autofit.c
+
+#
+# FreeType2 library postscript hinting module
+#
+pshinter.ppc.o: FT:src/pshinter/pshinter.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/pshinter/pshinter.c
+
+#
+# FreeType2 library PS support module
+#
+psaux.ppc.o: FT:src/psaux/psaux.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/psaux/psaux.c
+
+#
+# FreeType2 library PS glyph names module
+#
+psnames.ppc.o: FT:src/psnames/psnames.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/psnames/psnames.c
+
+#
+# FreeType2 library monochrome raster module
+#
+raster.ppc.o: FT:src/raster/raster.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/raster/raster.c
+
+#
+# FreeType2 library anti-aliasing raster module
+#
+smooth.ppc.o: FT:src/smooth/smooth.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/smooth/smooth.c
+
+#
+# FreeType2 library 'sfnt' module
+#
+sfnt.ppc.o: FT:src/sfnt/sfnt.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/sfnt/sfnt.c
+
+#
+# FreeType2 library glyph and image caching system
+#
+ftcache.ppc.o: FT:src/cache/ftcache.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/cache/ftcache.c
+
+#
+# FreeType2 library OpenType font driver
+#
+cff.ppc.o: FT:src/cff/cff.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/cff/cff.c
+
+#
+# FreeType2 library TrueType font driver
+#
+truetype.ppc.o: FT:src/truetype/truetype.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/truetype/truetype.c
+
+#
+# FreeType2 library Type1 font driver
+#
+type1.ppc.o: FT:src/type1/type1.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/type1/type1.c
+
+#
+# FreeType2 library Type42 font driver
+#
+type42.ppc.o: FT:src/type42/type42.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/type42/type42.c
+
+#
+# FreeType2 library CID-keyed Type1 font driver
+#
+type1cid.ppc.o: FT:src/cid/type1cid.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/cid/type1cid.c
+
+#
+# FreeType2 library BDF bitmap font driver
+#
+bdf.ppc.o: FT:src/bdf/bdf.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/bdf/bdf.c
+
+#
+# FreeType2 library PCF bitmap font driver
+#
+pcf.ppc.o: FT:src/pcf/pcf.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/pcf/pcf.c
+
+#
+# FreeType2 library gzip support for compressed PCF bitmap fonts
+#
+gzip.ppc.o: FT:src/gzip/ftgzip.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/gzip/ftgzip.c
+
+#
+# FreeType2 library compress support for compressed PCF bitmap fonts
+#
+lzw.ppc.o: FT:src/lzw/ftlzw.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/lzw/ftlzw.c
+
+#
+# FreeType2 library PFR font driver
+#
+pfr.ppc.o: FT:src/pfr/pfr.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/pfr/pfr.c
+
+#
+# FreeType2 library Windows FNT/FON bitmap font driver
+#
+winfnt.ppc.o: FT:src/winfonts/winfnt.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/winfonts/winfnt.c
+
+#
+# FreeType2 library OpenType validator
+#
+otvalid.ppc.o: FT:src/otvalid/otvalid.c
+	$(CC) -c $(CFLAGS) -o $@ /FT/src/otvalid/otvalid.c
+
+BASE =  ftbase.ppc.o ftbdf.ppc.o ftglyph.ppc.o ftbbox.ppc.o ftmm.ppc.o\
+	ftsynth.ppc.o fttype1.ppc.o ftwinfnt.ppc.o
+
+DEBUG = ftdebug.ppc.o ftdebugpure.ppc.o
+
+AFIT = autofit.ppc.o
+
+OTV = otvalid.ppc.o
+
+PS = psaux.ppc.o psnames.ppc.o pshinter.ppc.o
+
+RASTER = raster.ppc.o smooth.ppc.o
+
+FONTD = cff.ppc.o type1.ppc.o type42.ppc.o type1cid.ppc.o truetype.ppc.o\
+	bdf.ppc.o pcf.ppc.o pfr.ppc.o winfnt.ppc.o
+
+libft2_ppc.a:      $(BASE) $(AFIT) $(OTV) $(PS) $(RASTER) sfnt.ppc.o ftcache.ppc.o $(FONTD) gzip.ppc.o lzw.ppc.o
+	$(AR) r $@ $(BASE) $(AFIT) $(OTV) $(PS) $(RASTER) sfnt.ppc.o ftcache.ppc.o $(FONTD) gzip.ppc.o lzw.ppc.o
+	$(RANLIB) $@
--- a/builds/amiga/smakefile
+++ b/builds/amiga/smakefile
@@ -9,18 +9,19 @@
 # Your programs source code should start with this
 # (uncomment the parts you do not need to keep the program small):
 # ---8<---
-#define FT_USE_AUTOHINT // autohinter
-#define FT_USE_RASTER   // monochrome rasterizer
-#define FT_USE_SMOOTH   // anti-aliasing rasterizer
-#define FT_USE_TT       // truetype font driver
-#define FT_USE_T1       // type1 font driver
-#define FT_USE_T42      // type42 font driver
-#define FT_USE_T1CID    // cid-keyed type1 font driver
-#define FT_USE_CFF      // opentype font driver
-#define FT_USE_BDF      // bdf bitmap font driver
-#define FT_USE_PCF      // pcf bitmap font driver
-#define FT_USE_PFR      // pfr font driver
-#define FT_USE_WINFNT   // windows .fnt|.fon bitmap font driver
+#define FT_USE_AUTOFIT // autofitter
+#define FT_USE_RASTER  // monochrome rasterizer
+#define FT_USE_SMOOTH  // anti-aliasing rasterizer
+#define FT_USE_TT      // truetype font driver
+#define FT_USE_T1      // type1 font driver
+#define FT_USE_T42     // type42 font driver
+#define FT_USE_T1CID   // cid-keyed type1 font driver
+#define FT_USE_CFF     // opentype font driver
+#define FT_USE_BDF     // bdf bitmap font driver
+#define FT_USE_PCF     // pcf bitmap font driver
+#define FT_USE_PFR     // pfr font driver
+#define FT_USE_WINFNT  // windows .fnt|.fon bitmap font driver
+#define FT_USE_OTV     // opentype validator
 #include "FT:src/base/ftinit.c"
 # ---8<---
 #
@@ -28,32 +29,24 @@
 # (and either ftdebug.o or ftdebugpure.o if you enabled FT_DEBUG_LEVEL_ERROR or
 # FT_DEBUG_LEVEL_TRACE in include/freetype/config/ftoption.h).
 
-OBJBASE = ftbase.o ftglyph.o ftbbox.o ftmm.o ftsynth.o
+OBJBASE = ftbase.o ftbdf.o ftglyph.o ftbbox.o ftmm.o ftsynth.o fttype1.o ftwinfnt.o
 
 OBJSYSTEM = ftsystem.o ftsystempure.o
 
 OBJDEBUG = ftdebug.o ftdebugpure.o
 
-OBJAHINT = autohint.o ahoptim.o
+OBJAFIT = autofit.o
 
-OBJPSHINT = pshinter.o
+OBJOTV = otvalid.o
 
-OBJPSAUX = psaux.o
+OBJPS = psaux.o psnames.o pshinter.o
 
-OBJPSNAM = psnames.o
+OBJRASTER = raster.o smooth.o
 
-OBJRAST = raster.o
-
-OBJSMOOTH = smooth.o
-
 OBJSFNT = sfnt.o
 
 OBJCACHE = ftcache.o
 
-OBJPS = $(OBJPSAUX) $(OBJPSNAM) $(OBJPSHINT)
-
-OBJRASTER = $(OBJRAST) $(OBJSMOOTH)
-
 OBJFONTD = cff.o type1.o type42.o type1cid.o\
 	   truetype.o winfnt.o bdf.o pcf.o pfr.o
 
@@ -88,8 +81,8 @@
 
 # uses separate object modules in lib to make for easier debugging
 # also, can make smaller programs if entire engine is not used
-ft2_$(CPU).lib:  $(OBJBASE) $(OBJAHINT) $(OBJPS) $(OBJRASTER) $(OBJSFNT) $(OBJCACHE) $(OBJFONTD)
-	oml $@ r $(OBJBASE) $(OBJAHINT) $(OBJPS) $(OBJRASTER) $(OBJSFNT) $(OBJCACHE) $(OBJFONTD)
+ft2_$(CPU).lib:  $(OBJBASE) $(OBJAFIT) $(OBJOTV) $(OBJPS) $(OBJRASTER) $(OBJSFNT) $(OBJCACHE) $(OBJFONTD) lzw.o # gzip.o
+	oml $@ r $(OBJBASE) $(OBJAFIT) $(OBJOTV) $(OBJPS) $(OBJRASTER) $(OBJSFNT) $(OBJCACHE) $(OBJFONTD) lzw.o
 
 clean:
 	-delete \#?.o
@@ -115,25 +108,26 @@
 #
 # freetype library base extensions
 #
-ftglyph.o: $(CORE)base/ftglyph.c
-	sc $(SCFLAGS) objname=$@ $<
 ftbbox.o: $(CORE)base/ftbbox.c
 	sc $(SCFLAGS) objname=$@ $<
+ftbdf.o: $(CORE)base/ftbdf.c
+	sc $(SCFLAGS) objname=$@ $<
+ftglyph.o: $(CORE)base/ftglyph.c
+	sc $(SCFLAGS) objname=$@ $<
 ftmm.o: $(CORE)base/ftmm.c
 	sc $(SCFLAGS) objname=$@ $<
 ftsynth.o: $(CORE)base/ftsynth.c
 	sc $(SCFLAGS) objname=$@ $<
+fttype1.o: $(CORE)base/fttype1.c
+	sc $(SCFLAGS) objname=$@ $<
+ftwinfnt.o: $(CORE)base/ftwinfnt.c
+	sc $(SCFLAGS) objname=$@ $<
 
 #
-# freetype library autohinting module
+# freetype library autofitter module
 #
-autohint.o: $(CORE)autohint/autohint.c
+autofit.o: $(CORE)autofit/autofit.c
 	sc $(SCFLAGS) objname=$@ $<
-#
-# freetype library autohinting module extensions
-#
-ahoptim.o: $(CORE)autohint/ahoptim.c
-	sc $(SCFLAGS) objname=$@ $<
 
 #
 # freetype library PS hinting module
@@ -224,6 +218,18 @@
 	sc $(SCFLAGS) objname=$@ $<
 
 #
+# freetype library gzip support for compressed PCF bitmap fonts
+#
+gzip.o: $(CORE)gzip/ftgzip.c
+	sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library compress support for compressed PCF bitmap fonts
+#
+lzw.o: $(CORE)lzw/ftlzw.c
+	sc $(SCFLAGS) objname=$@ $<
+
+#
 # freetype library PFR font driver
 #
 pfr.o: $(CORE)pfr/pfr.c
@@ -233,4 +239,10 @@
 # freetype library Windows FNT/FON bitmap font driver
 #
 winfnt.o: $(CORE)winfonts/winfnt.c
+	sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library OpenType validator
+#
+otvalid.o: $(CORE)otvalid/otvalid.c
 	sc $(SCFLAGS) objname=$@ $<
--- a/builds/amiga/src/base/ftdebug.c
+++ b/builds/amiga/src/base/ftdebug.c
@@ -1,6 +1,24 @@
-// TetiSoft: replaced vprintf() with KVPrintF() and commented out exit()
-extern void __stdargs KVPrintF( const char *formatString, const void *values );
+/*
+ * TetiSoft: replaced vprintf() with KVPrintF(), commented out exit(),
+ * and replaced getenv() with GetVar()
+ */
 
+#include <exec/types.h>
+#include <utility/tagitem.h>
+#include <dos/exall.h>
+#include <dos/var.h>
+#define __NOLIBBASE__
+#define __NOLOBALIFACE__
+#define __USE_INLINE__
+#include <proto/dos.h>
+#include <clib/debug_protos.h>
+
+#ifndef __amigaos4__
+extern struct Library *DOSBase;
+#else
+extern struct DOSIFace *IDOS;
+#endif
+
 /***************************************************************************/
 /*                                                                         */
 /*  ftdebug.c                                                              */
@@ -7,7 +25,7 @@
 /*                                                                         */
 /*    Debugging and logging component (body).                              */
 /*                                                                         */
-/*  Copyright 1996-2001 by                                                 */
+/*  Copyright 1996-2001, 2002, 2004 by                                     */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -45,21 +63,14 @@
 
 
 #include <ft2build.h>
+#include FT_FREETYPE_H
 #include FT_INTERNAL_DEBUG_H
 
 
-#ifdef FT_DEBUG_LEVEL_TRACE
-  char  ft_trace_levels[trace_max];
-#endif
+#if defined( FT_DEBUG_LEVEL_ERROR )
 
+  /* documentation is in ftdebug.h */
 
-#if defined( FT_DEBUG_LEVEL_ERROR ) || defined( FT_DEBUG_LEVEL_TRACE )
-
-
-#include <stdarg.h>
-#include <stdlib.h>
-
-
   FT_EXPORT_DEF( void )
   FT_Message( const char*  fmt, ... )
   {
@@ -67,12 +78,14 @@
 
 
     va_start( ap, fmt );
-//  vprintf( fmt, ap );
+/*  vprintf( fmt, ap ); */
     KVPrintF( fmt, ap );
     va_end( ap );
   }
 
 
+  /* documentation is in ftdebug.h */
+
   FT_EXPORT_DEF( void )
   FT_Panic( const char*  fmt, ... )
   {
@@ -80,29 +93,87 @@
 
 
     va_start( ap, fmt );
-//  vprintf( fmt, ap );
+/*  vprintf( fmt, ap ); */
     KVPrintF( fmt, ap );
     va_end( ap );
 
-//  exit( EXIT_FAILURE );
+/*  exit( EXIT_FAILURE ); */
   }
 
+#endif /* FT_DEBUG_LEVEL_ERROR */
 
 
-  /* since I don't know wether "getenv" is available on the Amiga */
-  /* I prefer to simply disable this code for now in all builds   */
-  /*                                                              */
 
-/* #ifdef FT_DEBUG_LEVEL_TRACE */
-#if 0
+#ifdef FT_DEBUG_LEVEL_TRACE
 
+  /* array of trace levels, initialized to 0 */
+  int  ft_trace_levels[trace_count];
+
+
+  /* define array of trace toggle names */
+#define FT_TRACE_DEF( x )  #x ,
+
+  static const char*  ft_trace_toggles[trace_count + 1] =
+  {
+#include FT_INTERNAL_TRACE_H
+    NULL
+  };
+
+#undef FT_TRACE_DEF
+
+
+  /* documentation is in ftdebug.h */
+
+  FT_EXPORT_DEF( FT_Int )
+  FT_Trace_Get_Count( void )
+  {
+    return trace_count;
+  }
+
+
+  /* documentation is in ftdebug.h */
+
+  FT_EXPORT_DEF( const char * )
+  FT_Trace_Get_Name( FT_Int  idx )
+  {
+    int  max = FT_Trace_Get_Count();
+
+
+    if ( idx < max )
+      return ft_trace_toggles[idx];
+    else
+      return NULL;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Initialize the tracing sub-system.  This is done by retrieving the    */
+  /* value of the `FT2_DEBUG' environment variable.  It must be a list of  */
+  /* toggles, separated by spaces, `;', or `,'.  Example:                  */
+  /*                                                                       */
+  /*    export FT2_DEBUG="any:3 memory:7 stream:5"                         */
+  /*                                                                       */
+  /* This requests that all levels be set to 3, except the trace level for */
+  /* the memory and stream components which are set to 7 and 5,            */
+  /* respectively.                                                         */
+  /*                                                                       */
+  /* See the file <include/freetype/internal/fttrace.h> for details of the */
+  /* available toggle names.                                               */
+  /*                                                                       */
+  /* The level must be between 0 and 7; 0 means quiet (except for serious  */
+  /* runtime errors), and 7 means _very_ verbose.                          */
+  /*                                                                       */
   FT_BASE_DEF( void )
   ft_debug_init( void )
   {
-    const char*  ft2_debug = getenv( "FT2_DEBUG" );
+/*  const char*  ft2_debug = getenv( "FT2_DEBUG" ); */
+    char         buf[256];
+    const char*  ft2_debug = &buf[0];
 
 
-    if ( ft2_debug )
+/*  if ( ft2_debug ) */
+    if ( GetVar( "FT2_DEBUG", (STRPTR)ft2_debug, 256, LV_VAR ) > 0 )
     {
       const char*  p = ft2_debug;
       const char*  q;
@@ -114,7 +185,7 @@
         if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' )
           continue;
 
-        /* read toggle name, followed by '=' */
+        /* read toggle name, followed by ':' */
         q = p;
         while ( *p && *p != ':' )
           p++;
@@ -121,8 +192,8 @@
 
         if ( *p == ':' && p > q )
         {
-          int  n, i, len = p - q;
-          int  level = -1, found = -1;
+          FT_Int  n, i, len = (FT_Int)( p - q );
+          FT_Int  level = -1, found = -1;
 
 
           for ( n = 0; n < trace_count; n++ )
@@ -148,7 +219,7 @@
           if ( *p )
           {
             level = *p++ - '0';
-            if ( level < 0 || level > 6 )
+            if ( level < 0 || level > 7 )
               level = -1;
           }
 
@@ -156,7 +227,7 @@
           {
             if ( found == trace_any )
             {
-              /* special case for "any" */
+              /* special case for `any' */
               for ( n = 0; n < trace_count; n++ )
                 ft_trace_levels[n] = level;
             }
@@ -176,6 +247,22 @@
   ft_debug_init( void )
   {
     /* nothing */
+  }
+
+
+  FT_EXPORT_DEF( FT_Int )
+  FT_Trace_Get_Count( void )
+  {
+    return 0;
+  }
+
+
+  FT_EXPORT_DEF( const char * )
+  FT_Trace_Get_Name( FT_Int  idx )
+  {
+    FT_UNUSED( idx );
+
+    return NULL;
   }
 
 
--- a/builds/amiga/src/base/ftsystem.c
+++ b/builds/amiga/src/base/ftsystem.c
@@ -24,66 +24,48 @@
   /*************************************************************************/
 
 
-// Maintained by Detlef W�rkner <[email protected]>
+/* Maintained by Detlef W�rkner <[email protected]> */
 
-// TetiSoft: Modified to avoid fopen() fclose() fread() fseek() ftell()
-// malloc() realloc() and free() which can't be used in an amiga
-// shared run-time library linked with libinit.o
+/* TetiSoft: Modified to avoid fopen() fclose() fread() fseek() ftell()
+ * malloc() realloc() and free().
+ * We need exec V39+ because we use AllocPooled() etc.
+ */
 
-#include <exec/memory.h>
-
-#ifdef __GNUC__
-// Avoid warnings "struct X declared inside parameter list"
-#include <exec/devices.h>
-#include <exec/io.h>
-#include <exec/semaphores.h>
-#include <dos/exall.h>
-#endif
-
-// Necessary with OS3.9 includes
-#define __USE_SYSBASE
-
+#define __NOLIBBASE__
+#define __NOGLOBALIFACE__
+#define __USE_INLINE__
 #include <proto/exec.h>
+#include <dos/stdio.h>
 #include <proto/dos.h>
-
-#ifndef __GNUC__
-/* TetiSoft: Missing in alib_protos.h, see amiga.lib autodoc
- * (These amiga.lib functions work under AmigaOS V33 and up)
- */
-extern APTR __asm
-AsmCreatePool( register __d0 ULONG             memFlags,
-               register __d1 ULONG             puddleSize,
-               register __d2 ULONG             threshSize,
-               register __a6 struct ExecBase*  SysBase );
-
-extern VOID __asm
-AsmDeletePool( register __a0 APTR              poolHeader,
-               register __a6 struct ExecBase*  SysBase );
-
-extern APTR __asm
-AsmAllocPooled( register __a0 APTR              poolHeader,
-                register __d0 ULONG             memSize,
-                register __a6 struct ExecBase*  SysBase );
-
-extern VOID __asm
-AsmFreePooled( register __a0 APTR              poolHeader,
-               register __a1 APTR              memory,
-               register __d0 ULONG             memSize,
-               register __a6 struct ExecBase*  SysBase);
+#ifdef __amigaos4__
+extern struct ExecIFace *IExec;
+extern struct DOSIFace  *IDOS;
+#else
+extern struct Library   *SysBase;
+extern struct Library   *DOSBase;
 #endif
 
+#define IOBUF_SIZE 512
 
-// TetiSoft: C implementation of AllocVecPooled (see autodoc exec/AllocPooled)
+/* structure that helps us to avoid
+ * useless calls of Seek() and Read()
+ */
+struct SysFile
+{
+  BPTR  file;
+  ULONG iobuf_start;
+  ULONG iobuf_end;
+  UBYTE iobuf[IOBUF_SIZE];
+};
+
+#ifndef __amigaos4__
+/* C implementation of AllocVecPooled (see autodoc exec/AllocPooled) */
 APTR
-AllocVecPooled( APTR   poolHeader,
-                ULONG  memSize )
+Alloc_VecPooled( APTR   poolHeader,
+                 ULONG  memSize )
 {
   ULONG  newSize = memSize + sizeof ( ULONG );
-#ifdef __GNUC__
   ULONG  *mem = AllocPooled( poolHeader, newSize );
-#else
-  ULONG  *mem = AsmAllocPooled( poolHeader, newSize, SysBase );
-#endif
 
   if ( !mem )
     return NULL;
@@ -91,22 +73,17 @@
   return mem + 1;
 }
 
-
-// TetiSoft: C implementation of FreeVecPooled (see autodoc exec/AllocPooled)
+/* C implementation of FreeVecPooled (see autodoc exec/AllocPooled) */
 void
-FreeVecPooled( APTR  poolHeader,
-               APTR  memory )
+Free_VecPooled( APTR  poolHeader,
+                APTR  memory )
 {
   ULONG  *realmem = (ULONG *)memory - 1;
 
-#ifdef __GNUC__
   FreePooled( poolHeader, realmem, *realmem );
-#else
- AsmFreePooled( poolHeader, realmem, *realmem, SysBase );
-#endif
 }
+#endif
 
-
 #include <ft2build.h>
 #include FT_CONFIG_CONFIG_H
 #include FT_INTERNAL_DEBUG_H
@@ -154,10 +131,11 @@
   ft_alloc( FT_Memory  memory,
             long       size )
   {
-//  FT_UNUSED( memory );
-
-//  return malloc( size );
+#ifdef __amigaos4__
     return AllocVecPooled( memory->user, size );
+#else
+    return Alloc_VecPooled( memory->user, size );
+#endif
   }
 
 
@@ -187,19 +165,22 @@
               long       new_size,
               void*      block )
   {
-//  FT_UNUSED( memory );
-//  FT_UNUSED( cur_size );
-
-//  return realloc( block, new_size );
-
     void* new_block;
 
+#ifdef __amigaos4__
     new_block = AllocVecPooled ( memory->user, new_size );
+#else
+    new_block = Alloc_VecPooled ( memory->user, new_size );
+#endif
     if ( new_block != NULL )
     {
       CopyMem ( block, new_block,
                 ( new_size > cur_size ) ? cur_size : new_size );
+#ifdef __amigaos4__
       FreeVecPooled ( memory->user, block );
+#else
+      Free_VecPooled ( memory->user, block );
+#endif
     }
     return new_block;
   }
@@ -214,19 +195,19 @@
   /*    The memory release function.                                       */
   /*                                                                       */
   /* <Input>                                                               */
-  /*    memory :: A pointer to the memory object.                          */
+  /*    memory  :: A pointer to the memory object.                         */
   /*                                                                       */
-  /*    block  :: The address of block in memory to be freed.              */
+  /*    block   :: The address of block in memory to be freed.             */
   /*                                                                       */
   FT_CALLBACK_DEF( void )
   ft_free( FT_Memory  memory,
            void*      block )
   {
-//  FT_UNUSED( memory );
-
-//  free( block );
-
+#ifdef __amigaos4__
     FreeVecPooled( memory->user, block );
+#else
+    Free_VecPooled( memory->user, block );
+#endif
   }
 
 
@@ -248,14 +229,13 @@
 
   /* We use the macro STREAM_FILE for convenience to extract the       */
   /* system-specific stream handle from a given FreeType stream object */
-// #define STREAM_FILE( stream )  ( (FILE*)stream->descriptor.pointer )
-#define STREAM_FILE( stream )  ( (BPTR)stream->descriptor.pointer )     // TetiSoft
+#define STREAM_FILE( stream )  ( (struct SysFile *)stream->descriptor.pointer )
 
 
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
-  /*    ft_close_stream                                                    */
+  /*    ft_amiga_stream_close                                              */
   /*                                                                       */
   /* <Description>                                                         */
   /*    The function to close a stream.                                    */
@@ -264,11 +244,14 @@
   /*    stream :: A pointer to the stream object.                          */
   /*                                                                       */
   FT_CALLBACK_DEF( void )
-  ft_close_stream( FT_Stream  stream )
+  ft_amiga_stream_close( FT_Stream  stream )
   {
-//  fclose( STREAM_FILE( stream ) );
-    Close( STREAM_FILE( stream ) );     // TetiSoft
+    struct SysFile* sysfile;
 
+    sysfile = STREAM_FILE( stream );
+    Close ( sysfile->file );
+    FreeMem ( sysfile, sizeof ( struct SysFile ));
+
     stream->descriptor.pointer = NULL;
     stream->size               = 0;
     stream->base               = 0;
@@ -278,7 +261,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
-  /*    ft_io_stream                                                       */
+  /*    ft_amiga_stream_io                                                 */
   /*                                                                       */
   /* <Description>                                                         */
   /*    The function to open a stream.                                     */
@@ -296,22 +279,89 @@
   /*    The number of bytes actually read.                                 */
   /*                                                                       */
   FT_CALLBACK_DEF( unsigned long )
-  ft_io_stream( FT_Stream       stream,
-                unsigned long   offset,
-                unsigned char*  buffer,
-                unsigned long   count )
+  ft_amiga_stream_io( FT_Stream       stream,
+                      unsigned long   offset,
+                      unsigned char*  buffer,
+                      unsigned long   count )
   {
-//  FILE*  file;
-    BPTR   file;        // TetiSoft
+    struct SysFile* sysfile;
+    unsigned long   read_bytes;
 
+    if ( count != 0 )
+    {
+      sysfile = STREAM_FILE( stream );
 
-    file = STREAM_FILE( stream );
+      /* handle the seek */
+      if ( (offset < sysfile->iobuf_start) || (offset + count > sysfile->iobuf_end) )
+      {
+        /* requested offset implies we need a buffer refill */
+        if ( !sysfile->iobuf_end || offset != (sysfile->iobuf_end + 1) )
+        {
+          /* a physical seek is necessary */
+          Seek( sysfile->file, offset, OFFSET_BEGINNING );
+        }
+        sysfile->iobuf_start = offset;
+        sysfile->iobuf_end = 0; /* trigger a buffer refill */
+      }
 
-//  fseek( file, offset, SEEK_SET );
-    Seek( file, offset, OFFSET_BEGINNING );     // TetiSoft
+      /* handle the read */
+      if ( offset + count <= sysfile->iobuf_end )
+      {
+        /* we have buffer and requested bytes are all inside our buffer */
+        CopyMem( &sysfile->iobuf[offset - sysfile->iobuf_start], buffer, count );
+        read_bytes = count;
+      }
+      else
+      {
+        /* (re)fill buffer */
+        if ( count <= IOBUF_SIZE )
+        {
+          /* requested bytes is a subset of the buffer */
+          read_bytes = Read( sysfile->file, sysfile->iobuf, IOBUF_SIZE );
+          if ( read_bytes == -1UL )
+          {
+            /* error */
+            read_bytes = 0;
+          }
+          else
+          {
+            sysfile->iobuf_end = offset + read_bytes;
+            CopyMem( sysfile->iobuf, buffer, count );
+            if ( read_bytes > count )
+            {
+              read_bytes = count;
+            }
+          }
+        }
+        else
+        {
+          /* we actually need more than our buffer can hold, so we decide
+          ** to do a single big read, and then copy the last IOBUF_SIZE
+          ** bytes of that to our internal buffer for later use */
+          read_bytes = Read( sysfile->file, buffer, count );
+          if ( read_bytes == -1UL )
+          {
+            /* error */
+            read_bytes = 0;
+          }
+          else
+          {
+            ULONG bufsize;
 
-//  return (unsigned long)fread( buffer, 1, count, file );
-    return (unsigned long)FRead( file, buffer, 1, count);
+            bufsize = ( read_bytes > IOBUF_SIZE ) ? IOBUF_SIZE : read_bytes;
+            sysfile->iobuf_end = offset + read_bytes - bufsize;
+            sysfile->iobuf_start = sysfile->iobuf_end - bufsize;
+            CopyMem( &buffer[read_bytes - bufsize] , sysfile->iobuf, bufsize );
+          }
+        }
+      }
+    }
+    else
+    {
+      read_bytes = 0;
+    }
+
+    return read_bytes;
   }
 
 
@@ -321,17 +371,19 @@
   FT_Stream_Open( FT_Stream    stream,
                   const char*  filepathname )
   {
-//  FILE*                  file;
-    BPTR                   file; // TetiSoft
-    struct FileInfoBlock*  fib;  // TetiSoft
+    struct FileInfoBlock*  fib;
+    struct SysFile*        sysfile;
 
 
     if ( !stream )
       return FT_Err_Invalid_Stream_Handle;
 
-//  file = fopen( filepathname, "rb" );
-    file = Open( filepathname, MODE_OLDFILE );  // TetiSoft
-    if ( !file )
+#ifdef __amigaos4__
+    sysfile = AllocMem ( sizeof (struct SysFile ), MEMF_SHARED );
+#else
+    sysfile = AllocMem ( sizeof (struct SysFile ), MEMF_PUBLIC );
+#endif
+    if ( !sysfile )
     {
       FT_ERROR(( "FT_Stream_Open:" ));
       FT_ERROR(( " could not open `%s'\n", filepathname ));
@@ -338,23 +390,31 @@
 
       return FT_Err_Cannot_Open_Resource;
     }
+    sysfile->file = Open( (STRPTR)filepathname, MODE_OLDFILE );
+    if ( !sysfile->file )
+    {
+      FreeMem ( sysfile, sizeof ( struct SysFile ));
+      FT_ERROR(( "FT_Stream_Open:" ));
+      FT_ERROR(( " could not open `%s'\n", filepathname ));
 
-//  fseek( file, 0, SEEK_END );
-//  astream->size = ftell( file );
-//  fseek( file, 0, SEEK_SET );
+      return FT_Err_Cannot_Open_Resource;
+    }
+
     fib = AllocDosObject( DOS_FIB, NULL );
     if ( !fib )
     {
-      Close ( file );
+      Close ( sysfile->file );
+      FreeMem ( sysfile, sizeof ( struct SysFile ));
       FT_ERROR(( "FT_Stream_Open:" ));
       FT_ERROR(( " could not open `%s'\n", filepathname ));
 
       return FT_Err_Cannot_Open_Resource;
     }
-    if ( !( ExamineFH( file, fib ) ) )
+    if ( !( ExamineFH( sysfile->file, fib ) ) )
     {
       FreeDosObject( DOS_FIB, fib );
-      Close ( file );
+      Close ( sysfile->file );
+      FreeMem ( sysfile, sizeof ( struct SysFile ));
       FT_ERROR(( "FT_Stream_Open:" ));
       FT_ERROR(( " could not open `%s'\n", filepathname ));
 
@@ -363,17 +423,17 @@
     stream->size = fib->fib_Size;
     FreeDosObject( DOS_FIB, fib );
 
-//  stream->descriptor.pointer = file;
-    stream->descriptor.pointer = (void *)file;
-
+    stream->descriptor.pointer = (void *)sysfile;
     stream->pathname.pointer   = (char*)filepathname;
+    sysfile->iobuf_start       = 0;
+    sysfile->iobuf_end         = 0;
     stream->pos                = 0;
 
-    stream->read  = ft_io_stream;
-    stream->close = ft_close_stream;
+    stream->read  = ft_amiga_stream_io;
+    stream->close = ft_amiga_stream_close;
 
     FT_TRACE1(( "FT_Stream_Open:" ));
-    FT_TRACE1(( " opened `%s' (%d bytes) successfully\n",
+    FT_TRACE1(( " opened `%s' (%ld bytes) successfully\n",
                 filepathname, stream->size ));
 
     return FT_Err_Ok;
@@ -387,7 +447,7 @@
 
   extern void
   ft_mem_debug_done( FT_Memory  memory );
-
+  
 #endif
 
 
@@ -399,15 +459,17 @@
     FT_Memory  memory;
 
 
-//  memory = (FT_Memory)malloc( sizeof ( *memory ) );
+#ifdef __amigaos4__
+    memory = (FT_Memory)AllocVec( sizeof ( *memory ), MEMF_SHARED );
+#else
     memory = (FT_Memory)AllocVec( sizeof ( *memory ), MEMF_PUBLIC );
+#endif
     if ( memory )
     {
-//    memory->user = 0;
-#ifdef __GNUC__
-      memory->user = CreatePool( MEMF_PUBLIC, 2048, 2048 );
+#ifdef __amigaos4__
+      memory->user = CreatePool( MEMF_SHARED, 16384, 16384 );
 #else
-      memory->user = AsmCreatePool( MEMF_PUBLIC, 2048, 2048, SysBase );
+      memory->user = CreatePool( MEMF_PUBLIC, 16384, 16384 );
 #endif
       if ( memory->user == NULL )
       {
@@ -421,7 +483,7 @@
         memory->free    = ft_free;
 #ifdef FT_DEBUG_MEMORY
         ft_mem_debug_init( memory );
-#endif
+#endif    
       }
     }
 
@@ -436,15 +498,10 @@
   {
 #ifdef FT_DEBUG_MEMORY
     ft_mem_debug_done( memory );
-#endif
+#endif  
 
-#ifdef __GNUC__
     DeletePool( memory->user );
-#else
-    AsmDeletePool( memory->user, SysBase );
-#endif
     FreeVec( memory );
   }
-
 
 /* END */