]> granicus.if.org Git - graphviz/commitdiff
Made changes to accomodate the imagepath graph attribute.
authorDwight Perry <dperry@research.att.com>
Thu, 25 Aug 2011 15:27:34 +0000 (11:27 -0400)
committerDwight Perry <dperry@research.att.com>
Thu, 25 Aug 2011 15:27:34 +0000 (11:27 -0400)
lib/common/shapes.c
lib/gvc/gvusershape.c

index 260c7ca05a8150d58393cd4d38782f91a423b801..2b6ced2954cf04a6cc5b6a5b3d98c42cf9b1a0af 100644 (file)
 #include "render.h"
 #include "htmltable.h"
 #include <limits.h>
+#ifdef WIN32
+#include "libltdl/lt_system.h"
+#endif
+#ifndef WIN32
+#include <unistd.h>
+#endif
 
 #define RBCONST 12
 #define RBCURVE .5
@@ -1531,6 +1537,10 @@ static void poly_gencode(GVJ_t * job, node_t * n)
     boolean pfilled;           /* true if fill not handled by user shape */
     char *color, *name;
     int doMap = (obj->url || obj->explicit_tooltip);
+    static char* ipfilename = NULL;
+    static char* imagepath = NULL;
+    static boolean firsttime = TRUE;
+    char *p;
 
     if (doMap && !(job->flags & EMIT_CLUSTERS_LAST))
        gvrender_begin_anchor(job,
@@ -1613,6 +1623,18 @@ static void poly_gencode(GVJ_t * job, node_t * n)
            name = agget(n, "shapefile");
        usershape_p = TRUE;
     } else if ((name = agget(n, "image"))) {
+      
+      if (firsttime) {
+       imagepath = agget(agraphof(n),"imagepath");
+       firsttime = FALSE;
+      }
+      if ((access (safefile(name), R_OK) != 0) && imagepath != NULL){
+       if (p = strrchr(name, '/'))
+         name = ++p;
+       ipfilename = realloc(ipfilename,(strlen(imagepath) + strlen(name) + 2));
+       sprintf (ipfilename, "%s%s%s", imagepath, DIRSEP, name);
+       name = ipfilename;
+      }
        usershape_p = TRUE;
     }
     if (usershape_p) {
index 4f112b6e6563086191340086164dc47178d8117f..b7dba03f4d0d31c2f3dcd463a19d7fe0e4f08642 100644 (file)
 #include <string.h>
 #include <errno.h>
 
+#ifdef WIN32
+#include "libltdl/lt_system.h"
+#endif
+#ifndef WIN32
+#include <unistd.h>
+#endif
+
 #include "types.h"
 #include "logic.h"
 #include "memory.h"
@@ -52,6 +59,12 @@ typedef struct {
 #define XML_MAGIC  "<?xml"
 #define SVG_MAGIC  "<svg"
 
+#ifdef WIN32
+#define DIRSEP "\\"
+#else
+#define DIRSEP "/"
+#endif
+
 static knowntype_t knowntypes[] = {
     { PNG_MAGIC,  sizeof(PNG_MAGIC)-1,  FT_PNG,  "png",  },
     { PS_MAGIC,   sizeof(PS_MAGIC)-1,   FT_PS,   "ps",   },
@@ -475,9 +488,14 @@ gvusershape_size_dpi (usershape_t* us, pointf dpi)
  */
 point gvusershape_size(graph_t * g, char *name)
 {
+    static char *ipfilename = NULL;
+    static char* imagepath;
+    static boolean firsttime = TRUE;
+    const char *str;
+    char *p;
     point rv;
     pointf dpi;
-
+    
     /* no shape file, no shape size */
     if (!name || (*name == '\0')) {
         rv.x = rv.y = -1;
@@ -488,6 +506,21 @@ point gvusershape_size(graph_t * g, char *name)
        dpi.x = dpi.y;
     else
        dpi.x = dpi.y = (double)DEFAULT_DPI;
+    
+    //imagepath is typically set as a graph attribute on macos platforms
+    //It points to the directory where node images are located
+    if (firsttime) {
+      imagepath = agget(g,"imagepath");
+      firsttime = FALSE;
+    }
 
+    if ((access (safefile(name), R_OK) != 0) && imagepath != NULL){
+      if (p = strrchr(name, '/'))
+       name = ++p;
+      ipfilename = realloc(ipfilename,(strlen(imagepath) + strlen(name) + 2));
+      sprintf (ipfilename, "%s%s%s", imagepath, DIRSEP, name);
+      name = ipfilename;
+    }
     return gvusershape_size_dpi (gvusershape_open (name), dpi);
+
 }