From e3bb24569b85ff5fea4dcc3eb10e86ae59608967 Mon Sep 17 00:00:00 2001 From: lecoanet Date: Wed, 3 Mar 2004 10:16:24 +0000 Subject: Changes to implement a new behavior for -position attribute and local transforms. --- generic/Item.c | 50 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 10 deletions(-) (limited to 'generic/Item.c') diff --git a/generic/Item.c b/generic/Item.c index 5935917..ae71348 100644 --- a/generic/Item.c +++ b/generic/Item.c @@ -1766,16 +1766,18 @@ QueryItem(ZnItem item, */ static void ComposeTransform(ZnTransfo *transfo, + ZnPoint *pos, ZnTransfo *current_t, ZnTransfo *new_t, ZnBool compose_scale, ZnBool compose_rot) { ZnBool full; + ZnTransfo t, t2; full = compose_scale && compose_rot; - if (!transfo && full) { + if (!transfo && !pos && full) { *new_t = *current_t; return; } @@ -1784,20 +1786,40 @@ ComposeTransform(ZnTransfo *transfo, * Full concatenation. */ /*ZnPrintTransfo(transfo);*/ - ZnTransfoCompose(new_t, transfo, current_t); + if (pos) { + if (!transfo) { + ZnTransfoSetIdentity(&t); + } + else { + t = *transfo; + } + ZnTranslate(&t, pos->x, pos->y); + ZnTransfoCompose(new_t, &t, current_t); + } + else { + ZnTransfoCompose(new_t, transfo, current_t); + } } else { - ZnPoint scale, trans, local_scale, local_trans, p, p2; + ZnPoint scale, trans, local_scale, local_trans, p; ZnReal local_rot, rot; - ZnTransfo t, t2; ZnTransfoSetIdentity(new_t); ZnTransfoDecompose(transfo, &local_scale, &local_trans, &local_rot, NULL); ZnScale(new_t, local_scale.x, local_scale.y); ZnRotateRad(new_t, local_rot); + ZnTransfoDecompose(current_t, &scale, &trans, &rot, NULL); - ZnTransformPoint(current_t, &local_trans, &p2); + if (pos) { + ZnTransfoSetIdentity(&t); + ZnTranslate(&t, pos->x, pos->y); + ZnTransfoCompose(&t2, &t, current_t); + ZnTransformPoint(&t2, &local_trans, &p); + } + else { + ZnTransformPoint(current_t, &local_trans, &p); + } if (compose_scale) { ZnScale(new_t, scale.x, scale.y); @@ -1805,7 +1827,7 @@ ComposeTransform(ZnTransfo *transfo, if (compose_rot) { ZnRotateRad(new_t, rot); } - ZnTranslate(new_t, p2.x, p2.y); + ZnTranslate(new_t, p.x, p.y); } } @@ -1822,10 +1844,11 @@ static void GetItemTransform(ZnItem item, ZnTransfo *t) { - ZnItem *items; + ZnItem *items; int i; ZnTransfo t_tmp, *t1, *t2, *swap; - + ZnPoint *pos = NULL; + if (item_stack == NULL) { item_stack = ZnListNew(16, sizeof(ZnItem)); } @@ -1843,7 +1866,13 @@ GetItemTransform(ZnItem item, t2 = &t_tmp; items = (ZnItem *) ZnListArray(item_stack); for (i = ZnListSize(item_stack)-1; i >= 0; i--) { - ComposeTransform(items[i]->transfo, t1, t2, + if (items[i]->class->pos_offset >= 0) { + pos = ((void *) items[i]) + items[i]->class->pos_offset; + if (pos->x == 0 && pos->y == 0) { + pos = NULL; + } + } + ComposeTransform(items[i]->transfo, pos, t1, t2, ISSET(items[i]->flags, ZN_COMPOSE_SCALE_BIT), ISSET(items[i]->flags, ZN_COMPOSE_ROTATION_BIT)); swap = t2; @@ -1893,6 +1922,7 @@ ZnFreeTransformStack(ZnWInfo *wi) void ZnPushTransform(ZnWInfo *wi, ZnTransfo *transfo, + ZnPoint *pos, ZnBool compose_scale, ZnBool compose_rot) { @@ -1907,7 +1937,7 @@ ZnPushTransform(ZnWInfo *wi, num_t = ZnListSize(wi->transfo_stack); ZnListAssertSize(wi->transfo_stack, num_t+1); next_t = (ZnTransfo *) ZnListAt(wi->transfo_stack, num_t); - ComposeTransform(transfo, wi->current_transfo, next_t, + ComposeTransform(transfo, pos, wi->current_transfo, next_t, compose_scale, compose_rot); wi->current_transfo = next_t; } -- cgit v1.1