shithub: freetype+ttf2subf

Download patch

ref: c5cdf8bcf1bded63fbd57853ded641a42292a91c
parent: c703b1bf6df2757fd000e6cc08844478abf18c8a
author: David Turner <[email protected]>
date: Thu Jul 27 17:40:22 EDT 2000

re-adding a "unix-dev.mk". Debugging libtool output
is just too much of a pain for me, I prefer a good old
static lib without optimizations :-)

"make devel" is back on Unix then..

git/fs: mount .git/fs: mount/attach disallowed
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,20 @@
 LATEST CHANGES
 
+  - fixed two memory leaks:
+       - the memory manager (16 bytes) isn't released in FT_Done_FreeType !!
+       
+       - using custom input streams, the copy of the original stream
+         was never released
+
+  - fixed the auto-hinter by performing automatic computation of the
+    "filling direction" of each glyph. This is done through a simple and
+    fast approximation, and seems to work (problems spotted by Werner
+    though). The Arphic fonts are a lot nicer though there are still a
+    lot of things to do to handle Asian fonts correctly..
+
+===========================================================================
+BETA-8 (RELEASE CANDIDATE) CHANGES
+
   - deactivated the trueType bytecode interpreter by default
   
   - deactivated the "src/type1" font driver. Now "src/type1z" is
--- a/builds/unix/detect.mk
+++ b/builds/unix/detect.mk
@@ -22,30 +22,29 @@
     COPY     := cp
     DELETE   := rm -f
 
-    # If a Unix platform is detected, the configure script is called and
-    # `unix.mk' is created.
-    #
-    # Arguments to `configure' should be in the CFG variable.  Example:
-    #
-    #   make CFG="--prefix=/usr --disable-static"
-    #
-    # If you need to set CFLAGS or LDFLAGS, do it here also.
-    #
-    # Feel free to add support for other platform specific compilers in this
-    # directory (e.g. solaris.mk + changes here to detect the platform).
-    #
-    CONFIG_FILE := unix.mk
-    setup: unix.mk
-    unix: setup
 
-    # If `devel' is the requested target, use `-g -O0' as the default value
-    # for CFLAGS if CFLAGS isn't set.
+    # If `devel' is the requested target, we use a special configuration
+    # file named "unix-dev.mk". It disables optimization and libtool..
     #
     ifneq ($(findstring devel,$(MAKECMDGOALS)),)
-      ifndef CFLAGS
-        USE_CFLAGS := CFLAGS="-g -O0"
-      endif
+      CONFIG_FILE := unix-dev.mk
       devel: setup
+    else
+      # If a Unix platform is detected, the configure script is called and
+      # `unix.mk' is created.
+      #
+      # Arguments to `configure' should be in the CFG variable.  Example:
+      #
+      #   make CFG="--prefix=/usr --disable-static"
+      #
+      # If you need to set CFLAGS or LDFLAGS, do it here also.
+      #
+      # Feel free to add support for other platform specific compilers in this
+      # directory (e.g. solaris.mk + changes here to detect the platform).
+      #
+      CONFIG_FILE := unix.mk
+      setup: unix.mk
+      unix: setup
     endif
 
     setup: std_setup
--- a/builds/unix/ftsystem.c
+++ b/builds/unix/ftsystem.c
@@ -302,5 +302,21 @@
     return memory;
   }
 
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_Memory                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Discards memory manager.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory  :: handle to memory manager                                */
+  /*                                                                       */
+  FT_EXPORT_FUNC( void )  FT_Done_Memory( FT_Memory  memory )
+  {
+    free( memory );
+  }
+
 
 /* END */
