shithub: freetype+ttf2subf

Download patch

ref: 76bbd5793fcd04f7dd8b6ccdf3e0ce8561cc80e4
parent: b3a85b00c4c734405c7d017eeca506012f39768e
author: David Turner <[email protected]>
date: Thu Jan 27 08:35:16 EST 2000

the T1_Face definition changed slightly to clearly separate the
Type 1 font content from the rest. This implied some changes to
the following files.

git/fs: mount .git/fs: mount/attach disallowed
--- a/src/type1/t1gload.c
+++ b/src/type1/t1gload.c
@@ -191,9 +191,9 @@
       
     glyph_name = t1_standard_strings[t1_standard_encoding[charcode]];
     
-    for ( n = 0; n < face->num_glyphs; n++ )
+    for ( n = 0; n < face->type1.num_glyphs; n++ )
     {
-      T1_String*  name = (T1_String*)face->glyph_names[n];
+      T1_String*  name = (T1_String*)face->type1.glyph_names[n];
       
       if ( name && strcmp(name,glyph_name) == 0 )
         return n;
@@ -238,6 +238,7 @@
     FT_Outline*  cur  = &decoder->builder.current;
     FT_Outline*  base = &decoder->builder.base;
     T1_Vector    left_bearing, advance;
+    T1_Font*     type1 = &face->type1;
     
     bchar_index = lookup_glyph_by_stdcharcode( face, bchar );
     achar_index = lookup_glyph_by_stdcharcode( face, achar );
@@ -257,11 +258,11 @@
     cur->contours   = base->contours + base->n_contours;
 
     error = T1_Parse_CharStrings( decoder,
-                                  face->charstrings    [bchar_index],
-                                  face->charstrings_len[bchar_index],
-                                  face->num_subrs,
-                                  face->subrs,
-                                  face->subrs_len );
+                                  type1->charstrings    [bchar_index],
+                                  type1->charstrings_len[bchar_index],
+                                  type1->num_subrs,
+                                  type1->subrs,
+                                  type1->subrs_len );
     if (error) return error;
 
     n_base_points   = cur->n_points;
@@ -284,11 +285,11 @@
     cur->contours   = base->contours + base->n_contours;
 
     error = T1_Parse_CharStrings( decoder,
-                                  face->charstrings    [achar_index],
-                                  face->charstrings_len[achar_index],
-                                  face->num_subrs,
-                                  face->subrs,
-                                  face->subrs_len );
+                                  type1->charstrings    [achar_index],
+                                  type1->charstrings_len[achar_index],
+                                  type1->num_subrs,
+                                  type1->subrs,
+                                  type1->subrs_len );
     if (error) return error;
 
     /* adjust contours in accented character outline */
@@ -1063,6 +1064,7 @@
     T1_Error    error;
     T1_Decoder  decoder;
     T1_Int      glyph_index;
+    T1_Font*    type1 = &face->type1;
 
     *max_advance = 0;
 
@@ -1074,15 +1076,15 @@
 
     /* For each glyph, parse the glyph charstring and extract */
     /* the advance width..                                    */
-    for ( glyph_index = 0; glyph_index < face->num_glyphs; glyph_index++ )
+    for ( glyph_index = 0; glyph_index < type1->num_glyphs; glyph_index++ )
     {
       /* now get load the unscaled outline */
       error = T1_Parse_CharStrings( &decoder,
-                                    face->charstrings    [glyph_index],
-                                    face->charstrings_len[glyph_index],
-                                    face->num_subrs,
-                                    face->subrs,
-                                    face->subrs_len );
+                                    type1->charstrings    [glyph_index],
+                                    type1->charstrings_len[glyph_index],
+                                    type1->num_subrs,
+                                    type1->subrs,
+                                    type1->subrs_len );
       /* ignore the error if one occured - skip to next glyph */
       (void)error;
     }
@@ -1274,9 +1276,9 @@
     /* type is set to 1, this means that we have an "open path",   */
     /* also called a 'stroke'. The FreeType raster doesn't support */
     /* opened path, so we'll close it explicitely there..          */
