shithub: freetype+ttf2subf

Download patch

ref: 85eb6695465ab93ead94abb2a6efa2a561c80752
parent: 0d535112fdc7d425a3b8562fd2574246a69cc35f
author: David Turner <[email protected]>
date: Thu Dec 20 04:36:21 EST 2001

* src/type1/t1gload.c (T1_Load_Glyph): enable font matrix transform
        on hinted glyphs..

        * src/cid/cidgload.c, src/cid/cidobjs.c, src/cid/cidobjs.h,
        src/cid/cidriver.c, include/freetype/internal/t1types.h: added
        Postscript hinter support to the CID font driver !!

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2001-12-20  David Turner  <[email protected]>
+
+        * src/type1/t1gload.c (T1_Load_Glyph): enable font matrix transform
+        on hinted glyphs..
+
+        * src/cid/cidgload.c, src/cid/cidobjs.c, src/cid/cidobjs.h,
+        src/cid/cidriver.c, include/freetype/internal/t1types.h: added
+        Postscript hinter support to the CID font driver !!
+
+
 2001-12-19  David Turner  <[email protected]>
 
 	* include/freetype/cache/ftcache.h: Added comments to indicate that
--- a/include/freetype/internal/t1types.h
+++ b/include/freetype/internal/t1types.h
@@ -188,6 +188,9 @@
     CID_Info    cid;
     void*       afm_data;
     CID_Subrs*  subrs;
+    
+    /* since FT 2.1 - interface to PostScript hinter */
+    void*          pshinter;
 
   } CID_FaceRec;
 
--- a/src/cid/cidgload.c
+++ b/src/cid/cidgload.c
@@ -238,7 +238,7 @@
                                              (FT_GlyphSlot)glyph,
                                              0, /* glyph names -- XXX */
                                              0, /* blend == 0 */
-                                             0, /* hinting == 0 */
+                                             hinting,
                                              cid_load_glyph );
 
       /* set up the decoder */
@@ -316,11 +316,12 @@
 
 
           /* First of all, scale the points */
-          for ( n = cur->n_points; n > 0; n--, vec++ )
-          {
-            vec->x = FT_MulFix( vec->x, x_scale );
-            vec->y = FT_MulFix( vec->y, y_scale );
-          }
+          if ( !hinting )
+            for ( n = cur->n_points; n > 0; n--, vec++ )
+            {
+              vec->x = FT_MulFix( vec->x, x_scale );
+              vec->y = FT_MulFix( vec->y, y_scale );
+            }
 
           FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
 
--- a/src/cid/cidobjs.c
+++ b/src/cid/cidobjs.c
@@ -23,6 +23,7 @@
 #include "cidload.h"
 #include FT_INTERNAL_POSTSCRIPT_NAMES_H
 #include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_INTERNAL_POSTSCRIPT_HINTS_H
 
 #include "ciderrs.h"
 
@@ -37,8 +38,129 @@
 #define FT_COMPONENT  trace_cidobjs
 
 
+
   /*************************************************************************/
   /*                                                                       */
