Werner Lemberg pushed to branch master at FreeType / FreeType
Commits:
-
0348c627
by Dominik Röttsches at 2021-07-01T06:15:22+02:00
2 changed files:
Changes:
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'.
|
... | ... | @@ -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 );
|