[sfnt] Update paint format values to support non-variable paints.

* freetype.h (FT_PaintFormat): Update paint format identifiers after
a specification change.  The specification was updated to have
sibling formats, variable and non-variable variants for each.
Reflect that here.

* sfnt/ttcolr.c (read_paint): Remove parsing of variable indices as
the non-variable formats no longer have them.
This commit is contained in:
Dominik Röttsches 2021-02-16 12:53:45 +02:00 committed by Werner Lemberg
parent b2aeca5fda
commit 215ae25330
3 changed files with 31 additions and 55 deletions

View File

@ -1,3 +1,15 @@
2021-02-16 Dominik Röttsches <drott@chromium.org>
[sfnt] Update paint format values to support non-variable paints.
* freetype.h (FT_PaintFormat): Update paint format identifiers after
a specification change. The specification was updated to have
sibling formats, variable and non-variable variants for each.
Reflect that here.
* sfnt/ttcolr.c (read_paint): Remove parsing of variable indices as
the non-variable formats no longer have them.
2021-02-15 Daniel E <daniel.engberg.lists@pyret.net>
* CMakeLists.txt: Improve 'bz2' support.

View File

@ -4256,25 +4256,32 @@ FT_BEGIN_HEADER
* FT_PaintFormat
*
* @description:
* Enumeration describing the different gradient types of the v1
* Enumeration describing the different paint format types of the v1
* extensions to the 'COLR' table, see
* 'https://github.com/googlefonts/colr-gradients-spec'.
*
* Only non-variable format identifiers are listed in this enumeration;
* as soon as support for variable 'COLR' v1 fonts is implemented,
* interpolation is performed dependent on axis coordinates, which are
* configured on the @FT_Face through @FT_Set_Var_Design_Coordinates.
* This implies that always static (interpolated) values are returned
* for both variable and non-variable formats.
*/
typedef enum FT_PaintFormat_
{
FT_COLR_PAINTFORMAT_COLR_LAYERS = 1,
FT_COLR_PAINTFORMAT_SOLID = 2,
FT_COLR_PAINTFORMAT_LINEAR_GRADIENT = 3,
FT_COLR_PAINTFORMAT_RADIAL_GRADIENT = 4,
FT_COLR_PAINTFORMAT_SWEEP_GRADIENT = 5,
FT_COLR_PAINTFORMAT_GLYPH = 6,
FT_COLR_PAINTFORMAT_COLR_GLYPH = 7,
FT_COLR_PAINTFORMAT_TRANSFORMED = 8,
FT_COLR_PAINTFORMAT_TRANSLATE = 9,
FT_COLR_PAINTFORMAT_ROTATE = 10,
FT_COLR_PAINTFORMAT_SKEW = 11,
FT_COLR_PAINTFORMAT_COMPOSITE = 12,
FT_COLR_PAINT_FORMAT_MAX = 13,
FT_COLR_PAINTFORMAT_LINEAR_GRADIENT = 4,
FT_COLR_PAINTFORMAT_RADIAL_GRADIENT = 6,
FT_COLR_PAINTFORMAT_SWEEP_GRADIENT = 8,
FT_COLR_PAINTFORMAT_GLYPH = 10,
FT_COLR_PAINTFORMAT_COLR_GLYPH = 11,
FT_COLR_PAINTFORMAT_TRANSFORMED = 12,
FT_COLR_PAINTFORMAT_TRANSLATE = 14,
FT_COLR_PAINTFORMAT_ROTATE = 16,
FT_COLR_PAINTFORMAT_SKEW = 18,
FT_COLR_PAINTFORMAT_COMPOSITE = 20,
FT_COLR_PAINT_FORMAT_MAX = 21,
FT_COLR_PAINTFORMAT_UNSUPPORTED = 255
} FT_PaintFormat;

View File