--- /dev/null
+++ b/builds/unix/unix-dev.mk
@@ -1,0 +1,140 @@
+#
+# FreeType 2 Configuration rules for Unix + GCC
+#
+#   Development version without optimizations & libtool
+#
+
+
+# Copyright 1996-2000 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.
+#
+# NOTE: This version requires that GNU Make is invoked from the Windows
+#       Shell (_not_ Cygwin BASH)!
+#
+
+ifndef TOP
+  TOP := .
+endif
+
+DELETE   := rm -f
+SEP      := /
+HOSTSEP  := $(SEP)
+BUILD    := $(TOP)/builds/unix
+PLATFORM := unixdev  # do not set it to "unix", or libtool will trick you..
+CC       := gcc
+
+# The directory where all object files are placed.
+#
+# Note that this is not $(TOP)/obj!
+# This lets you build the library in your own directory with something like
+#
+#   set TOP=.../path/to/freetype2/top/dir...
+#   mkdir obj
+#   make -f %TOP%/Makefile setup [options]
+#   make -f %TOP%/Makefile
+#
+OBJ_DIR := obj
+
+
+# The directory where all library files are placed.
+#
+# By default, this is the same as $(OBJ_DIR), however, this can be changed
+# to suit particular needs.
+#
+LIB_DIR := $(OBJ_DIR)
+
+
+# The object file extension (for standard and static libraries).  This can be
+# .o, .tco, .obj, etc., depending on the platform.
+#
+O  := o
+SO := o
+
+# The library file extension (for standard and static libraries).  This can
+# be .a, .lib, etc., depending on the platform.
+#
+A  := a
+SA := a
+
+
+# The name of the final library file.  Note that the DOS-specific Makefile
+# uses a shorter (8.3) name.
+#
+LIBRARY := libfreetype
+
+
+# Path inclusion flag.  Some compilers use a different flag than `-I' to
+# specify an additional include path.  Examples are `/i=' or `-J'.
+#
+I := -I
+
+
+# C flag used to define a macro before the compilation of a given source
+# object.  Usually is `-D' like in `-DDEBUG'.
+#
+D := -D
+
+
+# The link flag used to specify a given library file on link.  Note that
+# this is only used to compile the demo programs, not the library itself.
+#
+L := -l
+
+
+# Target flag.
+#
+T := -o # Don't remove this comment line!  We need the space after `-o'.
+
+
+# C flags
+#
+#   These should concern: debug output, optimization & warnings.
+#
+#   Use the ANSIFLAGS variable to define the compiler flags used to enfore
+#   ANSI compliance.
+#
+ifndef CFLAGS
+  CFLAGS := -c -g -O0 -Wall -W
+endif
+
+# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
+#
+ANSIFLAGS := -ansi -pedantic
+
+
+ifdef BUILD_FREETYPE
+
+  # Now include the main sub-makefile.  It contains all the rules used to
+  # build the library with the previous variables defined.
+  #
+  include $(TOP)/builds/freetype.mk
+
+  # The cleanup targets.
+  #
+  clean_freetype: clean_freetype_std
+  distclean_freetype: distclean_freetype_std
+
+  # Librarian to use to build the static library
+  #
+  FT_LIBRARIAN := $(AR) -r
+
+
+  # This final rule is used to link all object files into a single library. 
+  # It is part of the system-specific sub-Makefile because not all
+  # librarians accept a simple syntax like
+  #
+  #   librarian library_file {list of object files} 
+  #
+  $(FT_LIBRARY): $(OBJECTS_LIST)
+	  -$(DELETE) $(subst $(SEP),$(HOSTSEP),$(FT_LIBRARY)) 2> nul
+	  $(FT_LIBRARIAN) $@ $(OBJECTS_LIST)
+
+endif
+
+# EOF
--- a/include/freetype/internal/ftobjs.h
+++ b/include/freetype/internal/ftobjs.h
@@ -506,6 +506,7 @@
 
   FT_EXPORT_DEF( FT_Memory )  FT_New_Memory( void );
 
+  FT_EXPORT_DEF( void )       FT_Done_Memory( FT_Memory  memory );
 
 #endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
 
--- a/src/autohint/ahglyph.c
+++ b/src/autohint/ahglyph.c
@@ -322,10 +322,13 @@
       outline->max_contours = new_contours;
     }
 
-    /* then, realloc the points, segments & edges arrays if needed */
-    if ( num_points > outline->max_points )
+    /* then, realloc the points, segments & edges arrays if needed   */
+    /* note that we reserved two additional point positions, used to */
+    /* hint metrics appropriately..                                  */
+    /*                                                               */
+    if ( num_points+2 > outline->max_points )
     {
-      FT_Int  news = ( num_points + 7 ) & -8;
+      FT_Int  news = ( num_points+2 + 7 ) & -8;
       FT_Int  max  = outline->max_points;
 
 
--- a/src/base/ftinit.c
+++ b/src/base/ftinit.c
@@ -152,4 +152,38 @@
   }
 
 
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_FreeType                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroys a given FreeType library object and all of its childs,    */
+  /*    including resources, drivers, faces, sizes, etc.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to the target library object.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_EXPORT_FUNC( FT_Error )  FT_Done_FreeType( FT_Library  library )
+  {
+    if (library)
+    {
+      FT_Memory  memory = library->memory;
+
+
+      /* Discard the library object */
+      FT_Done_Library( library );
+      
+      /* discard memory manager */
+      FT_Done_Memory( memory );
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+
 /* END */
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -265,8 +265,10 @@
     }
     else if ( args->flags & ft_open_stream && args->stream )
     {
-      *stream        = *(args->stream);
-      stream->memory = memory;
+      /* in this case, we do not need to allocate a new stream      */
+      /* object. The caller is responsible for closing it himself!! */
+      FREE(stream);
+      stream = args->stream;
     }
     else
       error = FT_Err_Invalid_Argument;
@@ -300,16 +302,19 @@
 
 
   static
-  void  ft_done_stream( FT_Stream*  astream )
+  void  ft_done_stream( FT_Stream*  astream, FT_Int  external )
   {
     FT_Stream  stream = *astream;
-    FT_Memory  memory = stream->memory;
 
 
     if ( stream->close )
       stream->close( stream );
 
-    FREE( stream );
+    if (!external)
+    {
+      FT_Memory  memory = stream->memory;
+      FREE( stream );
+    }
     *astream = 0;
   }
 
