From: ellson Date: Thu, 30 Jun 2005 21:53:11 +0000 (+0000) Subject: fixes for in-memory rendering to existing gd surface - needed by webdot X-Git-Tag: LAST_LIBGRAPH~32^2~7478 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d0316dfda0a738345afb7c7f61d2d675a7264c0a;p=graphviz fixes for in-memory rendering to existing gd surface - needed by webdot --- diff --git a/lib/common/const.h b/lib/common/const.h index 41727b586..16dad866e 100644 --- a/lib/common/const.h +++ b/lib/common/const.h @@ -134,13 +134,14 @@ #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 */ @@ -153,13 +154,12 @@ #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 */ diff --git a/lib/common/gdgen.c b/lib/common/gdgen.c index 0158af32e..5e871d334 100644 --- a/lib/common/gdgen.c +++ b/lib/common/gdgen.c @@ -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 */ -}; diff --git a/tclpkg/tcldot/tcldot.c b/tclpkg/tcldot/tcldot.c index 1797377fe..af2eba0a0 100644 --- a/tclpkg/tcldot/tcldot.c +++ b/tclpkg/tcldot/tcldot.c @@ -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 */ diff --git a/tclpkg/tcldot/tkgen.c b/tclpkg/tcldot/tkgen.c index badacaa93..24e236027 100644 --- a/tclpkg/tcldot/tkgen.c +++ b/tclpkg/tcldot/tkgen.c @@ -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,