diff options
author | Moazin Khatti <moazinkhatri@gmail.com> | 2019-08-17 23:42:27 +0500 |
---|---|---|
committer | Moazin Khatti <moazinkhatri@gmail.com> | 2019-08-17 23:42:27 +0500 |
commit | 503977f55c22d3286fb4fb623b5f12c89812a62d (patch) | |
tree | e04e5ca7e6d17e5b179b4a16d5413018f1d3dd4a /src/svg/ftsvg.c | |
parent | 9df8c7dd27df66c79327babf7c011cc145c95563 (diff) | |
download | freetype2-503977f55c22d3286fb4fb623b5f12c89812a62d.tar.gz |
Adds transformation support for OT-SVG glyphs.ot-svg-clean
* include/freetype/ftglyph.h: Adds `transform' and `delta' fields
to `FT_SvgGlyphRed'.
* include/freetype/otsvg.h: Adds `transform' and `delta' fields to
`FT_SVG_Document'.
* src/base/ftglyph.c: Creates method `ft_svg_glyph_transform' and
modifies existing functions for the new fields.
* src/sfnt/ttsvg.c: (tt_face_load_svg_doc) Set `transform' to unity
and `delta' to zero by default.
* src/svg/ftsvg.c: Adds `ft_svg_transform'.
Diffstat (limited to 'src/svg/ftsvg.c')
-rw-r--r-- | src/svg/ftsvg.c | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/src/svg/ftsvg.c b/src/svg/ftsvg.c index 901f3e82e..298ce650e 100644 --- a/src/svg/ftsvg.c +++ b/src/svg/ftsvg.c @@ -175,6 +175,57 @@ return 0; } + static FT_Error + ft_svg_transform( FT_Renderer renderer, + FT_GlyphSlot slot, + const FT_Matrix* _matrix, + const FT_Vector* _delta ) + { + FT_SVG_Document doc = (FT_SVG_Document)slot->other; + + FT_Matrix* matrix = _matrix; + FT_Vector* delta = _delta; + FT_Matrix tmp_matrix; + FT_Vector tmp_delta; + FT_Matrix a, b; + FT_Pos x, y; + + if ( !matrix ) + { + tmp_matrix.xx = 0x10000; + tmp_matrix.xy = 0; + tmp_matrix.yx = 0; + tmp_matrix.yy = 0x10000; + matrix = &tmp_matrix; + } + + if ( !delta ) + { + tmp_delta.x = 0; + tmp_delta.y = 0; + } + + a = doc->transform; + b = *matrix; + FT_Matrix_Multiply( &b, &a ); + + + x = ADD_LONG(ADD_LONG( + FT_MulFix(matrix->xx, doc->delta.x), + FT_MulFix(matrix->xy, doc->delta.y)), + delta->x); + y = ADD_LONG(ADD_LONG( + FT_MulFix(matrix->yx, doc->delta.x), + FT_MulFix(matrix->yy, doc->delta.y)), + delta->y); + doc->delta.x = x; + doc->delta.y = y; + + doc->transform = a; + + return FT_Err_Ok; + } + #endif #ifdef FT_CONFIG_OPTION_SVG @@ -201,7 +252,7 @@ PUT_SVG_MODULE( ft_svg_get_interface ), /* get_interface */ SVG_GLYPH_FORMAT, (FT_Renderer_RenderFunc)PUT_SVG_MODULE( ft_svg_render ), - NULL, + (FT_Renderer_TransformFunc)PUT_SVG_MODULE( ft_svg_transform ), NULL, NULL, NULL |