[Xorg-commit] xc/extras/freetype2/src/type1 rules.mk,1.1,1.1.4.1 t1afm.c,1.1.4.1,1.1.4.2 t1driver.c,1.1.4.1,1.1.4.2 t1gload.c,1.1.4.1,1.1.4.2 t1gload.h,1.1.4.1,1.1.4.2 t1load.c,1.1.4.1,1.1.4.2 t1objs.c,1.1.4.1,1.1.4.2 t1parse.c,1.1.4.1,1.1.4.2 t1parse.h,1.1.4.1,1.1.4.2 t1tokens.h,1.1.4.1,1.1.4.2

Kaleb Keithley xorg-commit at pdx.freedesktop.org
Wed May 9 17:30:30 EEST 2007


Committed by: kaleb

Update of /cvs/xorg/xc/extras/freetype2/src/type1
In directory pdx:/home/kaleb/xorg/xc.XORG-CURRENT/extras/freetype2/src/type1

Modified Files:
      Tag: XORG-CURRENT
	rules.mk t1afm.c t1driver.c t1gload.c t1gload.h t1load.c 
	t1objs.c t1parse.c t1parse.h t1tokens.h 
Log Message:
merge most of XFree86 RC3 (4.3.99.903) from vendor branch.
bug #214


Index: rules.mk
===================================================================
RCS file: /cvs/xorg/xc/extras/freetype2/src/type1/rules.mk,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -d -r1.1 -r1.1.4.1
--- a/rules.mk	14 Nov 2003 16:48:24 -0000	1.1
+++ b/rules.mk	23 Feb 2004 21:33:15 -0000	1.1.4.1
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2000, 2001 by
+# Copyright 1996-2000, 2001, 2003 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -15,29 +15,28 @@
 
 # Type1 driver directory
 #
-T1_DIR  := $(SRC_)type1
-T1_DIR_ := $(T1_DIR)$(SEP)
+T1_DIR := $(SRC_DIR)/type1
 
 
 # compilation flags for the driver
 #
-T1_COMPILE := $(FT_COMPILE) $I$(T1_DIR)
+T1_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(T1_DIR))
 
 
 # Type1 driver sources (i.e., C files)
 #
-T1_DRV_SRC := $(T1_DIR_)t1parse.c  \
-              $(T1_DIR_)t1load.c   \
-              $(T1_DIR_)t1driver.c \
-              $(T1_DIR_)t1afm.c    \
-              $(T1_DIR_)t1gload.c  \
-              $(T1_DIR_)t1objs.c
+T1_DRV_SRC := $(T1_DIR)/t1parse.c  \
+              $(T1_DIR)/t1load.c   \
+              $(T1_DIR)/t1driver.c \
+              $(T1_DIR)/t1afm.c    \
+              $(T1_DIR)/t1gload.c  \
+              $(T1_DIR)/t1objs.c
 
 # Type1 driver headers
 #
 T1_DRV_H := $(T1_DRV_SRC:%.c=%.h) \
-            $(T1_DIR_)t1tokens.h  \
-            $(T1_DIR_)t1errors.h
+            $(T1_DIR)/t1tokens.h  \
+            $(T1_DIR)/t1errors.h
 
 
 # Type1 driver object(s)
@@ -45,24 +44,24 @@
 #   T1_DRV_OBJ_M is used during `multi' builds
 #   T1_DRV_OBJ_S is used during `single' builds
 #
-T1_DRV_OBJ_M := $(T1_DRV_SRC:$(T1_DIR_)%.c=$(OBJ_)%.$O)
-T1_DRV_OBJ_S := $(OBJ_)type1.$O
+T1_DRV_OBJ_M := $(T1_DRV_SRC:$(T1_DIR)/%.c=$(OBJ_DIR)/%.$O)
+T1_DRV_OBJ_S := $(OBJ_DIR)/type1.$O
 
 # Type1 driver source file for single build
 #
-T1_DRV_SRC_S := $(T1_DIR_)type1.c
+T1_DRV_SRC_S := $(T1_DIR)/type1.c
 
 
 # Type1 driver - single object
 #
 $(T1_DRV_OBJ_S): $(T1_DRV_SRC_S) $(T1_DRV_SRC) $(FREETYPE_H) $(T1_DRV_H)
-	$(T1_COMPILE) $T$@ $(T1_DRV_SRC_S)
+	$(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(T1_DRV_SRC_S))
 
 
 # Type1 driver - multiple objects
 #
-$(OBJ_)%.$O: $(T1_DIR_)%.c $(FREETYPE_H) $(T1_DRV_H)
-	$(T1_COMPILE) $T$@ $<
+$(OBJ_DIR)/%.$O: $(T1_DIR)/%.c $(FREETYPE_H) $(T1_DRV_H)
+	$(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
 
 
 # update main driver object lists
@@ -70,4 +69,5 @@
 DRV_OBJS_S += $(T1_DRV_OBJ_S)
 DRV_OBJS_M += $(T1_DRV_OBJ_M)
 
+
 # EOF

Index: t1afm.c
===================================================================
RCS file: /cvs/xorg/xc/extras/freetype2/src/type1/t1afm.c,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -d -r1.1.4.1 -r1.1.4.2
--- a/t1afm.c	26 Nov 2003 22:48:28 -0000	1.1.4.1
+++ b/t1afm.c	23 Feb 2004 21:33:15 -0000	1.1.4.2
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    AFM support for Type 1 fonts (body).                                 */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002 by                                           */
+/*  Copyright 1996-2001, 2002, 2003 by                                     */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -148,7 +148,7 @@
     FT_ULong  index2 = KERN_INDEX( pair2->glyph1, pair2->glyph2 );
 
 
-    return ( index1 - index2 );
+    return (int)( index1 - index2 );
   }
 
 

