Commit 9eefed125a11c763dc5a7fe584b7bb7c71f88d89

Graham Asher 2002-08-23T10:08:38

Simplified the incremental loading system for CFF fonts and fixed a problem with the handling of the deprecated version of the Type 2 endchar command, that emulates Type 1 'seac'. This version now works with the GhostScript-to-FreeType bridge currently under development.

diff --git a/src/cff/cffgload.c b/src/cff/cffgload.c
index 753cf97..9fd8968 100644
--- a/src/cff/cffgload.c
+++ b/src/cff/cffgload.c
@@ -570,25 +570,20 @@
     /* For incremental fonts get the character data using the */
     /* callback function.                                     */
     if ( face->root.internal->incremental_interface )
-    {
-      FT_Data   data;
-      FT_Error  error = face->root.internal->incremental_interface->funcs->get_glyph_data(
-                          face->root.internal->incremental_interface->object,
-                          glyph_index, &data );
-
-
+	{
+	  FT_Data data;
+      FT_Error error = face->root.internal->incremental_interface->funcs->get_glyph_data(
+               face->root.internal->incremental_interface->object,
+               glyph_index, &data );
       *pointer = (FT_Byte*)data.pointer;
-      *length  = data.length;
-
+      *length = data.length;
       return error;
     }
     else
 #endif /* FT_CONFIG_OPTION_INCREMENTAL */
 
     {
-      CFF_Font  cff = (CFF_Font)(face->extra.data);
-
-
+      CFF_Font  cff  = (CFF_Font)(face->extra.data);
       return cff_index_access_element( &cff->charstrings_index, glyph_index,
                                        pointer, length );
     }
@@ -608,12 +603,10 @@
     /* For incremental fonts get the character data using the */
     /* callback function.                                     */
     if ( face->root.internal->incremental_interface )
-    {
-      FT_Data  data;
-
-
-      data.pointer = *pointer;
-      data.length  = length;
+	{
+      FT_Data data;
+	  data.pointer = *pointer;
+	  data.length = length;
       face->root.internal->incremental_interface->funcs->free_glyph_data(
         face->root.internal->incremental_interface->object,&data );
     }
@@ -621,9 +614,7 @@
 #endif /* FT_CONFIG_OPTION_INCREMENTAL */
 
     {
-      CFF_Font  cff = (CFF_Font)(face->extra.data);
-
-
+      CFF_Font  cff  = (CFF_Font)(face->extra.data);
       cff_index_forget_element( &cff->charstrings_index, pointer );
     }
   }
@@ -640,14 +631,26 @@
     FT_Int       bchar_index, achar_index, n_base_points;
     FT_Outline*  base = decoder->builder.base;
     TT_Face      face = decoder->builder.face;
-    CFF_Font     cff  = (CFF_Font)(face->extra.data);
     FT_Vector    left_bearing, advance;
     FT_Byte*     charstring;
     FT_ULong     charstring_len;
 
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    /* Incremental fonts don't necessarily have valid charsets.         */
+	/* They use the character code, not the glyph index, in this case.  */
+    if ( face->root.internal->incremental_interface )
+	{
+      bchar_index = bchar;
+      achar_index = achar;
+    }
+    else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+    {
+      CFF_Font cff = (CFF_Font)(face->extra.data);
 
-    bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar );
-    achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar );
+      bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar );
+      achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar );
+	}
 
     if ( bchar_index < 0 || achar_index < 0 )
     {
@@ -699,7 +702,8 @@
                                 &charstring, &charstring_len );
     if ( !error )
     {
-      error = cff_decoder_parse_charstrings( decoder, charstring, charstring_len );
+      error = cff_decoder_parse_charstrings( decoder, charstring,
+                                             charstring_len );
 
       if ( error )
         goto Exit;
@@ -2312,7 +2316,7 @@
 
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
-        /* Control data and length may not be available for incremental   */
+     	/* Control data and length may not be available for incremental   */
         /* fonts.                                                         */
         if ( face->root.internal->incremental_interface )
         {
@@ -2326,13 +2330,11 @@
         /* See how charstring loads at cff_index_access_element() in      */
         /* cffload.c.                                                     */
         {
-          CFF_IndexRec  csindex = cff->charstrings_index;
-
-
-          glyph->root.control_data =
-            csindex.bytes + csindex.offsets[glyph_index] - 1;
-          glyph->root.control_len =
-            charstring_len;
+        CFF_IndexRec csindex = cff->charstrings_index;
+        glyph->root.control_data =
+          csindex.bytes + csindex.offsets[glyph_index] - 1;
+        glyph->root.control_len =
+          charstring_len;
         }
       }
 
diff --git a/src/cff/cffload.c b/src/cff/cffload.c
index be40d0e..896df2d 100644
--- a/src/cff/cffload.c
+++ b/src/cff/cffload.c
@@ -2027,8 +2027,7 @@
   FT_LOCAL_DEF( FT_Error )
   cff_font_load( FT_Stream  stream,
                  FT_Int     face_index,
-                 CFF_Font   font,
-                 CFF_Face   face )
+                 CFF_Font   font )
   {
     static const FT_Frame_Field  cff_header_fields[] =
     {
@@ -2048,11 +2047,6 @@
     FT_ULong         base_offset;
     CFF_FontRecDict  dict;
 
-#ifndef FT_CONFIG_OPTION_INCREMENTAL
-    FT_UNUSED( face );
-#endif
-
-
     FT_ZERO( font );
 
     font->stream = stream;
@@ -2164,26 +2158,20 @@
     else
       font->num_subfonts = 0;
 
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    /* Incremental fonts don't need character recipes. */
-    if ( !face->root.internal->incremental_interface )
-#endif
+    /* read the charstrings index now */
+    if ( dict->charstrings_offset == 0 )
     {
-      /* read the charstrings index now */
-      if ( dict->charstrings_offset == 0 )
-      {
-        FT_ERROR(( "cff_font_load: no charstrings offset!\n" ));
-        error = CFF_Err_Unknown_File_Format;
-        goto Exit;
-      }
+      FT_ERROR(( "cff_font_load: no charstrings offset!\n" ));
+      error = CFF_Err_Unknown_File_Format;
+      goto Exit;
+    }
 
-      if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) )
-        goto Exit;
+    if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) )
+      goto Exit;
 
