forked from minhngoc25a/freetype2
Handle cascaded transformations correctly.
We use homogeneous coordinates to properly calculate an equivalent transformation correctly.
This commit is contained in:
parent
3f6f939378
commit
c492bf3f0a
|
@ -392,25 +392,51 @@
|
||||||
|
|
||||||
FT_CALLBACK_DEF( void )
|
FT_CALLBACK_DEF( void )
|
||||||
ft_svg_glyph_transform( FT_Glyph svg_glyph,
|
ft_svg_glyph_transform( FT_Glyph svg_glyph,
|
||||||
const FT_Matrix* matrix,
|
const FT_Matrix* _matrix,
|
||||||
const FT_Vector* delta )
|
const FT_Vector* _delta )
|
||||||
{
|
{
|
||||||
FT_SvgGlyph glyph = (FT_SvgGlyph)svg_glyph;
|
FT_SvgGlyph glyph = (FT_SvgGlyph)svg_glyph;
|
||||||
|
|
||||||
if ( matrix )
|
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 )
|
||||||
{
|
{
|
||||||
FT_Matrix a, b;
|
tmp_matrix.xx = 0x10000;
|
||||||
a = glyph->transform;
|
tmp_matrix.xy = 0;
|
||||||
b = *matrix;
|
tmp_matrix.yx = 0;
|
||||||
FT_Matrix_Multiply( &b, &a );
|
tmp_matrix.yy = 0x10000;
|
||||||
glyph->transform = a;
|
matrix = &tmp_matrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( delta )
|
if ( !delta )
|
||||||
{
|
{
|
||||||
glyph->delta.x = ADD_LONG( glyph->delta.x, delta->x );
|
tmp_delta.x = 0;
|
||||||
glyph->delta.y = ADD_LONG( glyph->delta.y, delta->y );
|
tmp_delta.y = 0;
|
||||||
|
delta = &tmp_delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
a = glyph->transform;
|
||||||
|
b = *matrix;
|
||||||
|
FT_Matrix_Multiply( &b, &a );
|
||||||
|
|
||||||
|
x = ADD_LONG(ADD_LONG(
|
||||||
|
FT_MulFix(matrix->xx, glyph->delta.x),
|
||||||
|
FT_MulFix(matrix->xy, glyph->delta.y)),
|
||||||
|
delta->x);
|
||||||
|
y = ADD_LONG(ADD_LONG(
|
||||||
|
FT_MulFix(matrix->yx, glyph->delta.x),
|
||||||
|
FT_MulFix(matrix->yy, glyph->delta.y)),
|
||||||
|
delta->y);
|
||||||
|
glyph->delta.x = x;
|
||||||
|
glyph->delta.y = y;
|
||||||
|
|
||||||
|
glyph->transform = a;
|
||||||
}
|
}
|
||||||
|
|
||||||
FT_CALLBACK_DEF( FT_Error )
|
FT_CALLBACK_DEF( FT_Error )
|
||||||
|
|
|
@ -190,26 +190,51 @@
|
||||||
static FT_Error
|
static FT_Error
|
||||||
ft_svg_transform( FT_Renderer renderer,
|
ft_svg_transform( FT_Renderer renderer,
|
||||||
FT_GlyphSlot slot,
|
FT_GlyphSlot slot,
|
||||||
const FT_Matrix* matrix,
|
const FT_Matrix* _matrix,
|
||||||
const FT_Vector* delta )
|
const FT_Vector* _delta )
|
||||||
{
|
{
|
||||||
FT_SVG_Document doc = (FT_SVG_Document)slot->other;
|
FT_SVG_Document doc = (FT_SVG_Document)slot->other;
|
||||||
|
|
||||||
if ( matrix )
|
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 )
|
||||||
{
|
{
|
||||||
FT_Matrix a, b;
|
tmp_matrix.xx = 0x10000;
|
||||||
a = doc->transform;
|
tmp_matrix.xy = 0;
|
||||||
b = *matrix;
|
tmp_matrix.yx = 0;
|
||||||
FT_Matrix_Multiply( &b, &a );
|
tmp_matrix.yy = 0x10000;
|
||||||
doc->transform = a;
|
matrix = &tmp_matrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( delta )
|
if ( !delta )
|
||||||
{
|
{
|
||||||
doc->delta.x = ADD_LONG( doc->delta.x, delta->x );
|
tmp_delta.x = 0;
|
||||||
doc->delta.y = ADD_LONG( doc->delta.y, delta->y );
|
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;
|
return FT_Err_Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue