[dia] diagram-as-element: fix some typical bugs and leaks



commit c158797dc1e9de793e479e7c6937cb612d2df504
Author: Hans Breuer <hans breuer org>
Date:   Sun Oct 4 14:48:41 2009 +0200

    diagram-as-element: fix some typical bugs and leaks
    
     - objecte_load_using_properties() is not vtable compatible
       (maybe I should change the vtable?)
     - don't leak the temporary file nor the DiaImage
     - prefer rendering with "cairo-alpha-png"
    
    TODO:
     - extend the renderer interface to get rid of the extra DiaImage,
       at least for some renderers (DiaRenderer::set_matrix?)
     - the image gets updated too often, something wrong with mtime check?
     - make diagrams directly selecteable in the properties dialog file entry
     - allow to open the diagram stand-alone by context menu
     - make new object available in the Misc sheet
     - normalize filenames during save (parent diagram relative path)

 objects/Misc/diagram_as_object.c |   25 ++++++++++++++++++++-----
 1 files changed, 20 insertions(+), 5 deletions(-)
---
diff --git a/objects/Misc/diagram_as_object.c b/objects/Misc/diagram_as_object.c
index 0dd5ada..a70a4c0 100644
--- a/objects/Misc/diagram_as_object.c
+++ b/objects/Misc/diagram_as_object.c
@@ -76,11 +76,13 @@ _dae_create (Point *startpoint,
 	     void *user_data,
 	     Handle **handle1,
 	     Handle **handle2);
+static DiaObject *
+_dae_load (ObjectNode obj_node, int version, const char *filename);
 
 static ObjectTypeOps _dae_type_ops =
 {
   (CreateFunc) _dae_create,
-  (LoadFunc)   object_load_using_properties,
+  (LoadFunc)   _dae_load, /* can't use object_load_using_properties, signature mismatch */
   (SaveFunc)   object_save_using_properties,
   (GetDefaultsFunc)   NULL,
   (ApplyDefaultsFunc) NULL
@@ -91,8 +93,9 @@ DiaObjectType diagram_as_element_type =
   "Misc - Diagram",  /* name */
   0,                 /* version */
   (char **) diagram_as_element_xpm, /* pixmap */
-  
-  &_dae_type_ops      /* ops */
+  &_dae_type_ops,     /* ops */
+  NULL,              /* pixmap_file */
+  0                  /* default_uder_data */
 };
 
 static void _dae_update_data (DiagramAsElement *dae);
@@ -197,14 +200,16 @@ _dae_draw(DiagramAsElement *dae, DiaRenderer *renderer)
 	gchar *imgfname = NULL;
 	gint fd = g_file_open_tmp ("diagram-as-elementXXXXXX.png", &imgfname, NULL);
 	if (fd != -1) {
-          DiaExportFilter *ef = filter_guess_export_filter (imgfname);
-	  
+          DiaExportFilter *ef = filter_get_by_name ("cairo-alpha-png");
+	  if (!ef) /* prefer cairo with alpha, but don't require it */
+	    ef = filter_guess_export_filter (imgfname);
 	  close(fd);
 	  if (ef) {
 	    ef->export_func (dae->data, imgfname, dae->filename, ef->user_data);
 	    /* TODO: change export_func to return success or GError* */
 	    dae->image = dia_image_load (imgfname);
 	  }
+	  g_unlink (imgfname);
 	  g_free (imgfname);
 	}
       }
@@ -255,6 +260,9 @@ _dae_destroy(DiagramAsElement *dae)
     g_object_unref(dae->data);
 
   g_free(dae->filename);
+  
+  if (dae->image)
+    g_object_unref (dae->image);
 
   element_destroy(&dae->element);
 }
@@ -317,3 +325,10 @@ _dae_create (Point *startpoint,
   *handle2 = obj->handles[7];  
   return &dae->element.object;
 }
+
+static DiaObject *
+_dae_load (ObjectNode obj_node, int version, const char *filename)
+{
+  return object_load_using_properties (&diagram_as_element_type,
+                                       obj_node, version, filename);
+}



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