Index: t1driver.c
===================================================================
RCS file: /cvs/xorg/xc/extras/freetype2/src/type1/t1driver.c,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -d -r1.1.4.1 -r1.1.4.2
--- a/t1driver.c	26 Nov 2003 22:48:28 -0000	1.1.4.1
+++ b/t1driver.c	23 Feb 2004 21:33:15 -0000	1.1.4.2
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 driver interface (body).                                      */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002 by                                           */
+/*  Copyright 1996-2001, 2002, 2003 by                                     */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -29,8 +29,13 @@
 
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_POSTSCRIPT_NAMES_H
 
+#include FT_SERVICE_MULTIPLE_MASTERS_H
+#include FT_SERVICE_GLYPH_DICT_H
+#include FT_SERVICE_XFREE86_NAME_H
+#include FT_SERVICE_POSTSCRIPT_NAME_H
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
+#include FT_SERVICE_POSTSCRIPT_INFO_H
 
   /*************************************************************************/
   /*                                                                       */
@@ -41,6 +46,10 @@
 #undef  FT_COMPONENT
 #define FT_COMPONENT  trace_t1driver
 
+ /*
+  *  GLYPH DICT SERVICE
+  *
+  */
 
   static FT_Error
   t1_get_glyph_name( T1_Face     face,
@@ -69,23 +78,6 @@
   }
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    t1_get_name_index                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Uses the Type 1 font's `glyph_names' table to find a given glyph   */
-  /*    name's glyph index.                                                */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face       :: A handle to the source face object.                  */
-  /*                                                                       */
-  /*    glyph_name :: The glyph name.                                      */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Glyph index.  0 means `undefined character code'.                  */
-  /*                                                                       */
   static FT_UInt
   t1_get_name_index( T1_Face     face,
                      FT_String*  glyph_name )
@@ -105,6 +97,17 @@
     return 0;
   }
 
+  static const FT_Service_GlyphDictRec  t1_service_glyph_dict =
+  {
+    (FT_GlyphDict_GetNameFunc)  t1_get_glyph_name,
+    (FT_GlyphDict_NameIndexFunc)t1_get_name_index
+  };
+
+
+ /*
+  *  POSTSCRIPT NAME SERVICE
+  *
+  */
 
   static const char*
   t1_get_ps_name( T1_Face  face )
@@ -112,61 +115,83 @@
     return (const char*) face->type1.font_name;
   }
 
+  static const FT_Service_PsFontNameRec  t1_service_ps_name =
+  {
+    (FT_PsName_GetFunc)t1_get_ps_name
+  };
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Get_Interface                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Each driver can provide one or more extensions to the base         */
-  /*    FreeType API.  These can be used to access format specific         */
-  /*    features (e.g., all TrueType/OpenType resources share a common     */
-  /*    file structure and common tables which can be accessed through the */
-  /*    `sfnt' interface), or more simply generic ones (e.g., the          */
-  /*    `postscript names' interface which can be used to retrieve the     */
-  /*     PostScript name of a given glyph index).                          */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    driver       :: A handle to a driver object.                       */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    t1_interface :: A string designing the interface.  Examples are    */
-  /*                    `sfnt', `post_names', `charmaps', etc.             */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    A typeless pointer to the extension's interface (normally a table  */
-  /*    of function pointers).  Returns NULL if the requested extension    */
-  /*    isn't available (i.e., wasn't compiled in the driver at build      */
-  /*    time).                                                             */
-  /*                                                                       */
-  static FT_Module_Interface
-  Get_Interface( FT_Driver         driver,
-                 const FT_String*  t1_interface )
+
+ /*
+  *  MULTIPLE MASTERS SERVICE
+  *
+  */
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+  static const FT_Service_MultiMastersRec  t1_service_multi_masters =
   {
-    FT_UNUSED( driver );
-    FT_UNUSED( t1_interface );
+    (FT_Get_MM_Func)       T1_Get_Multi_Master,
+    (FT_Set_MM_Design_Func)T1_Set_MM_Design,
+    (FT_Set_MM_Blend_Func) T1_Set_MM_Blend
+  };
+#endif
 
-    if ( ft_strcmp( (const char*)t1_interface, "glyph_name" ) == 0 )
-      return (FT_Module_Interface)t1_get_glyph_name;
 
-    if ( ft_strcmp( (const char*)t1_interface, "name_index" ) == 0 )
-      return (FT_Module_Interface)t1_get_name_index;
+ /*
+  *  POSTSCRIPT INFO SERVICE
+  *
+  */
 