-    if ( builder->path_begun && builder->face->paint_type == 1 )
+    if ( builder->path_begun && builder->face->type1.paint_type == 1 )
     {
-      if ( builder->face->paint_type == 1 )
+      if ( builder->face->type1.paint_type == 1 )
       {
         error = close_open_path( builder );
         if (error) return error;
@@ -1411,6 +1413,7 @@
     T1_Decoder      decoder;
     T1_Face         face = (T1_Face)glyph->root.face;
     T1_Bool         hinting;
+    T1_Font*        type1 = &face->type1;
 
     glyph->x_scale = size->root.metrics.x_scale;
     glyph->y_scale = size->root.metrics.y_scale;
@@ -1450,11 +1453,11 @@
       glyph->hints->vert_stems.num_stems = 0;
 
       error = T1_Parse_CharStrings( &decoder,
-                                    face->charstrings    [glyph_index],
-                                    face->charstrings_len[glyph_index],
-                                    face->num_subrs,
-                                    face->subrs,
-                                    face->subrs_len );
+                                    type1->charstrings    [glyph_index],
+                                    type1->charstrings_len[glyph_index],
+                                    type1->num_subrs,
+                                    type1->subrs,
+                                    type1->subrs_len );
 
       /* All right, pass 1 is finished, now grid-fit all stem hints */
       T1_Hint_Stems( &decoder.builder );
@@ -1467,11 +1470,11 @@
       decoder.builder.pass = 1;
 
       error = T1_Parse_CharStrings( &decoder,
-                                    face->charstrings    [glyph_index],
-                                    face->charstrings_len[glyph_index],
-                                    face->num_subrs,
-                                    face->subrs,
-                                    face->subrs_len );
+                                    type1->charstrings    [glyph_index],
+                                    type1->charstrings_len[glyph_index],
+                                    type1->num_subrs,
+                                    type1->subrs,
+                                    type1->subrs_len );
 
       /* save new glyph tables */
       T1_Done_Builder( &decoder.builder );
@@ -1486,11 +1489,11 @@
   
       /* now load the unscaled outline */
       error = T1_Parse_CharStrings( &decoder,
-                                    face->charstrings    [glyph_index],
-                                    face->charstrings_len[glyph_index],
-                                    face->num_subrs,
-                                    face->subrs,
-                                    face->subrs_len );
+                                    type1->charstrings    [glyph_index],
+                                    type1->charstrings_len[glyph_index],
+                                    type1->num_subrs,
+                                    type1->subrs,
+                                    type1->subrs_len );
   
       /* save new glyph tables */
       T1_Done_Builder( &decoder.builder );
