Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 692) +++ trunk/src/draw.c (revision 693) @@ -41,19 +41,58 @@ if (mx[4] < 0) *sy = -(*sy);*/ } +static rnd_coord_t MIN4(rnd_coord_t a, rnd_coord_t b, rnd_coord_t c, rnd_coord_t d) +{ + rnd_coord_t min = a; + if (b < min) min = b; + if (c < min) min = c; + if (d < min) min = d; + return min; +} + +static rnd_coord_t MAX4(rnd_coord_t a, rnd_coord_t b, rnd_coord_t c, rnd_coord_t d) +{ + rnd_coord_t max = a; + if (b > max) max = b; + if (c > max) max = c; + if (d > max) max = d; + return max; +} + 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; void *o; rnd_xform_mx_t *mx = NULL; + camv_rtree_box_t vtmp, *view = (camv_rtree_box_t *)®ion->view; if (ly->enable_mx) { + rnd_coord_t x1, y1, x2, y2, x3, y3, x4, y4, sx, sy; mx = &ly->mx; ly->mx_rotdeg = mx_extract_rot(*mx); mx_extract_scale(*mx, &ly->mx_sx, &ly->mx_sy); + x1 = rnd_xform_x((*mx), view->x1, view->y1); + y1 = rnd_xform_y((*mx), view->x1, view->y1); + x2 = rnd_xform_x((*mx), view->x2, view->y2); + y2 = rnd_xform_y((*mx), view->x2, view->y2); + x3 = rnd_xform_x((*mx), view->x1, view->y2); + y3 = rnd_xform_y((*mx), view->x1, view->y2); + x4 = rnd_xform_x((*mx), view->x2, view->y1); + y4 = rnd_xform_y((*mx), view->x2, view->y1); + +/* rnd_trace("orig: %mm;%mm %mm;%mm\n", view->x1, view->y1, view->x1, view->y2);*/ + sx = (view->x2 - view->x1)*2; sy = (view->y2 - view->y1)*2; + + vtmp.x1 = MIN4(x1, x2, x3, x4) - sx; vtmp.y1 = MIN4(y1, y2, y3, y4) - sy; + vtmp.x2 = MAX4(x1, x2, x3, x4) + sx; vtmp.y2 = MAX4(y1, y2, y3, y4) + sy; + + view = &vtmp; + +/* rnd_trace(" %mm;%mm %mm;%mm\n", vtmp.x1, vtmp.y1, vtmp.x2, vtmp.y2);*/ } - for(o = camv_rtree_first(&it, &ly->objs, (camv_rtree_box_t *)®ion->view); o != NULL; o = camv_rtree_next(&it)) { + for(o = camv_rtree_first(&it, &ly->objs, view); o != NULL; o = camv_rtree_next(&it)) { + camv_any_obj_t *obj = o; obj->proto.calls->draw(obj, gc, mx); }