shithub: freetype+ttf2subf

Download patch

ref: ef512e3ec62d21049d2c1f6983887e6534ca5b14
parent: 6cda9c489d2cc4841932551363c87fbc647d5357
author: Werner Lemberg <[email protected]>
date: Fri Jan 23 14:52:40 EST 2004

Add support for the hexadicimal representation of binary data
started with `StartData' in CID-keyed Type 1 fonts.

* include/freetype/internal/t1types.h (CID_FaceRec): Add new
members `binary_data' and `cid_stream'.

* src/cid/cidload.c (cid_read_subrs): Use `face->cid_stream'.
(cid_hex_to_binary): New auxiliary function.
(cid_face_open): Add new argument `face_index' to return quickly
if less than zero.  Updated all callers.
Call `cid_hex_to_binary', then open and assign memory stream to
`face->cid_stream' if `parser->binary_length' is non-zero.
* src/cid/cidload.h: Updated.

* src/cid/cidobjs.c (cid_face_done): Free `binary_data' and
`cid_stream'.

* src/cid/cidparse.c (cid_parser_new): Check arguments to
`StartData' and set parser->binary_length accordingly.
* src/cid/cidparse.h (CID_Parser): New member `binary_length'.

* src/cid/cidgload.c (cid_load_glyph): Use `face->cid_stream'.

* docs/CHANGES: Updated.


include/freetype/config/ftstdlib.h (ft_atoi): Replaced with...
(ft_atol): This.
* src/base/ftdbgmem.c: s/atol/ft_atol/.
* src/type42/t42drivr.c: s/ft_atoi/ft_atol/.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,37 @@
+2004-01-22  Werner Lemberg  <[email protected]>
+
+	Add support for the hexadicimal representation of binary data
+	started with `StartData' in CID-keyed Type 1 fonts.
+
+	* include/freetype/internal/t1types.h (CID_FaceRec): Add new
+	members `binary_data' and `cid_stream'.
+
+	* src/cid/cidload.c (cid_read_subrs): Use `face->cid_stream'.
+	(cid_hex_to_binary): New auxiliary function.
+	(cid_face_open): Add new argument `face_index' to return quickly
+	if less than zero.  Updated all callers.
+	Call `cid_hex_to_binary', then open and assign memory stream to
+	`face->cid_stream' if `parser->binary_length' is non-zero.
+	* src/cid/cidload.h: Updated.
+
+	* src/cid/cidobjs.c (cid_face_done): Free `binary_data' and
+	`cid_stream'.
+
+	* src/cid/cidparse.c (cid_parser_new): Check arguments to
+	`StartData' and set parser->binary_length accordingly.
+	* src/cid/cidparse.h (CID_Parser): New member `binary_length'.
+
+	* src/cid/cidgload.c (cid_load_glyph): Use `face->cid_stream'.
+
+	* docs/CHANGES: Updated.
+
+2004-01-21  Werner Lemberg  <[email protected]>
+
+	include/freetype/config/ftstdlib.h (ft_atoi): Replaced with...
+	(ft_atol): This.
+	* src/base/ftdbgmem.c: s/atol/ft_atol/.
+	* src/type42/t42drivr.c: s/ft_atoi/ft_atol/.
+
 2004-01-20  Masatake YAMATO  <[email protected]>
 
 	* include/freetype/ftcache.h: Delete duplicated definition of
--- a/docs/CHANGES
+++ b/docs/CHANGES
@@ -38,6 +38,11 @@
       `tttables.h')  is  available  to   get  the  language  ID  of  a
       TrueType/SFNT cmap.
 
