shithub: freetype+ttf2subf

Download patch

ref: 4f3b5bbd958a4abe05f7d3831b103bb72b9b9488
parent: a94746caeee0fd861c0711f14b7870a0952338a1
author: Werner Lemberg <[email protected]>
date: Thu May 4 03:13:05 EDT 2006

* src/lzw/ftlzw2.c: Renamed to...
* src/lzw/ftlzw.c: This.

* src/lzw/Jamfile, src/lzw/rules.mk: Updated.

* builds/mac/FreeType.m68k_cfm.make.txt,
builds/mac/FreeType.m68k_far.make.txt,
builds/mac/FreeType.ppc_carbon.make.txt,
builds/mac/FreeType.ppc_classic.make.txt: Updated.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2006-05-04  Werner Lemberg  <[email protected]>
+
+	* src/lzw/ftlzw2.c: Renamed to...
+	* src/lzw/ftlzw.c: This.
+
+	* src/lzw/Jamfile, src/lzw/rules.mk: Updated.
+
+	* builds/mac/FreeType.m68k_cfm.make.txt,
+	builds/mac/FreeType.m68k_far.make.txt,
+	builds/mac/FreeType.ppc_carbon.make.txt,
+	builds/mac/FreeType.ppc_classic.make.txt: Updated.
+
 2006-05-03  David Turner  <[email protected]>
 
 	Allow compilation again with C++ compilers.
@@ -26,17 +38,6 @@
 
 2006-05-02  David Turner  <[email protected]>
 
