From eddee965ffa29dc7681d12befa0cf90e4bf6d5c5 Mon Sep 17 00:00:00 2001 From: Nicola Fontana Date: Wed, 13 Aug 2008 22:07:14 +0200 Subject: [PATCH] Implemented adg_entity_build_{paper2model,model2paper}() --- adg/adg-entity.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ adg/adg-entity.h | 4 ++++ 2 files changed, 64 insertions(+) diff --git a/adg/adg-entity.c b/adg/adg-entity.c index 09b5dd61..0b33293a 100644 --- a/adg/adg-entity.c +++ b/adg/adg-entity.c @@ -387,6 +387,66 @@ adg_entity_scale_to_paper(AdgEntity *entity, cairo_t *cr) } /** + * adg_entity_build_paper2model: + * @entity: an #AdgEntity + * @matrix: the destination matrix + * + * Builds a matrix to translate from paper to model space and + * put the result in @matrix. + * + * Return value: %TRUE on success, %FALSE on errors + **/ +gboolean +adg_entity_build_paper2model(AdgEntity *entity, AdgMatrix *matrix) +{ + cairo_status_t status; + + g_return_val_if_fail(ADG_IS_ENTITY(entity), FALSE); + g_return_val_if_fail(matrix != NULL, FALSE); + + adg_matrix_set(matrix, adg_entity_get_model_matrix(entity)); + status = cairo_matrix_invert(matrix); + if (status != CAIRO_STATUS_SUCCESS) { + g_error("Unable to invert model matrix (cairo message: %s)", + cairo_status_to_string(status)); + return FALSE; + } + + cairo_matrix_multiply(matrix, matrix, adg_entity_get_paper_matrix(entity)); + return TRUE; +} + +/** + * adg_entity_build_model2paper: + * @entity: an #AdgEntity + * @matrix: the destination matrix + * + * Builds a matrix to translate from model to paper space and + * put the result in @matrix. + * + * Return value: %TRUE on success, %FALSE on errors + **/ +gboolean +adg_entity_build_model2paper(AdgEntity *entity, AdgMatrix *matrix) +{ + cairo_status_t status; + + g_return_val_if_fail(ADG_IS_ENTITY(entity), FALSE); + g_return_val_if_fail(matrix != NULL, FALSE); + + adg_matrix_set(matrix, adg_entity_get_paper_matrix(entity)); + status = cairo_matrix_invert(matrix); + if (status != CAIRO_STATUS_SUCCESS) { + g_error("Unable to invert paper matrix (cairo message: %s)", + cairo_status_to_string(status)); + return FALSE; + } + + cairo_matrix_multiply(matrix, matrix, adg_entity_get_model_matrix(entity)); + return TRUE; +} + +/** * adg_entity_model_matrix_changed: * @entity: an #AdgEntity * @parent_matrix: the parent #AdgMatrix diff --git a/adg/adg-entity.h b/adg/adg-entity.h index fd6df4c7..e1e05b05 100644 --- a/adg/adg-entity.h +++ b/adg/adg-entity.h @@ -85,6 +85,10 @@ void adg_entity_set_context (AdgEntity *entity, AdgContext *context); const AdgMatrix*adg_entity_get_model_matrix (AdgEntity *entity); const AdgMatrix*adg_entity_get_paper_matrix (AdgEntity *entity); +gboolean adg_entity_build_paper2model (AdgEntity *entity, + AdgMatrix *matrix); +gboolean adg_entity_build_model2paper (AdgEntity *entity, + AdgMatrix *matrix); void adg_entity_scale_to_model (AdgEntity *entity, cairo_t *cr); void adg_entity_scale_to_paper (AdgEntity *entity, -- 2.11.4.GIT