shithub: freetype+ttf2subf

Download patch

ref: 5ae831c10181954cd56e9b170da1133291383bc9
parent: 203bb47cfe3dbdc2e3eabd619a1ef2cb855e7fe1
author: David Turner <[email protected]>
date: Thu Jun 29 21:31:22 EDT 2000

changes used to implement the auto-hinting support

git/fs: mount .git/fs: mount/attach disallowed
--- a/demos/src/memtest.c
+++ b/demos/src/memtest.c
@@ -184,7 +184,7 @@
     }
   }
   if (!bad)
-    fprintf( stderr, "no leaked memory block, congratulations ;-)" );
+    fprintf( stderr, "no leaked memory block\n\n" );
 }
 
 /****************************************************************************/
@@ -302,7 +302,7 @@
       {
         for ( id = 0; id < num_glyphs; id++ )
         {
-          error = FT_Load_Glyph( face, id, FT_LOAD_DEFAULT );
+          error = FT_Load_Glyph( face, id, FT_LOAD_RENDER | FT_LOAD_ANTI_ALIAS );
           if (error)
           {
             if ( Fail < 10 )
--- a/docs/design/index.html
+++ b/docs/design/index.html
@@ -20,19 +20,22 @@
 
 <center>
 <h2>
-Version 1.0</h2></center>
+Version 1.2</h2></center>
 
 <center>
 <h3>
-&copy; 1999 David Turner (<a href="fichier :///[email protected]">[email protected]</a>)<br>
-&copy; 1999 The FreeType Development Team (<a href="fichier :///[email protected]">[email protected]</a>)</h3></center>
+&copy; 1999-2000 David Turner (<a href="fichier :///[email protected]">[email protected]</a>)<br>
+&copy; 1999-2000 The FreeType Development Team (<a href="fichier :///[email protected]">[email protected]</a>)</h3></center>
 
 <p><br>
 <hr WIDTH="100%">
 <br>&nbsp;
-<h2>
-Introduction:</h2>
+<h2>Introduction:</h2>
 
+<p>This document describes in great deatils the internals of FreeType 2.
+   It is a must read for porters and developers alike. Its purpose is to
+   
+   present the
 <blockquote>This document describes in great details the internals of the
 FreeType 2.0 library. It is a must read for porters and developers alike.
 Its purpose is to present the engine's objects, their roles and interactions.
--- a/include/freetype/freetype.h
+++ b/include/freetype/freetype.h
@@ -645,7 +645,7 @@
     FT_CharMap       charmap;
     FT_ListRec       sizes_list;
 
-    void*            autohint_globals;
+    FT_Generic       autohint;
     void*            extensions;
 
     FT_UShort        max_points;
--- a/include/freetype/ftmodule.h
+++ b/include/freetype/ftmodule.h
@@ -23,11 +23,15 @@
   /* module bit flags */
   typedef enum FT_Module_Flags_
   {
-    ft_module_font_driver         = 1, /* this module is a font driver */
-    ft_module_renderer            = 2, /* this module is a renderer    */
+    ft_module_font_driver         = 1, /* this module is a font driver  */
+    ft_module_renderer            = 2, /* this module is a renderer     */
+    ft_module_hinter              = 4, /* this module is a glyph hinter */
+    ft_module_styler              = 8, /* this module is a styler       */
 
-    ft_module_driver_scalable     = 4, /* this driver supports scalable fonts          */
-    ft_module_driver_no_outlines  = 8  /* this driver does not support vector outlines */
+    ft_module_driver_scalable     = 0x100,  /* the driver supports scalable fonts          */
+    ft_module_driver_no_outlines  = 0x200,  /* the driver does not support vector outlines */
+
+    ft_module_driver_has_hinter   = 0x400   /* the driver provides its own hinter */
 
   } FT_Module_Flags;
 
--- a/include/freetype/internal/autohint.h
+++ b/include/freetype/internal/autohint.h
@@ -2,7 +2,7 @@
 /*                                                                         */
 /*  autohint.h                                                             */
 /*                                                                         */
-/*    High-level `autohint" driver interface (specification)               */
+/*    High-level `autohint" module-specific interface (specification)      */
 /*                                                                         */
 /*  Copyright 1996-2000 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
@@ -111,47 +111,6 @@
  /***********************************************************************
   *
   * <FuncType>
-  *    FT_AutoHinter_Init_Func
-  *
-  * <Description>
-  *    Compute or set the global hints for a given face object.
-  *
-  * <Input>
-  *    hinter       :: handle to source auto-hinter module
-  *    face         :: handle to target face object.
-  *    global_hints :: typeless pointer to global hints. If 0, the
-  *                    hints are computed for the face
-  *
-  * <Note>
-  *    it is up to client applications to ensure that the global hints
-  *    were retrieved for the same face object. Strange results may occur
-  *    otherwise..
-  *
-  */
-  typedef FT_Error   (*FT_AutoHinter_Init_Func)( FT_AutoHinter  hinter,
-                                                 FT_Face        face,
-                                                 void*          global_hints );
-
- /***********************************************************************
-  *
-  * <FuncType>
-  *    FT_AutoHinter_Done_Func
-  *
-  * <Description>
-  *    Discards the global hints for a given face..
-  *
-  * <Input>
-  *    hinter       :: handle to source auto-hinter module
-  *    face         :: handle to target face object.
-  *
-  */
-  typedef FT_Error   (*FT_AutoHinter_Done_Func)( FT_AutoHinter  hinter,
-                                                 FT_Face        face );
-
-
- /***********************************************************************
-  *
-  * <FuncType>
   *    FT_AutoHinter_Reset_Func
   *
   * <Description>
@@ -165,8 +124,8 @@
   *
   *
   */
-  typedef  FT_Error    (*FT_AutoHinter_Reset_Func)( FT_AutoHinter  hinter,
-                                                    FT_Face        face );
+  typedef  void    (*FT_AutoHinter_Reset_Func)( FT_AutoHinter  hinter,
+                                                FT_Face        face );
 
  /***********************************************************************
   *
@@ -190,9 +149,12 @@
   *    set..
   *
   */
-  typedef  FT_Error    (*FT_AutoHinter_Load_Func)( FT_Face   face,
-                                                   FT_UInt   glyph_index,
-   					                               FT_ULong  load_flags );
+  typedef  FT_Error    (*FT_AutoHinter_Load_Func)(
+                               FT_AutoHinter  hinter,
+                               FT_GlyphSlot   slot,
+			       FT_Size        size,
+                               FT_UInt        glyph_index,
+  			       FT_ULong       load_flags );
 
  /***********************************************************************
   *
@@ -205,10 +167,8 @@
   */
   typedef struct FT_AutoHinter_Interface
   {
-    FT_AutoHinter_Init_Func   init_autohinter;
-    FT_AutoHinter_Done_Func   done_autohinter;
-    FT_AutoHinter_Reset_Func  reset_face;
-    FT_AutoHinter_Load_Func   load_glyph;
+    FT_AutoHinter_Reset_Func        reset_face;
+    FT_AutoHinter_Load_Func         load_glyph;
 
     FT_AutoHinter_Get_Global_Func   get_global_hints;
     FT_AutoHinter_Done_Global_Func  done_global_hints;
--- a/include/freetype/internal/ftobjs.h
+++ b/include/freetype/internal/ftobjs.h
@@ -28,6 +28,7 @@
 #include <freetype/internal/ftmemory.h>
 #include <freetype/ftrender.h>
 #include <freetype/internal/ftdriver.h>
+#include <freetype/internal/autohint.h>
 
   /*************************************************************************/
   /*                                                                       */
@@ -120,6 +121,12 @@
 #define  FT_MODULE_IS_RENDERER(x)  (FT_MODULE_CLASS(x)->module_flags & \
                                      ft_module_renderer )
 
+#define  FT_MODULE_IS_HINTER(x) (FT_MODULE_CLASS(x)->module_flags & \
+                                     ft_module_hinter )
+
+#define  FT_MODULE_IS_STYLER(x) (FT_MODULE_CLASS(x)->module_flags & \
+                                     ft_module_styler )
+
 #define  FT_DRIVER_IS_SCALABLE(x)  (FT_MODULE_CLASS(x)->module_flags & \
                                      ft_module_driver_scalable )
 