-	* include/freetype/ftstream.h (FT_FRAME_ENTER, FT_FRAME_EXIT,
-	FT_FRAME_EXTRACT, FT_FRAME_RELEASE: Use FT_DEBUG_INNER to report the
-	place where the frames were entered, extracted, exited or released
-	in the memory debugger.
-
-	* src/base/ftstream.c (FT_Stream_ReleaseFrame) [FT_DEBUG_MEMORY]:
-	Call ft_mem_free.
-	(FT_Stream_EnterFrame) [FT_DEBUG_MEMORY]: Use ft_mem_qalloc.
-	(FT_Stream_ExitFrame) [FT_DEBUG_MEMORY]: Use ft_mem_free.
-
-
 	Update the memory management functions and macros to safely deal
 	with array size buffer overflows.  This corresponds to attemps to
 	allocate arrays that are too large.  For an example, consider the
@@ -95,6 +96,17 @@
 	* src/base/ftrfork.c (raccess_guess_darwin_hfsplus): Ditto.
 	* src/base/ftutil.c: Remove special code for FT_STRICT_ALIASING.
 	(ft_mem_alloc. ft_mem_realloc, ft_mem_qrealloc): Rewrite.
+
+
+	* include/freetype/ftstream.h (FT_FRAME_ENTER, FT_FRAME_EXIT,
+	FT_FRAME_EXTRACT, FT_FRAME_RELEASE): Use FT_DEBUG_INNER to report the
+	place where the frames were entered, extracted, exited or released
+	in the memory debugger.
+
+	* src/base/ftstream.c (FT_Stream_ReleaseFrame) [FT_DEBUG_MEMORY]:
+	Call ft_mem_free.
+	(FT_Stream_EnterFrame) [FT_DEBUG_MEMORY]: Use ft_mem_qalloc.
+	(FT_Stream_ExitFrame) [FT_DEBUG_MEMORY]: Use ft_mem_free.
 
 2006-04-30  suzuki toshiya  <[email protected]>
 
--- a/builds/mac/FreeType.m68k_cfm.make.txt
+++ b/builds/mac/FreeType.m68k_cfm.make.txt
@@ -56,7 +56,7 @@
 				  :src:cid:type1cid.c \xB6
 				  :src:gxvalid:gxvalid.c \xB6
 				  :src:gzip:ftgzip.c \xB6
-				  :src:lzw:ftlzw2.c \xB6
+				  :src:lzw:ftlzw.c \xB6
 				  :src:otvalid:otvalid.c \xB6
 				  :src:pcf:pcf.c \xB6
 				  :src:pfr:pfr.c \xB6
@@ -100,7 +100,7 @@
 				  "{ObjDir}type1cid.c.o" \xB6
 				  "{ObjDir}gxvalid.c.o" \xB6
 				  "{ObjDir}ftgzip.c.o" \xB6
-				  "{ObjDir}ftlzw2.c.o" \xB6
+				  "{ObjDir}ftlzw.c.o" \xB6
 				  "{ObjDir}otvalid.c.o" \xB6
 				  "{ObjDir}pcf.c.o" \xB6
 				  "{ObjDir}pfr.c.o" \xB6
@@ -171,7 +171,7 @@
 "{ObjDir}type1cid.c.o" \xC4 :src:cid:type1cid.c
 "{ObjDir}gxvalid.c.o" \xC4 :src:gxvalid:gxvalid.c
 "{ObjDir}ftgzip.c.o" \xC4 :src:gzip:ftgzip.c
-"{ObjDir}ftlzw2.c.o" \xC4 :src:lzw:ftlzw2.c
+"{ObjDir}ftlzw.c.o" \xC4 :src:lzw:ftlzw.c
 "{ObjDir}otvalid.c.o" \xC4 :src:otvalid:otvalid.c
 "{ObjDir}pcf.c.o" \xC4 :src:pcf:pcf.c
 "{ObjDir}pfr.c.o" \xC4 :src:pfr:pfr.c
--- a/builds/mac/FreeType.m68k_far.make.txt
+++ b/builds/mac/FreeType.m68k_far.make.txt
@@ -55,7 +55,7 @@
 				  :src:cid:type1cid.c \xB6
 				  :src:gxvalid:gxvalid.c \xB6
 				  :src:gzip:ftgzip.c \xB6
-				  :src:lzw:ftlzw2.c \xB6
+				  :src:lzw:ftlzw.c \xB6
 				  :src:otvalid:otvalid.c \xB6
 				  :src:pcf:pcf.c \xB6
 				  :src:pfr:pfr.c \xB6
@@ -99,7 +99,7 @@
 				  "{ObjDir}type1cid.c.o" \xB6
 				  "{ObjDir}gxvalid.c.o" \xB6
 				  "{ObjDir}ftgzip.c.o" \xB6
-				  "{ObjDir}ftlzw2.c.o" \xB6
+				  "{ObjDir}ftlzw.c.o" \xB6
 				  "{ObjDir}otvalid.c.o" \xB6
 				  "{ObjDir}pcf.c.o" \xB6
 				  "{ObjDir}pfr.c.o" \xB6
@@ -170,7 +170,7 @@
 "{ObjDir}type1cid.c.o" \xC4 :src:cid:type1cid.c
 "{ObjDir}gxvalid.c.o" \xC4 :src:gxvalid:gxvalid.c
 "{ObjDir}ftgzip.c.o" \xC4 :src:gzip:ftgzip.c
-"{ObjDir}ftlzw2.c.o" \xC4 :src:lzw:ftlzw2.c
+"{ObjDir}ftlzw.c.o" \xC4 :src:lzw:ftlzw.c
 "{ObjDir}otvalid.c.o" \xC4 :src:otvalid:otvalid.c
 "{ObjDir}pcf.c.o" \xC4 :src:pcf:pcf.c
 "{ObjDir}pfr.c.o" \xC4 :src:pfr:pfr.c
--- a/builds/mac/FreeType.ppc_carbon.make.txt
+++ b/builds/mac/FreeType.ppc_carbon.make.txt
@@ -56,7 +56,7 @@
 				  :src:cid:type1cid.c \xB6
 				  :src:gxvalid:gxvalid.c \xB6
 				  :src:gzip:ftgzip.c \xB6
-				  :src:lzw:ftlzw2.c \xB6
+				  :src:lzw:ftlzw.c \xB6
 				  :src:otvalid:otvalid.c \xB6
 				  :src:pcf:pcf.c \xB6
 				  :src:pfr:pfr.c \xB6
@@ -100,7 +100,7 @@
 				  "{ObjDir}type1cid.c.x" \xB6
 				  "{ObjDir}gxvalid.c.x" \xB6
 				  "{ObjDir}ftgzip.c.x" \xB6
-				  "{ObjDir}ftlzw2.c.x" \xB6
+				  "{ObjDir}ftlzw.c.x" \xB6
 				  "{ObjDir}otvalid.c.x" \xB6
 				  "{ObjDir}pcf.c.x" \xB6
 				  "{ObjDir}pfr.c.x" \xB6
@@ -171,7 +171,7 @@
 "{ObjDir}type1cid.c.x" \xC4 :src:cid:type1cid.c
 "{ObjDir}gxvalid.c.x" \xC4 :src:gxvalid:gxvalid.c
 "{ObjDir}ftgzip.c.x" \xC4 :src:gzip:ftgzip.c
-"{ObjDir}ftlzw2.c.x" \xC4 :src:lzw:ftlzw2.c
+"{ObjDir}ftlzw.c.x" \xC4 :src:lzw:ftlzw.c
 "{ObjDir}otvalid.c.x" \xC4 :src:otvalid:otvalid.c
 "{ObjDir}pcf.c.x" \xC4 :src:pcf:pcf.c
 "{ObjDir}pfr.c.x" \xC4 :src:pfr:pfr.c
--- a/builds/mac/FreeType.ppc_classic.make.txt
+++ b/builds/mac/FreeType.ppc_classic.make.txt
@@ -56,7 +56,7 @@
 				  :src:cid:type1cid.c \xB6
 				  :src:gxvalid:gxvalid.c \xB6
 				  :src:gzip:ftgzip.c \xB6
-				  :src:lzw:ftlzw2.c \xB6
+				  :src:lzw:ftlzw.c \xB6
 				  :src:otvalid:otvalid.c \xB6
 				  :src:pcf:pcf.c \xB6
 				  :src:pfr:pfr.c \xB6
@@ -100,7 +100,7 @@
 				  "{ObjDir}type1cid.c.x" \xB6
 				  "{ObjDir}gxvalid.c.x" \xB6
 				  "{ObjDir}ftgzip.c.x" \xB6
-				  "{ObjDir}ftlzw2.c.x" \xB6
+				  "{ObjDir}ftlzw.c.x" \xB6
 				  "{ObjDir}otvalid.c.x" \xB6
 				  "{ObjDir}pcf.c.x" \xB6
 				  "{ObjDir}pfr.c.x" \xB6
@@ -171,7 +171,7 @@
 "{ObjDir}type1cid.c.x" \xC4 :src:cid:type1cid.c
 "{ObjDir}gxvalid.c.x" \xC4 :src:gxvalid:gxvalid.c
 "{ObjDir}ftgzip.c.x" \xC4 :src:gzip:ftgzip.c
-"{ObjDir}ftlzw2.c.x" \xC4 :src:lzw:ftlzw2.c
+"{ObjDir}ftlzw.c.x" \xC4 :src:lzw:ftlzw.c
 "{ObjDir}otvalid.c.x" \xC4 :src:otvalid:otvalid.c
 "{ObjDir}pcf.c.x" \xC4 :src:pcf:pcf.c
 "{ObjDir}pfr.c.x" \xC4 :src:pfr:pfr.c
--- a/src/lzw/Jamfile
+++ b/src/lzw/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/lzw Jamfile
 #
-# Copyright 2004 by
+# Copyright 2004, 2006 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -11,7 +11,6 @@
 
 SubDir  FT2_TOP $(FT2_SRC_DIR) lzw ;
 
-Library  $(FT2_LIB) : ftlzw2.c ;
+Library  $(FT2_LIB) : ftlzw.c ;
 
 # end of src/lzw Jamfile
-
--- /dev/null
+++ b/src/lzw/ftlzw.c
@@ -1,0 +1,413 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftlzw.c                                                                */
+/*                                                                         */
+/*    FreeType support for .Z compressed files.                            */
+/*                                                                         */
+/*  This optional component relies on NetBSD's zopen().  It should mainly  */
+/*  be used to parse compressed PCF fonts, as found with many X11 server   */
+/*  distributions.                                                         */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2006 by                                          */
+/*  Albert Chin-A-Young.                                                   */
+/*                                                                         */
+/*  Based on code in src/gzip/ftgzip.c, Copyright 2004 by                  */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#include <ft2build.h>
+#include FT_INTERNAL_MEMORY_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_LZW_H
+#include <string.h>
+#include <stdio.h>
+
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#define FT_ERR_PREFIX  LZW_Err_
+#define FT_ERR_BASE    FT_Mod_Err_LZW
+
+#include FT_ERRORS_H
+
+
+#ifdef FT_CONFIG_OPTION_USE_LZW
+
+#include "ftzopen.h"
+
+
+/***************************************************************************/
+/***************************************************************************/
+/*****                                                                 *****/
+/*****                  M E M O R Y   M A N A G E M E N T              *****/
+/*****                                                                 *****/
+/***************************************************************************/
+/***************************************************************************/
+
+/***************************************************************************/
+/***************************************************************************/
+/*****                                                                 *****/
+/*****                   F I L E   D E S C R I P T O R                 *****/
+/*****                                                                 *****/
+/***************************************************************************/
+/***************************************************************************/
+
+#define FT_LZW_BUFFER_SIZE  4096
+
+  typedef struct  FT_LZWFileRec_
+  {
+    FT_Stream       source;         /* parent/source stream        */
+    FT_Stream       stream;         /* embedding stream            */
+    FT_Memory       memory;         /* memory allocator            */
+    FT_LzwStateRec  lzw;            /* lzw decompressor state      */
+
+    FT_Byte         buffer[FT_LZW_BUFFER_SIZE]; /* output buffer      */
+    FT_ULong        pos;                        /* position in output */
+    FT_Byte*        cursor;
+    FT_Byte*        limit;
+
+  } FT_LZWFileRec, *FT_LZWFile;
+
+
+  /* check and skip .Z header */
+  static FT_Error
+  ft_lzw_check_header( FT_Stream  stream )
+  {
+    FT_Error  error;
+    FT_Byte   head[2];
+
+
+    if ( FT_STREAM_SEEK( 0 )       ||
+         FT_STREAM_READ( head, 2 ) )
+      goto Exit;
+
+    /* head[0] && head[1] are the magic numbers */
+    if ( head[0] != 0x1f ||
+         head[1] != 0x9d )
+      error = LZW_Err_Invalid_File_Format;
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  ft_lzw_file_init( FT_LZWFile  zip,
+                    FT_Stream   stream,
+                    FT_Stream   source )
+  {
+    FT_LzwState  lzw   = &zip->lzw;
+    FT_Error     error = LZW_Err_Ok;
+
+
+    zip->stream = stream;
+    zip->source = source;
+    zip->memory = stream->memory;
+
+    zip->limit  = zip->buffer + FT_LZW_BUFFER_SIZE;
+    zip->cursor = zip->limit;
+    zip->pos    = 0;
+
+    /* check and skip .Z header */
+    {
+      stream = source;
+
+      error = ft_lzw_check_header( source );
+      if ( error )
+        goto Exit;
+    }
+
+    /* initialize internal lzw variable */
+    ft_lzwstate_init( lzw, source );
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  ft_lzw_file_done( FT_LZWFile  zip )
+  {
+    /* clear the rest */
+    ft_lzwstate_done( &zip->lzw );
+
+    zip->memory = NULL;
+    zip->source = NULL;
+    zip->stream = NULL;
+  }
+
+
+  static FT_Error
+  ft_lzw_file_reset( FT_LZWFile  zip )
+  {
+    FT_Stream  stream = zip->source;
+    FT_Error   error;
+
+
+    if ( !FT_STREAM_SEEK( 0 ) )
+    {
+      ft_lzwstate_reset( &zip->lzw );
+
+      zip->limit  = zip->buffer + FT_LZW_BUFFER_SIZE;
+      zip->cursor = zip->limit;
+      zip->pos    = 0;
+    }
+
+    return error;
+  }
+
+
+  static FT_Error
+  ft_lzw_file_fill_output( FT_LZWFile  zip )
+  {
+    FT_LzwState  lzw = &zip->lzw;
+    FT_ULong     count;
+    FT_Error     error   = 0;
+
+
+    zip->cursor = zip->buffer;
+
+    count = ft_lzwstate_io( lzw, zip->buffer, FT_LZW_BUFFER_SIZE );
+
+    zip->limit = zip->cursor + count;
+
+    if ( count == 0 )
+      error = LZW_Err_Invalid_Stream_Operation;
+
+    return error;
+  }
+
+
+  /* fill output buffer; `count' must be <= FT_LZW_BUFFER_SIZE */
+  static FT_Error
+  ft_lzw_file_skip_output( FT_LZWFile  zip,
+                           FT_ULong    count )
+  {
+    FT_Error  error = LZW_Err_Ok;
+
+
+    /* first, we skip what we can from the output buffer */
+    {
+      FT_ULong  delta = (FT_ULong)( zip->limit - zip->cursor );
+
+
+      if ( delta >= count )
+        delta = count;
+
+      zip->cursor += delta;
+      zip->pos    += delta;
+
+      count -= delta;
+    }
+
+    /* next, we skip as many bytes remaining as possible */
+    while ( count > 0 )
+    {
+      FT_ULong  delta = FT_LZW_BUFFER_SIZE;
+      FT_ULong  numread;
+
+
+      if ( delta > count )
+        delta = count;
+
+      numread = ft_lzwstate_io( &zip->lzw, NULL, delta );
+      if ( numread < delta )
+      {
+        /* not enough bytes */
+        error = LZW_Err_Invalid_Stream_Operation;
+        break;
+      }
+
+      zip->pos += delta;
+      count    -= delta;
+    }
+
+    return error;
+  }
+
+
+  static FT_ULong
+  ft_lzw_file_io( FT_LZWFile  zip,
+                  FT_ULong    pos,
+                  FT_Byte*    buffer,
+                  FT_ULong    count )
+  {
+    FT_ULong  result = 0;
+    FT_Error  error;
+
+
+    /* seeking backwards. */
+    if ( pos < zip->pos )
+    {
+      /* If the new position is within the output buffer, simply       */
+      /* decrement pointers, otherwise we reset the stream completely! */
+      if ( ( zip->pos - pos ) <= (FT_ULong)( zip->cursor - zip->buffer ) )
+      {
+        zip->cursor -= zip->pos - pos;
+        zip->pos     = pos;
+      }
+      else
+      {
+        error = ft_lzw_file_reset( zip );
+        if ( error )
+          goto Exit;
+      }
+    }
+
+    /* skip unwanted bytes */
+    if ( pos > zip->pos )
+    {
+      error = ft_lzw_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) );
+      if ( error )
+        goto Exit;
+    }
+
+    if ( count == 0 )
+      goto Exit;
+
+    /* now read the data */
+    for (;;)
+    {
+      FT_ULong  delta;
+
+
+      delta = (FT_ULong)( zip->limit - zip->cursor );
+      if ( delta >= count )
+        delta = count;
+
+      FT_MEM_COPY( buffer + result, zip->cursor, delta );
+      result      += delta;
+      zip->cursor += delta;
+      zip->pos    += delta;
+
+      count -= delta;
+      if ( count == 0 )
+        break;
+
+      error = ft_lzw_file_fill_output( zip );
+      if ( error )
+        break;
+    }
+
+  Exit:
+    return result;
+  }
+
+
+/***************************************************************************/
+/***************************************************************************/
+/*****                                                                 *****/
+/*****            L Z W   E M B E D D I N G   S T R E A M              *****/
+/*****                                                                 *****/
+/***************************************************************************/
+/***************************************************************************/
+
+  static void
+  ft_lzw_stream_close( FT_Stream  stream )
+  {
+    FT_LZWFile  zip    = (FT_LZWFile)stream->descriptor.pointer;
+    FT_Memory   memory = stream->memory;
+
+
+    if ( zip )
+    {
+      /* finalize lzw file descriptor */
+      ft_lzw_file_done( zip );
+
+      FT_FREE( zip );
+
+      stream->descriptor.pointer = NULL;
+    }
+  }
+
+
+  static FT_ULong
+  ft_lzw_stream_io( FT_Stream  stream,
+                    FT_ULong   pos,
+                    FT_Byte*   buffer,
+                    FT_ULong   count )
+  {
+    FT_LZWFile  zip = (FT_LZWFile)stream->descriptor.pointer;
+
+
+    return ft_lzw_file_io( zip, pos, buffer, count );
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stream_OpenLZW( FT_Stream  stream,
+                     FT_Stream  source )
+  {
+    FT_Error    error;
+    FT_Memory   memory = source->memory;
+    FT_LZWFile  zip;
+
+
+    /*
+     *  Check the header right now; this prevents allocation of a huge
+     *  LZWFile object (400 KByte of heap memory) if not necessary.
+     *
+     *  Did I mention that you should never use .Z compressed font
+     *  files?
+     */
+    error = ft_lzw_check_header( source );
+    if ( error )
+      goto Exit;
+
+    FT_ZERO( stream );
+    stream->memory = memory;
+
+    if ( !FT_NEW( zip ) )
+    {
+      error = ft_lzw_file_init( zip, stream, source );
+      if ( error )
+      {
+        FT_FREE( zip );
+        goto Exit;
+      }
+
+      stream->descriptor.pointer = zip;
+    }
+
+    stream->size  = 0x7FFFFFFFL;  /* don't know the real size! */
+    stream->pos   = 0;
+    stream->base  = 0;
+    stream->read  = ft_lzw_stream_io;
+    stream->close = ft_lzw_stream_close;
+
+  Exit:
+    return error;
+  }
+
+
+#include "ftzopen.c"
+
+
+#else  /* !FT_CONFIG_OPTION_USE_LZW */
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stream_OpenLZW( FT_Stream  stream,
+                     FT_Stream  source )
+  {
+    FT_UNUSED( stream );
+    FT_UNUSED( source );
+
+    return LZW_Err_Unimplemented_Feature;
+  }
+
+
+#endif /* !FT_CONFIG_OPTION_USE_LZW */
+
+
+/* END */
--- a/src/lzw/ftlzw2.c
+++ /dev/null
@@ -1,413 +1,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftlzw2.c                                                               */
-/*                                                                         */
-/*    FreeType support for .Z compressed files (reimplementation).         */
-/*                                                                         */
-/*  This optional component relies on NetBSD's zopen().  It should mainly  */
-/*  be used to parse compressed PCF fonts, as found with many X11 server   */
-/*  distributions.                                                         */
-/*                                                                         */
-/*  Copyright 2004, 2005, 2006 by                                          */
-/*  Albert Chin-A-Young.                                                   */
-/*                                                                         */
-/*  Based on code in src/gzip/ftgzip.c, Copyright 2004 by                  */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-#include <ft2build.h>
-#include FT_INTERNAL_MEMORY_H
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_DEBUG_H
-#include FT_LZW_H
-#include <string.h>
-#include <stdio.h>
-
-
-#include FT_MODULE_ERRORS_H
-
-#undef __FTERRORS_H__
-
-#define FT_ERR_PREFIX  LZW_Err_
-#define FT_ERR_BASE    FT_Mod_Err_LZW
-
-#include FT_ERRORS_H
-
-
-#ifdef FT_CONFIG_OPTION_USE_LZW
-
-#include "ftzopen.h"
-
-
-/***************************************************************************/
-/***************************************************************************/
-/*****                                                                 *****/
-/*****                  M E M O R Y   M A N A G E M E N T              *****/
-/*****                                                                 *****/
-/***************************************************************************/
-/***************************************************************************/
-
-/***************************************************************************/
-/***************************************************************************/
-/*****                                                                 *****/
-/*****                   F I L E   D E S C R I P T O R                 *****/
-/*****                                                                 *****/
-/***************************************************************************/
-/***************************************************************************/
-
-#define FT_LZW_BUFFER_SIZE  4096
-
-  typedef struct  FT_LZWFileRec_
-  {
-    FT_Stream       source;         /* parent/source stream        */
-    FT_Stream       stream;         /* embedding stream            */
-    FT_Memory       memory;         /* memory allocator            */
-    FT_LzwStateRec  lzw;            /* lzw decompressor state      */
-
-    FT_Byte         buffer[FT_LZW_BUFFER_SIZE]; /* output buffer      */
-    FT_ULong        pos;                        /* position in output */
-    FT_Byte*        cursor;
-    FT_Byte*        limit;
-
-  } FT_LZWFileRec, *FT_LZWFile;
-
-
-  /* check and skip .Z header */
-  static FT_Error
-  ft_lzw_check_header( FT_Stream  stream )
-  {
-    FT_Error  error;
-    FT_Byte   head[2];
-
-
-    if ( FT_STREAM_SEEK( 0 )       ||
-         FT_STREAM_READ( head, 2 ) )
-      goto Exit;
-
-    /* head[0] && head[1] are the magic numbers */
-    if ( head[0] != 0x1f ||
-         head[1] != 0x9d )
-      error = LZW_Err_Invalid_File_Format;
-
-  Exit:
-    return error;
-  }
-
-
-  static FT_Error
-  ft_lzw_file_init( FT_LZWFile  zip,
-                    FT_Stream   stream,
-                    FT_Stream   source )
-  {
-    FT_LzwState  lzw   = &zip->lzw;
-    FT_Error     error = LZW_Err_Ok;
-
-
-    zip->stream = stream;
-    zip->source = source;
-    zip->memory = stream->memory;
-
-    zip->limit  = zip->buffer + FT_LZW_BUFFER_SIZE;
-    zip->cursor = zip->limit;
-    zip->pos    = 0;
-
-    /* check and skip .Z header */
-    {
-      stream = source;
-
-      error = ft_lzw_check_header( source );
-      if ( error )
-        goto Exit;
-    }
-
-    /* initialize internal lzw variable */
-    ft_lzwstate_init( lzw, source );
-
-  Exit:
-    return error;
-  }
-
-
-  static void
-  ft_lzw_file_done( FT_LZWFile  zip )
-  {
-    /* clear the rest */
-    ft_lzwstate_done( &zip->lzw );
-
-    zip->memory = NULL;
-    zip->source = NULL;
-    zip->stream = NULL;
-  }
-
-
-  static FT_Error
-  ft_lzw_file_reset( FT_LZWFile  zip )
-  {
-    FT_Stream  stream = zip->source;
-    FT_Error   error;
-
-
-    if ( !FT_STREAM_SEEK( 0 ) )
-    {
-      ft_lzwstate_reset( &zip->lzw );
-
-      zip->limit  = zip->buffer + FT_LZW_BUFFER_SIZE;
-      zip->cursor = zip->limit;
-      zip->pos    = 0;
-    }
-
-    return error;
-  }
-
-
-  static FT_Error
-  ft_lzw_file_fill_output( FT_LZWFile  zip )
-  {
-    FT_LzwState  lzw = &zip->lzw;
-    FT_ULong     count;
-    FT_Error     error   = 0;
-
-
-    zip->cursor = zip->buffer;
-
-    count = ft_lzwstate_io( lzw, zip->buffer, FT_LZW_BUFFER_SIZE );
-
-    zip->limit = zip->cursor + count;
-
-    if ( count == 0 )
-      error = LZW_Err_Invalid_Stream_Operation;
-
-    return error;
-  }
-
-
-  /* fill output buffer; `count' must be <= FT_LZW_BUFFER_SIZE */
-  static FT_Error
-  ft_lzw_file_skip_output( FT_LZWFile  zip,
-                           FT_ULong    count )
-  {
-    FT_Error  error = LZW_Err_Ok;
-
-
-    /* first, we skip what we can from the output buffer */
-    {
-      FT_ULong  delta = (FT_ULong)( zip->limit - zip->cursor );
-
-
-      if ( delta >= count )
-        delta = count;
-
-      zip->cursor += delta;
-      zip->pos    += delta;
-
-      count -= delta;
-    }
-
-    /* next, we skip as many bytes remaining as possible */
-    while ( count > 0 )
-    {
-      FT_ULong  delta = FT_LZW_BUFFER_SIZE;
-      FT_ULong  numread;
-
-
-      if ( delta > count )
-        delta = count;
-
-      numread = ft_lzwstate_io( &zip->lzw, NULL, delta );
-      if ( numread < delta )
-      {
-        /* not enough bytes */
-        error = LZW_Err_Invalid_Stream_Operation;
-        break;
-      }
-
-      zip->pos += delta;
-      count    -= delta;
-    }
-
-    return error;
-  }
-
-
-  static FT_ULong
-  ft_lzw_file_io( FT_LZWFile  zip,
-                  FT_ULong    pos,
-                  FT_Byte*    buffer,
-                  FT_ULong    count )
-  {
-    FT_ULong  result = 0;
-    FT_Error  error;
-
-
-    /* seeking backwards. */
-    if ( pos < zip->pos )
-    {
-      /* If the new position is within the output buffer, simply       */
-      /* decrement pointers, otherwise we reset the stream completely! */
-      if ( ( zip->pos - pos ) <= (FT_ULong)( zip->cursor - zip->buffer ) )
-      {
-        zip->cursor -= zip->pos - pos;
-        zip->pos     = pos;
-      }
-      else
-      {
-        error = ft_lzw_file_reset( zip );
-        if ( error )
-          goto Exit;
-      }
-    }
-
-    /* skip unwanted bytes */
-    if ( pos > zip->pos )
-    {
-      error = ft_lzw_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) );
-      if ( error )
-        goto Exit;
-    }
-
-    if ( count == 0 )
-      goto Exit;
-
-    /* now read the data */
-    for (;;)
-    {
-      FT_ULong  delta;
-
-
-      delta = (FT_ULong)( zip->limit - zip->cursor );
-      if ( delta >= count )
-        delta = count;
-
-      FT_MEM_COPY( buffer + result, zip->cursor, delta );
-      result      += delta;
-      zip->cursor += delta;
-      zip->pos    += delta;
-
-      count -= delta;
-      if ( count == 0 )
-        break;
-
-      error = ft_lzw_file_fill_output( zip );
-      if ( error )
-        break;
-    }
-
-  Exit:
-    return result;
-  }
-
-
-/***************************************************************************/
-/***************************************************************************/
-/*****                                                                 *****/
-/*****            L Z W   E M B E D D I N G   S T R E A M              *****/
-/*****                                                                 *****/
-/***************************************************************************/
-/***************************************************************************/
-
-  static void
-  ft_lzw_stream_close( FT_Stream  stream )
-  {
-    FT_LZWFile  zip    = (FT_LZWFile)stream->descriptor.pointer;
-    FT_Memory   memory = stream->memory;
-
-
-    if ( zip )
-    {
-      /* finalize lzw file descriptor */
-      ft_lzw_file_done( zip );
-
-      FT_FREE( zip );
-
-      stream->descriptor.pointer = NULL;
-    }
-  }
-
-
-  static FT_ULong
-  ft_lzw_stream_io( FT_Stream  stream,
-                    FT_ULong   pos,
-                    FT_Byte*   buffer,
-                    FT_ULong   count )
-  {
-    FT_LZWFile  zip = (FT_LZWFile)stream->descriptor.pointer;
-
-
-    return ft_lzw_file_io( zip, pos, buffer, count );
-  }
-
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Stream_OpenLZW( FT_Stream  stream,
-                     FT_Stream  source )
-  {
-    FT_Error    error;
-    FT_Memory   memory = source->memory;
-    FT_LZWFile  zip;
-
-
-    /*
-     *  Check the header right now; this prevents allocation of a huge
-     *  LZWFile object (400 KByte of heap memory) if not necessary.
-     *
-     *  Did I mention that you should never use .Z compressed font
-     *  files?
-     */
-    error = ft_lzw_check_header( source );
-    if ( error )
-      goto Exit;
-
-    FT_ZERO( stream );
-    stream->memory = memory;
-
-    if ( !FT_NEW( zip ) )
-    {
-      error = ft_lzw_file_init( zip, stream, source );
-      if ( error )
-      {
-        FT_FREE( zip );
-        goto Exit;
-      }
-
-      stream->descriptor.pointer = zip;
-    }
-
-    stream->size  = 0x7FFFFFFFL;  /* don't know the real size! */
-    stream->pos   = 0;
-    stream->base  = 0;
-    stream->read  = ft_lzw_stream_io;
-    stream->close = ft_lzw_stream_close;
-
-  Exit:
-    return error;
-  }
-
-
-#include "ftzopen.c"
-
-
-#else  /* !FT_CONFIG_OPTION_USE_LZW */
-
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Stream_OpenLZW( FT_Stream  stream,
-                     FT_Stream  source )
-  {
-    FT_UNUSED( stream );
-    FT_UNUSED( source );
-
-    return LZW_Err_Unimplemented_Feature;
-  }
-
-
-#endif /* !FT_CONFIG_OPTION_USE_LZW */
-
-
-/* END */
--- a/src/lzw/rules.mk
+++ b/src/lzw/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2004, 2005 by
+# Copyright 2004, 2005, 2006 by
 # Albert Chin-A-Young.
 #
 # Based on src/lzw/rules.mk, Copyright 2002 by
@@ -28,7 +28,7 @@
 
 # LZW support sources (i.e., C files)
 #
-LZW_DRV_SRC := $(LZW_DIR)/ftlzw2.c
+LZW_DRV_SRC := $(LZW_DIR)/ftlzw.c
 
 # LZW support headers
 #
@@ -41,12 +41,12 @@
 #   LZW_DRV_OBJ_M is used during `multi' builds
 #   LZW_DRV_OBJ_S is used during `single' builds
 #
-LZW_DRV_OBJ_M := $(OBJ_DIR)/ftlzw2.$O
-LZW_DRV_OBJ_S := $(OBJ_DIR)/ftlzw2.$O
+LZW_DRV_OBJ_M := $(OBJ_DIR)/ftlzw.$O
+LZW_DRV_OBJ_S := $(OBJ_DIR)/ftlzw.$O
 
 # LZW support source file for single build
 #
-LZW_DRV_SRC_S := $(LZW_DIR)/ftlzw2.c
+LZW_DRV_SRC_S := $(LZW_DIR)/ftlzw.c
 
 
 # LZW support - single object