aboutsummaryrefslogtreecommitdiff
path: root/generic/Item.c
diff options
context:
space:
mode:
authorlecoanet2004-03-03 10:16:24 +0000
committerlecoanet2004-03-03 10:16:24 +0000
commite3bb24569b85ff5fea4dcc3eb10e86ae59608967 (patch)
tree4a5a104f74812cd7ac1c914c90c5ae51053d767d /generic/Item.c
parent30852dd99b28fddaef4ac37bfa225da343c6be7e (diff)
downloadtkzinc-e3bb24569b85ff5fea4dcc3eb10e86ae59608967.zip
tkzinc-e3bb24569b85ff5fea4dcc3eb10e86ae59608967.tar.gz
tkzinc-e3bb24569b85ff5fea4dcc3eb10e86ae59608967.tar.bz2
tkzinc-e3bb24569b85ff5fea4dcc3eb10e86ae59608967.tar.xz
Changes to implement a new behavior for -position attribute and local transforms.
Diffstat (limited to 'generic/Item.c')
-rw-r--r--generic/Item.c50
1 files changed, 40 insertions, 10 deletions
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;
}