-    if ( ft_strcmp( (const char*)t1_interface, "postscript_name" ) == 0 )
-      return (FT_Module_Interface)t1_get_ps_name;
+  static FT_Error
+  t1_ps_get_font_info( FT_Face          face,
+                       PS_FontInfoRec*  afont_info )
+  {
+    *afont_info = ((T1_Face)face)->type1.font_info;
+    return 0;
+  }
 
-#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
-    if ( ft_strcmp( (const char*)t1_interface, "get_mm" ) == 0 )
-      return (FT_Module_Interface)T1_Get_Multi_Master;
 
-    if ( ft_strcmp( (const char*)t1_interface, "set_mm_design") == 0 )
-      return (FT_Module_Interface)T1_Set_MM_Design;
+  static FT_Int
+  t1_ps_has_glyph_names( FT_Face  face )
+  {
+    FT_UNUSED( face );
+    return 1;
+  }
 
-    if ( ft_strcmp( (const char*)t1_interface, "set_mm_blend") == 0 )
-      return (FT_Module_Interface)T1_Set_MM_Blend;
+
+  static const FT_Service_PsInfoRec  t1_service_ps_info =
+  {
+    (PS_GetFontInfoFunc)  t1_ps_get_font_info,
+    (PS_HasGlyphNamesFunc)t1_ps_has_glyph_names
+  };
+
+
+ /*
+  *  SERVICE LIST
+  *
+  */
+
+  static const FT_ServiceDescRec  t1_services[] =
+  {
+    { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name },
+    { FT_SERVICE_ID_GLYPH_DICT,           &t1_service_glyph_dict },
+    { FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_TYPE_1 },
+    { FT_SERVICE_ID_POSTSCRIPT_INFO,      &t1_service_ps_info },
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+    { FT_SERVICE_ID_MULTI_MASTERS,        &t1_service_multi_masters },
 #endif
-    return 0;
+    { NULL, NULL }
+  };
+
+
+  static FT_Module_Interface
+  Get_Interface( FT_Driver         driver,
+                 const FT_String*  t1_interface )
+  {
+    FT_UNUSED( driver );
+    FT_UNUSED( t1_interface );
+
+    return ft_service_list_lookup( t1_services, t1_interface );
   }
 
 
@@ -227,15 +252,13 @@
 #endif /* T1_CONFIG_OPTION_NO_AFM */
 
 
