freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Git][freetype/freetype][master] [sfnt] Handle fonts without layer list


From: Werner Lemberg (@wl)
Subject: [Git][freetype/freetype][master] [sfnt] Handle fonts without layer list in 'COLR' v1.
Date: Thu, 01 Jul 2021 04:17:33 +0000

Werner Lemberg pushed to branch master at FreeType / FreeType

Commits:

2 changed files:

Changes:

  • ChangeLog
    1
    +2021-06-30  Dominik Röttsches  <drott@chromium.org>
    
    2
    +
    
    3
    +	[sfnt] Handle fonts without layer list in 'COLR' v1.
    
    4
    +
    
    5
    +	'COLR' v1 fonts do not necessarily need to have a layer list; for
    
    6
    +	this reason, 'fontTools' recently started generating fonts in a way
    
    7
    +	that drops the layer list if there are no layers in it.  This
    
    8
    +	results in the layer list offset becoming zero, which FreeType
    
    9
    +	treated as an invalid table.  Fix that and handle the case for layer
    
    10
    +	list offset being 0.  This slightly changes how we need to calculate
    
    11
    +	the starting offset for paints.
    
    12
    +
    
    13
    +	* src/sfnt/ttcolr.c (tt_face_load_colr): Handle case of layer list
    
    14
    +	offset being zero without outright rejecting table.
    
    15
    +
    
    1 16
     2021-06-30  Alexei Podtelezhnikov  <apodtele@gmail.com>
    
    2 17
     
    
    3 18
     	* src/raster/ftraster.c (Render_Single_Pass): Simplify `band_stack'.
    

  • src/sfnt/ttcolr.c
    ... ... @@ -186,24 +186,35 @@
    186 186
     
    
    187 187
           layer_offset_v1 = FT_NEXT_ULONG( p );
    
    188 188
     
    
    189
    -      if ( !layer_offset_v1 || layer_offset_v1 >= table_size )
    
    189
    +      if ( layer_offset_v1 >= table_size )
    
    190 190
             goto InvalidTable;
    
    191 191
     
    
    192
    -      p1            = (FT_Byte*)( table + layer_offset_v1 );
    
    193
    -      num_layers_v1 = FT_PEEK_ULONG( p1 );
    
    192
    +      if ( layer_offset_v1 )
    
    193
    +      {
    
    194
    +        p1            = (FT_Byte*)( table + layer_offset_v1 );
    
    195
    +        num_layers_v1 = FT_PEEK_ULONG( p1 );
    
    194 196
     
    
    195
    -      if ( num_layers_v1 * LAYER_V1_LIST_PAINT_OFFSET_SIZE >
    
    196
    -             table_size - layer_offset_v1 )
    
    197
    -        goto InvalidTable;
    
    197
    +        if ( num_layers_v1 * LAYER_V1_LIST_PAINT_OFFSET_SIZE >
    
    198
    +               table_size - layer_offset_v1 )
    
    199
    +          goto InvalidTable;
    
    198 200
     
    
    199
    -      colr->num_layers_v1 = num_layers_v1;
    
    200
    -      colr->layers_v1     = p1;
    
    201
    +        colr->num_layers_v1 = num_layers_v1;
    
    202
    +        colr->layers_v1     = p1;
    
    201 203
     
    
    202
    -      colr->paints_start_v1 =
    
    203
    -        FT_MIN( colr->base_glyphs_v1 +
    
    204
    -                  colr->num_base_glyphs_v1 * BASE_GLYPH_PAINT_RECORD_SIZE,
    
    205
    -                colr->layers_v1 +
    
    206
    -                  colr->num_layers_v1 * LAYER_V1_LIST_PAINT_OFFSET_SIZE );
    
    204
    +        colr->paints_start_v1 =
    
    205
    +            FT_MIN( colr->base_glyphs_v1 +
    
    206
    +                    colr->num_base_glyphs_v1 * BASE_GLYPH_PAINT_RECORD_SIZE,
    
    207
    +                    colr->layers_v1 +
    
    208
    +                    colr->num_layers_v1 * LAYER_V1_LIST_PAINT_OFFSET_SIZE );
    
    209
    +      }
    
    210
    +      else
    
    211
    +      {
    
    212
    +        colr->num_layers_v1   = 0;
    
    213
    +        colr->layers_v1       = 0;
    
    214
    +        colr->paints_start_v1 =
    
    215
    +          colr->base_glyphs_v1 +
    
    216
    +          colr->num_base_glyphs_v1 * BASE_GLYPH_PAINT_RECORD_SIZE;
    
    217
    +      }
    
    207 218
         }
    
    208 219
     
    
    209 220
         colr->base_glyphs = (FT_Byte*)( table + base_glyph_offset );
    


  • reply via email to

    [Prev in Thread] Current Thread [Next in Thread]