shithub: freetype+ttf2subf

Download patch

ref: d2681a49771228b35266d359e97b68f1a729fd6d
parent: 1a103015328a5897005311fa051fd57cb4b6aadb
author: Nikhil Ramakrishnan <[email protected]>
date: Wed Aug 21 16:21:02 EDT 2019

[woff2] More formatting and documentation.

* include/freetype/internal/wofftypes.h, src/sfnt/sfwoff2.c: Implement
formatting changes suggested as

  https://lists.nongnu.org/archive/html/freetype-devel/2019-08/msg00052.html

git/fs: mount .git/fs: mount/attach disallowed
--- a/include/freetype/internal/wofftypes.h
+++ b/include/freetype/internal/wofftypes.h
@@ -120,12 +120,6 @@
    *     Number of tables in TTC, indicating number of elements in
    *     `table_indices`.
    *
-   *   dst_offset ::
-   *     Uncompressed table offset.
-   *
-   *   header_checksum ::
-   *     Checksum for font header.
-   *
    *   table_indices ::
    *     Array of table indices for each TTC font.
    */
@@ -133,8 +127,6 @@
   {
     FT_ULong    flavor;
     FT_UShort   num_tables;
-    FT_ULong    dst_offset;
-    FT_ULong    header_checksum;
     FT_UShort*  table_indices;
 
   } WOFF2_TtcFontRec, *WOFF2_TtcFont;
@@ -157,7 +149,7 @@
    *   We don't care about the fields `reserved`, `majorVersion` and
    *   `minorVersion`, so they are not included.  The `totalSfntSize` field
    *   does not necessarily represent the actual size of the uncompressed
-   *   SFNT font stream, so that is not included either.
+   *   SFNT font stream, so that is used as a reference value instead.
    */
   typedef struct  WOFF2_HeaderRec_
   {
@@ -173,13 +165,13 @@
     FT_ULong   privOffset;
     FT_ULong   privLength;
 
-    FT_ULong   uncompressed_size;
-    FT_ULong   compressed_offset;
-    FT_ULong   header_version;
-    FT_UShort  num_fonts;
-    FT_ULong   actual_sfnt_size;
+    FT_ULong   uncompressed_size;    /* uncompressed brotli stream size */
+    FT_ULong   compressed_offset;    /* compressed stream offset        */
+    FT_ULong   header_version;       /* version of original TTC Header  */
+    FT_UShort  num_fonts;            /* number of fonts in TTC          */
+    FT_ULong   actual_sfnt_size;     /* actual size of sfnt stream      */
 
-    WOFF2_TtcFont  ttc_fonts;
+    WOFF2_TtcFont  ttc_fonts;        /* metadata for fonts in a TTC     */
 
   } WOFF2_HeaderRec, *WOFF2_Header;
 
@@ -194,14 +186,17 @@
    *   sfnt tables.
    *
    * @fields:
+   *   header_checksum ::
+   *     Checksum of SFNT offset table.
+   *
    *   num_glyphs ::
    *     Number of glyphs in the font.
    *
    *   num_hmetrics ::
-   *     `numberOfHMetrics' field in the `hhea' table.
+   *     `numberOfHMetrics` field in the 'hhea' table.
    *
    *   x_mins ::
-   *     `xMin' values of glyph bounding box.
+   *     `xMin` values of glyph bounding box.
    */
   typedef struct  WOFF2_InfoRec_
   {
@@ -236,7 +231,6 @@
     FT_ULong  flags;              /* calculated flags          */
     FT_ULong  src_offset;         /* compressed table offset   */
     FT_ULong  src_length;         /* compressed table length   */
-
     FT_ULong  dst_offset;         /* uncompressed table offset */
 
   } WOFF2_TableRec, *WOFF2_Table;
@@ -249,7 +243,7 @@
    *
    * @description:
    *   This structure stores information about a substream in the transformed
-   *   `glyf' table in a WOFF2 stream.
+   *   'glyf' table in a WOFF2 stream.
    *
    * @fields:
    *   start ::
@@ -266,6 +260,7 @@
     FT_ULong  start;
     FT_ULong  offset;
     FT_ULong  size;
+
   } WOFF2_SubstreamRec, *WOFF2_Substream;
 
 
@@ -276,7 +271,7 @@
    *
    * @description:
    *   This structure stores information about a point in the transformed