-
-
   FT_CALLBACK_TABLE_DEF
   const FT_Driver_ClassRec  t1_driver_class =
   {
     {
-      ft_module_font_driver      |
-      ft_module_driver_scalable  |
-      ft_module_driver_has_hinter,
+      FT_MODULE_FONT_DRIVER       |
+      FT_MODULE_DRIVER_SCALABLE   |
+      FT_MODULE_DRIVER_HAS_HINTER,
 
       sizeof( FT_DriverRec ),
 

Index: t1gload.c
===================================================================
RCS file: /cvs/xorg/xc/extras/freetype2/src/type1/t1gload.c,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -d -r1.1.4.1 -r1.1.4.2
--- a/t1gload.c	26 Nov 2003 22:48:28 -0000	1.1.4.1
+++ b/t1gload.c	23 Feb 2004 21:33:15 -0000	1.1.4.2
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 Glyph Loader (body).                                          */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002 by                                           */
+/*  Copyright 1996-2001, 2002, 2003 by                                     */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -14,7 +14,7 @@
 /*  understand and accept it fully.                                        */
 /*                                                                         */
 /***************************************************************************/
-/* $XFree86: xc/extras/freetype2/src/type1/t1gload.c,v 1.2 2003/10/22 17:26:31 tsi Exp $ */
+
 
 #include <ft2build.h>
 #include "t1gload.h"
@@ -98,8 +98,8 @@
       FT_Incremental_MetricsRec  metrics;
 
       metrics.bearing_x = decoder->builder.left_bearing.x;
-	  metrics.bearing_y = decoder->builder.left_bearing.y;
-	  metrics.advance   = decoder->builder.advance.x;
+      metrics.bearing_y = decoder->builder.left_bearing.y;
+      metrics.advance   = decoder->builder.advance.x;
       error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
                 face->root.internal->incremental_interface->object,
                 glyph_index, FALSE, &metrics );
@@ -120,7 +120,7 @@
                   FT_UInt     glyph_index )
   {
     FT_Data   glyph_data;
-    FT_Error  error = T1_Parse_Glyph_And_Get_Char_String(
+    FT_Error  error = T1_Parse_Glyph_And_Get_Char_String( 
                         decoder, glyph_index, &glyph_data );
 
 
@@ -130,7 +130,7 @@
       T1_Face  face = (T1_Face)decoder->builder.face;
 
 
-	  if ( face->root.internal->incremental_interface )
+      if ( face->root.internal->incremental_interface )
         face->root.internal->incremental_interface->funcs->free_glyph_data(
           face->root.internal->incremental_interface->object,
           &glyph_data );
@@ -143,7 +143,7 @@
 
   FT_LOCAL_DEF( FT_Error )
   T1_Compute_Max_Advance( T1_Face  face,
-                          FT_Int*  max_advance )
+                          FT_Pos*  max_advance )
   {
     FT_Error       error;
     T1_DecoderRec  decoder;
@@ -184,8 +184,8 @@
       error = T1_Parse_Glyph( &decoder, glyph_index );
       if ( glyph_index == 0 || decoder.builder.advance.x > *max_advance )
         *max_advance = decoder.builder.advance.x;
-
-      /* ignore the error if one occured - skip to next glyph */
+        
+      /* ignore the error if one occurred - skip to next glyph */
     }
 
     return T1_Err_Ok;
@@ -304,6 +304,7 @@
       {
         FT_BBox            cbox;
         FT_Glyph_Metrics*  metrics = &glyph->root.metrics;
+        FT_Vector          advance;
 
 
         /* copy the _unscaled_ advance width */
@@ -330,6 +331,15 @@
         FT_Outline_Translate( &glyph->root.outline,
                               font_offset.x,
                               font_offset.y );
+
+        advance.x = metrics->horiAdvance;
+        advance.y = 0;
+        FT_Vector_Transform( &advance, &font_matrix );
+        metrics->horiAdvance = advance.x + font_offset.x;
+        advance.x = 0;
+        advance.y = metrics->vertAdvance;
+        FT_Vector_Transform( &advance, &font_matrix );
+        metrics->vertAdvance = advance.y + font_offset.y;
 #endif
 
         if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )

Index: t1gload.h
===================================================================
RCS file: /cvs/xorg/xc/extras/freetype2/src/type1/t1gload.h,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -d -r1.1.4.1 -r1.1.4.2
--- a/t1gload.h	26 Nov 2003 22:48:28 -0000	1.1.4.1
+++ b/t1gload.h	23 Feb 2004 21:33:15 -0000	1.1.4.2
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 Glyph Loader (specification).                                 */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002 by                                           */
+/*  Copyright 1996-2001, 2002, 2003 by                                     */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -29,7 +29,7 @@
 
   FT_LOCAL( FT_Error )
   T1_Compute_Max_Advance( T1_Face  face,
-                          FT_Int*  max_advance );
+                          FT_Pos*  max_advance );
 
   FT_LOCAL( FT_Error )
   T1_Load_Glyph( T1_GlyphSlot  glyph,

Index: t1load.c
===================================================================
RCS file: /cvs/xorg/xc/extras/freetype2/src/type1/t1load.c,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -d -r1.1.4.1 -r1.1.4.2
--- a/t1load.c	26 Nov 2003 22:48:28 -0000	1.1.4.1
+++ b/t1load.c	23 Feb 2004 21:33:15 -0000	1.1.4.2
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 font loader (body).                                           */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002 by                                           */
+/*  Copyright 1996-2001, 2002, 2003 by                                     */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -41,11 +41,10 @@
   /*                                                                       */
   /* All other common cases are handled very simply.  The matching rules   */
[...1227 lines suppressed...]
               }
               break;
             }
           }
       }
+
+      /*
+       *  Yes, this happens: Certain PDF-embedded fonts have only a
+       *  `.notdef' glyph defined!
+       */
+
+      if ( min_char > max_char )
+      {
+        min_char = 0;
+        max_char = loader.encoding_table.max_elems;
+      }
+
       type1->encoding.code_first = min_char;
       type1->encoding.code_last  = max_char;
       type1->encoding.num_chars  = loader.num_chars;

Index: t1objs.c
===================================================================
RCS file: /cvs/xorg/xc/extras/freetype2/src/type1/t1objs.c,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -d -r1.1.4.1 -r1.1.4.2
--- a/t1objs.c	26 Nov 2003 22:48:28 -0000	1.1.4.1
+++ b/t1objs.c	23 Feb 2004 21:33:15 -0000	1.1.4.2
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 objects manager (body).                                       */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002 by                                           */
+/*  Copyright 1996-2001, 2002, 2003 by                                     */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -14,7 +14,7 @@
 /*  understand and accept it fully.                                        */
 /*                                                                         */
 /***************************************************************************/
-/* $XFree86: xc/extras/freetype2/src/type1/t1objs.c,v 1.3 2003/05/29 02:13:06 dawes Exp $ */
+
 
 #include <ft2build.h>
 #include FT_INTERNAL_DEBUG_H
@@ -29,7 +29,7 @@
 #include "t1afm.h"
 #endif
 
-#include FT_INTERNAL_POSTSCRIPT_NAMES_H
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
 #include FT_INTERNAL_POSTSCRIPT_AUX_H
 
 
@@ -118,9 +118,9 @@
 
     if ( funcs )
       error = funcs->set_scale( (PSH_Globals)size->root.internal,
-                                 size->root.metrics.x_scale,
-                                 size->root.metrics.y_scale,
-                                 0, 0 );
+                                size->root.metrics.x_scale,
+                                size->root.metrics.y_scale,
+                                0, 0 );
     return error;
   }
 