+    - The hexadecimal format of  data after the `StartData' command in
+      CID-keyed Type 1 fonts is now supported.  While this can't occur
+      in  file-based   fonts,  it  can   happen  in  document-embedded
+      resources of PostScript documents.
+
     - The cache sub-system has been rewritten.
 
       - There is now support for deinstallation of faces.
--- a/include/freetype/config/ftstdlib.h
+++ b/include/freetype/config/ftstdlib.h
@@ -5,7 +5,7 @@
 /*    ANSI-specific library and header configuration file (specification   */
 /*    only).                                                               */
 /*                                                                         */
-/*  Copyright 2002, 2003 by                                                */
+/*  Copyright 2002, 2003, 2004 by                                          */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -110,7 +110,7 @@
 #define ft_qsort  qsort
 #define ft_exit   exit    /* only used to exit from unhandled exceptions */
 
-#define ft_atoi   atoi
+#define ft_atol   atol
 
 
   /**********************************************************************/
--- a/include/freetype/internal/t1types.h
+++ b/include/freetype/internal/t1types.h
@@ -5,7 +5,7 @@
 /*    Basic Type1/Type2 type definitions and interface (specification      */
 /*    only).                                                               */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002, 2003 by                                     */
+/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -173,6 +173,8 @@
     void*            psaux;
     CID_FaceInfoRec  cid;
     void*            afm_data;
+    FT_Byte*         binary_data; /* used if hex data has been converted */
+    FT_Stream        cid_stream;
     CID_Subrs        subrs;
 
     /* since FT 2.1 - interface to PostScript hinter */
--- a/src/base/ftdbgmem.c
+++ b/src/base/ftdbgmem.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Memory debugger (body).                                              */
 /*                                                                         */
-/*  Copyright 2001, 2002, 2003 by                                          */
+/*  Copyright 2001, 2002, 2003, 2004 by                                    */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -604,7 +604,7 @@
         p = getenv( "FT2_ALLOC_TOTAL_MAX" );
         if ( p != NULL )
         {
-          FT_Long   total_max = atol(p);
+          FT_Long   total_max = ft_atol(p);
           
           if ( total_max > 0 )
           {
@@ -616,7 +616,7 @@
         p = getenv( "FT2_ALLOC_COUNT_MAX" );
         if ( p != NULL )
         {
-          FT_Long  total_count = atol(p);
+          FT_Long  total_count = ft_atol(p);
           
           if ( total_count > 0 )
           {
--- a/src/cid/cidgload.c
+++ b/src/cid/cidgload.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID-keyed Type1 Glyph Loader (body).                                 */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002, 2003 by                                     */
+/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -44,7 +44,7 @@
     CID_FaceInfo   cid  = &face->cid;
     FT_Byte*       p;
     FT_UInt        fd_select;
-    FT_Stream      stream = face->root.stream;
+    FT_Stream      stream = face->cid_stream;
     FT_Error       error  = 0;
     FT_Byte*       charstring = 0;
     FT_Memory      memory = face->root.memory;
--- a/src/cid/cidload.c
+++ b/src/cid/cidload.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID-keyed Type1 font loader (body).                                  */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002, 2003 by                                     */
+/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -363,7 +363,7 @@
   {
     CID_FaceInfo   cid    = &face->cid;
     FT_Memory      memory = face->root.memory;
-    FT_Stream      stream = face->root.stream;
+    FT_Stream      stream = face->cid_stream;
     FT_Error       error;
     FT_Int         n;
     CID_Subrs      subr;
@@ -399,7 +399,7 @@
 
       /* read the subrmap's offsets */
       if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) ||
-           FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes )   )
+           FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes )      )
         goto Fail;
 
       p = (FT_Byte*)stream->cursor;
@@ -487,11 +487,111 @@
   }
 
 
+  static FT_Error
+  cid_hex_to_binary( FT_Byte*  data,
+                     FT_Long   data_len,
+                     FT_ULong  offset,
+                     CID_Face  face )
+  {
+    FT_Stream  stream = face->root.stream;
+    FT_Error   error;
+
+    FT_Byte    buffer[256];
+    FT_Byte   *p, *plimit;
+    FT_Byte   *d, *dlimit;
+    FT_Byte    val;
+
+    FT_Bool    upper_nibble, done;
+
+
+    if ( FT_STREAM_SEEK( offset ) )
+      goto Exit;
+
+    d      = data;
+    dlimit = d + data_len;
+    p      = buffer;
+    plimit = p;
+
+    upper_nibble = 1;
+    done         = 0;
+
+    while ( d < dlimit )
+    {
+      if ( p >= plimit )
+      {
+        FT_ULong  oldpos = FT_STREAM_POS();
+        FT_ULong  size   = stream->size - oldpos;
+
+
+        if ( size == 0 )
+        {
+          error = CID_Err_Syntax_Error;
+          goto Exit;
+        }
+
+        if ( FT_STREAM_READ( buffer, 256 > size ? size : 256 ) )
+          goto Exit;
+        p      = buffer;
+        plimit = p + FT_STREAM_POS() - oldpos;
+      }
+
+      if ( ft_isdigit( *p ) )
+        val = *p - '0';
+      else if ( *p >= 'a' && *p <= 'f' )
+        val = *p - 'a';
+      else if ( *p >= 'A' && *p <= 'F' )
+        val = *p - 'A' + 10;
+      else if ( *p == ' '  ||
+                *p == '\t' ||
+                *p == '\r' ||
+                *p == '\n' ||
+                *p == '\f' ||
+                *p == '\0' )
+      {
+        p++;
+        continue;
+      }
+      else if ( *p == '>' )
+      {
+        val  = 0;
+        done = 1;
+      }
+      else
+      {
+        error = CID_Err_Syntax_Error;
+        goto Exit;
+      }
+
+      if ( upper_nibble )
+        *d = val << 4;
+      else
+      {
+        *d += val;
+        d++;
+      }
+
+      upper_nibble = 1 - upper_nibble;
+
+      if ( done )
+        break;
+
+      p++;
+    }
+
+    error = CID_Err_Ok;
+
+  Exit:
+    return error;
+  }
+
+
   FT_LOCAL_DEF( FT_Error )
-  cid_face_open( CID_Face  face )
+  cid_face_open( CID_Face  face,
+                 FT_Int    face_index )
   {
     CID_Loader   loader;
     CID_Parser*  parser;
+    FT_Memory    memory = face->root.memory;
     FT_Error     error;
 
 
@@ -509,7 +609,30 @@
     if ( error )
       goto Exit;
 
-    face->cid.data_offset = loader.parser.data_offset;
+    if ( face_index < 0 )
+      goto Exit;
+
+    if ( parser->binary_length )
+    {
+      /* we must convert the data section from hexadecimal to binary */
+      if ( FT_ALLOC( face->binary_data, parser->binary_length )         ||
+           cid_hex_to_binary( face->binary_data, parser->binary_length,
+                              parser->data_offset, face )               )
+        goto Exit;
+
+      if ( FT_NEW( face->cid_stream ) )
+        goto Exit;
+
+      FT_Stream_OpenMemory( face->cid_stream,
+                            face->binary_data, parser->binary_length );
+      face->cid.data_offset = 0;
+    }
+    else
+    {
+      face->cid_stream = face->root.stream;
+      face->cid.data_offset = loader.parser.data_offset;
+    }
+
     error = cid_read_subrs( face );
 
   Exit:
--- a/src/cid/cidload.h
+++ b/src/cid/cidload.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID-keyed Type1 font loader (specification).                         */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002, 2003 by                                     */
+/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -41,7 +41,8 @@
                   FT_Byte    offsize );
 
   FT_LOCAL( FT_Error )
-  cid_face_open( CID_Face  face );
+  cid_face_open( CID_Face  face,
+                 FT_Int    face_index );
 
 
 FT_END_HEADER
--- a/src/cid/cidobjs.c
+++ b/src/cid/cidobjs.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID objects manager (body).                                          */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002, 2003 by                                     */
+/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -234,6 +234,9 @@
 
       face->root.family_name = 0;
       face->root.style_name  = 0;
+
+      FT_FREE( face->binary_data );
+      FT_FREE( face->cid_stream );
     }
   }
 
@@ -275,7 +278,6 @@
 
     FT_UNUSED( num_params );
     FT_UNUSED( params );
-    FT_UNUSED( face_index );
     FT_UNUSED( stream );
 
 
@@ -305,7 +307,7 @@
     if ( FT_STREAM_SEEK( 0 ) )
       goto Exit;
 
-    error = cid_face_open( face );
+    error = cid_face_open( face, face_index );
     if ( error )
       goto Exit;
 
--- a/src/cid/cidparse.c
+++ b/src/cid/cidparse.c
@@ -140,22 +140,23 @@
     /* in a comment or string.  We also get its arguments to find out */
     /* whether the data is represented in binary or hex format.       */
 
-    limit = parser->root.limit;
-    cur   = parser->root.cursor;
-
-    arg1 = cur;
+    arg1 = parser->root.cursor;
     cid_parser_skip_PS_token( parser );
     cid_parser_skip_spaces  ( parser );
-    arg2 = cur;
+    arg2 = parser->root.cursor;
     cid_parser_skip_PS_token( parser );
     cid_parser_skip_spaces  ( parser );
 
+    limit = parser->root.limit;
+    cur   = parser->root.cursor;
+
     while ( cur < limit )
     {
       if ( *cur == 'S' && ft_strncmp( (char*)cur, "StartData", 9 ) == 0 )
       {
         if ( ft_strncmp( (char*)arg1, "(Hex)", 5 ) == 0 )
-          parser->data_type = 1;
+          parser->binary_length = ft_atol( (const char *)arg2 );
+
         limit = parser->root.limit;
         cur   = parser->root.cursor;
         goto Exit;
--- a/src/cid/cidparse.h
+++ b/src/cid/cidparse.h
@@ -50,8 +50,8 @@
   /*    data_offset    :: The start position of the binary data (i.e., the */
   /*                      end of the data to be parsed.                    */
   /*                                                                       */
-  /*    data_type      :: If true, the binary data is represented in       */
-  /*                      hexadecimal format.                              */
+  /*    binary_length  :: The length of the data after the `StartData'     */
+  /*                      command if the data format is hexadecimal.       */
   /*                                                                       */
   /*    cid            :: A structure which holds the information about    */
   /*                      the current font.                                */
@@ -67,7 +67,8 @@
     FT_Long       postscript_len;
 
     FT_ULong      data_offset;
-    FT_Bool       data_type;
+
+    FT_Long       binary_length;
 
     CID_FaceInfo  cid;
     FT_Int        num_dict;
--- a/src/type42/t42drivr.c
+++ b/src/type42/t42drivr.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level Type 42 driver interface (body).                          */
 /*                                                                         */
-/*  Copyright 2002, 2003 by Roberto Alameda.                               */
+/*  Copyright 2002, 2003, 2004 by Roberto Alameda.                         */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 /*  modified, and distributed under the terms of the FreeType project      */
@@ -95,7 +95,7 @@
       gname = face->type1.glyph_names[i];
 
       if ( !ft_strcmp( glyph_name, gname ) )
-        return ft_atoi( (const char *)face->type1.charstrings[i] );
+        return (FT_UInt)ft_atol( (const char *)face->type1.charstrings[i] );
     }
 
     return 0;