@@ -126,6 +133,8 @@
 #define  FT_DRIVER_USES_OUTLINES(x)  !(FT_MODULE_CLASS(x)->module_flags & \
                                        ft_module_driver_no_outlines )
 
+#define  FT_DRIVER_HAS_HINTER(x)  (FT_MODULE_CLASS(x)->module_flags & \
+                                       ft_module_driver_has_hinter )
 
   /*************************************************************************/
   /*************************************************************************/
@@ -389,6 +398,7 @@
 
     FT_ListRec          renderers;     /* list of renderers        */
     FT_Renderer         cur_renderer;  /* current outline renderer */
+    FT_Module           auto_hinter;
 
     void*               raster_pool;      /* scan-line conversion render pool */
     unsigned long       raster_pool_size; /* size of render pool in bytes     */
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -678,8 +678,15 @@
   static
   void  ft_glyphslot_clear( FT_GlyphSlot  slot )
   {
+    /* free bitmap if needed */
+    if ( slot->flags & ft_glyph_own_bitmap )
+    {
+      FT_Memory  memory = FT_FACE_MEMORY( slot->face );
+      FREE( slot->bitmap.buffer );
+      slot->flags &= ~ft_glyph_own_bitmap;
+    }
+  
     /* clear all public fields in the glyph slot */
-
     MEM_Set( &slot->metrics, 0, sizeof ( slot->metrics ) );
     MEM_Set( &slot->outline, 0, sizeof ( slot->outline ) );
     MEM_Set( &slot->bitmap,  0, sizeof ( slot->bitmap )  );
@@ -931,6 +938,9 @@
     FT_Error      error;
     FT_Driver     driver;
     FT_GlyphSlot  slot;
+    FT_Library    library;
+    FT_Bool       autohint;
+    FT_Module     hinter;
 
 
     if ( !face || !face->size || !face->glyph )
@@ -948,10 +958,31 @@
     if ( load_flags & FT_LOAD_NO_RECURSE )
       load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
 
-    error = driver->clazz->load_glyph( slot,
-                                       face->size,
-                                       glyph_index,
-                                       load_flags );
+    /* do we need to load the glyph through the auto-hinter ?? */
+    library  = driver->root.library;
+    hinter   = library->auto_hinter;
+    autohint = hinter &&
+               !(load_flags & (FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING));
+    if (autohint)
+    {
+      if ( FT_DRIVER_HAS_HINTER( driver ) &&
+           !(load_flags & FT_LOAD_FORCE_AUTOHINT) )
+	autohint = 0;
+    }	       
+    
+    if (autohint)
+    {
+      FT_AutoHinter_Interface*  hinting;
+      
+      hinting = (FT_AutoHinter_Interface*)hinter->clazz->module_interface;
+      error = hinting->load_glyph( (FT_AutoHinter)hinter, slot,  face->size,
+                                   glyph_index, load_flags );
+    }
+    else
+      error = driver->clazz->load_glyph( slot,
+                                         face->size,
+					 glyph_index,
+					 load_flags );
     if ( error )
       goto Exit;
 
@@ -982,6 +1013,16 @@
       FT_Vector_Transform( &slot->advance, &face->transform_matrix );
     }
 