@@ -275,9 +275,11 @@
                 FT_Int         num_params,
                 FT_Parameter*  params )
   {
-    FT_Error          error;
-    PSNames_Service   psnames;
-    PSAux_Service     psaux;
+    FT_Error            error;
+    FT_Service_PsCMaps  psnames;
+    PSAux_Service       psaux;
+    T1_Font             type1 = &face->type1;
+    PS_FontInfo         info = &type1->font_info;
 
     FT_UNUSED( num_params );
     FT_UNUSED( params );
@@ -287,9 +289,8 @@
 
     face->root.num_faces = 1;
 
-    face->psnames = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
-                                             "psnames" );
-    psnames = (PSNames_Service)face->psnames;
+    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+    face->psnames = psnames;
 
     face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
                                            "psaux" );
@@ -298,7 +299,7 @@
     face->pshinter = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
                                               "pshinter" );
 
-    /* open the tokenizer, this will also check the font format */
+    /* open the tokenizer; this will also check the font format */
     error = T1_Open_Face( face );
     if ( error )
       goto Exit;
@@ -315,22 +316,23 @@
       goto Exit;
     }
 
-    /* Now, load the font program into the face object */
+    /* now load the font program into the face object */
 
-    /* Init the face object fields */
-    /* Now set up root face fields */
+    /* initialize the face object fields */
+
+    /* set up root face fields */
     {
       FT_Face  root = (FT_Face)&face->root;
 
 
-      root->num_glyphs = face->type1.num_glyphs;
+      root->num_glyphs = type1->num_glyphs;
       root->face_index = face_index;
 
-      root->face_flags = FT_FACE_FLAG_SCALABLE;
+      root->face_flags  = FT_FACE_FLAG_SCALABLE;
       root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
       root->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;
 
-      if ( face->type1.font_info.is_fixed_pitch )
+      if ( info->is_fixed_pitch )
         root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
 
       if ( face->blend )
@@ -340,45 +342,55 @@
 
       /* get style name -- be careful, some broken fonts only */
       /* have a `/FontName' dictionary entry!                 */
-      root->family_name = face->type1.font_info.family_name;
+      root->family_name = info->family_name;
+      /* assume "Regular" style if we don't know better */
+      root->style_name = (char *)"Regular";
       if ( root->family_name )
       {
-        char*  full   = face->type1.font_info.full_name;
+        char*  full   = info->full_name;
         char*  family = root->family_name;
 
 
         if ( full )
         {
-          while ( *family && *full == *family )
+          while ( *full )
           {
-            family++;
-            full++;
+            if ( *full == *family )
+            {
+              family++;
+              full++;
+            }
+            else
+            {
+              if ( *full == ' ' || *full == '-' )
+                full++;
+              else if ( *family == ' ' || *family == '-' )
+                family++;
+              else
+              {
+                if ( !*family )
+                  root->style_name = full;
+                break;
+              }
+            }
           }
-
-          root->style_name = ( *full == ' ' ? full + 1
-                                            : (char *)"Regular" );
         }
-        else
-          root->style_name = (char *)"Regular";
       }
       else
       {
         /* do we have a `/FontName'? */
-        if ( face->type1.font_name )
-        {
-          root->family_name = face->type1.font_name;
-          root->style_name  = (char *)"Regular";
-        }
+        if ( type1->font_name )
+          root->family_name = type1->font_name;
       }
 
       /* compute style flags */
       root->style_flags = 0;
-      if ( face->type1.font_info.italic_angle )
+      if ( info->italic_angle )
         root->style_flags |= FT_STYLE_FLAG_ITALIC;
-      if ( face->type1.font_info.weight )
+      if ( info->weight )
       {
-        if ( !ft_strcmp( face->type1.font_info.weight, "Bold"  ) ||
-             !ft_strcmp( face->type1.font_info.weight, "Black" ) )
+        if ( !ft_strcmp( info->weight, "Bold"  ) ||
+             !ft_strcmp( info->weight, "Black" ) )
           root->style_flags |= FT_STYLE_FLAG_BOLD;
       }
 
@@ -386,10 +398,10 @@
       root->num_fixed_sizes = 0;
       root->available_sizes = 0;
 
-      root->bbox.xMin =   face->type1.font_bbox.xMin             >> 16;
-      root->bbox.yMin =   face->type1.font_bbox.yMin             >> 16;
-      root->bbox.xMax = ( face->type1.font_bbox.xMax + 0xFFFFU ) >> 16;
-      root->bbox.yMax = ( face->type1.font_bbox.yMax + 0xFFFFU ) >> 16;
+      root->bbox.xMin =   type1->font_bbox.xMin             >> 16;
+      root->bbox.yMin =   type1->font_bbox.yMin             >> 16;
+      root->bbox.xMax = ( type1->font_bbox.xMax + 0xFFFFU ) >> 16;
+      root->bbox.yMax = ( type1->font_bbox.yMax + 0xFFFFU ) >> 16;
 
       /* Set units_per_EM if we didn't set it in parse_font_matrix. */
       if ( !root->units_per_EM )
@@ -398,13 +410,13 @@
       root->ascender  = (FT_Short)( root->bbox.yMax );
       root->descender = (FT_Short)( root->bbox.yMin );
       root->height    = (FT_Short)(
-                          ( ( root->ascender - root->descender ) * 12 ) / 10 );
+        ( ( root->ascender - root->descender ) * 12 ) / 10 );
 
       /* now compute the maximum advance width */
       root->max_advance_width =
         (FT_Short)( root->bbox.xMax );
       {
-        FT_Int  max_advance;
+        FT_Pos  max_advance;
 
 
         error = T1_Compute_Max_Advance( face, &max_advance );
@@ -418,8 +430,10 @@
 
       root->max_advance_height = root->height;
 
-      root->underline_position  = face->type1.font_info.underline_position;
-      root->underline_thickness = face->type1.font_info.underline_thickness;
+      root->underline_position =
+        (FT_Short)( info->underline_position >> 16 );
+      root->underline_thickness =
+        (FT_Short)( info->underline_thickness >> 16 );
 
       root->internal->max_points   = 0;
       root->internal->max_contours = 0;
@@ -449,7 +463,7 @@
         charmap.platform_id = 7;
         clazz               = NULL;
 
-        switch ( face->type1.encoding_type )
+        switch ( type1->encoding_type )
         {
         case T1_ENCODING_TYPE_STANDARD:
           charmap.encoding    = FT_ENCODING_ADOBE_STANDARD;

Index: t1parse.c
===================================================================
RCS file: /cvs/xorg/xc/extras/freetype2/src/type1/t1parse.c,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -d -r1.1.4.1 -r1.1.4.2
--- a/t1parse.c	26 Nov 2003 22:48:28 -0000	1.1.4.1
+++ b/t1parse.c	23 Feb 2004 21:33:15 -0000	1.1.4.2
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 parser (body).                                                */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002 by                                           */
+/*  Copyright 1996-2001, 2002, 2003 by                                     */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -65,53 +65,30 @@
   /*************************************************************************/
 
 
-#define IS_T1_WHITESPACE( c )  ( (c) == ' '  || (c) == '\t' )
-#define IS_T1_LINESPACE( c )   ( (c) == '\r' || (c) == '\n' )
-
-#define IS_T1_SPACE( c )  ( IS_T1_WHITESPACE( c ) || IS_T1_LINESPACE( c ) )
-
-
-  typedef struct  PFB_Tag_
+  static FT_Error
+  read_pfb_tag( FT_Stream   stream,
+                FT_UShort  *atag,
+                FT_Long    *asize )
   {
+    FT_Error   error;
     FT_UShort  tag;
     FT_Long    size;
 
-  } PFB_Tag;
-
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  PFB_Tag
-
-
-  static
-  const FT_Frame_Field  pfb_tag_fields[] =
-  {
-    FT_FRAME_START( 6 ),
-      FT_FRAME_USHORT ( tag ),
-      FT_FRAME_LONG_LE( size ),
-    FT_FRAME_END
-  };
-
-
-  static FT_Error
-  read_pfb_tag( FT_Stream   stream,
-                FT_UShort*  tag,
-                FT_Long*    size )
-  {
-    FT_Error  error;
-    PFB_Tag   head;
 
+    *atag  = 0;
+    *asize = 0;
 
-    *tag  = 0;
-    *size = 0;
-    if ( !FT_STREAM_READ_FIELDS( pfb_tag_fields, &head ) )
+    if ( !FT_READ_USHORT( tag ) )
     {
-      if ( head.tag == 0x8001U || head.tag == 0x8002U )
+      if ( tag == 0x8001U || tag == 0x8002U )
       {
-        *tag  = head.tag;
-        *size = head.size;
+        if ( !FT_READ_LONG_LE( size ) )
+          *asize = size;
       }
+
+      *atag = tag;
     }
+
     return error;
   }
 
@@ -127,7 +104,7 @@
     FT_Long    size;
 
 
-    psaux->ps_parser_funcs->init( &parser->root,0, 0, memory );
+    psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );
 
     parser->stream       = stream;
     parser->base_len     = 0;
@@ -242,36 +219,13 @@
   }
 
 