-   *   `glyf' table in a WOFF2 stream.
+   *   'glyf' table in a WOFF2 stream.
    *
    * @fields:
    *   x ::
@@ -286,7 +281,7 @@
    *     y-coordinate.
    *
    *   on_curve ::
-   *     on-curve.
+   *     Whether point is on-curve.
    */
   typedef struct  WOFF2_PointRec_
   {
@@ -293,6 +288,7 @@
     FT_Int   x;
     FT_Int   y;
     FT_Bool  on_curve;
+
   } WOFF2_PointRec, *WOFF2_Point;
 
 
--- a/src/sfnt/sfwoff2.c
+++ b/src/sfnt/sfwoff2.c
@@ -135,6 +135,7 @@
     FT_Byte              result_byte  = 0;
     FT_UShort            result_short = 0;
 
+
     if ( FT_READ_BYTE( code ) )
       return error;
     if ( code == wordCode )
@@ -176,7 +177,9 @@
     FT_Byte   code;
     FT_Error  error  = FT_Err_Ok;
 
-    for ( i = 0; i < 5; ++i ) {
+
+    for ( i = 0; i < 5; ++i )
+    {
       code = 0;
       if ( FT_READ_BYTE( code ) )
         return error;
@@ -215,7 +218,8 @@
     /* We are reallocating memory for `dst', so its pointer may change. */
     FT_Byte*  dst   = *dst_bytes;
 
-    /* Check if we are within limits. */
+
+    /* Check whether we are within limits. */
     if ( ( *offset + size ) > WOFF2_DEFAULT_MAX_SIZE  )
       return FT_THROW( Array_Too_Large );
 
@@ -256,6 +260,7 @@
     FT_Byte   zeroes[] = { 0, 0, 0 };
     FT_ULong  pad_bytes;
 
+
     if ( dest_offset + 3 < dest_offset )
       return FT_THROW( Invalid_Table );
 
@@ -281,6 +286,7 @@
     FT_ULong  i;
     FT_ULong  v;
 