@ -405,8 +405,6 @@
{
apaint->u.solid.color.palette_index = FT_NEXT_USHORT ( p );
apaint->u.solid.color.alpha = FT_NEXT_USHORT ( p );
/* skip VarIdx */
FT_NEXT_ULONG ( p );
}
else if ( apaint->format == FT_COLR_PAINTFORMAT_LINEAR_GRADIENT )
@ -419,19 +417,12 @@
&apaint->u.linear_gradient.colorline ) )
return 0;
/* skip VarIdx entries */
apaint->u.linear_gradient.p0.x = FT_NEXT_SHORT ( p );
FT_NEXT_ULONG ( p );
apaint->u.linear_gradient.p0.y = FT_NEXT_SHORT ( p );
FT_NEXT_ULONG ( p );
apaint->u.linear_gradient.p1.x = FT_NEXT_SHORT ( p );
FT_NEXT_ULONG ( p );
apaint->u.linear_gradient.p1.y = FT_NEXT_SHORT ( p );
FT_NEXT_ULONG ( p );
apaint->u.linear_gradient.p2.x = FT_NEXT_SHORT ( p );
FT_NEXT_ULONG ( p );
apaint->u.linear_gradient.p2.y = FT_NEXT_SHORT ( p );
FT_NEXT_ULONG ( p );
}
else if ( apaint->format == FT_COLR_PAINTFORMAT_RADIAL_GRADIENT )
@ -444,22 +435,15 @@
&apaint->u.radial_gradient.colorline ) )
return 0;
/* skip VarIdx entries */
apaint->u.radial_gradient.c0.x = FT_NEXT_SHORT ( p );
FT_NEXT_ULONG ( p );
apaint->u.radial_gradient.c0.y = FT_NEXT_SHORT ( p );
FT_NEXT_ULONG ( p );
apaint->u.radial_gradient.r0 = FT_NEXT_USHORT ( p );
FT_NEXT_ULONG ( p );
apaint->u.radial_gradient.c1.x = FT_NEXT_SHORT ( p );
FT_NEXT_ULONG ( p );
apaint->u.radial_gradient.c1.y = FT_NEXT_SHORT ( p );
FT_NEXT_ULONG ( p );
apaint->u.radial_gradient.r1 = FT_NEXT_USHORT ( p );
FT_NEXT_ULONG ( p );
}
else if ( apaint->format == FT_COLR_PAINTFORMAT_SWEEP_GRADIENT )
@ -472,16 +456,11 @@
&apaint->u.sweep_gradient.colorline ) )
return 0;
/* skip VarIdx entries */
apaint->u.sweep_gradient.center.x = FT_NEXT_SHORT ( p );
FT_NEXT_ULONG ( p );
apaint->u.sweep_gradient.center.y = FT_NEXT_SHORT ( p );
FT_NEXT_ULONG ( p );
apaint->u.sweep_gradient.start_angle = FT_NEXT_LONG( p );
FT_NEXT_ULONG ( p );
apaint->u.sweep_gradient.end_angle = FT_NEXT_LONG( p );
FT_NEXT_ULONG ( p );
}
else if ( apaint->format == FT_COLR_PAINTFORMAT_TRANSFORMED )
@ -501,19 +480,12 @@
apaint->u.transformed.paint.p = paint_p;
apaint->u.transformed.paint.insert_root_transform = 0;
/* skip VarIdx entries */
apaint->u.transformed.affine.xx = FT_NEXT_LONG( p );
FT_NEXT_ULONG( p );
apaint->u.transformed.affine.yx = FT_NEXT_LONG( p );
FT_NEXT_ULONG( p );
apaint->u.transformed.affine.xy = FT_NEXT_LONG( p );
FT_NEXT_ULONG( p );
apaint->u.transformed.affine.yy = FT_NEXT_LONG( p );
FT_NEXT_ULONG( p );
apaint->u.transformed.affine.dx = FT_NEXT_LONG( p );
FT_NEXT_ULONG( p );
apaint->u.transformed.affine.dy = FT_NEXT_LONG( p );
FT_NEXT_ULONG( p );
}
else if ( apaint->format == FT_COLR_PAINTFORMAT_TRANSLATE )
@ -533,11 +505,8 @@
apaint->u.translate.paint.p = paint_p;
apaint->u.translate.paint.insert_root_transform = 0;
/* skip VarIdx entries */
apaint->u.translate.dx = FT_NEXT_LONG( p );
FT_NEXT_ULONG( p );
apaint->u.translate.dy = FT_NEXT_LONG( p );
FT_NEXT_ULONG( p );
}
else if ( apaint->format == FT_COLR_PAINTFORMAT_ROTATE )
@ -557,14 +526,10 @@
apaint->u.rotate.paint.p = paint_p;
apaint->u.rotate.paint.insert_root_transform = 0;
/* skip VarIdx entries */
apaint->u.rotate.angle = FT_NEXT_LONG( p );
FT_NEXT_ULONG( p );
apaint->u.rotate.center_x = FT_NEXT_LONG( p );
FT_NEXT_ULONG( p );
apaint->u.rotate.center_y = FT_NEXT_LONG( p );
FT_NEXT_ULONG( p );
}
else if ( apaint->format == FT_COLR_PAINTFORMAT_SKEW )
@ -584,16 +549,11 @@
apaint->u.skew.paint.p = paint_p;
apaint->u.skew.paint.insert_root_transform = 0;
/* skip VarIdx entries */
apaint->u.skew.x_skew_angle = FT_NEXT_LONG( p );
FT_NEXT_ULONG( p );
apaint->u.skew.y_skew_angle = FT_NEXT_LONG( p );
FT_NEXT_ULONG( p );
apaint->u.skew.center_x = FT_NEXT_LONG( p );
FT_NEXT_ULONG( p );
apaint->u.skew.center_y = FT_NEXT_LONG( p );
FT_NEXT_ULONG( p );
}
else if ( apaint->format == FT_COLR_PAINTFORMAT_COMPOSITE )
@ -814,14 +774,11 @@
/* Iterator points at first `ColorStop` of `ColorLine`. */
p = iterator->p;
/* skip VarIdx entries */
color_stop->stop_offset = FT_NEXT_USHORT ( p );
FT_NEXT_ULONG ( p );
color_stop->color.palette_index = FT_NEXT_USHORT ( p );
color_stop->color.alpha = FT_NEXT_USHORT ( p );
FT_NEXT_ULONG ( p );
iterator->p = p;
iterator->current_color_stop++;