@@ -1146,8 +1151,8 @@
       clazz->done_face( face );
 
     /* close the stream for this face if needed */
-    if ( ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) == 0 )
-      ft_done_stream( &face->stream );
+    ft_done_stream( &face->stream,
+                    (face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM) != 0 );
 
     /* get rid of it */
     FREE( face );
@@ -1392,8 +1397,8 @@
     FT_Stream    stream;
     FT_Face      face = 0;
     FT_ListNode  node = 0;
+    FT_Bool      external_stream;
 
-
     /* test for valid `library' and `args' delayed to */
     /* ft_new_input_stream()                          */
 
@@ -1402,6 +1407,8 @@
 
     *aface = 0;
 
+    external_stream = ( args->flags & ft_open_stream && args->stream );
+
     /* create input stream */
     error = ft_new_input_stream( library, args, &stream );
     if ( error )
@@ -1436,7 +1443,7 @@
       else
         error = FT_Err_Invalid_Handle;
 
-      ft_done_stream( &stream );
+      ft_done_stream( &stream, external_stream );
       goto Fail;
     }
     else
@@ -1473,7 +1480,7 @@
         }
       }
 
-      ft_done_stream( &stream );
+      ft_done_stream( &stream, external_stream );
 
       /* no driver is able to handle this format */
       error = FT_Err_Unknown_File_Format;
@@ -1484,7 +1491,7 @@
     FT_TRACE4(( "FT_New_Face: New face object, adding to list\n" ));
 
     /* set the FT_FACE_FLAG_EXTERNAL_STREAM bit for FT_Done_Face */
-    if ( args->flags & ft_open_stream && args->stream )
+    if ( external_stream )
       face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM;
 
     /* add the face object to its driver's list */
@@ -1654,8 +1661,9 @@
       error = clazz->attach_file( face, stream );
 
     /* close the attached stream */
-    if ( !parameters->stream || ( parameters->flags & ft_open_stream ) )
-      ft_done_stream( &stream );
+    ft_done_stream( &stream,
+                    (FT_Bool)(parameters->stream &&
+                             (parameters->flags & ft_open_stream)) );
 
   Exit:
     return error;
@@ -3214,32 +3222,6 @@
          hook_index <
            ( sizeof ( library->debug_hooks ) / sizeof ( void* ) ) )
       library->debug_hooks[hook_index] = debug_hook;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Done_FreeType                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Destroys a given FreeType library object and all of its childs,    */
-  /*    including resources, drivers, faces, sizes, etc.                   */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library :: A handle to the target library object.                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_EXPORT_FUNC( FT_Error )  FT_Done_FreeType( FT_Library  library )
-  {
-    /* test for valid `library' delayed to FT_Done_Library() */
-
-    /* Discard the library object */
-    FT_Done_Library( library );
-
-    return FT_Err_Ok;
   }
 
 
--- a/src/base/ftsystem.c
+++ b/src/base/ftsystem.c
@@ -296,4 +296,20 @@
   }
 
 
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_Memory                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Discards memory manager.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory  :: handle to memory manager                                */
+  /*                                                                       */
+  FT_EXPORT_FUNC( void )  FT_Done_Memory( FT_Memory  memory )
+  {
+    free( memory );
+  }
+
 /* END */
--- a/src/psnames/psnames.c
+++ b/src/psnames/psnames.c
@@ -18,7 +18,7 @@
 
 #define FT_MAKE_OPTION_SINGLE_OBJECT
 
-#include <psmodule.c>
+#include <psnames/psmodule.c>
 
 
 /* END */
--- a/src/truetype/ttgload.c
+++ b/src/truetype/ttgload.c
@@ -539,6 +539,8 @@
     FT_Error         error    = FT_Err_Ok;
 
 
+    FT_UNUSED(debug);  /* used by truetype interpreter only */
+    
     n_ins = load->glyph->control_len;
 
     /* add shadow points */
@@ -674,7 +676,8 @@
     FT_GlyphLoader*  gloader = loader->gloader;
     FT_Bool          opened_frame = 0;
 
-
+    FT_UNUSED(stream);  /* used with bytecode interpreter only */
+    
     /* check glyph index */
     index = glyph_index;
     if ( index >= (FT_UInt)face->root.num_glyphs )
--- a/src/truetype/ttobjs.c
+++ b/src/truetype/ttobjs.c
@@ -143,7 +143,6 @@
 
     return error;
   }
-
 #endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
 
 
@@ -730,7 +729,8 @@
       TT_Destroy_Context( driver->context, driver->root.root.memory );
       driver->context = NULL;
     }
-
+#else
+    FT_UNUSED(driver);
 #endif
 
   }
--- a/src/truetype/ttobjs.h
+++ b/src/truetype/ttobjs.h
@@ -119,6 +119,7 @@
 #endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
 
 
+
   /*************************************************************************/
   /*                                                                       */
   /*  EXECUTION SUBTABLES                                                  */