summaryrefslogtreecommitdiff
path: root/src/svg/ftsvg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/svg/ftsvg.c')
-rw-r--r--src/svg/ftsvg.c53
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