[lasem] [SvgStyle] Use reference counting.
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [lasem] [SvgStyle] Use reference counting.
- Date: Tue, 18 Aug 2009 13:28:06 +0000 (UTC)
commit 49de3879ef6c9ef5de5738c2ff635f56ea1bbe22
Author: Emmanuel Pacaud <emmanuel pacaud lapp in2p3 fr>
Date: Tue Aug 18 15:25:35 2009 +0200
[SvgStyle] Use reference counting.
src/lsmsvgclippathelement.c | 2 +-
src/lsmsvgelement.c | 2 +-
src/lsmsvgmarkerelement.c | 10 ++++------
src/lsmsvgmaskelement.c | 2 +-
src/lsmsvgpatternelement.c | 2 +-
src/lsmsvgstyle.c | 39 ++++++++++++++++++++++++++++++++-------
src/lsmsvgstyle.h | 4 ++--
src/lsmsvgview.c | 4 ++--
src/lsmsvgview.h | 2 +-
9 files changed, 45 insertions(+), 22 deletions(-)
---
diff --git a/src/lsmsvgclippathelement.c b/src/lsmsvgclippathelement.c
index 4ebb617..baf8846 100644
--- a/src/lsmsvgclippathelement.c
+++ b/src/lsmsvgclippathelement.c
@@ -71,7 +71,7 @@ lsm_svg_clip_path_element_render (LsmSvgElement *self, LsmSvgView *view)
}
lsm_svg_view_pop_style (view);
- lsm_svg_style_free (style);
+ lsm_svg_style_unref (style);
}
static void
diff --git a/src/lsmsvgelement.c b/src/lsmsvgelement.c
index 331cd09..2fb0e9d 100644
--- a/src/lsmsvgelement.c
+++ b/src/lsmsvgelement.c
@@ -140,7 +140,7 @@ lsm_svg_element_render (LsmSvgElement *element, LsmSvgView *view)
if (!lsm_svg_matrix_is_identity (&element->transform.matrix))
lsm_svg_view_pop_matrix (view);
- lsm_svg_style_free (style);
+ lsm_svg_style_unref (style);
}
static void
diff --git a/src/lsmsvgmarkerelement.c b/src/lsmsvgmarkerelement.c
index 829fc18..aa9ab69 100644
--- a/src/lsmsvgmarkerelement.c
+++ b/src/lsmsvgmarkerelement.c
@@ -50,10 +50,8 @@ _marker_element_render (LsmSvgElement *self, LsmSvgView *view)
if (!marker->enable_rendering) {
if (marker->style)
- lsm_svg_style_free (marker->style);
- /* FIXME Use reference counting for LsmSvgStyle */
- marker->style = lsm_svg_style_duplicate (lsm_svg_view_get_current_style (view));
-
+ lsm_svg_style_unref (marker->style);
+ marker->style = lsm_svg_style_ref (lsm_svg_view_get_current_style (view));
lsm_debug ("[LsmSvgMarkerElement::render] Direct rendering not allowed");
return;
} else {
@@ -108,7 +106,7 @@ _marker_element_render (LsmSvgElement *self, LsmSvgView *view)
lsm_svg_view_pop_matrix (view);
lsm_svg_view_pop_style (view);
- lsm_svg_style_free (style);
+ lsm_svg_style_unref (style);
}
/* LsmSvgMarkerElement implementation */
@@ -166,7 +164,7 @@ lsm_svg_marker_element_finalize (GObject *object)
LsmSvgMarkerElement *marker = LSM_SVG_MARKER_ELEMENT (object);
if (marker->style)
- lsm_svg_style_free (marker->style);
+ lsm_svg_style_unref (marker->style);
parent_class->finalize (object);
}
diff --git a/src/lsmsvgmaskelement.c b/src/lsmsvgmaskelement.c
index 16cd1d9..fa89d1e 100644
--- a/src/lsmsvgmaskelement.c
+++ b/src/lsmsvgmaskelement.c
@@ -119,7 +119,7 @@ lsm_svg_mask_element_render (LsmSvgElement *self, LsmSvgView *view)
}
lsm_svg_view_pop_style (view);
- lsm_svg_style_free (style);
+ lsm_svg_style_unref (style);
}
static void
diff --git a/src/lsmsvgpatternelement.c b/src/lsmsvgpatternelement.c
index 471023b..60e2fdd 100644
--- a/src/lsmsvgpatternelement.c
+++ b/src/lsmsvgpatternelement.c
@@ -135,7 +135,7 @@ lsm_svg_pattern_element_render (LsmSvgElement *self, LsmSvgView *view)
}
lsm_svg_view_pop_style (view);
- lsm_svg_style_free (style);
+ lsm_svg_style_unref (style);
}
static void
diff --git a/src/lsmsvgstyle.c b/src/lsmsvgstyle.c
index f28f45b..828b3ad 100644
--- a/src/lsmsvgstyle.c
+++ b/src/lsmsvgstyle.c
@@ -441,6 +441,12 @@ lsm_svg_property_bag_serialize (LsmPropertyBag *property_bag)
return lsm_property_manager_serialize (property_manager, property_bag);
}
+typedef struct {
+ LsmSvgStyle base;
+
+ volatile gint ref_count;
+} LsmSvgRealStyle;
+
static const LsmSvgStyle *
lsm_svg_get_default_style (void)
{
@@ -450,7 +456,7 @@ lsm_svg_get_default_style (void)
if (style != NULL)
return style;
- style = g_new (LsmSvgStyle, 1);
+ style = lsm_svg_style_new ();
lsm_property_manager_init_default_style (property_manager, style);
@@ -460,30 +466,49 @@ lsm_svg_get_default_style (void)
LsmSvgStyle *
lsm_svg_style_new (void)
{
- LsmSvgStyle *style;
+ LsmSvgRealStyle *style;
+
+ style = g_slice_new0 (LsmSvgRealStyle);
+ style->ref_count = 1;
+
+ return (LsmSvgStyle *) style;
+}
+
+LsmSvgStyle *
+lsm_svg_style_ref (LsmSvgStyle *style)
+{
+ LsmSvgRealStyle *real_style = (LsmSvgRealStyle *) style;
- style = g_new0 (LsmSvgStyle, 1);
+ g_return_val_if_fail (real_style != NULL, style);
+ g_return_val_if_fail (g_atomic_int_get (&real_style->ref_count) > 0, style);
+ g_atomic_int_inc (&real_style->ref_count);
return style;
}
void
-lsm_svg_style_free (LsmSvgStyle *style)
+lsm_svg_style_unref (LsmSvgStyle *style)
{
- g_return_if_fail (style != NULL);
+ LsmSvgRealStyle *real_style = (LsmSvgRealStyle *) style;
- g_free (style);
+ g_return_if_fail (g_atomic_int_get (&real_style->ref_count) > 0);
+ if (g_atomic_int_dec_and_test (&real_style->ref_count))
+ g_slice_free (LsmSvgRealStyle, real_style);
}
LsmSvgStyle *
lsm_svg_style_new_inherited (const LsmSvgStyle *parent_style, LsmPropertyBag *property_bag)
{
+ LsmSvgRealStyle *real_style;
LsmSvgStyle *style;
const LsmSvgStyle *default_style;
default_style = lsm_svg_get_default_style ();
- style = g_new (LsmSvgStyle, 1);
+ real_style = g_slice_new (LsmSvgRealStyle);
+ real_style->ref_count = 1;
+
+ style = &real_style->base;
if (parent_style != NULL) {
LsmPropertyManager *property_manager = lsm_svg_get_property_manager ();
diff --git a/src/lsmsvgstyle.h b/src/lsmsvgstyle.h
index a57ee60..68fca37 100644
--- a/src/lsmsvgstyle.h
+++ b/src/lsmsvgstyle.h
@@ -149,10 +149,10 @@ void lsm_svg_property_bag_clean (LsmPropertyBag *property_bag);
char * lsm_svg_property_bag_serialize (LsmPropertyBag *property_bag);
LsmSvgStyle * lsm_svg_style_new (void);
-void lsm_svg_style_free (LsmSvgStyle *style);
+LsmSvgStyle * lsm_svg_style_ref (LsmSvgStyle *style);
+void lsm_svg_style_unref (LsmSvgStyle *style);
LsmSvgStyle * lsm_svg_style_new_inherited (const LsmSvgStyle *parent_style,
LsmPropertyBag *property_bag);
-LsmSvgStyle * lsm_svg_style_duplicate (const LsmSvgStyle *origin);
G_END_DECLS
diff --git a/src/lsmsvgview.c b/src/lsmsvgview.c
index 6adbcfa..4b3482c 100644
--- a/src/lsmsvgview.c
+++ b/src/lsmsvgview.c
@@ -1660,12 +1660,12 @@ void lsm_svg_view_pop_style (LsmSvgView *view)
view->style = view->style_stack != NULL ? view->style_stack->data : NULL;
}
-const LsmSvgStyle *
+LsmSvgStyle *
lsm_svg_view_get_current_style (LsmSvgView *view)
{
g_return_val_if_fail (LSM_IS_SVG_VIEW (view), NULL);
- return view->style;
+ return (LsmSvgStyle *) view->style;
}
const LsmBox *
diff --git a/src/lsmsvgview.h b/src/lsmsvgview.h
index 79ceb23..947072f 100644
--- a/src/lsmsvgview.h
+++ b/src/lsmsvgview.h
@@ -132,7 +132,7 @@ void lsm_svg_view_pop_group_opacity (LsmSvgView *view);
void lsm_svg_view_push_style (LsmSvgView *view, const LsmSvgStyle *style);
void lsm_svg_view_pop_style (LsmSvgView *view);
-const LsmSvgStyle * lsm_svg_view_get_current_style (LsmSvgView *view);
+LsmSvgStyle * lsm_svg_view_get_current_style (LsmSvgView *view);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]