Index: trunk/src/data.h =================================================================== --- trunk/src/data.h (revision 688) +++ trunk/src/data.h (revision 689) @@ -61,6 +61,7 @@ /* cache */ rnd_xform_mx_t mx; /* drawin/rendering mx transformation; does not affect bbox */ + double mx_sx, mx_sy, mx_rotdeg; }; extern camv_design_t camv; Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 688) +++ trunk/src/draw.c (revision 689) @@ -27,6 +27,20 @@ #include #include "obj_any.h" +/* based on https://math.stackexchange.com/questions/13150/extracting-rotation-scale-values-from-2d-transformation-matrix/13165#13165 */ +static double mx_extract_rot(rnd_xform_mx_t mx) +{ + return atan2(mx[3], mx[4]) * RND_RAD_TO_DEG; +} +static void mx_extract_scale(rnd_xform_mx_t mx, double *sx, double *sy) +{ + *sx = sqrt(mx[0] * mx[0] + mx[1] * mx[1]); + *sy = sqrt(mx[3] * mx[3] + mx[4] * mx[4]); +/* This would be needed for mirroring + if (mx[0] < 0) *sx = -(*sx); + if (mx[4] < 0) *sy = -(*sy);*/ +} + void camv_draw_layer(camv_layer_t *ly, rnd_hid_gc_t gc, const rnd_hid_expose_ctx_t *region, rnd_xform_t *xform_caller) { camv_rtree_it_t it; @@ -33,8 +47,11 @@ void *o; rnd_xform_mx_t *mx = NULL; - if (ly->enable_mx) + if (ly->enable_mx) { mx = &ly->mx; + ly->mx_rotdeg = mx_extract_rot(*mx); + mx_extract_scale(*mx, &ly->mx_sx, &ly->mx_sy); + } for(o = camv_rtree_first(&it, &ly->objs, (camv_rtree_box_t *)®ion->view); o != NULL; o = camv_rtree_next(&it)) { camv_any_obj_t *obj = o; Index: trunk/src/obj_arc.c =================================================================== --- trunk/src/obj_arc.c (revision 688) +++ trunk/src/obj_arc.c (revision 689) @@ -42,7 +42,17 @@ { rnd_hid_set_line_cap(gc, rnd_cap_round); rnd_hid_set_line_width(gc, obj->arc.thick); - rnd_render->draw_arc(gc, obj->arc.cx, obj->arc.cy, obj->arc.r, obj->arc.r, obj->arc.start, obj->arc.delta); + if (mx != NULL) { + camv_layer_t *ly = obj->arc.parent_layer; + rnd_coord_t cx = rnd_xform_x((*mx), obj->arc.cx, obj->arc.cy); + rnd_coord_t cy = rnd_xform_y((*mx), obj->arc.cx, obj->arc.cy); + double rx = obj->arc.r * ly->mx_sx, ry = obj->arc.r * ly->mx_sy; + double start= obj->arc.start - ly->mx_rotdeg, delta = obj->arc.delta; + + rnd_render->draw_arc(gc, cx, cy, rx, ry, start, delta); + } + else + rnd_render->draw_arc(gc, obj->arc.cx, obj->arc.cy, obj->arc.r, obj->arc.r, obj->arc.start, obj->arc.delta); } static void camv_arc_bbox(camv_any_obj_t *obj)