-  /* return the value of an hexadecimal digit */
-  static int
-  hexa_value( char  c )
-  {
-    unsigned int  d;
-
-
-    d = (unsigned int)( c - '0' );
-    if ( d <= 9 )
-      return (int)d;
-
-    d = (unsigned int)( c - 'a' );
-    if ( d <= 5 )
-      return (int)( d + 10 );
-
-    d = (unsigned int)( c - 'A' );
-    if ( d <= 5 )
-      return (int)( d + 10 );
-
-    return -1;
-  }
-
-
   FT_LOCAL_DEF( FT_Error )
   T1_Get_Private_Dict( T1_Parser      parser,
                        PSAux_Service  psaux )
   {
     FT_Stream  stream = parser->stream;
     FT_Memory  memory = parser->root.memory;
-    FT_Error   error  = 0;
+    FT_Error   error  = T1_Err_Ok;
     FT_Long    size;
 
 
@@ -325,7 +279,8 @@
           break;
         }
 
-        if ( FT_STREAM_READ( parser->private_dict + parser->private_len, size ) )
+        if ( FT_STREAM_READ( parser->private_dict + parser->private_len,
+                             size ) )
           goto Fail;
 
         parser->private_len += size;
@@ -333,9 +288,9 @@
     }
     else
     {
-      /* we have already `loaded' the whole PFA font file into memory; */
+      /* We have already `loaded' the whole PFA font file into memory; */
       /* if this is a memory resource, allocate a new block to hold    */
-      /* the private dict. Otherwise, simply overwrite into the base   */
+      /* the private dict.  Otherwise, simply overwrite into the base  */
       /* dictionary block in the heap.                                 */
 
       /* first of all, look at the `eexec' keyword */
@@ -344,24 +299,18 @@
       FT_Byte   c;
 
 
+    Again:
       for (;;)
       {
         c = cur[0];
         if ( c == 'e' && cur + 9 < limit )  /* 9 = 5 letters for `eexec' + */
                                             /* newline + 4 chars           */
         {
-          if ( cur[1] == 'e' && cur[2] == 'x' &&
-               cur[3] == 'e' && cur[4] == 'c' )
-          {
-            cur += 6; /* we skip the newling after the `eexec' */
-
-            /* XXX: Some fonts use DOS-linefeeds, i.e. \r\n; we need to */
-            /*      skip the extra \n if we find it                     */
-            if ( cur[0] == '\n' )
-              cur++;
-
+          if ( cur[1] == 'e' &&
+               cur[2] == 'x' &&
+               cur[3] == 'e' &&
+               cur[4] == 'c' )
             break;
-          }
         }
         cur++;
         if ( cur >= limit )
@@ -373,10 +322,43 @@
         }
       }
 
