[sfnt] PaintRotate/PaintRotateAroundCenter spec updates

* src/sfnt/ttcolr.c (read_paint): Implement spec change where
PaintRotate and PaintRotateAroundCenter were split for a more
compact format definition.  Update parsing to read shorter values
as changed in the spec.
* include/freetype/ftcolor.h (FT_PaintRotate): Update documentation.
This commit is contained in:
Dominik Röttsches 2021-07-23 19:02:51 +03:00 committed by Werner Lemberg
parent d7bdcb1bb5
commit 48df0fa652
2 changed files with 24 additions and 5 deletions

View File

@ -1173,7 +1173,9 @@ FT_BEGIN_HEADER
* rotated.
*
* angle ::
* The rotation angle that is to be applied.
* The rotation angle that is to be applied in degrees divided by
* 180.0 (as in the spec). Multiply by 180.0f to receive degrees
* value.
*
* center_x ::
* The x~coordinate of the pivot point of the rotation (in font

View File

@ -619,15 +619,32 @@
return 1;
}
else if ( apaint->format == FT_COLR_PAINTFORMAT_ROTATE )
else if ( apaint->format == FT_COLR_PAINTFORMAT_ROTATE ||
(FT_PaintFormat_Internal)apaint->format ==
FT_COLR_PAINTFORMAT_INTERNAL_ROTATE_CENTER )
{
apaint->u.rotate.paint.p = child_table_p;
apaint->u.rotate.paint.insert_root_transform = 0;
apaint->u.rotate.angle = FT_NEXT_LONG( p );
/* The angle is specified as F2DOT14 and our output type is an FT_Fixed,
* shift by 2 positions. */
apaint->u.rotate.angle = FT_NEXT_SHORT( p ) << 2;
apaint->u.rotate.center_x = FT_NEXT_LONG( p );
apaint->u.rotate.center_y = FT_NEXT_LONG( p );
if ( (FT_PaintFormat_Internal)apaint->format ==
FT_COLR_PAINTFORMAT_INTERNAL_ROTATE_CENTER )
{
/* The center is specified as Int16 in font units, shift by 16 bits to
* convert to our FT_Fixed output type. */
apaint->u.rotate.center_x = FT_NEXT_SHORT( p ) << 16;
apaint->u.rotate.center_y = FT_NEXT_SHORT( p ) << 16;
}
else
{
apaint->u.rotate.center_x = 0;
apaint->u.rotate.center_y = 0;
}
apaint->format = FT_COLR_PAINTFORMAT_ROTATE;
return 1;
}