From 83a10fa1535f0337200352813f7ada795ebaba9e Mon Sep 17 00:00:00 2001 From: Nicola Fontana Date: Sat, 29 Aug 2009 21:36:32 +0200 Subject: [PATCH] [AdgEntity] get_{global,local}_matrix now virtuals Having get_local_matrix() (and get_global_matrix() for consistency) implemented as a virtual function allows to override it for special local matrix needs, such as in AdgToyText. --- adg/adg-entity.c | 56 +++++++++++++++++++++++++++++++++++--------------------- adg/adg-entity.h | 4 ++++ 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/adg/adg-entity.c b/adg/adg-entity.c index 4d2b45ad..5af54968 100644 --- a/adg/adg-entity.c +++ b/adg/adg-entity.c @@ -92,6 +92,10 @@ static void set_global_map (AdgEntity *entity, const AdgMatrix *map); static void set_local_map (AdgEntity *entity, const AdgMatrix *map); +static void get_global_matrix (AdgEntity *entity, + AdgMatrix *matrix); +static void get_local_matrix (AdgEntity *entity, + AdgMatrix *matrix); static void real_invalidate (AdgEntity *entity, gpointer user_data); static void real_render (AdgEntity *entity, @@ -122,6 +126,8 @@ adg_entity_class_init(AdgEntityClass *klass) klass->parent_set = NULL; klass->context_set = NULL; + klass->get_global_matrix = get_global_matrix; + klass->get_local_matrix = get_local_matrix; klass->invalidate = NULL; klass->render = NULL; @@ -572,19 +578,10 @@ adg_entity_transform_global_map(AdgEntity *entity, void adg_entity_get_global_matrix(AdgEntity *entity, AdgMatrix *matrix) { - AdgEntityPrivate *data; - g_return_if_fail(ADG_IS_ENTITY(entity)); g_return_if_fail(matrix != NULL); - data = entity->data; - - if (data->parent == NULL) { - adg_matrix_copy(matrix, &data->global_map); - } else { - adg_entity_get_global_matrix((AdgEntity *) data->parent, matrix); - cairo_matrix_multiply(matrix, &data->global_map, matrix); - } + ADG_ENTITY_GET_CLASS(entity)->get_global_matrix(entity, matrix); } /** @@ -666,19 +663,10 @@ adg_entity_transform_local_map(AdgEntity *entity, void adg_entity_get_local_matrix(AdgEntity *entity, AdgMatrix *matrix) { - AdgEntityPrivate *data; - g_return_if_fail(ADG_IS_ENTITY(entity)); g_return_if_fail(matrix != NULL); - data = entity->data; - - if (data->parent == NULL) { - adg_matrix_copy(matrix, &data->local_map); - } else { - adg_entity_get_local_matrix((AdgEntity *) data->parent, matrix); - cairo_matrix_multiply(matrix, &data->local_map, matrix); - } + ADG_ENTITY_GET_CLASS(entity)->get_local_matrix(entity, matrix); } /** @@ -742,7 +730,7 @@ adg_entity_get_style(AdgEntity *entity, AdgStyleSlot style_slot) } if (data->parent) - return adg_entity_get_style((AdgEntity *) data->parent, style_slot); + return adg_entity_get_style(data->parent, style_slot); return NULL; } @@ -918,6 +906,32 @@ set_local_map(AdgEntity *entity, const AdgMatrix *map) } static void +get_global_matrix(AdgEntity *entity, AdgMatrix *matrix) +{ + AdgEntityPrivate *data = entity->data; + + if (data->parent == NULL) { + adg_matrix_copy(matrix, &data->global_map); + } else { + adg_entity_get_global_matrix(data->parent, matrix); + cairo_matrix_multiply(matrix, &data->global_map, matrix); + } +} + +static void +get_local_matrix(AdgEntity *entity, AdgMatrix *matrix) +{ + AdgEntityPrivate *data = entity->data; + + if (data->parent == NULL) { + adg_matrix_copy(matrix, &data->local_map); + } else { + adg_entity_get_local_matrix(data->parent, matrix); + cairo_matrix_multiply(matrix, &data->local_map, matrix); + } +} + +static void real_invalidate(AdgEntity *entity, gpointer user_data) { AdgEntityClass *entity_class; diff --git a/adg/adg-entity.h b/adg/adg-entity.h index f3c78a48..199dcfc9 100644 --- a/adg/adg-entity.h +++ b/adg/adg-entity.h @@ -59,6 +59,10 @@ struct _AdgEntityClass { void (*context_set) (AdgEntity *entity, AdgContext *old_context); /* Virtual Table */ + void (*get_global_matrix) (AdgEntity *entity, + AdgMatrix *matrix); + void (*get_local_matrix) (AdgEntity *entity, + AdgMatrix *matrix); gboolean (*invalidate) (AdgEntity *entity); gboolean (*render) (AdgEntity *entity, cairo_t *cr); -- 2.11.4.GIT