]> granicus.if.org Git - graphviz/commitdiff
fixes for in-memory rendering to existing gd surface - needed by webdot
authorellson <devnull@localhost>
Thu, 30 Jun 2005 21:53:11 +0000 (21:53 +0000)
committerellson <devnull@localhost>
Thu, 30 Jun 2005 21:53:11 +0000 (21:53 +0000)
lib/common/const.h
lib/common/gdgen.c
tclpkg/tcldot/tcldot.c
tclpkg/tcldot/tkgen.c

index 41727b586058d489c58c99d8a9acfb84b185748a..16dad866e8942ec0dd949121fd1fffa172c20500 100644 (file)
 #define                PLAIN_EXT       7
 
 #define                GD              8       /* libgd bitmap format */
-#define                memGD           9       /* libgd bitmap format */
-#define                GD2             10      /* libgd bitmap format */
-#define                GIF             11      /* libgd bitmap format */
-#define                JPEG            12      /* libgd bitmap format */
-#define                PNG             13      /* libgd bitmap format */
-#define                WBMP            14      /* libgd bitmap format */
-#define                XBM             15      /* libgd bitmap format */
+#define                GD2             9       /* libgd bitmap format */
+#define                GIF             10      /* libgd bitmap format */
+#define                JPEG            11      /* libgd bitmap format */
+#define                PNG             12      /* libgd bitmap format */
+#define                WBMP            13      /* libgd bitmap format */
+#define                XBM             14      /* libgd bitmap format */
+
+#define                TK              15      /* TK canvas */
 
 #define        ISMAP           16      /* old style map file for httpd servers */
 #define        IMAP            17      /* apache map file for httpd servers */
 #define                DIA             24      /* dia drawing tool */
 #define                SVG             25      /* Structured Vector Graphics */
 #define                SVGZ            26      /* compressed SVG */
-#define                TK              27      /* TK canvas */
-#define                CANONICAL_DOT   28      /* wanted for tcl/tk version */
-#define                PDF             29
-#define                EXTENDED_DOT    30      /* dot with drawing info */
+#define                CANONICAL_DOT   27      /* wanted for tcl/tk version */
+#define                PDF             28
+#define                EXTENDED_DOT    29      /* dot with drawing info */
 
-#define                QPDF            31      /* Quartz paged PDF */
-#define                QEPDF           32      /* Quartz embedded PDF */
+#define                QPDF            30      /* Quartz paged PDF */
+#define                QEPDF           31      /* Quartz embedded PDF */
 
 #define                QBM_FIRST 100   /* first Quartz bitmap format, inclusive */
 #define                QBM_LAST 200    /* last Quartz bitmap format, exclusive */
index 0158af32e7962ee83165752710dde2e9cb46c891..5e871d334e2ff1e2119059dc19077d1cfcb54914 100644 (file)
@@ -26,6 +26,7 @@ extern gdImagePtr gd_getshapeimage(char *name);
 extern void gd_freeusershapes(void);
 
 static gdImagePtr im;
+static int external_surface;
 
 #ifdef _UWIN
 #ifndef DEFAULT_FONTPATH
@@ -217,95 +218,84 @@ static boolean is_format_truecolor_capable(int Output_lang)
     return rv;
 }
 