+      /* check whether `eexec' was real -- it could be in a comment */
+      /* or string (as e.g. in u003043t.gsf from ghostscript)       */
+
+      parser->root.cursor = parser->base_dict;
+      parser->root.limit  = cur + 9;
+
+      cur   = parser->root.cursor;
+      limit = parser->root.limit;
+
+      while ( cur < limit )
+      {
+        if ( *cur == 'e' && ft_strncmp( (char*)cur, "eexec", 5 ) == 0 )
+          goto Found;
+
+        T1_Skip_PS_Token( parser );
+        T1_Skip_Spaces  ( parser );
+        cur = parser->root.cursor;
+      }
+
+      /* we haven't found the correct `eexec'; go back and continue */
+      /* searching                                                  */
+
+      cur   = limit;
+      limit = parser->base_dict + parser->base_len;
+      goto Again;
+
       /* now determine where to write the _encrypted_ binary private  */
       /* dictionary.  We overwrite the base dictionary for disk-based */
       /* resources and allocate a new block otherwise                 */
 
+    Found:
+      parser->root.limit = parser->base_dict + parser->base_len;
+
+      T1_Skip_PS_Token( parser );
+      T1_Skip_Spaces  ( parser );
+      cur = parser->root.cursor;
+
       size = (FT_Long)( parser->base_len - ( cur - parser->base_dict ) );
 
       if ( parser->in_memory )
@@ -402,51 +384,38 @@
       /* the `eexec' keyword); if they all are hexadecimal digits, then   */
       /* we have a case of ASCII storage                                  */
 
-      if ( ( hexa_value( cur[0] ) | hexa_value( cur[1] ) |
-             hexa_value( cur[2] ) | hexa_value( cur[3] ) ) < 0 )
-
-        /* binary encoding -- `simply' copy the private dict */
-        FT_MEM_COPY( parser->private_dict, cur, size );
-
-      else
+      if ( ft_isxdigit( cur[0] ) && ft_isxdigit( cur[1] ) &&
+           ft_isxdigit( cur[2] ) && ft_isxdigit( cur[3] ) )
       {
         /* ASCII hexadecimal encoding */
+        FT_Long  len;
 
-        FT_Byte*  write;
-        FT_Int    count;
-
-
-        write = parser->private_dict;
-        count = 0;
-
-        for ( ;cur < limit; cur++ )
-        {
-          int  hex1;
-
-
-          /* check for newline */
-          if ( cur[0] == '\r' || cur[0] == '\n' )
-            continue;
-
-          /* exit if we have a non-hexadecimal digit that isn't a newline */
-          hex1 = hexa_value( cur[0] );
-          if ( hex1 < 0 || cur + 1 >= limit )
-            break;
 
-          /* otherwise, store byte */
-          *write++ = (FT_Byte)( ( hex1 << 4 ) | hexa_value( cur[1] ) );
-          count++;
-          cur++;
-        }
+        parser->root.cursor = cur;
+        (void)psaux->ps_parser_funcs->to_bytes( &parser->root,
+                                                parser->private_dict,
+                                                parser->private_len,
+                                                &len,
+                                                0 );
+        parser->private_len = len;
 
         /* put a safeguard */
-        parser->private_len = write - parser->private_dict;
-        *write++ = 0;
+        parser->private_dict[len] = '\0';
       }
+      else
+        /* binary encoding -- copy the private dict */
+        FT_MEM_COPY( parser->private_dict, cur, size );
     }
 
     /* we now decrypt the encoded binary private dictionary */
     psaux->t1_decrypt( parser->private_dict, parser->private_len, 55665U );
+
+    /* replace the four random bytes at the beginning with whitespace */
+    parser->private_dict[0] = ' ';
+    parser->private_dict[1] = ' ';
+    parser->private_dict[2] = ' ';
+    parser->private_dict[3] = ' ';
+
     parser->root.base   = parser->private_dict;
     parser->root.cursor = parser->private_dict;
     parser->root.limit  = parser->root.cursor + parser->private_len;