-      error = cff_new_index( &font->charstrings_index, stream, 0 );
-      if ( error )
-        goto Exit;
-    }
+    error = cff_new_index( &font->charstrings_index, stream, 0 );
+    if ( error )
+      goto Exit;
 
     /* explicit the global subrs */
     font->num_global_subrs = font->global_subrs_index.count;
@@ -2199,7 +2187,7 @@
     if ( font->num_glyphs > 0 )
     {
       error = cff_charset_load( &font->charset, font->num_glyphs, stream,
-                                base_offset, dict->charset_offset );
+                              base_offset, dict->charset_offset );
       if ( error )
         goto Exit;
 
diff --git a/src/cff/cffload.h b/src/cff/cffload.h
index 3051a25..4cadfe6 100644
--- a/src/cff/cffload.h
+++ b/src/cff/cffload.h
@@ -55,8 +55,7 @@ FT_BEGIN_HEADER
   FT_LOCAL( FT_Error )
   cff_font_load( FT_Stream  stream,
                  FT_Int     face_index,
-                 CFF_Font   font,
-                 CFF_Face   face );
+                 CFF_Font   font );
 
   FT_LOCAL( void )
   cff_font_done( CFF_Font  font );
diff --git a/src/cff/cffobjs.c b/src/cff/cffobjs.c
index 3dead51..a1b6166 100644
--- a/src/cff/cffobjs.c
+++ b/src/cff/cffobjs.c
@@ -342,7 +342,7 @@
         goto Exit;
 
       face->extra.data = cff;
-      error = cff_font_load( stream, face_index, cff, face );
+      error = cff_font_load( stream, face_index, cff );
       if ( error )
         goto Exit;