shithub: freetype+ttf2subf

Download patch

ref: 18f6ff11f91e377d6296bad2ece8bb2be7dbb0e2
parent: 7a1639bc1ee3ab8d79bfd7b58270c2f3eb908269
author: Nikhil Ramakrishnan <[email protected]>
date: Sun Jun 30 21:29:30 EDT 2019

[woff2] Handle TTCs and start reconstructing font.

We `handle' TTCs by modifying the `indices' array to point to only
those tables that are part of the requested `face_index'.

Set and use `num_tables' in `WOFF2_TtcFont'.

* src/sfnt/sfwoff2.c (reconstruct_font): New function.
(woff2_open_font): Start reconstruction of font.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
 2019-08-27  Nikhil Ramakrishnan  <[email protected]>
 
+	[woff2] Handle TTCs and start reconstructing font.
+
+	We `handle' TTCs by modifying the `indices' array to point to only
+	those tables that are part of the requested `face_index'.
+
+	Set and use `num_tables' in `WOFF2_TtcFont'.
+
+	* src/sfnt/sfwoff2.c (reconstruct_font): New function.
+	(woff2_open_font): Start reconstruction of font.
+
+2019-08-27  Nikhil Ramakrishnan  <[email protected]>
+
 	[woff2] Get known tags from function.
 
 	Change `KnownTags' to a function (`woff2_known_tags').  This avoids
--- a/src/sfnt/sfwoff2.c
+++ b/src/sfnt/sfwoff2.c
@@ -235,6 +235,27 @@
   }
 
 
+  static FT_Error
+  reconstruct_font( FT_Byte*       transformed_buf,
+                    FT_ULong       transformed_buf_size,
+                    WOFF2_Table*   indices,
+                    WOFF2_Header   woff2,
+                    FT_Int         face_index,
+                    FT_Byte*       sfnt )
+  {
+    /* We're writing only one face per call, so offset is fixed. */
+    FT_ULong  dst_offset  = 12;
+    FT_Byte*  table_entry = NULL;
+
+    FT_UNUSED( dst_offset );
+    FT_UNUSED( table_entry );
+
+    /* TODO reconstruct the font tables! */
+
+    return FT_Err_Ok;
+  }
+
+
   /* Replace `face->root.stream' with a stream containing the extracted */
   /* SFNT of a WOFF2 font.                                              */
 
@@ -247,8 +268,9 @@
     FT_Error         error  = FT_Err_Ok;
 
     WOFF2_HeaderRec  woff2;
-    WOFF2_Table      tables  = NULL;
-    WOFF2_Table*     indices = NULL;
+    WOFF2_Table      tables       = NULL;
+    WOFF2_Table*     indices      = NULL;
+    WOFF2_Table*     temp_indices = NULL;
     WOFF2_Table      last_table;
 
     FT_Int           nn;
@@ -257,7 +279,6 @@
     FT_UShort        xform_version;
     FT_ULong         src_offset = 0;
 
-    FT_UShort        ttc_num_tables;
     FT_UInt          glyf_index;
     FT_UInt          loca_index;
     FT_UInt64        first_table_offset;
@@ -453,16 +474,16 @@
       {
         WOFF2_TtcFont  ttc_font = woff2.ttc_fonts + nn;
 
-        if( READ_255USHORT( ttc_num_tables ) )
+        if( READ_255USHORT( ttc_font->num_tables ) )
           goto Exit;
         if( FT_READ_ULONG( ttc_font->flavor ) )
           goto Exit;
 
-        if( FT_NEW_ARRAY( ttc_font->table_indices, ttc_num_tables ) )
+        if( FT_NEW_ARRAY( ttc_font->table_indices, ttc_font->num_tables ) )
           goto Exit;
         /* DEBUG - Change to TRACE4 */
         FT_TRACE2(( "Number of tables in font %d: %ld\n",
-                    nn, ttc_num_tables ));
+                    nn, ttc_font->num_tables ));
         /* DEBUG - Change to TRACE5 */
         FT_TRACE2(( "  Indices: " ));
 
@@ -469,7 +490,7 @@
         glyf_index = 0;
         loca_index = 0;
 
-        for ( j = 0; j < ttc_num_tables; j++ )
+        for ( j = 0; j < ttc_font->num_tables; j++ )
         {
           FT_UShort    table_index;
           WOFF2_Table  table;
@@ -492,7 +513,8 @@
         /* glyf and loca must be consecutive */
         if( glyf_index > 0 || loca_index > 0 )
         {
-          if(glyf_index > loca_index || loca_index - glyf_index != 1)
+          if( glyf_index > loca_index      ||
+              loca_index - glyf_index != 1 )
             return FT_THROW( Invalid_Table );
           /* DEBUG - Remove later */
           else
@@ -531,13 +553,38 @@
     if( file_offset != ( ROUND4( woff2.length ) ) )
       return FT_THROW( Invalid_Table );
 
-    /* TODO Add support for uncompression of TTC fonts. */
-    /* Redirect a TTC to exit for now. */
+    /* Only retain tables of the requested face in a TTC. */
+    /* TODO Check whether it is OK for rest of the code to be unaware of the
+       fact that we're working with a TTC. */
     if( woff2.header_version )
     {
-      FT_TRACE2(( "Reading TTC fonts not supported yet.\n" ));
-      error = FT_THROW( Unimplemented_Feature );
-      goto Exit;
+      WOFF2_TtcFont  ttc_font = woff2.ttc_fonts + face_index;
+      /* Create a temporary array. */
+      if( FT_NEW_ARRAY( temp_indices,
+                        ttc_font->num_tables ) )
+        goto Exit;
+
+      for ( nn = 0; nn < ttc_font->num_tables; nn++ )
+      {
+        /* DEBUG - Remove later */
+        FT_TRACE2(( "i=%d, table_index=%d\n",
+                    nn, ttc_font->table_indices[nn] ));
+        temp_indices[nn] = indices[ttc_font->table_indices[nn]];
+      }
+
+      /* Resize array to required size. */
+      if( FT_RENEW_ARRAY( indices, woff2.num_tables,
+                      ttc_font->num_tables ) )
+        goto Exit;
+
+      for ( nn = 0; nn < ttc_font->num_tables; nn++ )
+        indices[nn] = temp_indices[nn];
+      FT_FREE( temp_indices );
+
+      /* Change header values. */
+      woff2.flavor     = ttc_font->flavor;
+      woff2.num_tables = ttc_font->num_tables;
+
     }
 
     /* Write sfnt header. */
@@ -580,7 +627,7 @@
 
     /* DEBUG - Remove later */
     FT_TRACE2(( "Sorted table indices: \n" ));
-    for( nn = 0; nn < woff2.num_tables; ++nn )
+    for ( nn = 0; nn < woff2.num_tables; ++nn )
     {
       WOFF2_Table  table = indices[nn];
       /* DEBUG - Remove later */
@@ -612,6 +659,8 @@
     FT_FRAME_EXIT();
 
     /* TODO Write table entries. */
+    reconstruct_font( uncompressed_buf, woff2.uncompressed_size,
+                      indices, &woff2, face_index, sfnt );
 
     error = FT_THROW( Unimplemented_Feature );
     /* DEBUG - Remove later */