+    /* do we need to render the image now ? */
+    if ( !error                                    &&
+         slot->format != ft_glyph_format_bitmap    &&
+         slot->format != ft_glyph_format_composite &&
+	 load_flags & FT_LOAD_RENDER )
+    {
+      error = FT_Render_Glyph( slot, (load_flags & FT_LOAD_ANTI_ALIAS) ?
+                                ft_render_mode_antialias : 0 );
+    }	 
+
   Exit:
     return error;
   }
@@ -1039,8 +1080,7 @@
     if ( face->charmap )
       glyph_index = FT_Get_Char_Index( face, char_code );
 
-    return glyph_index ? FT_Load_Glyph( face, glyph_index, load_flags )
-                       : FT_Err_Invalid_Character_Code;
+    return FT_Load_Glyph( face, glyph_index, load_flags );
   }
 
 
@@ -2618,8 +2658,9 @@
   static
   void  Destroy_Module( FT_Module  module )
   {
-    FT_Memory         memory = module->memory;
-    FT_Module_Class*  clazz  = module->clazz;
+    FT_Memory         memory  = module->memory;
+    FT_Module_Class*  clazz   = module->clazz;
+    FT_Library        library = module->library;
 
 
     /* finalize client-data - before anything else */
@@ -2626,6 +2667,9 @@
     if ( module->generic.finalizer )
       module->generic.finalizer( module );
 
+    if ( library && library->auto_hinter == module )
+      library->auto_hinter = 0;
+
     /* if the module is a renderer */
     if ( FT_MODULE_IS_RENDERER( module ) )
       ft_remove_renderer( module );
@@ -2729,6 +2773,10 @@
         goto Fail;
     }
 
