static void swf_svg_print_matrix(SWFReader *read, GF_Matrix2D *mat) { if (!gf_mx2d_is_identity(*mat)) { GF_Point2D scale; GF_Point2D translate; Fixed rotate; if( gf_mx2d_decompose(mat, &scale, &rotate, &translate)) { swf_svg_print(read, "transform=\""); if (translate.x != 0 || translate.y != 0) { swf_svg_print(read, "translate(%g, %g) ", FIX2FLT(translate.x), FIX2FLT(translate.y)); } if (rotate != 0) { swf_svg_print(read, "rotate(%g) ", FIX2FLT(rotate)); } if (scale.x != FIX_ONE || scale.y != FIX_ONE) { swf_svg_print(read, "scale(%g, %g) ", FIX2FLT(scale.x), FIX2FLT(scale.y)); } swf_svg_print(read, "\" "); } else { swf_svg_print(read, "transform=\"matrix(%g,%g,%g,%g,%g,%g)\" ", FIX2FLT(mat->m[0]), FIX2FLT(mat->m[3]), FIX2FLT(mat->m[1]), FIX2FLT(mat->m[4]), FIX2FLT(mat->m[2]), FIX2FLT(mat->m[5]) ); } } }
static void StatSVGAttribute(GF_SceneStatistics *stat, GF_FieldInfo *field) { u32 i = 0; stat->nb_svg_attributes++; switch (field->fieldType) { case SVG_PathData_datatype: { #if USE_GF_PATH SVG_PathData *d = (SVG_PathData *)field->far_ptr; for (i=0; i<d->n_points; i++) { StatSVGPoint(stat, &(d->points[i])); stat->count_2d ++; } #else SVG_PathData *d = (SVG_PathData *)field->far_ptr; for (i=0; i<gf_list_count(d->points); i++) { SVG_Point *p = (SVG_Point *)gf_list_get(d->points, i); StatSVGPoint(stat, (SFVec2f *)p); stat->count_2d ++; } #endif } break; case SVG_ViewBox_datatype: { SVG_ViewBox *vB = (SVG_ViewBox *)field->far_ptr; StatFixed(stat, vB->x, 0); StatFixed(stat, vB->y, 0); StatFixed(stat, vB->width, 0); StatFixed(stat, vB->height, 0); } break; case SVG_Points_datatype: case SVG_Coordinates_datatype: { GF_List *points = *((GF_List **)field->far_ptr); for (i=0; i<gf_list_count(points); i++) { SVG_Point *p = (SVG_Point *)gf_list_get(points, i); StatSVGPoint(stat, (SFVec2f *)p); stat->count_2d ++; } } break; case SVG_Transform_datatype: { GF_Matrix2D *mx = &((SVG_Transform *)field->far_ptr)->mat; if (!gf_mx2d_is_identity(*mx) && !(!mx->m[0] && !mx->m[1] && !mx->m[3] && !mx->m[4])) { StatFixed(stat, mx->m[0], 1); StatFixed(stat, mx->m[1], 1); StatFixed(stat, mx->m[3], 1); StatFixed(stat, mx->m[4], 1); StatFixed(stat, mx->m[2], 0); StatFixed(stat, mx->m[5], 0); } } break; case SVG_Motion_datatype: { GF_Matrix2D *mx = (GF_Matrix2D *)field->far_ptr; if (!gf_mx2d_is_identity(*mx) && !(!mx->m[0] && !mx->m[1] && !mx->m[3] && !mx->m[4])) { StatFixed(stat, mx->m[0], 1); StatFixed(stat, mx->m[1], 1); StatFixed(stat, mx->m[3], 1); StatFixed(stat, mx->m[4], 1); StatFixed(stat, mx->m[2], 0); StatFixed(stat, mx->m[5], 0); } } break; case SVG_Length_datatype: case SVG_Coordinate_datatype: StatFixed(stat, ((SVG_Number *)field->far_ptr)->value, 0); break; } }