-static void gd_begin_graph_to_file(GVC_t * gvc, graph_t * g, box bb,
-                                  point pb)
+static void gd_begin_graph(GVC_t * gvc, graph_t * g, box bb, point pb)
 {
     char *bgcolor_str, *truecolor_str;
     boolean truecolor_p = FALSE;       /* try to use cheaper paletted mode */
     boolean bg_transparent_p = FALSE;
     int bgcolor;
 
+    external_surface = gvc->job->external_surface;
+
     init1_gd(gvc, g, bb, pb);
 
-    truecolor_str = agget(g, "truecolor");     /* allow user to force truecolor */
-    bgcolor_str = agget(g, "bgcolor");
+    if (external_surface) {
+       im = (gdImagePtr)gvc->job->surface;
+    } else {
+        truecolor_str = agget(g, "truecolor"); /* allow user to force truecolor */
+        bgcolor_str = agget(g, "bgcolor");
 
-    if (truecolor_str && truecolor_str[0])
-       truecolor_p = mapbool(truecolor_str);
+        if (truecolor_str && truecolor_str[0])
+           truecolor_p = mapbool(truecolor_str);
 
-    if (bgcolor_str && strcmp(bgcolor_str, "transparent") == 0) {
-       bg_transparent_p = TRUE;
-       if (is_format_truecolor_capable(Output_lang))
-           truecolor_p = TRUE; /* force truecolor */
-    }
+        if (bgcolor_str && strcmp(bgcolor_str, "transparent") == 0) {
+           bg_transparent_p = TRUE;
+           if (is_format_truecolor_capable(Output_lang))
+               truecolor_p = TRUE;     /* force truecolor */
+        }
 
-    if (GD_has_images(g))
-       truecolor_p = TRUE;     /* force truecolor */
+       if (GD_has_images(g))
+           truecolor_p = TRUE; /* force truecolor */
 
-    if (truecolor_p) {
-       if (Verbose)
-           fprintf(stderr, "%s: allocating a %dK TrueColor GD image\n",
-                   CmdName, ROUND(Viewport.x * Viewport.y * 4 / 1024.));
-       im = gdImageCreateTrueColor(Viewport.x, Viewport.y);
-    } else {
-       if (Verbose)
-           fprintf(stderr, "%s: allocating a %dK PaletteColor GD image\n",
-                   CmdName, ROUND(Viewport.x * Viewport.y / 1024.));
-       im = gdImageCreate(Viewport.x, Viewport.y);
-    }
-    if (!im) {
-       agerr(AGERR, "gdImageCreate returned NULL. Malloc problem?\n");
-       return;
+        if (truecolor_p) {
+           if (Verbose)
+               fprintf(stderr, "%s: allocating a %dK TrueColor GD image\n",
+                       CmdName, ROUND(Viewport.x * Viewport.y * 4 / 1024.));
+           im = gdImageCreateTrueColor(Viewport.x, Viewport.y);
+        } else {
+           if (Verbose)
+               fprintf(stderr, "%s: allocating a %dK PaletteColor GD image\n",
+                       CmdName, ROUND(Viewport.x * Viewport.y / 1024.));
+           im = gdImageCreate(Viewport.x, Viewport.y);
+        }
+        if (!im) {
+           agerr(AGERR, "gdImageCreate returned NULL. Malloc problem?\n");
+           return;
+        }
     }
 
     init2_gd(im);
 
-    if (bgcolor_str && bgcolor_str[0])
-       if (bg_transparent_p)
-           bgcolor = transparent;
-       else
-           bgcolor = gd_resolve_color(bgcolor_str);
-    else
-       bgcolor = white;
-
-    cstk[0].fillcolor = bgcolor;
-
-    /* Blending must be off to lay a transparent bgcolor.
-       Nothing to blend with anyway. */
-    gdImageAlphaBlending(im, FALSE);
-
-    gdImageFill(im, im->sx / 2, im->sy / 2, bgcolor);
-
-    /* Blend everything else together,
-       especially fonts over non-transparent backgrounds */
-    gdImageAlphaBlending(im, TRUE);
-
-
-#ifdef MYTRACE
-    fprintf(stderr, "gd_begin_graph_to_file\n");
-#endif
-}
-
-static void gd_begin_graph_to_memory(GVC_t * gvc, graph_t * g, box bb,
-                                    point pb)
-{
-    if (Verbose)
-       fprintf(stderr, "%s: using existing GD image\n", CmdName);
-
-    init1_gd(gvc, g, bb, pb);
-
-    im = *(gdImagePtr *) Output_file;
-
-    init2_gd(im);
+    if (! external_surface) {
+        if (bgcolor_str && bgcolor_str[0])
+           if (bg_transparent_p)
+               bgcolor = transparent;
+           else
+               bgcolor = gd_resolve_color(bgcolor_str);
+        else
+           bgcolor = white;
+    
+        cstk[0].fillcolor = bgcolor;
+    
+        /* Blending must be off to lay a transparent bgcolor.
+           Nothing to blend with anyway. */
+        gdImageAlphaBlending(im, FALSE);
+    
+        gdImageFill(im, im->sx / 2, im->sy / 2, bgcolor);
+    
+        /* Blend everything else together,
+           especially fonts over non-transparent backgrounds */
+        gdImageAlphaBlending(im, TRUE);
+    }    
 
 #ifdef MYTRACE
-    fprintf(stderr, "gd_begin_graph_to_memory\n");
+    fprintf(stderr, "gd_begin_graph\n");
 #endif
 }
 
-static void gd_end_graph_to_file(void)
+static void gd_end_graph(void)
 {
-    if (!im)
+    if (!im || external_surface)
        return;
 
 /*
@@ -1002,7 +992,7 @@ static void gd_user_shape(char *name, point * A, int n, int filled)
 codegen_t GD_CodeGen = {
     0,                         /* gd_reset */
     gd_begin_job, gd_end_job,
-    gd_begin_graph_to_file, gd_end_graph_to_file,
+    gd_begin_graph, gd_end_graph,
     gd_begin_page, gd_end_page,
     0, /* gd_begin_layer */ 0, /* gd_end_layer */
     0, /* gd_begin_cluster */ 0,       /* gd_end_cluster */
@@ -1022,27 +1012,3 @@ codegen_t GD_CodeGen = {
     gd_user_shape,
     0                          /* gd_user_shape_size */
 };
-
-codegen_t memGD_CodeGen = {    /* see tcldot */
-    0,                         /* gd_reset */
-    gd_begin_job, gd_end_job,
-    gd_begin_graph_to_memory, gd_end_graph_to_memory,
-    gd_begin_page, gd_end_page,
-    0, /* gd_begin_layer */ 0, /* gd_end_layer */
-    0, /* gd_begin_cluster */ 0,       /* gd_end_cluster */
-    0, /* gd_begin_nodes */ 0, /* gd_end_nodes */
-    0, /* gd_begin_edges */ 0, /* gd_end_edges */
-    0, /* gd_begin_node */ 0,  /* gd_end_node */
-    0, /* gd_begin_edge */ 0,  /* gd_end_edge */
-    gd_begin_context, gd_end_context,
-    0, /* gd_begin_anchor */ 0,        /* gd_end_anchor */
-    gd_set_font, gd_textline,
-    gd_set_pencolor, gd_set_fillcolor, gd_set_style,
-    gd_ellipse, gd_polygon,
-    gd_bezier, gd_polyline,
-    0,                         /* bezier_has_arrows */
-    0,                         /* gd_comment */
-    0,                         /* gd_textsize */
-    gd_user_shape,
-    0                          /* gd_user_shape_size */
-};
index 1797377fe0a872fa84190f057178c36fd326f25e..af2eba0a050df149022284ff15030512a67e21a6 100644 (file)
@@ -46,15 +46,7 @@ Tcl_GetString(Tcl_Obj *obj) {
 #endif
 ********* */
 
-#if defined(_BLD_tcldot) && defined(_DLL)
-extern codegen_t TK_CodeGen;
-#else
 extern codegen_t TK_CodeGen;
-#if ENABLE_CODEGENS
-extern FILE *Output_file;
-extern int Output_lang;
-#endif
-#endif
 extern void *GDHandleTable;
 extern int Gdtclft_Init(Tcl_Interp *);
 
@@ -1086,7 +1078,7 @@ static int graphcmd(ClientData clientData, Tcl_Interp * interp,
            return TCL_ERROR;
        }
 
-       gvc->job->output_file = (FILE *) & tkgendata;
+       gvc->job->surface = (void *)(&tkgendata);
        gvc->job->external_surface = TRUE;
 
        /* make sure that layout is done */
@@ -1101,8 +1093,7 @@ static int graphcmd(ClientData clientData, Tcl_Interp * interp,
        return TCL_OK;
 
     } else if ((c == 'r') && (strncmp(argv[1], "rendergd", length) == 0)) {
-       void *hdl;
-       int *im;
+       void **hdl;
 
        if (argc < 3) {
            Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
@@ -1120,9 +1111,7 @@ static int graphcmd(ClientData clientData, Tcl_Interp * interp,
            Tcl_AppendResult(interp, "GD Image not found.", (char *) NULL);
            return TCL_ERROR;
        }
-       /* FIXME - this is gross! */
-        im = *(int **)hdl;
-       gvc->job->output_file = (FILE *) im;
+       gvc->job->surface = *hdl;
        gvc->job->external_surface = TRUE;
 
        /* make sure that layout is done */
index badacaa937a55ac0f0a0ab4e41c6c5173f26dead..24e2360279eb76540f21e53067de7e73b4997cd1 100644 (file)
@@ -82,6 +82,8 @@ static int SP;
 
 static char *op[] = { "graph", "node", "edge", "graph" };
 
+static tkgendata_t *Tkgendata;
+
 static void tkgen_append_string(char *string)
 {
     Tcl_DStringAppend(&script, string, strlen(string));
@@ -89,7 +91,7 @@ static void tkgen_append_string(char *string)
 
 static void tkgen_start_item(char *item)
 {
-    tkgen_append_string(((tkgendata_t *) Output_file)->canvas);
+    tkgen_append_string(Tkgendata->canvas);
     tkgen_append_string(" create ");
     tkgen_append_string(item);
 }
@@ -191,6 +193,8 @@ static void tk_begin_graph(GVC_t * gvc, graph_t * g, box bb, point pb)
 {
     double dpi = GD_drawing(g)->dpi;
 
+    Tkgendata = (tkgendata_t *)gvc->job->surface;
+
     if (dpi < 1.0)
        dpi = DEFAULT_DPI;
     DevScale = dpi / POINTS_PER_INCH;
@@ -239,7 +243,7 @@ static void tk_begin_graph(GVC_t * gvc, graph_t * g, box bb, point pb)
 
 static void tk_end_graph(void)
 {
-    Tcl_DStringResult(((tkgendata_t *) Output_file)->interp, &script);
+    Tcl_DStringResult(Tkgendata->interp, &script);
 }
 
 static void tk_begin_page(graph_t * g, point page, double scale, int rot,