+
     for ( i = 0; i < aligned_size; i += 4 )
     {
       checksum += ( buf[i] << 24 ) | ( buf[i+1] << 16 ) |
@@ -310,15 +316,16 @@
     FT_ULong             uncompressed_size = dst_size;
     BrotliDecoderResult  result;
 
+
     result = BrotliDecoderDecompress(
       src_size, src, &uncompressed_size, dst);
 
     if ( result != BROTLI_DECODER_RESULT_SUCCESS ||
          uncompressed_size != dst_size           )
-      {
-        FT_ERROR(( "woff2_decompress: Stream length mismatch.\n" ));
-        return FT_THROW( Invalid_Table );
-      }
+    {
+      FT_ERROR(( "woff2_decompress: Stream length mismatch.\n" ));
+      return FT_THROW( Invalid_Table );
+    }
 
     FT_TRACE2(( "woff2_decompress: Brotli stream decompressed.\n" ));
     return FT_Err_Ok;
@@ -339,6 +346,7 @@
   {
     FT_Int i;
 
+
     for ( i = 0; i < num_tables; i++ )
     {
       if ( tables[i]->Tag == tag )
@@ -357,6 +365,7 @@
     FT_Error   error = FT_Err_Ok;
     FT_UShort  num_metrics;
 
+
     if ( FT_STREAM_SKIP( 34 )  )
       return FT_THROW( Invalid_Table );
 
@@ -411,6 +420,7 @@
 
     FT_Int  i;
 
+
     if ( n_points > in_size )
       return FT_THROW( Invalid_Table );
 
@@ -418,6 +428,8 @@
     {
       FT_Byte  flag = flags_in[i];
       FT_Bool  on_curve = !( flag >> 7 );
+
+
       flag &= 0x7f;
       if ( flag < 84 )
         data_bytes = 1;
@@ -506,20 +518,20 @@
                 FT_ULong           dst_size,
                 FT_ULong*          glyph_size )
   {
-    FT_UInt  flag_offset  = 10 + ( 2 * n_contours ) + 2 + instruction_len;
-    FT_Int   last_flag    = -1;
-    FT_Int   repeat_count =  0;
-    FT_Int   last_x       =  0;
-    FT_Int   last_y       =  0;
-    FT_UInt  x_bytes      =  0;
-    FT_UInt  y_bytes      =  0;
-    FT_UInt  xy_bytes;
-    FT_UInt  i;
-    FT_UInt  x_offset;
-    FT_UInt  y_offset;
-
+    FT_UInt   flag_offset  = 10 + ( 2 * n_contours ) + 2 + instruction_len;
+    FT_Int    last_flag    = -1;
+    FT_Int    repeat_count =  0;
+    FT_Int    last_x       =  0;
+    FT_Int    last_y       =  0;
+    FT_UInt   x_bytes      =  0;
+    FT_UInt   y_bytes      =  0;
+    FT_UInt   xy_bytes;
+    FT_UInt   i;
+    FT_UInt   x_offset;
+    FT_UInt   y_offset;
     FT_Byte*  pointer;
 
+
     for ( i = 0; i < n_points; ++i )
     {
       const WOFF2_PointRec  point = points[i];
@@ -528,6 +540,7 @@
       FT_Int       dx   = point.x - last_x;
       FT_Int       dy   = point.y - last_y;
 
+
       if ( dx == 0 )
         flag |= GLYF_THIS_X_IS_SAME;
       else if ( dx > -256 && dx < 256 )
@@ -641,6 +654,7 @@
     FT_ULong  offset;
     FT_Byte*  pointer;
 
+
     if ( n_points > 0 )
     {
       x_min = points[0].x;
@@ -682,6 +696,7 @@
     FT_Bool    we_have_inst = FALSE;
     FT_UShort  flags        = FLAG_MORE_COMPONENTS;
 
+
     if ( FT_STREAM_SEEK( start_offset ) )
       goto Exit;
     while ( flags & FLAG_MORE_COMPONENTS )
@@ -712,8 +727,8 @@
     *size              = FT_STREAM_POS() - start_offset;
     *have_instructions = we_have_inst;
 
-    Exit:
-      return error;
+  Exit:
+    return error;
   }
 
 
@@ -739,6 +754,7 @@
 
     const FT_ULong  offset_size = index_format ? 4 : 2;
 
+
     if ( ( loca_values_size << 2 ) >> 2 != loca_values_size )
       goto Fail;
 
@@ -750,6 +766,8 @@
     for ( i = 0; i < loca_values_size; i++ )
     {
       FT_ULong  value = loca_values[i];
+
+
       if ( index_format )
         WRITE_ULONG( dst, value );
       else
@@ -768,13 +786,13 @@
     FT_FREE( loca_buf );
     return error;
 
-    Fail:
-      if ( !error )
-        error = FT_THROW( Invalid_Table );
+  Fail:
+    if ( !error )
+      error = FT_THROW( Invalid_Table );
 
-      FT_FREE( loca_buf );
+    FT_FREE( loca_buf );
 
-      return error;
+    return error;
   }
 
 
@@ -818,6 +836,7 @@
     FT_Byte*     glyph_buf         = NULL;
     WOFF2_Point  points            = NULL;
 
+
     if ( FT_NEW_ARRAY( substreams, num_substreams ) )
       goto Fail;
 
@@ -849,6 +868,8 @@
     for ( i = 0; i < num_substreams; ++i )
     {
       FT_ULong  substream_size;
+
+
       if ( FT_READ_ULONG( substream_size ) )
         goto Fail;
       if ( substream_size > glyf_table->TransformLength - offset )
@@ -889,6 +910,7 @@
       FT_ULong   bbox_offset;
       FT_UShort  x_min;
 
+
       /* Set `have_bbox'. */
       bbox_offset = bbox_bitmap_offset + ( i >> 3 );
       if ( FT_STREAM_SEEK( bbox_offset ) ||
@@ -912,6 +934,7 @@
         FT_ULong   size_needed;
         FT_Byte*   pointer           = NULL;
 
+
         /* Composite glyphs must have explicit bbox. */
         if ( !have_bbox )
           goto Fail;
@@ -990,6 +1013,7 @@
 
         FT_Byte*   pointer = NULL;
 
+
         if ( FT_NEW_ARRAY( n_points_arr, n_contours ) )
           goto Fail;
 
@@ -1149,17 +1173,17 @@
 
       return error;
 
-    Fail:
-      if ( !error )
-        error = FT_THROW( Invalid_Table );
+  Fail:
+    if ( !error )
+      error = FT_THROW( Invalid_Table );
 
-      FT_FREE( substreams );
-      FT_FREE( loca_values );
-      FT_FREE( n_points_arr );
-      FT_FREE( glyph_buf );
-      FT_FREE( points );
+    FT_FREE( substreams );
+    FT_FREE( loca_values );
+    FT_FREE( n_points_arr );
+    FT_FREE( glyph_buf );
+    FT_FREE( points );
 
-      return error;
+    return error;
   }
 
 
@@ -1189,6 +1213,7 @@
     const WOFF2_Table head_table = find_table( tables, num_tables,
                                                TTAG_head );
 
+
     /* Read `numGlyphs' from maxp table. */
     if ( FT_STREAM_SEEK( maxp_table->src_offset ) && FT_STREAM_SKIP( 8 ) )
       return error;
@@ -1273,6 +1298,7 @@
     FT_Byte*    hmtx_table     = NULL;
     FT_Byte*    dst            = NULL;
 
+
     if ( FT_READ_BYTE( hmtx_flags ) )
       goto Fail;
 
@@ -1292,7 +1318,7 @@
          ( num_hmetrics < 1 )          )
       goto Fail;
 
-    /* Must have atleast one entry. */
+    /* Must have at least one entry. */
     if ( num_hmetrics < 1 )
       goto Fail;
 
@@ -1305,6 +1331,7 @@
     {
       FT_UShort  advance_width;
 
+
       if ( FT_READ_USHORT( advance_width ) )
         goto Fail;
 
@@ -1316,6 +1343,7 @@
     {
       FT_Short  lsb;
 
+
       if ( has_proportional_lsbs )
       {
         if ( FT_READ_SHORT( lsb ) )
@@ -1332,6 +1360,7 @@
     {
       FT_Short  lsb;
 
+
       if ( has_monospace_lsbs )
       {
         if ( FT_READ_SHORT( lsb ) )
@@ -1374,10 +1403,11 @@
 
     return error;
 
-    Fail:
-      if ( !error )
-        error = FT_THROW( Invalid_Table );
-      return error;
+  Fail:
+    if ( !error )
+      error = FT_THROW( Invalid_Table );
+
+    return error;
   }
 
 
@@ -1419,6 +1449,7 @@
     const WOFF2_Table loca_table = find_table( indices, num_tables,
                                                TTAG_loca );
 
+
     if ( ( !glyf_table && loca_table ) ||
          ( !loca_table && glyf_table ) )
     {
@@ -1455,6 +1486,7 @@
     {
       WOFF2_TableRec  table = *( indices[nn] );
 
+
       FT_TRACE3(( "Seeking to %d with table size %d.\n",
                   table.src_offset, table.src_length ));
       FT_TRACE3(( "Table tag: %c%c%c%c.\n",
@@ -1481,7 +1513,7 @@
       checksum = 0;
       if ( ( table.flags & WOFF2_FLAGS_TRANSFORM ) != WOFF2_FLAGS_TRANSFORM )
       {
-        /* Check if `head' is atleast 12 bytes. */
+        /* Check whether `head' is at least 12 bytes. */
         if ( table.Tag == TTAG_head )
         {
           if ( table.src_length < 12 )
@@ -1591,15 +1623,15 @@
 
     return error;
 
-    Fail:
-      if ( !error )
-        error = FT_THROW( Invalid_Table );
+  Fail:
+    if ( !error )
+      error = FT_THROW( Invalid_Table );
 
-      FT_FREE( table_entry );
-      FT_Stream_Close( stream );
-      FT_FREE( stream );
+    FT_FREE( table_entry );
+    FT_Stream_Close( stream );
+    FT_FREE( stream );
 
-      return error;
+    return error;
   }
 
 
@@ -1662,6 +1694,7 @@
       FT_FRAME_END
     };
 
+
     FT_ASSERT( stream == face->root.stream );
     FT_ASSERT( FT_STREAM_POS() == 0 );
 
@@ -1716,6 +1749,8 @@
     for ( nn = 0; nn < woff2.num_tables; nn++ )
     {
       WOFF2_Table  table = tables + nn;
+
+
       if ( FT_READ_BYTE( table->FlagByte ) )
         goto Exit;
 
@@ -1824,6 +1859,7 @@
       {
         WOFF2_TtcFont  ttc_font = woff2.ttc_fonts + nn;
 
+
         if ( READ_255USHORT( ttc_font->num_tables ) )
           goto Exit;
         if ( FT_READ_ULONG( ttc_font->flavor ) )
@@ -1845,6 +1881,7 @@
           FT_UShort    table_index;
           WOFF2_Table  table;
 
+
           if ( READ_255USHORT( table_index ) )
             goto Exit;
 
@@ -1934,6 +1971,7 @@
     {
       WOFF2_TtcFont  ttc_font = woff2.ttc_fonts + face_index;
 
+
       /* Create a temporary array. */
       if ( FT_NEW_ARRAY( temp_indices,
                          ttc_font->num_tables ) )
@@ -1974,6 +2012,7 @@
 
     {
       FT_UInt  searchRange, entrySelector, rangeShift, x;
+
 
       x             = woff2.num_tables;
       entrySelector = 0;