+  /*                            SLOT  FUNCTIONS                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+  FT_LOCAL_DEF void
+  CID_GlyphSlot_Done( CID_GlyphSlot  slot )
+  {
+    slot->root.internal->glyph_hints = 0;
+  }
+
+
+  FT_LOCAL_DEF FT_Error
+  CID_GlyphSlot_Init( CID_GlyphSlot   slot )
+  {  
+    CID_Face             face;
+    PSHinter_Interface*  pshinter;
+    
+    face     = (CID_Face) slot->root.face;
+    pshinter = face->pshinter;
+    if (pshinter)
+    {
+      FT_Module  module;
+      
+      module = FT_Get_Module( slot->root.face->driver->root.library, "pshinter" );
+      if (module)
+      {
+        T1_Hints_Funcs  funcs;
+        
+        funcs = pshinter->get_t1_funcs( module );
+        slot->root.internal->glyph_hints = (void*)funcs;                   
+      }
+    }
+    return 0;
+  }
+  
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                           SIZE  FUNCTIONS                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static PSH_Globals_Funcs
+  CID_Size_Get_Globals_Funcs( CID_Size  size )
+  {
+    CID_Face              face     = (CID_Face) size->root.face;
+    PSHinter_Interface*  pshinter = face->pshinter;
+    FT_Module            module;
+    
+
+    module = FT_Get_Module( size->root.face->driver->root.library,
+                            "pshinter" );
+    return ( module && pshinter && pshinter->get_globals_funcs )
+           ? pshinter->get_globals_funcs( module )
+           : 0 ;
+  }
+
+
+  FT_LOCAL_DEF void
+  CID_Size_Done( CID_Size  size )
+  {
+    if ( size->root.internal )
+    {
+      PSH_Globals_Funcs  funcs;
+    
+
+      funcs = CID_Size_Get_Globals_Funcs( size );
+      if ( funcs )
+        funcs->destroy( (PSH_Globals)size->root.internal );
+
+      size->root.internal = 0;
+    }
+  }
+
+
+  FT_LOCAL_DEF FT_Error
+  CID_Size_Init( CID_Size  size )
+  {
+    FT_Error           error = 0;
+    PSH_Globals_Funcs  funcs = CID_Size_Get_Globals_Funcs( size );
+    
+
+    if ( funcs )
+    {
+      PSH_Globals  globals;
+      CID_Face      face = (CID_Face)size->root.face;
+      CID_FontDict* dict = face->cid.font_dicts + face->root.face_index;
+      T1_Private*   priv = &dict->private_dict;
+      
+
+      error = funcs->create( size->root.face->memory, priv, &globals );
+      if ( !error )
+        size->root.internal = (FT_Size_Internal)(void*)globals;
+    }
+    
+    return error;
+  }
+
+
+  FT_LOCAL_DEF FT_Error
+  CID_Size_Reset( CID_Size  size )
+  {
+    PSH_Globals_Funcs  funcs = CID_Size_Get_Globals_Funcs( size );
+    FT_Error           error = 0;
+
+    
+    if ( funcs )
+      error = funcs->set_scale( (PSH_Globals)size->root.internal,
+                                 size->root.metrics.x_scale,
+                                 size->root.metrics.y_scale,
+                                 0, 0 );
+    return error;                                
+  }
+
+
+
+
+  /*************************************************************************/
+  /*                                                                       */
   /*                           FACE  FUNCTIONS                             */
   /*                                                                       */
   /*************************************************************************/
@@ -47,7 +169,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
-  /*    CID_Done_Face                                                      */
+  /*    CID_Face_Done                                                      */
   /*                                                                       */
   /* <Description>                                                         */
   /*    Finalizes a given face object.                                     */
@@ -56,7 +178,7 @@
   /*    face :: A pointer to the face object to destroy.                   */
   /*                                                                       */
   FT_LOCAL_DEF void
-  CID_Done_Face( CID_Face  face )
+  CID_Face_Done( CID_Face  face )
   {
     FT_Memory  memory;
 
@@ -94,7 +216,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
-  /*    CID_Init_Face                                                      */
+  /*    CID_Face_Init                                                      */
   /*                                                                       */
   /* <Description>                                                         */
   /*    Initializes a given CID face object.                               */
@@ -115,7 +237,7 @@
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
   FT_LOCAL_DEF FT_Error
-  CID_Init_Face( FT_Stream      stream,
+  CID_Face_Init( FT_Stream      stream,
                  CID_Face       face,
                  FT_Int         face_index,
                  FT_Int         num_params,
@@ -124,6 +246,7 @@
     FT_Error            error;
     PSNames_Interface*  psnames;
     PSAux_Interface*    psaux;
+    PSHinter_Interface* pshinter;
 
     FT_UNUSED( num_params );
     FT_UNUSED( params );
@@ -151,6 +274,17 @@
       face->psaux = psaux;
     }
 
+
+    pshinter = (PSHinter_Interface*)face->pshinter;
+    if ( !pshinter )
+    {
+      pshinter = (PSHinter_Interface*)
+                 FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), "pshinter" );
+
+      face->pshinter = pshinter;
+    }
+
+
     /* open the tokenizer; this will also check the font format */
     if ( FILE_Seek( 0 ) )
       goto Exit;
@@ -166,7 +300,7 @@
     /* check the face index */
     if ( face_index != 0 )
     {
-      FT_ERROR(( "CID_Init_Face: invalid face index\n" ));
+      FT_ERROR(( "CID_Face_Init: invalid face index\n" ));
       error = CID_Err_Invalid_Argument;
       goto Exit;
     }
@@ -342,7 +476,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
-  /*    CID_Init_Driver                                                    */
+  /*    CID_Driver_Init                                                    */
   /*                                                                       */
   /* <Description>                                                         */
   /*    Initializes a given CID driver object.                             */
@@ -354,7 +488,7 @@
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
   FT_LOCAL_DEF FT_Error
