summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Röttsches <drott@chromium.org>2021-07-26 17:32:22 +0300
committerWerner Lemberg <wl@gnu.org>2021-07-29 06:01:34 +0000
commit66189807b8f42411d981bc7d2a3cc7f753cf22ae (patch)
tree8a256604e54ecc987fb56bd6e5668c107e0d932a
parent48df0fa6522f078498d3be92686522b1a512481f (diff)
downloadfreetype2-66189807b8f42411d981bc7d2a3cc7f753cf22ae.tar.gz
[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.
-rw-r--r--include/freetype/ftcolor.h6
-rw-r--r--src/sfnt/ttcolr.c23
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;
}