From 66189807b8f42411d981bc7d2a3cc7f753cf22ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20R=C3=B6ttsches?= Date: Mon, 26 Jul 2021 17:32:22 +0300 Subject: [sfnt] 'COLR' v1 PaintSkew related spec updates * src/sfnt/ttcolr.c (read_paint): Implement spec changes around PaintSkew, PaintSkewAroundCenter. Update parsing to read shorter values as changed in the spec. * include/freetype/ftcolor.h (FT_PaintSkew): Update documentation. --- include/freetype/ftcolor.h | 6 ++++-- src/sfnt/ttcolr.c | 23 ++++++++++++++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/include/freetype/ftcolor.h b/include/freetype/ftcolor.h index 8f2507c6a..43e463e98 100644 --- a/include/freetype/ftcolor.h +++ b/include/freetype/ftcolor.h @@ -1219,10 +1219,12 @@ FT_BEGIN_HEADER * skewed. * * x_skew_angle :: - * The skewing angle in x~direction. + * The skewing angle in x~direction in degrees divided by 180.0 + * (as in the spec). Multiply by 180.0f to receive degrees. * * y_skew_angle :: - * The skewing angle in y~direction. + * The skewing angle in y~direction in degrees divided by 180.0 + * (as in the spec). Multiply by 180.0f to receive degrees. * * center_x :: * The x~coordinate of the pivot point of the skew (in font units). diff --git a/src/sfnt/ttcolr.c b/src/sfnt/ttcolr.c index ca8a7a2da..e46ca48da 100644 --- a/src/sfnt/ttcolr.c +++ b/src/sfnt/ttcolr.c @@ -649,16 +649,29 @@ return 1; } - else if ( apaint->format == FT_COLR_PAINTFORMAT_SKEW ) + else if ( apaint->format == FT_COLR_PAINTFORMAT_SKEW || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_SKEW_CENTER ) { apaint->u.skew.paint.p = child_table_p; apaint->u.skew.paint.insert_root_transform = 0; - apaint->u.skew.x_skew_angle = FT_NEXT_LONG( p ); - apaint->u.skew.y_skew_angle = FT_NEXT_LONG( p ); + apaint->u.skew.x_skew_angle = FT_NEXT_SHORT( p ) << 2; + apaint->u.skew.y_skew_angle = FT_NEXT_SHORT( p ) << 2; + + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_SKEW_CENTER ) + { + apaint->u.skew.center_x = FT_NEXT_SHORT( p ) << 16; + apaint->u.skew.center_y = FT_NEXT_SHORT( p ) << 16; + } + else + { + apaint->u.skew.center_x = 0; + apaint->u.skew.center_y = 0; + } - apaint->u.skew.center_x = FT_NEXT_LONG( p ); - apaint->u.skew.center_y = FT_NEXT_LONG( p ); + apaint->format = FT_COLR_PAINTFORMAT_SKEW; return 1; } -- cgit v1.2.1