[evince] [libdocument] Convert EvRectangle struct into a boxed type



commit 13c5a93aca3d2e7b88161ae047b751af20ce277d
Author: Carlos Garcia Campos <carlosgc gnome org>
Date:   Tue May 12 10:38:33 2009 +0200

    [libdocument] Convert EvRectangle struct into a boxed type
---
 libdocument/ev-document.c |   27 +++++++++++++++++++++++++++
 libdocument/ev-document.h |   40 ++++++++++++++++++++++++++++++++++------
 2 files changed, 61 insertions(+), 6 deletions(-)

diff --git a/libdocument/ev-document.c b/libdocument/ev-document.c
index f33b75b..e1521b7 100644
--- a/libdocument/ev-document.c
+++ b/libdocument/ev-document.c
@@ -311,6 +311,33 @@ ev_document_info_free (EvDocumentInfo *info)
 	g_free (info);
 }
 
+/* EvRectangle */
+EV_DEFINE_BOXED_TYPE (EvRectangle, ev_rectangle, ev_rectangle_copy, ev_rectangle_free)
+
+EvRectangle *
+ev_rectangle_new (void)
+{
+	return g_new0 (EvRectangle, 1);
+}
+
+EvRectangle *
+ev_rectangle_copy (EvRectangle *rectangle)
+{
+	EvRectangle *new_rectangle;
+
+	g_return_val_if_fail (rectangle != NULL, NULL);
+
+	new_rectangle = g_new (EvRectangle, 1);
+	*new_rectangle = *rectangle;
+
+	return new_rectangle;
+}
+
+void
+ev_rectangle_free (EvRectangle *rectangle)
+{
+	g_free (rectangle);
+}
 
 /* Compares two rects.  returns 0 if they're equal */
 #define EPSILON 0.0000001
diff --git a/libdocument/ev-document.h b/libdocument/ev-document.h
index 3ab918a..5afdb03 100644
--- a/libdocument/ev-document.h
+++ b/libdocument/ev-document.h
@@ -64,12 +64,7 @@ typedef struct {
         double y;
 } EvPoint;
 
-typedef struct {
-        double x1;
-        double y1;
-        double x2;
-        double y2;
-} EvRectangle;
+typedef struct _EvRectangle EvRectangle;
 
 struct _EvDocumentIface
 {
@@ -137,6 +132,20 @@ cairo_surface_t *ev_document_render           (EvDocument      *document,
 gint            ev_rect_cmp                   (EvRectangle     *a,
                                                EvRectangle     *b);
 
+#define EV_TYPE_RECTANGLE (ev_rectangle_get_type ())
+struct _EvRectangle
+{
+	gdouble x1;
+	gdouble y1;
+	gdouble x2;
+	gdouble y2;
+};
+
+GType        ev_rectangle_get_type (void) G_GNUC_CONST;
+EvRectangle *ev_rectangle_new      (void);
+EvRectangle *ev_rectangle_copy     (EvRectangle *ev_rect);
+void         ev_rectangle_free     (EvRectangle *ev_rect);
+
 /* convenience macro to ease interface addition in the CODE
  * section of EV_BACKEND_REGISTER_WITH_CODE (this macro relies on
  * the g_define_type_id present within EV_BACKEND_REGISTER_WITH_CODE()).
@@ -269,6 +278,25 @@ type_name##_get_type (void)
 	}                                                                                    \
 	return g_define_type_id__volatile;                                                   \
 }
+
+/*
+ * A convenience macro for boxed type implementations, which defines a
+ * type_name_get_type() function registering the boxed type.
+ */
+#define EV_DEFINE_BOXED_TYPE(TypeName, type_name, copy_func, free_func)               \
+GType                                                                                 \
+type_name##_get_type (void)                                                           \
+{                                                                                     \
+        static volatile gsize g_define_type_id__volatile = 0;                         \
+	if (g_once_init_enter (&g_define_type_id__volatile)) {                        \
+	        GType g_define_type_id =                                              \
+		    g_boxed_type_register_static (g_intern_static_string (#TypeName), \
+		                                  (GBoxedCopyFunc) copy_func,         \
+						  (GBoxedFreeFunc) free_func);        \
+		g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);    \
+	}                                                                             \
+	return g_define_type_id__volatile;                                            \
+}
 		
 G_END_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]