+    /* is the module a auto-hinter ? */
+    if ( FT_MODULE_IS_HINTER(module) )
+      library->auto_hinter = module;
+      
     /* if the module is a font driver */
     if ( FT_MODULE_IS_DRIVER( module ) )
     {
--- a/src/cid/cidgload.c
+++ b/src/cid/cidgload.c
@@ -491,6 +491,7 @@
 
       /* set up remaining glyph fields */
       glyph->num_subglyphs = 2;
+      glyph->subglyphs     = loader->current.subglyphs;
       glyph->format        = ft_glyph_format_composite;
 
       loader->current.num_subglyphs = 2;
--- a/src/smooth/ftsmooth.c
+++ b/src/smooth/ftsmooth.c
@@ -84,7 +84,7 @@
     }
     
     /* check mode */
-    if ( !(mode & ft_render_mode_antialias) )
+    if ( mode != ft_render_mode_antialias )
       return FT_Err_Cannot_Render_Glyph;
       
     outline = &slot->outline;
--- a/src/truetype/ttdriver.c
+++ b/src/truetype/ttdriver.c
@@ -423,7 +423,10 @@
   const FT_Driver_Class  tt_driver_class =
   {
     {
-      ft_module_font_driver | ft_module_driver_scalable,
+      ft_module_font_driver     |
+      ft_module_driver_scalable |
+      ft_module_driver_has_hinter,
+      
       sizeof ( TT_DriverRec ),
     
       "truetype",      /* driver name                           */
--- a/src/type1/t1gload.c
+++ b/src/type1/t1gload.c
@@ -313,6 +313,7 @@
 
       /* set up remaining glyph fields */
       glyph->num_subglyphs = 2;
+      glyph->subglyphs     = loader->current.subglyphs;
       glyph->format        = ft_glyph_format_composite;
       
       loader->current.num_subglyphs = 2;
--- a/src/type1z/z1gload.c
+++ b/src/type1z/z1gload.c
@@ -455,6 +455,7 @@
 
       /* set up remaining glyph fields */
       glyph->num_subglyphs = 2;
+      glyph->subglyphs     = loader->base.subglyphs;
       glyph->format        = ft_glyph_format_composite;
       
       loader->current.num_subglyphs = 2;