From ee2cfe7b280e4d93b6d17ddec5f81fb23258b056 Mon Sep 17 00:00:00 2001 From: Nicola Fontana Date: Fri, 11 Jul 2008 17:35:32 +0000 Subject: [PATCH] Implemented adg_style_from_id() and tested on AdgLineStyle --- adg/adg-canvas.c | 3 ++- adg/adg-dim-style.c | 2 +- adg/adg-line-style.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ adg/adg-style.c | 29 +++++++++++++++++++++++++++++ adg/adg-style.h | 3 +++ 5 files changed, 82 insertions(+), 2 deletions(-) diff --git a/adg/adg-canvas.c b/adg/adg-canvas.c index 29d6152f..0fc38e34 100644 --- a/adg/adg-canvas.c +++ b/adg/adg-canvas.c @@ -139,7 +139,8 @@ adg_canvas_init (AdgCanvas *canvas) ADG_TYPE_CANVAS, AdgCanvasPrivate); - priv->line_style = (AdgLineStyle *) adg_line_style_from_id (ADG_LINE_STYLE_DRAW); + priv->line_style = (AdgLineStyle *) adg_style_from_id (ADG_TYPE_LINE_STYLE, + ADG_LINE_STYLE_DRAW); priv->font_style = (AdgFontStyle *) adg_font_style_from_id (ADG_FONT_STYLE_TEXT); priv->arrow_style = (AdgArrowStyle *) adg_arrow_style_from_id (ADG_ARROW_STYLE_ARROW); priv->dim_style = (AdgDimStyle *) adg_dim_style_from_id (ADG_DIM_STYLE_ISO); diff --git a/adg/adg-dim-style.c b/adg/adg-dim-style.c index 7d6e440a..cc9c7bc2 100644 --- a/adg/adg-dim-style.c +++ b/adg/adg-dim-style.c @@ -215,7 +215,7 @@ adg_dim_style_init (AdgDimStyle *dim_style) priv->quote_style = adg_font_style_from_id (ADG_FONT_STYLE_QUOTE); priv->tolerance_style = adg_font_style_from_id (ADG_FONT_STYLE_TOLERANCE); priv->note_style = adg_font_style_from_id (ADG_FONT_STYLE_NOTE); - priv->line_style = adg_line_style_from_id (ADG_LINE_STYLE_DIM); + priv->line_style = adg_style_from_id (ADG_TYPE_LINE_STYLE, ADG_LINE_STYLE_DIM); priv->arrow_style = adg_arrow_style_from_id (ADG_ARROW_STYLE_ARROW); priv->from_offset = 5.; priv->to_offset = 5.; diff --git a/adg/adg-line-style.c b/adg/adg-line-style.c index 6bec7528..54c4d1c6 100644 --- a/adg/adg-line-style.c +++ b/adg/adg-line-style.c @@ -56,6 +56,7 @@ static void set_property (GObject *object, const GValue *value, GParamSpec *pspec); +static AdgStyle*from_id (gint id); static void apply (AdgStyle *style, cairo_t *cr); @@ -78,6 +79,7 @@ adg_line_style_class_init (AdgLineStyleClass *klass) gobject_class->get_property = get_property; gobject_class->set_property = set_property; + style_class->from_id = from_id; style_class->apply = apply; param = g_param_spec_double ("width", @@ -439,6 +441,51 @@ adg_line_style_set_antialias (AdgLineStyle *line_style, } +static AdgStyle * +from_id (gint id) +{ + static AdgStyle **builtins = NULL; + + if G_UNLIKELY (builtins == NULL) + { + cairo_pattern_t *pattern; + + builtins = g_new (AdgStyle *, ADG_LINE_STYLE_LAST); + + builtins[ADG_LINE_STYLE_DRAW] = g_object_new (ADG_TYPE_LINE_STYLE, + "width", 2., + NULL); + + pattern = cairo_pattern_create_rgb (0., 1., 0.); + builtins[ADG_LINE_STYLE_CENTER] = g_object_new (ADG_TYPE_LINE_STYLE, + "pattern", pattern, + "width", 0.75, + NULL); + cairo_pattern_destroy (pattern); + + pattern = cairo_pattern_create_rgba (0., 0., 0., 0.5); + builtins[ADG_LINE_STYLE_HIDDEN] = g_object_new (ADG_TYPE_LINE_STYLE, + "pattern", pattern, + "width", 0.75, + NULL); + cairo_pattern_destroy (pattern); + + pattern = cairo_pattern_create_rgb (0., 0., 1.); + builtins[ADG_LINE_STYLE_XATCH] = g_object_new (ADG_TYPE_LINE_STYLE, + "pattern", pattern, + "width", 1.25, + NULL); + cairo_pattern_destroy (pattern); + + builtins[ADG_LINE_STYLE_DIM] = g_object_new (ADG_TYPE_LINE_STYLE, + "width", 0.75, + NULL); + } + + g_return_val_if_fail (id < ADG_LINE_STYLE_LAST, NULL); + return builtins[id]; +} + static void apply (AdgStyle *style, cairo_t *cr) diff --git a/adg/adg-style.c b/adg/adg-style.c index 075af2f9..b1295da4 100644 --- a/adg/adg-style.c +++ b/adg/adg-style.c @@ -54,6 +54,7 @@ static void set_property (GObject *object, const GValue *value, GParamSpec *pspec); +static AdgStyle*from_id (gint id); static void apply (AdgStyle *style, cairo_t *cr); static void set_pattern (AdgStyle *style, @@ -76,6 +77,7 @@ adg_style_class_init (AdgStyleClass *klass) gobject_class->get_property = get_property; gobject_class->set_property = set_property; + klass->from_id = from_id; klass->apply = apply; param = g_param_spec_boxed ("pattern", @@ -137,6 +139,26 @@ set_property (GObject *object, /** + * adg_style_from_id: + * @style_type: the type id from which obtain the style + * @id: the id to get + * + * Gets the preregistered style identified by @id of @style_type family. + * + * Return value: the requested style or %NULL on errors + **/ +AdgStyle * +adg_style_from_id (GType style_type, + gint id) +{ + AdgStyleClass *klass = g_type_class_ref (style_type); + + g_return_val_if_fail (ADG_IS_STYLE_CLASS (klass), NULL); + + return klass->from_id (id); +} + +/** * adg_style_apply: * @style: an #AdgStyle derived object * @cr: the cairo context @@ -195,6 +217,13 @@ adg_style_set_pattern (AdgStyle *style, } +static AdgStyle * +from_id (gint id) +{ + g_warning ("Uninmplemented from_id()"); + return NULL; +} + static void apply (AdgStyle *style, cairo_t *cr) diff --git a/adg/adg-style.h b/adg/adg-style.h index 4039f727..75004dc9 100644 --- a/adg/adg-style.h +++ b/adg/adg-style.h @@ -51,11 +51,14 @@ struct _AdgStyleClass GObjectClass parent_class; /* Virtual table */ + AdgStyle * (*from_id) (gint id); void (*apply) (AdgStyle *style, cairo_t *cr); }; GType adg_style_get_type (void) G_GNUC_CONST; +AdgStyle * adg_style_from_id (GType style_type, + gint id); void adg_style_apply (AdgStyle *style, cairo_t *cr); -- 2.11.4.GIT