diff options
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 |