[lasem] [SvgStyle] Use reference counting.



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]