Index: t1parse.h
===================================================================
RCS file: /cvs/xorg/xc/extras/freetype2/src/type1/t1parse.h,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -d -r1.1.4.1 -r1.1.4.2
--- a/t1parse.h	26 Nov 2003 22:48:28 -0000	1.1.4.1
+++ b/t1parse.h	23 Feb 2004 21:33:15 -0000	1.1.4.2
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 parser (specification).                                       */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002 by                                           */
+/*  Copyright 1996-2001, 2002, 2003 by                                     */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -69,9 +69,9 @@
     FT_Byte*      private_dict;
     FT_Long       private_len;
 
-    FT_Byte       in_pfb;
-    FT_Byte       in_memory;
-    FT_Byte       single_block;
+    FT_Bool       in_pfb;
+    FT_Bool       in_memory;
+    FT_Bool       single_block;
 
   } T1_ParserRec, *T1_Parser;
 
@@ -91,8 +91,8 @@
           } while ( 0 )
 
 
-#define T1_Skip_Spaces( p )  (p)->root.funcs.skip_spaces( &(p)->root )
-#define T1_Skip_Alpha( p )   (p)->root.funcs.skip_alpha ( &(p)->root )
+#define T1_Skip_Spaces( p )    (p)->root.funcs.skip_spaces( &(p)->root )
+#define T1_Skip_PS_Token( p )  (p)->root.funcs.skip_PS_token( &(p)->root )
 
 #define T1_ToInt( p )       (p)->root.funcs.to_int( &(p)->root )
 #define T1_ToFixed( p, t )  (p)->root.funcs.to_fixed( &(p)->root, t )

Index: t1tokens.h
===================================================================
RCS file: /cvs/xorg/xc/extras/freetype2/src/type1/t1tokens.h,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -d -r1.1.4.1 -r1.1.4.2
--- a/t1tokens.h	26 Nov 2003 22:48:28 -0000	1.1.4.1
+++ b/t1tokens.h	23 Feb 2004 21:33:15 -0000	1.1.4.2
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 tokenizer (specification).                                    */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002 by                                           */
+/*  Copyright 1996-2001, 2002, 2003 by                                     */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -21,16 +21,17 @@
 #undef  T1CODE
 #define T1CODE        T1_FIELD_LOCATION_FONT_INFO
 
-  T1_FIELD_STRING   ( "version", version )
-  T1_FIELD_STRING   ( "Notice", notice )
-  T1_FIELD_STRING   ( "FullName", full_name )
-  T1_FIELD_STRING   ( "FamilyName", family_name )
-  T1_FIELD_STRING   ( "Weight", weight )
+  T1_FIELD_STRING( "version", version )
+  T1_FIELD_STRING( "Notice", notice )
+  T1_FIELD_STRING( "FullName", full_name )
+  T1_FIELD_STRING( "FamilyName", family_name )
+  T1_FIELD_STRING( "Weight", weight )
 
-  T1_FIELD_NUM      ( "ItalicAngle", italic_angle )
-  T1_FIELD_TYPE_BOOL( "isFixedPitch", is_fixed_pitch )
-  T1_FIELD_NUM      ( "UnderlinePosition", underline_position )
-  T1_FIELD_NUM      ( "UnderlineThickness", underline_thickness )
+  /* we use pointers to detect modifications made by synthetic fonts */
+  T1_FIELD_NUM   ( "ItalicAngle", italic_angle )
+  T1_FIELD_BOOL  ( "isFixedPitch", is_fixed_pitch )
+  T1_FIELD_NUM   ( "UnderlinePosition", underline_position )
+  T1_FIELD_NUM   ( "UnderlineThickness", underline_thickness )
 
 
 #undef  FT_STRUCTURE
@@ -43,7 +44,7 @@
   T1_FIELD_NUM       ( "LanguageGroup", language_group )
   T1_FIELD_NUM       ( "password", password )
 
-  T1_FIELD_FIXED     ( "BlueScale", blue_scale )
+  T1_FIELD_FIXED_1000( "BlueScale", blue_scale )
   T1_FIELD_NUM       ( "BlueShift", blue_shift )
   T1_FIELD_NUM       ( "BlueFuzz",  blue_fuzz )
 
@@ -65,9 +66,10 @@
 #undef  T1CODE
 #define T1CODE        T1_FIELD_LOCATION_FONT_DICT
 
-  T1_FIELD_NUM( "PaintType", paint_type )
-  T1_FIELD_NUM( "FontType", font_type )
-  T1_FIELD_NUM( "StrokeWidth", stroke_width )
+  T1_FIELD_KEY  ( "FontName", font_name )
+  T1_FIELD_NUM  ( "PaintType", paint_type )
+  T1_FIELD_NUM  ( "FontType", font_type )
+  T1_FIELD_FIXED( "StrokeWidth", stroke_width )
 
 #undef  FT_STRUCTURE
 #define FT_STRUCTURE  FT_BBox





More information about the xorg-commit mailing list