-  CID_Init_Driver( CID_Driver  driver )
+  CID_Driver_Init( CID_Driver  driver )
   {
     FT_UNUSED( driver );
 
@@ -365,7 +499,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
-  /*    CID_Done_Driver                                                    */
+  /*    CID_Driver_Done                                                    */
   /*                                                                       */
   /* <Description>                                                         */
   /*    Finalizes a given CID driver.                                      */
@@ -374,7 +508,7 @@
   /*    driver :: A handle to the target CID driver.                       */
   /*                                                                       */
   FT_LOCAL_DEF void
-  CID_Done_Driver( CID_Driver  driver )
+  CID_Driver_Done( CID_Driver  driver )
   {
     FT_UNUSED( driver );
   }
--- a/src/cid/cidobjs.h
+++ b/src/cid/cidobjs.h
@@ -111,22 +111,43 @@
   } CID_GlyphSlotRec;
 
 
+  FT_LOCAL void
+  CID_GlyphSlot_Done( CID_GlyphSlot  slot );
+
   FT_LOCAL FT_Error
-  CID_Init_Face( FT_Stream      stream,
+  CID_GlyphSlot_Init( CID_GlyphSlot   slot );
+
+
+  FT_LOCAL void
+  CID_Size_Done( CID_Size  size );
+
+
+  FT_LOCAL FT_Error
+  CID_Size_Init( CID_Size  size );
+
+
+  FT_LOCAL FT_Error
+  CID_Size_Reset( CID_Size  size );
+
+
+  FT_LOCAL FT_Error
+  CID_Face_Init( FT_Stream      stream,
                  CID_Face       face,
                  FT_Int         face_index,
                  FT_Int         num_params,
                  FT_Parameter*  params );
 
+
   FT_LOCAL void
-  CID_Done_Face( CID_Face  face );
+  CID_Face_Done( CID_Face  face );
 
 
   FT_LOCAL FT_Error
-  CID_Init_Driver( CID_Driver  driver );
+  CID_Driver_Init( CID_Driver  driver );
 
+
   FT_LOCAL void
-  CID_Done_Driver( CID_Driver  driver );
+  CID_Driver_Done( CID_Driver  driver );
 
 
 FT_END_HEADER
--- a/src/cid/cidriver.c
+++ b/src/cid/cidriver.c
@@ -190,7 +190,10 @@
   {
     /* first of all, the FT_Module_Class fields */
     {
-      ft_module_font_driver | ft_module_driver_scalable,
+      ft_module_font_driver       |
+      ft_module_driver_scalable   |
+      ft_module_driver_has_hinter ,
+      
       sizeof( FT_DriverRec ),
       "t1cid",   /* module name           */
       0x10000L,  /* version 1.0 of driver */
@@ -198,8 +201,8 @@
 
       0,
 
-      (FT_Module_Constructor)CID_Init_Driver,
-      (FT_Module_Destructor) CID_Done_Driver,
+      (FT_Module_Constructor)CID_Driver_Init,
+      (FT_Module_Destructor) CID_Driver_Done,
       (FT_Module_Requester)  CID_Get_Interface
     },
 
@@ -208,16 +211,16 @@
     sizeof( CID_SizeRec ),
     sizeof( CID_GlyphSlotRec ),
 
-    (FTDriver_initFace)     CID_Init_Face,
-    (FTDriver_doneFace)     CID_Done_Face,
+    (FTDriver_initFace)     CID_Face_Init,
+    (FTDriver_doneFace)     CID_Face_Done,
 
-    (FTDriver_initSize)     0,
-    (FTDriver_doneSize)     0,
-    (FTDriver_initGlyphSlot)0,
-    (FTDriver_doneGlyphSlot)0,
+    (FTDriver_initSize)     CID_Size_Init,
+    (FTDriver_doneSize)     CID_Size_Done,
+    (FTDriver_initGlyphSlot)CID_GlyphSlot_Init,
+    (FTDriver_doneGlyphSlot)CID_GlyphSlot_Done,
 
-    (FTDriver_setCharSizes) 0,
-    (FTDriver_setPixelSizes)0,
+    (FTDriver_setCharSizes) CID_Size_Reset,
+    (FTDriver_setPixelSizes)CID_Size_Reset,
 
     (FTDriver_loadGlyph)    CID_Load_Glyph,
     (FTDriver_getCharIndex) CID_Get_Char_Index,
--- a/src/type1/t1gload.c
+++ b/src/type1/t1gload.c
@@ -241,8 +241,7 @@
         if ( size && size->root.metrics.y_ppem < 24 )
           glyph->root.outline.flags |= ft_outline_high_precision;
 
-  /* XXX: the following needs serious work to work properly with hinting! */
-#if 0
+#if 1
         /* apply the font matrix, if any */
         FT_Outline_Transform( &glyph->root.outline, &font_matrix );