static void _adg_arrange(AdgEntity *entity) { AdgAlignmentPrivate *data; const CpmlExtents *extents; CpmlExtents new_extents; cairo_matrix_t ctm, ctm_inverted, old_map; if (_ADG_OLD_ENTITY_CLASS->arrange == NULL) return; data = adg_alignment_get_instance_private((AdgAlignment *) entity); extents = adg_entity_get_extents(entity); data->shift.x = 0; data->shift.y = 0; /* The shift is performed only when relevant */ if (data->factor.x != 0 || data->factor.y != 0) { /* Force the ctm to be the identity matrix */ adg_matrix_copy(&old_map, adg_entity_get_global_map(entity)); adg_matrix_copy(&ctm, adg_entity_get_global_map(entity)); adg_matrix_transform(&ctm, adg_entity_get_local_matrix(entity), ADG_TRANSFORM_AFTER); adg_matrix_copy(&ctm_inverted, &ctm); cairo_matrix_invert(&ctm_inverted); adg_entity_transform_global_map(entity, &ctm_inverted, ADG_TRANSFORM_AFTER); adg_entity_global_changed(entity); /* Calculating the shift */ _ADG_OLD_ENTITY_CLASS->arrange(entity); extents = adg_entity_get_extents(entity); if (extents->is_defined) { data->shift.x = -extents->size.x * data->factor.x; data->shift.y = -extents->size.y * data->factor.y; cpml_vector_transform(&data->shift, &ctm); } /* Restore the old global map */ adg_entity_set_global_map(entity, &old_map); adg_entity_global_changed(entity); } /* Add the shift to the extents */ _ADG_OLD_ENTITY_CLASS->arrange(entity); cpml_extents_copy(&new_extents, adg_entity_get_extents(entity)); new_extents.org.x += data->shift.x; new_extents.org.y += data->shift.y; adg_entity_set_extents(entity, &new_extents); }
static gboolean _adg_get_map(GtkWidget *widget, gboolean local_space, cairo_matrix_t *map, cairo_matrix_t *inverted) { AdgGtkAreaPrivate *data; AdgEntity *entity; data = ((AdgGtkArea *) widget)->data; entity = (AdgEntity *) data->canvas; if (entity == NULL) return FALSE; if (local_space) { adg_matrix_copy(map, adg_entity_get_local_map(entity)); /* The inverted map is subject to the global matrix */ adg_matrix_copy(inverted, adg_entity_get_global_matrix(entity)); adg_matrix_transform(inverted, map, ADG_TRANSFORM_BEFORE); } else { adg_matrix_copy(map, adg_entity_get_global_map(entity)); adg_matrix_copy(inverted, map); } return cairo_matrix_invert(inverted) == CAIRO_STATUS_SUCCESS; }