--- a/src/type1/t1hinter.c
+++ b/src/type1/t1hinter.c
@@ -105,7 +105,7 @@
   T1_Error  t1_set_blue_zones( T1_Size  size )
   {
     T1_Face          face = (T1_Face)size->root.face;
-    T1_Private*      priv = &face->private_dict;
+    T1_Font*         priv = &face->type1;
     T1_Int           n;
     T1_Int           blues[24];
     T1_Int           num_bottom;
@@ -285,8 +285,8 @@
     T1_Pos         standard_width;
     T1_Fixed       scale;
 
-    T1_Face          face = (T1_Face)size->root.face;
-    T1_Private*      priv = &face->private_dict;
+    T1_Face         face = (T1_Face)size->root.face;
+    T1_Font*        priv = &face->type1;
     T1_Size_Hints*  hints = size->hints;
 
     /* start with horizontal snap zones */
@@ -1250,7 +1250,7 @@
   void  T1_Hint_Stems( T1_Builder*  builder )
   {
     T1_Glyph_Hints*  hints = builder->glyph->hints;
-    T1_Private*      priv  = &builder->face->private_dict;
+    T1_Font*         priv  = &builder->face->type1;
 
     T1_Size   size    = builder->size;
     T1_Fixed  scale_x = size->root.metrics.x_scale;
--- a/src/type1/t1load.c
+++ b/src/type1/t1load.c
@@ -39,13 +39,13 @@
     parser->state_index    = 0;
     parser->state_stack[0] = dict_none;
 
-	parser->encoding_type    = encoding_none;
+	parser->encoding_type    = t1_encoding_none;
     parser->encoding_names   = 0;
     parser->encoding_offsets = 0;
     parser->encoding_lengths = 0;
 
     parser->dump_tokens      = 0;
-    face->private_dict.lenIV = 4;  /* XXX : is it sure ?? */
+    face->type1.lenIV        = 4;  /* XXX : is it sure ?? */
   }
 
 
@@ -191,7 +191,7 @@
   {
 	T1_Token*     token  = parser->top+1;
 	FT_Memory     memory = parser->face->root.memory;
-	T1_Encoding*  encode = &parser->face->encoding;
+	T1_Encoding*  encode = &parser->face->type1.encoding;
 	T1_Error      error  = 0;
 
 	if (token->kind  == tok_keyword &&
@@ -210,8 +210,8 @@
 	  /* Now copy the encoding */
 	  switch (token->kind2)
 	  {
-		  case key_ExpertEncoding : parser->encoding_type = encoding_expert;
-		  default                 : parser->encoding_type = encoding_standard; break;
+		  case key_ExpertEncoding : parser->encoding_type = t1_encoding_expert;
+		  default                 : parser->encoding_type = t1_encoding_standard; break;
 	  }
     }
 	else
@@ -260,6 +260,7 @@
   {
     T1_Token*  top   = parser->top;
     T1_Face    face  = parser->face;
+    T1_Font*   type1 = &face->type1;
 
     switch ( top[0].kind2 )
     {
@@ -273,19 +274,19 @@
           T1_Error   error;
           T1_Int     len = top[1].len;
 
-          if ( ALLOC( face->font_name, len+1 ) )
+          if ( ALLOC( type1->font_name, len+1 ) )
           {
             parser->error = error;
             return error;
           }
 
-          MEM_Copy( face->font_name,
+          MEM_Copy( type1->font_name,
                     parser->tokenizer->base + top[1].start,
                     len );
-          face->font_name[len] = '\0';
+          type1->font_name[len] = '\0';
         }
         else
-          face->font_name = CopyString( parser );
+          type1->font_name = CopyString( parser );
         break;
 
       case imm_Encoding:
@@ -293,31 +294,31 @@
         break;
 
       case imm_PaintType:
-        face->paint_type = (T1_Byte)CopyInteger( parser );
+        type1->paint_type = (T1_Byte)CopyInteger( parser );
         break;
 
       case imm_FontType:
-        face->font_type = (T1_Byte)CopyInteger( parser );
+        type1->font_type = (T1_Byte)CopyInteger( parser );
         break;
 
       case imm_FontMatrix:
-        CopyMatrix( parser, &face->font_matrix );
+        CopyMatrix( parser, &type1->font_matrix );
         break;
 
       case imm_FontBBox:
-        CopyBBox( parser, &face->font_bbox );
+        CopyBBox( parser, &type1->font_bbox );
         break;
 
       case imm_UniqueID:
-        face->unique_id = CopyInteger( parser );
+        type1->unique_id = CopyInteger( parser );
         break;
 
       case imm_StrokeWidth:
-        face->stroke_width = CopyInteger( parser );
+        type1->stroke_width = CopyInteger( parser );
         break;
 
       case imm_FontID:
-        face->font_id = CopyInteger( parser );
+        type1->font_id = CopyInteger( parser );
         break;
 
       default:
@@ -347,8 +348,8 @@
   static
   T1_Error  Do_Def_FontInfo( T1_Parser*  parser )
   {
-    T1_Token*     top   = parser->top;
-    T1_FontInfo*  info  = &parser->face->font_info;
+    T1_Token*  top   = parser->top;
+    T1_Font*   info  = &parser->face->type1;
 
     switch ( top[0].kind2 )
     {
@@ -415,8 +416,8 @@
   static
   T1_Error  Do_Def_Private( T1_Parser*  parser )
   {
-    T1_Token*     top   = parser->top;
-    T1_Private*   priv  = &parser->face->private_dict;
+    T1_Token*   top   = parser->top;
+    T1_Font*    priv  = &parser->face->type1;
 
     switch ( top[0].kind2 )
     {
@@ -605,7 +606,7 @@
     T1_Error      error  = T1_Err_Ok;
     T1_Face       face   = parser->face;
     T1_Token*     top    = parser->top;
-    T1_Encoding*  encode = &face->encoding;
+    T1_Encoding*  encode = &face->type1.encoding;
     T1_Int        index;
 
     /* record and check the character code */
@@ -709,7 +710,7 @@
     count = (T1_Int)CopyInteger( parser );
     error = parser->error; if (error) goto Exit;
 
-    if ( index < 0 || index >= face->num_subrs )
+    if ( index < 0 || index >= face->type1.num_subrs )
     {
       FT_ERROR(( "T1.Parse.put: invalid character code\n" ));
       goto Syntax_Error;
@@ -722,8 +723,8 @@
       t1_decrypt( base, count, 4330 );
       tokzer->cursor += count;
 
-      base  += face->private_dict.lenIV;
-      count -= face->private_dict.lenIV;
+      base  += face->type1.lenIV;
+      count -= face->type1.lenIV;
 
       error = T1_Add_Table( &parser->table, index, base, count );
     }
@@ -806,8 +807,8 @@
       t1_decrypt( base, count, 4330 );
       tokzer->cursor += count;  /* skip */
 
-      base  += face->private_dict.lenIV;
-      count -= face->private_dict.lenIV;
+      base  += face->type1.lenIV;
+      count -= face->type1.lenIV;
 
       error = T1_Add_Table( &parser->table, index*2+1, base, count );
     }
@@ -925,7 +926,7 @@
     {
       case imm_Encoding:
         {
-          T1_Encoding*  encode = &face->encoding;
+          T1_Encoding*  encode = &face->type1.encoding;
 
           new_state = dict_encoding;
 
@@ -941,7 +942,7 @@
           error = T1_New_Table( &parser->table, count, memory );
           if (error) goto Exit;
 
-		  parser->encoding_type = encoding_array;
+		  parser->encoding_type = t1_encoding_array;
         }
         break;
 
@@ -948,8 +949,8 @@
 
       case imm_Subrs:
         {
-          new_state       = dict_subrs;
-          face->num_subrs = count;
+          new_state             = dict_subrs;
+          face->type1.num_subrs = count;
 
           error = T1_New_Table( &parser->table, count, memory );
           if (error) goto Exit;
@@ -981,6 +982,7 @@
   T1_Error  Finalise_Parsing( T1_Parser*  parser )
   {
     T1_Face    face       = parser->face;
+    T1_Font*   type1      = &face->type1;
     FT_Memory  memory     = face->root.memory;
     T1_Table*  strings    = &parser->table;
 	T1_Int     num_glyphs;
@@ -987,21 +989,21 @@
 	T1_Int     n;
 	T1_Error   error;
 
-    num_glyphs = face->num_glyphs = parser->cur_name;
+    num_glyphs = type1->num_glyphs = parser->cur_name;
 
 	/* allocate glyph names and charstrings arrays */
-	if ( ALLOC_ARRAY( face->glyph_names    , num_glyphs, T1_String* ) ||
-		 ALLOC_ARRAY( face->charstrings    , num_glyphs, T1_Byte* )   ||
-	     ALLOC_ARRAY( face->charstrings_len, num_glyphs, T1_Int*  )   )
+	if ( ALLOC_ARRAY( type1->glyph_names    , num_glyphs, T1_String* ) ||
+		 ALLOC_ARRAY( type1->charstrings    , num_glyphs, T1_Byte* )   ||
+	     ALLOC_ARRAY( type1->charstrings_len, num_glyphs, T1_Int*  )   )
 	  return error;
 
 	/* copy glyph names and charstrings offsets and lengths */
-    face->charstrings_block = strings->block;
+    type1->charstrings_block = strings->block;
 	for ( n = 0; n < num_glyphs; n++ )
 	{
-	  face->glyph_names[n]     = (T1_String*)strings->elements[2*n];
-	  face->charstrings[n]     = strings->elements[2*n+1];
-	  face->charstrings_len[n] = strings->lengths [2*n+1];
+      type1->glyph_names[n]     = (T1_String*)strings->elements[2*n];
+      type1->charstrings[n]     = strings->elements[2*n+1];
+      type1->charstrings_len[n] = strings->lengths [2*n+1];
     }
 
 	/* now free the old tables */
@@ -1009,7 +1011,7 @@
 	FREE( strings->lengths );
 
 	/* Compute encoding if required. */
-	if (parser->encoding_type == encoding_none)
+	if (parser->encoding_type == t1_encoding_none)
     {
 	  FT_ERROR(( "T1.Parse.Finalise : no encoding specified in font file\n" ));
 	  return T1_Err_Syntax_Error;
@@ -1017,7 +1019,7 @@
 
 	{
 	  T1_Int        n;
-	  T1_Encoding*  encode = &face->encoding;
+	  T1_Encoding*  encode = &type1->encoding;
 
 	  encode->code_first = encode->num_chars-1;
 	  encode->code_last  = 0;
@@ -1030,12 +1032,12 @@
 
 		switch (parser->encoding_type)
 		{
-		  case encoding_standard:
+		  case t1_encoding_standard:
 			  index = t1_standard_encoding[n];
 			  names = (T1_String**)t1_standard_strings;
 			  break;
 
-		  case encoding_expert:
+		  case t1_encoding_expert:
 			  index = t1_expert_encoding[n];
 			  names = (T1_String**)t1_standard_strings;
 			  break;
@@ -1056,7 +1058,7 @@
             /* lookup glyph index from name */
             for ( m = 0; m < num_glyphs; m++ )
    		    {
-		  	  if ( strncmp( face->glyph_names[m], name, len ) == 0 )
+		  	  if ( strncmp( type1->glyph_names[m], name, len ) == 0 )
 			  {
 			    encode->char_index[n] = m;
 			    break;
@@ -1069,7 +1071,7 @@
 	    }
 	  }
 
-	  parser->encoding_type = encoding_none;
+	  parser->encoding_type = t1_encoding_none;
 	  FREE( parser->encoding_names );
 	  FREE( parser->encoding_lengths );
 	  FREE( parser->encoding_offsets );
@@ -1086,6 +1088,7 @@
   T1_Error  Parse_T1_FontProgram( T1_Parser*  parser )
   {
     T1_Error  error;
+    T1_Font*  type1 = &parser->face->type1;
 
     for (;;)
     {
@@ -1151,7 +1154,7 @@
                                                    dict_charstrings, &count );
                     if (error) goto Exit;
 
-                    face->num_glyphs = count;
+                    type1->num_glyphs = count;
                     error = T1_New_Table( &parser->table, count*2, face->root.memory );
                     if (error) goto Exit;
 
@@ -1210,14 +1213,12 @@
 
                 case dict_subrs:
                   {
-                    T1_Face  face = parser->face;
-
                     /* copy recorder sub-routines */
                     T1_Done_Table( &parser->table );
 
-                    parser->subrs   = parser->table.block;
-                    face->subrs     = parser->table.elements;
-                    face->subrs_len = parser->table.lengths;
+                    parser->subrs    = parser->table.block;
+                    type1->subrs     = parser->table.elements;
+                    type1->subrs_len = parser->table.lengths;
 
                     parser->state_index--;
                   }
--- a/src/type1/t1objs.c
+++ b/src/type1/t1objs.c
@@ -217,9 +217,10 @@
       /* Init the face object fields */
       /* Now set up root face fields */
       {
-        FT_Face  root = (FT_Face)&face->root;
+        FT_Face  root  = (FT_Face)&face->root;
+        T1_Font* type1 = &face->type1;
         
-        root->num_glyphs   = face->num_glyphs;
+        root->num_glyphs   = type1->num_glyphs;
         root->num_charmaps = 1;
   
         root->face_index = face_index;
@@ -227,7 +228,7 @@
         
         root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
                               
-        if ( face->font_info.is_fixed_pitch )
+        if ( type1->is_fixed_pitch )
           root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
 
         /* XXX : TO DO - add kerning with .afm support */
@@ -234,10 +235,10 @@
 
         /* get style name - be careful, some broken fonts only */
         /* have a /FontName dictionary entry .. !!             */
-        root->family_name = face->font_info.family_name;
+        root->family_name = type1->family_name;
         if (root->family_name)
         {
-          char*  full   = face->font_info.full_name;
+          char*  full   = type1->full_name;
           char*  family = root->family_name;
           
           while ( *family && *full == *family )
@@ -251,9 +252,9 @@
         else
         {
           /* do we have a /FontName ?? */
-          if (face->font_name)
+          if (type1->font_name)
           {
-            root->family_name = face->font_name;
+            root->family_name = type1->font_name;
             root->style_name  = "Regular";
           }
         }
@@ -262,18 +263,18 @@
         root->num_fixed_sizes = 0;
         root->available_sizes = 0;
   
-        root->bbox         = face->font_bbox;
+        root->bbox         = type1->font_bbox;
         root->units_per_EM = 1000;
-        root->ascender     =  (T1_Short)face->font_bbox.yMax;
-        root->descender    = -(T1_Short)face->font_bbox.yMin;
+        root->ascender     =  (T1_Short)type1->font_bbox.yMax;
+        root->descender    = -(T1_Short)type1->font_bbox.yMin;
         root->height       = ((root->ascender + root->descender)*12)/10;
   
         /* now compute the maximum advance width */
 
-        root->max_advance_width = face->private_dict.standard_width;
+        root->max_advance_width = type1->standard_width;
 
         /* compute max advance width for proportional fonts */
-        if (!face->font_info.is_fixed_pitch)
+        if (!type1->is_fixed_pitch)
         {
           T1_Int  max_advance;
 
@@ -288,8 +289,8 @@
 
         root->max_advance_height = root->height;
         
-        root->underline_position  = face->font_info.underline_position;
-        root->underline_thickness = face->font_info.underline_thickness;
+        root->underline_position  = type1->underline_position;
+        root->underline_thickness = type1->underline_thickness;
   
         root->max_points   = 0;
         root->max_contours = 0;
--- a/src/type1/t1parse.h
+++ b/src/type1/t1parse.h
@@ -61,14 +61,6 @@
   } T1_DictState;
 
 
-  typedef enum T1_EncodingType_
-  {
-	encoding_none = 0,
-	encoding_array,
-	encoding_standard,
-	encoding_expert
-
-  } T1_EncodingType;
 /*************************************************************************
  *
  * <Struct> T1_Table