From: <ai...@us...> - 2008-09-26 06:34:48
|
Revision: 8828 http://plplot.svn.sourceforge.net/plplot/?rev=8828&view=rev Author: airwin Date: 2008-09-26 06:34:38 +0000 (Fri, 26 Sep 2008) Log Message: ----------- Change file schema to one that validates with svg-1.1 following exactly what is done with svgcairo. Open with standard xml tag drop <document> opening and </document> closing tags add standard xmlns:xlink attribute to <svg> tag. In <svg> tag reexpress width and height attributes in pts following exactly what is done with svgcairo. The replaced width and height attributes in cm were not calculated correctly when -geometry overrides the aspect ratio. This bug is fixed with the new "pt" method. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-09-26 00:07:23 UTC (rev 8827) +++ trunk/drivers/svg.c 2008-09-26 06:34:38 UTC (rev 8828) @@ -176,7 +176,7 @@ svgFile = pls->OutFile; svgIndent = 0; - svg_open("document>"); + svg_open("?xml version=\"1.0\" encoding=\"UTF-8\"?>"); } /*---------------------------------------------------------------------- @@ -193,9 +193,12 @@ svg_open("svg"); svg_attr_value("xmlns", "http://www.w3.org/2000/svg"); + svg_attr_value("xmlns:xlink", "http://www.w3.org/1999/xlink"); svg_attr_value("version", "1.1"); - svg_attr_values("width", "%dcm", (int)((double)canvasXSize/DPI * 2.54)); - svg_attr_values("height", "%dcm", (int)((double)canvasYSize/DPI * 2.54)); + /* svg_attr_values("width", "%dcm", (int)((double)canvasXSize/DPI * 2.54)); */ + /* svg_attr_values("height", "%dcm", (int)((double)canvasYSize/DPI * 2.54)); */ + svg_attr_values("width", "%dpt", canvasXSize); + svg_attr_values("height", "%dpt", canvasYSize); svg_attr_values("viewBox", "%d %d %d %d", 0, 0, canvasXSize, canvasYSize); svg_general(">\n"); @@ -268,7 +271,6 @@ void plD_tidy_svg(PLStream *pls) { - svg_close("document"); fclose(svgFile); } @@ -558,7 +560,7 @@ /*--------------------------------------------------------------------- svg_open_end () - Used to end the opending of a new XML expression i.e. add + Used to end the opening of a new XML expression i.e. add the final ">". ---------------------------------------------------------------------*/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-09-26 07:32:01
|
Revision: 8829 http://plplot.svn.sourceforge.net/plplot/?rev=8829&view=rev Author: airwin Date: 2008-09-26 07:31:51 +0000 (Fri, 26 Sep 2008) Log Message: ----------- Implement alpha channel transparency for -dev svg Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-09-26 06:34:38 UTC (rev 8828) +++ trunk/drivers/svg.c 2008-09-26 07:31:51 UTC (rev 8829) @@ -701,6 +701,8 @@ write_hex(pls->curcolor.g); write_hex(pls->curcolor.b); fprintf(svgFile, "\"\n"); + svg_indent(); + fprintf(svgFile, "stroke-opacity=\"%f\"\n", pls->curcolor.a); } /*--------------------------------------------------------------------- @@ -717,6 +719,8 @@ write_hex(pls->curcolor.g); write_hex(pls->curcolor.b); fprintf(svgFile, "\"\n"); + svg_indent(); + fprintf(svgFile, "fill-opacity=\"%f\"\n", pls->curcolor.a); } /*--------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-09-26 23:14:32
|
Revision: 8830 http://plplot.svn.sourceforge.net/plplot/?rev=8830&view=rev Author: airwin Date: 2008-09-26 21:42:01 +0000 (Fri, 26 Sep 2008) Log Message: ----------- Implement familying. I didn't track potential memory management issues in the code (which can be quite complicated), but I did test the result with valgrind for multipage examples 8 and 9 and got an absolutely clean valgrind result. The current situation (just like before familying was enabled) is if the -fam option is _not_ used this device produces bad svg results (repeat <svg> elements corresponding to each page which is not allowed by the svg standard which is only a single-page standard). These bad svg results completely break the imagemagick viewer, cause errors and warnings for other viewers (while they pick an arbitrary page to view), and invalidate the results at the w3c validator. Of course, none of this is an issue now if the user remembers to always use the -fam option for multipaged plots. ToDo: to avoid this issue when -fam is not used for multi-page plots do file output only for the case of the first page similar to what is currently done for the gd devices and the single-page subset (pngcairo and svgcairo) of the cairo devices. For all these cases we should issue a reminder message to use -fam whenever any pages are being skipped. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-09-26 07:31:51 UTC (rev 8829) +++ trunk/drivers/svg.c 2008-09-26 21:42:01 UTC (rev 8830) @@ -170,6 +170,9 @@ plP_setphy((PLINT) 0, (PLINT) pls->xlength, (PLINT) 0, (PLINT) pls->ylength); } + /* Initialize family file info */ + plFamInit(pls); + /* Prompt for a file name if not already set */ plOpenFile(pls); @@ -187,6 +190,9 @@ void plD_bop_svg(PLStream *pls) { + /* Plot familying stuff. Not really understood, just copying gd.c */ + plGetFam(pls); + pls->famadv = 1; pls->page++; /* write opening svg tag for the new page */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-09-29 20:52:06
|
Revision: 8834 http://plplot.svn.sourceforge.net/plplot/?rev=8834&view=rev Author: airwin Date: 2008-09-29 20:51:44 +0000 (Mon, 29 Sep 2008) Log Message: ----------- Scale coordinates so that internal PLplot virtual pixel coordinates are larger (PIXELS_X x PIXELS_Y or 32768x24576) than the normal external coordinates used for the svg file. This change improves the PLplot internal precision sufficiently to solve the hidden line errors that occurred previously for example 18. This change left some continued lack of smoothness in the results (although no known hidden line problems). This additional issue was solved by storing the above scale factor and all the external coordinates written to the svg file as doubles. ToDo. Use explicit formatting on the coordinates written to the file to round values to say 0.01 pixels. This small a rounding error should not significantly compromise the smoothness and should substantially reduce the size of the svg files that are generated. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-09-29 14:55:39 UTC (rev 8833) +++ trunk/drivers/svg.c 2008-09-29 20:51:44 UTC (rev 8834) @@ -52,6 +52,7 @@ static int canvasXSize = 0; static int canvasYSize = 0; +static PLFLT scale = 0.; static int svgIndent = 0; static FILE *svgFile; @@ -159,20 +160,29 @@ /* Set up device parameters */ - plP_setpxl(DPI/25.4, DPI/25.4); /* Pixels/mm. */ - /* Set the bounds for plotting. default is SVG_Default_X x SVG_Default_Y unless otherwise specified. */ if (pls->xlength <= 0 || pls->ylength <= 0){ canvasXSize = SVG_Default_X; canvasYSize = SVG_Default_Y; - plP_setphy((PLINT) 0, (PLINT) SVG_Default_X, (PLINT) 0, (PLINT) SVG_Default_Y); } else { canvasXSize = pls->xlength; canvasYSize = pls->ylength; - plP_setphy((PLINT) 0, (PLINT) pls->xlength, (PLINT) 0, (PLINT) pls->ylength); - } + } + /* Calculate ratio of (larger) internal PLplot coordinates to external + coordinates used for svg file. */ + if (canvasXSize > canvasYSize) + scale = (PLFLT)PIXELS_X/(PLFLT)canvasXSize; + else + scale = (PLFLT)PIXELS_Y/(PLFLT)canvasYSize; + /* to return to old behaviour use + scale = 1.; + */ + plP_setphy((PLINT) 0, (PLINT) (scale*canvasXSize), (PLINT) 0, (PLINT) (scale*canvasYSize)); + + plP_setpxl(scale*DPI/25.4, scale*DPI/25.4); /* Pixels/mm. */ + /* Initialize family file info */ plFamInit(pls); @@ -245,7 +255,7 @@ svg_stroke_color(pls); svg_attr_value("fill", "none"); /* svg_attr_value("shape-rendering", "crisp-edges"); */ - svg_attr_values("points", "%d,%d %d,%d", x1a, y1a, x2a, y2a); + svg_attr_values("points", "%f,%f %f,%f", (double)x1a/scale, (double)y1a/scale, (double)x2a/scale, (double)y2a/scale); svg_open_end(); } @@ -344,7 +354,7 @@ svg_indent(); fprintf(svgFile, "points=\""); for (i = 0; i < npts; i++){ - fprintf(svgFile, "%d,%d ", xa[i], ya[i]); + fprintf(svgFile, "%f,%f ", (double)xa[i]/scale, (double)ya[i]/scale); if(((i+1)%10) == 0){ fprintf(svgFile,"\n"); svg_indent(); @@ -412,7 +422,7 @@ ftHt = 1.5 * pls->chrht * DPI/25.4; /* Calculate the tranformation matrix for SVG based on the - transformation matrix provived by PLplot. */ + transformation matrix provided by PLplot. */ plRotationShear(args->xform, &rotation, &shear, &stride); /* N.B. Experimentally, I (AWI) have found the svg rotation angle is the negative of the libcairo rotation angle, and the svg shear angle @@ -429,7 +439,7 @@ /* Apply coordinate transform for text display. The transformation also defines the location of the text in x and y. */ svg_open("g"); - svg_attr_values("transform", "matrix(%f %f %f %f %d %d)", t[0], t[1], t[2], t[3], args->x, (int)(args->y - 0.3*ftHt + 0.5)); + svg_attr_values("transform", "matrix(%f %f %f %f %f %f)", t[0], t[1], t[2], t[3], (double)(args->x/scale), (double)(args->y/scale - 0.3*ftHt + 0.5)); svg_general(">\n"); /*-------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-09-29 21:46:39
|
Revision: 8835 http://plplot.svn.sourceforge.net/plplot/?rev=8835&view=rev Author: airwin Date: 2008-09-29 21:46:26 +0000 (Mon, 29 Sep 2008) Log Message: ----------- Round positions to 0.01 pixels. The result doesn't save that much in raw file size (8-16 per cent for the few cases I looked at), but it will probably save substantially in compressed file size since there are a lot less "random" numbers to reduce the effectiveness of the compression. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-09-29 20:51:44 UTC (rev 8834) +++ trunk/drivers/svg.c 2008-09-29 21:46:26 UTC (rev 8835) @@ -255,7 +255,7 @@ svg_stroke_color(pls); svg_attr_value("fill", "none"); /* svg_attr_value("shape-rendering", "crisp-edges"); */ - svg_attr_values("points", "%f,%f %f,%f", (double)x1a/scale, (double)y1a/scale, (double)x2a/scale, (double)y2a/scale); + svg_attr_values("points", "%r,%r %r,%r", (double)x1a/scale, (double)y1a/scale, (double)x2a/scale, (double)y2a/scale); svg_open_end(); } @@ -354,7 +354,7 @@ svg_indent(); fprintf(svgFile, "points=\""); for (i = 0; i < npts; i++){ - fprintf(svgFile, "%f,%f ", (double)xa[i]/scale, (double)ya[i]/scale); + fprintf(svgFile, "%.2f,%.2f ", (double)xa[i]/scale, (double)ya[i]/scale); if(((i+1)%10) == 0){ fprintf(svgFile,"\n"); svg_indent(); @@ -644,6 +644,11 @@ dval = va_arg(ap, double); fprintf(svgFile, "%f", dval); break; + case 'r': + /* r is non-standard, but use it here to format rounded value */ + dval = va_arg(ap, double); + fprintf(svgFile, "%.2f", dval); + break; case 's': sval = va_arg(ap, char *); fprintf(svgFile, "%s", sval); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-09-29 23:10:48
|
Revision: 8837 http://plplot.svn.sourceforge.net/plplot/?rev=8837&view=rev Author: airwin Date: 2008-09-29 23:10:29 +0000 (Mon, 29 Sep 2008) Log Message: ----------- Adjust multiplicative factor on ftHt to get the best empirical vertical position of text using example 1 and example 2. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-09-29 21:50:08 UTC (rev 8836) +++ trunk/drivers/svg.c 2008-09-29 23:10:29 UTC (rev 8837) @@ -418,7 +418,7 @@ plgesc(&plplot_esc); plgfci(&fci); - /* determine the font height */ + /* determine the font height in pixels*/ ftHt = 1.5 * pls->chrht * DPI/25.4; /* Calculate the tranformation matrix for SVG based on the @@ -437,9 +437,11 @@ t[3] = -sin_rot * sin_shear + cos_rot * cos_shear; /* Apply coordinate transform for text display. - The transformation also defines the location of the text in x and y. */ + The transformation also defines the location of the text in x and y. + The value of the ftHT multiplicative factor has been determined + empirically by looking at example 1 and example 2 results. */ svg_open("g"); - svg_attr_values("transform", "matrix(%f %f %f %f %f %f)", t[0], t[1], t[2], t[3], (double)(args->x/scale), (double)(args->y/scale - 0.3*ftHt + 0.5)); + svg_attr_values("transform", "matrix(%f %f %f %f %f %f)", t[0], t[1], t[2], t[3], (double)(args->x/scale), (double)(args->y/scale - 0.38*ftHt + 0.5)); svg_general(">\n"); /*-------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-09-30 20:44:23
|
Revision: 8840 http://plplot.svn.sourceforge.net/plplot/?rev=8840&view=rev Author: airwin Date: 2008-09-30 20:44:11 +0000 (Tue, 30 Sep 2008) Log Message: ----------- A stroke-width of 0 in SVG means the stroke is not painted. Therefore, make the minimum width 1. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-09-30 18:10:24 UTC (rev 8839) +++ trunk/drivers/svg.c 2008-09-30 20:44:11 UTC (rev 8840) @@ -710,13 +710,15 @@ /*--------------------------------------------------------------------- svg_stroke_width () - sets the stroke color based on the current color + sets the stroke width based on the current width + N.B. a stroke width of 0 in SVG means no stroke is painted so + we make sure the minimum value is 1. ---------------------------------------------------------------------*/ void svg_stroke_width(PLStream *pls) { svg_indent(); - fprintf(svgFile, "stroke-width=\"%d\"\n", pls->width); + fprintf(svgFile, "stroke-width=\"%d\"\n", MAX(1,pls->width)); } /*--------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hba...@us...> - 2008-10-04 02:15:57
|
Revision: 8847 http://plplot.svn.sourceforge.net/plplot/?rev=8847&view=rev Author: hbabcock Date: 2008-10-04 02:15:53 +0000 (Sat, 04 Oct 2008) Log Message: ----------- Separate the overall text positioning transform from the baseline offset transform so that the baseline offset in y is applied in the new, possibly rotated coordinate system, instead of the original coordinate system. This fixes some of the issues with rendering non-horizontal text. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-10-01 20:57:14 UTC (rev 8846) +++ trunk/drivers/svg.c 2008-10-04 02:15:53 UTC (rev 8847) @@ -441,9 +441,13 @@ The value of the ftHT multiplicative factor has been determined empirically by looking at example 1 and example 2 results. */ svg_open("g"); - svg_attr_values("transform", "matrix(%f %f %f %f %f %f)", t[0], t[1], t[2], t[3], (double)(args->x/scale), (double)(args->y/scale - 0.38*ftHt + 0.5)); + svg_attr_values("transform", "matrix(%f %f %f %f %f %f)", t[0], t[1], t[2], t[3], (double)(args->x/scale), (double)(args->y/scale)); svg_general(">\n"); + svg_open("g"); + svg_attr_values("transform", "matrix(1.0 0.0 0.0 1.0 0.0 %f)", 0.38*ftHt - 0.5); + svg_general(">\n"); + /*-------------- open text tag --------------*/ @@ -569,6 +573,7 @@ svg_close("text"); svg_close("g"); + svg_close("g"); } /*--------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hba...@us...> - 2008-10-04 03:34:07
|
Revision: 8848 http://plplot.svn.sourceforge.net/plplot/?rev=8848&view=rev Author: hbabcock Date: 2008-10-04 03:33:58 +0000 (Sat, 04 Oct 2008) Log Message: ----------- Added text clipping. This makes rendering with Firefox quite a bit slower, so we may make it optional or remove it in the future. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-10-04 02:15:53 UTC (rev 8847) +++ trunk/drivers/svg.c 2008-10-04 03:33:58 UTC (rev 8848) @@ -396,6 +396,7 @@ void proc_str (PLStream *pls, EscText *args) { char plplot_esc; + short static which_clip = 0; short i; short upDown = 0; short totalTags = 1; @@ -421,6 +422,24 @@ /* determine the font height in pixels*/ ftHt = 1.5 * pls->chrht * DPI/25.4; + /* Setup & apply text clipping area */ + svg_open("clipPath"); + svg_attr_values("id","text-clipping%d", which_clip); + svg_general(">\n"); + svg_open("rect"); + svg_attr_values("x","%f", pls->clpxmi/scale); + svg_attr_values("y","%f", pls->clpymi/scale); + svg_attr_values("width","%f", (pls->clpxma - pls->clpxmi)/scale); + svg_attr_values("height","%f", (pls->clpyma - pls->clpymi)/scale); + svg_open_end(); + svg_close("clipPath"); + + svg_open("g"); + svg_attr_values("clip-path", "url(#text-clipping%d)", which_clip); + svg_general(">\n"); + + which_clip++; + /* Calculate the tranformation matrix for SVG based on the transformation matrix provided by PLplot. */ plRotationShear(args->xform, &rotation, &shear, &stride); @@ -574,6 +593,7 @@ svg_close("text"); svg_close("g"); svg_close("g"); + svg_close("g"); } /*--------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-09-28 19:22:49
|
Revision: 8831 http://plplot.svn.sourceforge.net/plplot/?rev=8831&view=rev Author: airwin Date: 2008-09-28 19:22:45 +0000 (Sun, 28 Sep 2008) Log Message: ----------- Skip all pages after the first if family file output is not specified. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-09-26 21:42:01 UTC (rev 8830) +++ trunk/drivers/svg.c 2008-09-28 19:22:45 UTC (rev 8831) @@ -57,6 +57,7 @@ static FILE *svgFile; static char curColor[7]; +static int already_warned = 0; /* font stuff */ @@ -79,7 +80,9 @@ static void svg_stroke_color(PLStream *); static void svg_fill_color(PLStream *); static void svg_fill_background_color(PLStream *); +static int svg_family_check(PLStream *); + /* General */ static void poly_line(PLStream *, short *, short *, PLINT, short); @@ -194,6 +197,7 @@ plGetFam(pls); pls->famadv = 1; pls->page++; + if(svg_family_check(pls)) {return;} /* write opening svg tag for the new page */ @@ -235,6 +239,7 @@ void plD_line_svg(PLStream *pls, short x1a, short y1a, short x2a, short y2a) { + if(svg_family_check(pls)) {return;} svg_open("polyline"); svg_stroke_width(pls); svg_stroke_color(pls); @@ -252,6 +257,7 @@ void plD_polyline_svg(PLStream *pls, short *xa, short *ya, PLINT npts) { + if(svg_family_check(pls)) {return;} poly_line(pls, xa, ya, npts, 0); } @@ -263,6 +269,7 @@ void plD_eop_svg(PLStream *pls) { + if(svg_family_check(pls)) {return;} /* write the closing svg tag */ svg_close("g"); @@ -277,6 +284,7 @@ void plD_tidy_svg(PLStream *pls) { + if(svg_family_check(pls)) {return;} fclose(svgFile); } @@ -301,6 +309,7 @@ void plD_esc_svg(PLStream *pls, PLINT op, void *ptr) { + if(svg_family_check(pls)) {return;} int i; switch (op) { @@ -746,9 +755,33 @@ } /*--------------------------------------------------------------------- + svg_family_check () + + support function to help supress more than one page if family file + output not specified by the user (e.g., with the -fam command-line option). + ---------------------------------------------------------------------*/ + +int svg_family_check(PLStream *pls) +{ + if (pls->family || pls->page == 1) + { + return 0; + } + else + { + if(! already_warned) + { + already_warned = 1; + plwarn("All pages after the first skipped because family file output not specified.\n"); + } + return 1; + } +} + +/*--------------------------------------------------------------------- write_hex () - writes a unsigned char as an approriately formatted hex value + writes a unsigned char as an appropriately formatted hex value ---------------------------------------------------------------------*/ void write_hex(unsigned char val) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-10-01 06:08:19
|
Revision: 8844 http://plplot.svn.sourceforge.net/plplot/?rev=8844&view=rev Author: airwin Date: 2008-10-01 06:07:51 +0000 (Wed, 01 Oct 2008) Log Message: ----------- Change unit of width and height of SVG viewport from points (1/72th of an inch) to pixels. This makes a difference on monitors with DPI values different from 72 (which is essentially all of them since their true DPI values typically range from 80 to 100 DPI). I have ensured that X establishes a reliable DPI for my particular old monitor (it turns out that is 80) so this -dev svg change means that when I specify a resolution in pixels using the -geometry PLplot option, I get the expected size of result in pixels as measured on my monitor screen. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-10-01 01:46:57 UTC (rev 8843) +++ trunk/drivers/svg.c 2008-10-01 06:07:51 UTC (rev 8844) @@ -217,8 +217,8 @@ svg_attr_value("version", "1.1"); /* svg_attr_values("width", "%dcm", (int)((double)canvasXSize/DPI * 2.54)); */ /* svg_attr_values("height", "%dcm", (int)((double)canvasYSize/DPI * 2.54)); */ - svg_attr_values("width", "%dpt", canvasXSize); - svg_attr_values("height", "%dpt", canvasYSize); + svg_attr_values("width", "%dpx", canvasXSize); + svg_attr_values("height", "%dpx", canvasYSize); svg_attr_values("viewBox", "%d %d %d %d", 0, 0, canvasXSize, canvasYSize); svg_general(">\n"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hba...@us...> - 2008-10-06 02:07:40
|
Revision: 8855 http://plplot.svn.sourceforge.net/plplot/?rev=8855&view=rev Author: hbabcock Date: 2008-10-06 02:07:36 +0000 (Mon, 06 Oct 2008) Log Message: ----------- Made text clipping optional for the svg driver, turn this on with text_clipping=1. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-10-05 01:00:26 UTC (rev 8854) +++ trunk/drivers/svg.c 2008-10-06 02:07:36 UTC (rev 8855) @@ -60,6 +60,13 @@ static char curColor[7]; static int already_warned = 0; +static int text_clipping; +static DrvOpt svg_options[] = {{"text_clipping", DRV_INT, &text_clipping, "Use text clipping (text_clipping=0|1)"}}; + +typedef struct { + short textClipping; +} SVG; + /* font stuff */ /* Debugging extras */ @@ -140,6 +147,7 @@ void plD_init_svg(PLStream *pls) { + SVG *aStream; pls->termin = 0; /* not an interactive device */ pls->color = 1; /* supports color */ @@ -186,11 +194,22 @@ /* Initialize family file info */ plFamInit(pls); - /* Prompt for a file name if not already set */ - + /* Prompt for a file name if not already set */ plOpenFile(pls); svgFile = pls->OutFile; + /* Handle the text clipping option */ + aStream = malloc(sizeof(SVG)); + plParseDrvOpts(svg_options); + + printf("text clipping: %d\n", text_clipping); + /* Turn on text clipping if the user desires this */ + if(text_clipping){ + aStream->textClipping = 1; + } + aStream->textClipping = text_clipping; + pls->dev = aStream; + svgIndent = 0; svg_open("?xml version=\"1.0\" encoding=\"UTF-8\"?>"); } @@ -408,6 +427,7 @@ PLFLT t[4]; /* PLFLT *t = args->xform; */ PLUNICODE *ucs4 = args->unicode_array; + SVG *aStream; /* check that we got unicode */ if(ucs4Len == 0){ @@ -422,24 +442,27 @@ /* determine the font height in pixels*/ ftHt = 1.5 * pls->chrht * DPI/25.4; - /* Setup & apply text clipping area */ - svg_open("clipPath"); - svg_attr_values("id","text-clipping%d", which_clip); - svg_general(">\n"); - svg_open("rect"); - svg_attr_values("x","%f", pls->clpxmi/scale); - svg_attr_values("y","%f", pls->clpymi/scale); - svg_attr_values("width","%f", (pls->clpxma - pls->clpxmi)/scale); - svg_attr_values("height","%f", (pls->clpyma - pls->clpymi)/scale); - svg_open_end(); - svg_close("clipPath"); - - svg_open("g"); - svg_attr_values("clip-path", "url(#text-clipping%d)", which_clip); - svg_general(">\n"); + /* Setup & apply text clipping area if desired */ + aStream = (SVG*)pls->dev; + if(aStream->textClipping){ + svg_open("clipPath"); + svg_attr_values("id","text-clipping%d", which_clip); + svg_general(">\n"); + svg_open("rect"); + svg_attr_values("x","%f", pls->clpxmi/scale); + svg_attr_values("y","%f", pls->clpymi/scale); + svg_attr_values("width","%f", (pls->clpxma - pls->clpxmi)/scale); + svg_attr_values("height","%f", (pls->clpyma - pls->clpymi)/scale); + svg_open_end(); + svg_close("clipPath"); + + svg_open("g"); + svg_attr_values("clip-path", "url(#text-clipping%d)", which_clip); + svg_general(">\n"); + + which_clip++; + } - which_clip++; - /* Calculate the tranformation matrix for SVG based on the transformation matrix provided by PLplot. */ plRotationShear(args->xform, &rotation, &shear, &stride); @@ -593,7 +616,9 @@ svg_close("text"); svg_close("g"); svg_close("g"); - svg_close("g"); + if(aStream->textClipping){ + svg_close("g"); + } } /*--------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hba...@us...> - 2008-10-06 02:08:45
|
Revision: 8856 http://plplot.svn.sourceforge.net/plplot/?rev=8856&view=rev Author: hbabcock Date: 2008-10-06 02:08:40 +0000 (Mon, 06 Oct 2008) Log Message: ----------- Remove printf debugging. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-10-06 02:07:36 UTC (rev 8855) +++ trunk/drivers/svg.c 2008-10-06 02:08:40 UTC (rev 8856) @@ -202,7 +202,6 @@ aStream = malloc(sizeof(SVG)); plParseDrvOpts(svg_options); - printf("text clipping: %d\n", text_clipping); /* Turn on text clipping if the user desires this */ if(text_clipping){ aStream->textClipping = 1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hba...@us...> - 2008-10-06 02:20:15
|
Revision: 8857 http://plplot.svn.sourceforge.net/plplot/?rev=8857&view=rev Author: hbabcock Date: 2008-10-06 02:20:11 +0000 (Mon, 06 Oct 2008) Log Message: ----------- Fix a sign problem with subscripts that was causing them to become superscripts. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-10-06 02:08:40 UTC (rev 8856) +++ trunk/drivers/svg.c 2008-10-06 02:20:11 UTC (rev 8857) @@ -880,15 +880,12 @@ short desired_offset(short level, double ftHt) { - if(level > 0){ - return -level * ftHt * pow(0.6, abs(level)); - } - else if(level < 0){ - return level * ftHt * pow(0.6, abs(level)); - } - else{ - return 0; - } + if(level != 0){ + return -level * ftHt * pow(0.6, abs(level)); + } + else{ + return 0; + } } /*--------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hba...@us...> - 2008-10-06 02:28:00
|
Revision: 8858 http://plplot.svn.sourceforge.net/plplot/?rev=8858&view=rev Author: hbabcock Date: 2008-10-06 02:27:36 +0000 (Mon, 06 Oct 2008) Log Message: ----------- Fix the -ori problem. The text rendering was ignoring the pls->diorot parameter. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-10-06 02:20:11 UTC (rev 8857) +++ trunk/drivers/svg.c 2008-10-06 02:27:36 UTC (rev 8858) @@ -468,6 +468,7 @@ /* N.B. Experimentally, I (AWI) have found the svg rotation angle is the negative of the libcairo rotation angle, and the svg shear angle is pi minus the libcairo shear angle. */ + rotation -= pls->diorot * 3.14159 / 2.0; cos_rot = cos(rotation); sin_rot = -sin(rotation); sin_shear = sin(shear); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-10-06 06:27:19
|
Revision: 8859 http://plplot.svn.sourceforge.net/plplot/?rev=8859&view=rev Author: airwin Date: 2008-10-06 06:22:55 +0000 (Mon, 06 Oct 2008) Log Message: ----------- Text clipping turned on by default. Specify that PLplot core software generates pattern fills. Improved value of PI. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-10-06 02:27:36 UTC (rev 8858) +++ trunk/drivers/svg.c 2008-10-06 06:22:55 UTC (rev 8859) @@ -60,7 +60,7 @@ static char curColor[7]; static int already_warned = 0; -static int text_clipping; +static int text_clipping = 1; static DrvOpt svg_options[] = {{"text_clipping", DRV_INT, &text_clipping, "Use text clipping (text_clipping=0|1)"}}; typedef struct { @@ -158,8 +158,8 @@ pls->dev_text = 1; /* handles text */ pls->dev_unicode = 1; /* wants text as unicode */ pls->page = 0; - pls->dev_fill0 = 1; /* supports hardware solid fills */ - pls->dev_fill1 = 1; + pls->dev_fill0 = 1; /* driver generates solid fills */ + pls->dev_fill1 = 0; /* PLplot core software generates pattern fills */ pls->graphx = GRAPHICS_MODE; @@ -468,7 +468,7 @@ /* N.B. Experimentally, I (AWI) have found the svg rotation angle is the negative of the libcairo rotation angle, and the svg shear angle is pi minus the libcairo shear angle. */ - rotation -= pls->diorot * 3.14159 / 2.0; + rotation -= pls->diorot * PI / 2.0; cos_rot = cos(rotation); sin_rot = -sin(rotation); sin_shear = sin(shear); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-10-08 17:20:52
|
Revision: 8863 http://plplot.svn.sourceforge.net/plplot/?rev=8863&view=rev Author: airwin Date: 2008-10-08 17:20:48 +0000 (Wed, 08 Oct 2008) Log Message: ----------- Remove declaration for unused variable. For some reason this unneeded declaration was causing an error rather than a warning for Robert Pollak's Visual Studio 2008 Express Edition compiler for Windows XP. I double-checked with od there were no non-printing characters in that line. Anyhow, the "why the error" question is now moot since I have removed the line. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-10-08 08:56:44 UTC (rev 8862) +++ trunk/drivers/svg.c 2008-10-08 17:20:48 UTC (rev 8863) @@ -338,7 +338,6 @@ void plD_esc_svg(PLStream *pls, PLINT op, void *ptr) { if(svg_family_check(pls)) {return;} - int i; switch (op) { case PLESC_FILL: /* fill polygon */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-10-11 20:23:27
|
Revision: 8883 http://plplot.svn.sourceforge.net/plplot/?rev=8883&view=rev Author: airwin Date: 2008-10-11 20:23:21 +0000 (Sat, 11 Oct 2008) Log Message: ----------- Put in a DocType declaration to get rid of one SVG 1.1 validator warning. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-10-11 06:15:24 UTC (rev 8882) +++ trunk/drivers/svg.c 2008-10-11 20:23:21 UTC (rev 8883) @@ -210,7 +210,9 @@ pls->dev = aStream; svgIndent = 0; - svg_open("?xml version=\"1.0\" encoding=\"UTF-8\"?>"); + svg_general("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); + svg_general("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n"); + svg_general(" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n"); } /*---------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2011-07-09 01:49:42
|
Revision: 11800 http://plplot.svn.sourceforge.net/plplot/?rev=11800&view=rev Author: airwin Date: 2011-07-09 01:49:33 +0000 (Sat, 09 Jul 2011) Log Message: ----------- Use plP_script_scale method to replace idiosyncratic method of determining superscript/subscript font sizes and offsets. The test_superscript_subscript.py results are much improved by this change. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2011-07-07 20:56:29 UTC (rev 11799) +++ trunk/drivers/svg.c 2011-07-09 01:49:33 UTC (rev 11800) @@ -566,7 +566,6 @@ char plplot_esc; short static which_clip = 0; short i; - short upDown; short totalTags = 1; short ucs4Len = args->unicode_array_len; double ftHt, scaled_offset, scaled_ftHt; @@ -579,6 +578,8 @@ // PLFLT *t = args->xform; PLUNICODE *ucs4 = args->unicode_array; SVG *aStream; + PLFLT old_sscale, sscale, old_soffset, soffset, old_dup, dup; + PLINT level; // check that we got unicode if ( ucs4Len == 0 ) @@ -748,7 +749,8 @@ } i = 0; scaled_ftHt = ftHt; - upDown = 0; + level = 0; + dup = 0.; while ( i < ucs4Len ) { if ( ucs4[i] < PL_FCI_MARK ) // not a font change @@ -787,9 +789,23 @@ // adjustment. if ( ucs4[i] == (PLUNICODE) 'u' ) // Superscript { - upDown++; - scaled_offset = -FONT_SHIFT_RATIO * 0.80 * scaled_ftHt; - scaled_ftHt = ftHt * pow( 0.75, (double) abs( upDown ) ); + plP_script_scale( TRUE, &level, + &old_sscale, &sscale, &old_soffset, &soffset ); + // The correction for the difference in magnitude + // between the baseline and middle coordinate systems + // for superscripts should be + // 0.5*(base font size - superscript/subscript font size). + old_dup = dup; + dup = 0.5 * ( 1.0 - sscale ); + if(level <= 0) + { + scaled_offset = FONT_SHIFT_RATIO * ftHt * ( 0.80 * ( soffset - old_soffset ) - ( dup - old_dup ) ); + } + else + { + scaled_offset = -FONT_SHIFT_RATIO * ftHt * ( 0.80 * ( soffset - old_soffset ) + ( dup - old_dup ) ); + } + scaled_ftHt = sscale* ftHt; if ( if_write ) { totalTags++; @@ -802,9 +818,23 @@ } if ( ucs4[i] == (PLUNICODE) 'd' ) // Subscript { - upDown--; - scaled_ftHt = ftHt * pow( 0.75, (double) abs( upDown ) ); - scaled_offset = FONT_SHIFT_RATIO * 0.80 * scaled_ftHt; + plP_script_scale( FALSE, &level, + &old_sscale, &sscale, &old_soffset, &soffset ); + // The correction for the difference in magnitude + // between the baseline and middle coordinate systems + // for superscripts should be + // 0.5*(base font size - superscript/subscript font size). + old_dup = dup; + dup = 0.5 * ( 1.0 - sscale ); + if(level < 0) + { + scaled_offset = FONT_SHIFT_RATIO * ftHt * ( 0.80 * ( soffset - old_soffset ) - ( dup - old_dup ) ); + } + else + { + scaled_offset = -FONT_SHIFT_RATIO * ftHt * ( 0.80 * ( soffset - old_soffset ) + ( dup - old_dup ) ); + } + scaled_ftHt = sscale* ftHt; if ( if_write ) { totalTags++; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-10-11 22:50:33
|
Revision: 8884 http://plplot.svn.sourceforge.net/plplot/?rev=8884&view=rev Author: airwin Date: 2008-10-11 22:50:22 +0000 (Sat, 11 Oct 2008) Log Message: ----------- Remove white space and line ends from text. This solves most but not all text placement issues for the ImageMagick "display" code. ToDo. The remaining text placement issue concerns the interpretation of PLplot's string justification parameter which takes continuous values from 0. to 1. Currently, those are interpreted as one of beginning, middle, and end of string, and this quantization is much too crude. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-10-11 20:23:21 UTC (rev 8883) +++ trunk/drivers/svg.c 2008-10-11 22:50:22 UTC (rev 8884) @@ -612,9 +612,16 @@ for(i=0;i<totalTags;i++){ fprintf(svgFile,"</tspan>"); } - fprintf(svgFile,"\n"); - - svg_close("text"); + /* The following commented out (by AWI) because it is a bad idea to + * put line ends in the middle of a text tag. This was the key to + * all the text rendering issues we had. */ + /*fprintf(svgFile,"\n");*/ + /* For the same reason use fprintf and svgIndent -= 2; + * to close the text tag rather than svg_close("text"); since + * we don't want indentation spaces entering the text. */ + /* svg_close("text"); */ + fprintf(svgFile,"</text>\n"); + svgIndent -= 2; svg_close("g"); svg_close("g"); if(aStream->textClipping){ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-10-12 19:13:38
|
Revision: 8885 http://plplot.svn.sourceforge.net/plplot/?rev=8885&view=rev Author: airwin Date: 2008-10-12 19:13:33 +0000 (Sun, 12 Oct 2008) Log Message: ----------- Code indentation style changed to the emacs default in preparation for further real code changes. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-10-11 22:50:22 UTC (rev 8884) +++ trunk/drivers/svg.c 2008-10-12 19:13:33 UTC (rev 8885) @@ -1,24 +1,24 @@ /* November 8, 2006 - PLplot driver for SVG 1.1 (http://www.w3.org/Graphics/SVG/) + PLplot driver for SVG 1.1 (http://www.w3.org/Graphics/SVG/) - Copyright (C) 2006 Hazen Babcock + Copyright (C) 2006 Hazen Babcock - This file is part of PLplot. + This file is part of PLplot. - PLplot is free software; you can redistribute it and/or modify - it under the terms of the GNU General Library Public License as published - by the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + PLplot is free software; you can redistribute it and/or modify + it under the terms of the GNU General Library Public License as published + by the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. - PLplot is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Library General Public License for more details. + PLplot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Library General Public License for more details. - You should have received a copy of the GNU Library General Public License - along with PLplot; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Library General Public License + along with PLplot; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -124,19 +124,19 @@ void plD_dispatch_init_svg(PLDispatchTable *pdt) { #ifndef ENABLE_DYNDRIVERS - pdt->pl_MenuStr = "Scalable Vector Graphics (SVG 1.1)"; - pdt->pl_DevName = "svg"; + pdt->pl_MenuStr = "Scalable Vector Graphics (SVG 1.1)"; + pdt->pl_DevName = "svg"; #endif - pdt->pl_type = plDevType_FileOriented; - pdt->pl_seq = 57; - pdt->pl_init = (plD_init_fp) plD_init_svg; - pdt->pl_line = (plD_line_fp) plD_line_svg; - pdt->pl_polyline = (plD_polyline_fp) plD_polyline_svg; - pdt->pl_eop = (plD_eop_fp) plD_eop_svg; - pdt->pl_bop = (plD_bop_fp) plD_bop_svg; - pdt->pl_tidy = (plD_tidy_fp) plD_tidy_svg; - pdt->pl_state = (plD_state_fp) plD_state_svg; - pdt->pl_esc = (plD_esc_fp) plD_esc_svg; + pdt->pl_type = plDevType_FileOriented; + pdt->pl_seq = 57; + pdt->pl_init = (plD_init_fp) plD_init_svg; + pdt->pl_line = (plD_line_fp) plD_line_svg; + pdt->pl_polyline = (plD_polyline_fp) plD_polyline_svg; + pdt->pl_eop = (plD_eop_fp) plD_eop_svg; + pdt->pl_bop = (plD_bop_fp) plD_bop_svg; + pdt->pl_tidy = (plD_tidy_fp) plD_tidy_svg; + pdt->pl_state = (plD_state_fp) plD_state_svg; + pdt->pl_esc = (plD_esc_fp) plD_esc_svg; } /*--------------------------------------------------------------------- @@ -147,72 +147,72 @@ void plD_init_svg(PLStream *pls) { - SVG *aStream; + SVG *aStream; - pls->termin = 0; /* not an interactive device */ - pls->color = 1; /* supports color */ - pls->width = 1; - pls->verbose = 1; - pls->bytecnt = 0; - /*pls->debug = 1;*/ - pls->dev_text = 1; /* handles text */ - pls->dev_unicode = 1; /* wants text as unicode */ - pls->page = 0; - pls->dev_fill0 = 1; /* driver generates solid fills */ - pls->dev_fill1 = 0; /* PLplot core software generates pattern fills */ + pls->termin = 0; /* not an interactive device */ + pls->color = 1; /* supports color */ + pls->width = 1; + pls->verbose = 1; + pls->bytecnt = 0; + /*pls->debug = 1;*/ + pls->dev_text = 1; /* handles text */ + pls->dev_unicode = 1; /* wants text as unicode */ + pls->page = 0; + pls->dev_fill0 = 1; /* driver generates solid fills */ + pls->dev_fill1 = 0; /* PLplot core software generates pattern fills */ - pls->graphx = GRAPHICS_MODE; + pls->graphx = GRAPHICS_MODE; - if (!pls->colorset) - pls->color = 1; + if (!pls->colorset) + pls->color = 1; - /* Set up device parameters */ + /* Set up device parameters */ - /* Set the bounds for plotting. default is SVG_Default_X x SVG_Default_Y unless otherwise specified. */ + /* Set the bounds for plotting. default is SVG_Default_X x SVG_Default_Y unless otherwise specified. */ - if (pls->xlength <= 0 || pls->ylength <= 0){ - canvasXSize = SVG_Default_X; - canvasYSize = SVG_Default_Y; - } else { - canvasXSize = pls->xlength; - canvasYSize = pls->ylength; - } - /* Calculate ratio of (larger) internal PLplot coordinates to external - coordinates used for svg file. */ - if (canvasXSize > canvasYSize) - scale = (PLFLT)(PIXELS_X-1)/(PLFLT)canvasXSize; - else - scale = (PLFLT)PIXELS_Y/(PLFLT)canvasYSize; - /* to return to old behaviour use - scale = 1.; - */ + if (pls->xlength <= 0 || pls->ylength <= 0){ + canvasXSize = SVG_Default_X; + canvasYSize = SVG_Default_Y; + } else { + canvasXSize = pls->xlength; + canvasYSize = pls->ylength; + } + /* Calculate ratio of (larger) internal PLplot coordinates to external + coordinates used for svg file. */ + if (canvasXSize > canvasYSize) + scale = (PLFLT)(PIXELS_X-1)/(PLFLT)canvasXSize; + else + scale = (PLFLT)PIXELS_Y/(PLFLT)canvasYSize; + /* to return to old behaviour use + scale = 1.; + */ - plP_setphy((PLINT) 0, (PLINT) (scale*canvasXSize), (PLINT) 0, (PLINT) (scale*canvasYSize)); + plP_setphy((PLINT) 0, (PLINT) (scale*canvasXSize), (PLINT) 0, (PLINT) (scale*canvasYSize)); - plP_setpxl(scale*DPI/25.4, scale*DPI/25.4); /* Pixels/mm. */ + plP_setpxl(scale*DPI/25.4, scale*DPI/25.4); /* Pixels/mm. */ - /* Initialize family file info */ - plFamInit(pls); + /* Initialize family file info */ + plFamInit(pls); - /* Prompt for a file name if not already set */ - plOpenFile(pls); - svgFile = pls->OutFile; + /* Prompt for a file name if not already set */ + plOpenFile(pls); + svgFile = pls->OutFile; - /* Handle the text clipping option */ - aStream = malloc(sizeof(SVG)); - plParseDrvOpts(svg_options); + /* Handle the text clipping option */ + aStream = malloc(sizeof(SVG)); + plParseDrvOpts(svg_options); - /* Turn on text clipping if the user desires this */ - if(text_clipping){ - aStream->textClipping = 1; - } - aStream->textClipping = text_clipping; - pls->dev = aStream; + /* Turn on text clipping if the user desires this */ + if(text_clipping){ + aStream->textClipping = 1; + } + aStream->textClipping = text_clipping; + pls->dev = aStream; - svgIndent = 0; - svg_general("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); - svg_general("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n"); - svg_general(" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n"); + svgIndent = 0; + svg_general("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); + svg_general("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n"); + svg_general(" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n"); } /*---------------------------------------------------------------------- @@ -223,42 +223,42 @@ void plD_bop_svg(PLStream *pls) { - /* Plot familying stuff. Not really understood, just copying gd.c */ - plGetFam(pls); - pls->famadv = 1; - pls->page++; - if(svg_family_check(pls)) {return;} + /* Plot familying stuff. Not really understood, just copying gd.c */ + plGetFam(pls); + pls->famadv = 1; + pls->page++; + if(svg_family_check(pls)) {return;} - /* write opening svg tag for the new page */ + /* write opening svg tag for the new page */ - svg_open("svg"); - svg_attr_value("xmlns", "http://www.w3.org/2000/svg"); - svg_attr_value("xmlns:xlink", "http://www.w3.org/1999/xlink"); - svg_attr_value("version", "1.1"); - /* svg_attr_values("width", "%dcm", (int)((double)canvasXSize/DPI * 2.54)); */ - /* svg_attr_values("height", "%dcm", (int)((double)canvasYSize/DPI * 2.54)); */ - svg_attr_values("width", "%dpx", canvasXSize); - svg_attr_values("height", "%dpx", canvasYSize); - svg_attr_values("viewBox", "%d %d %d %d", 0, 0, canvasXSize, canvasYSize); - svg_general(">\n"); + svg_open("svg"); + svg_attr_value("xmlns", "http://www.w3.org/2000/svg"); + svg_attr_value("xmlns:xlink", "http://www.w3.org/1999/xlink"); + svg_attr_value("version", "1.1"); + /* svg_attr_values("width", "%dcm", (int)((double)canvasXSize/DPI * 2.54)); */ + /* svg_attr_values("height", "%dcm", (int)((double)canvasYSize/DPI * 2.54)); */ + svg_attr_values("width", "%dpx", canvasXSize); + svg_attr_values("height", "%dpx", canvasYSize); + svg_attr_values("viewBox", "%d %d %d %d", 0, 0, canvasXSize, canvasYSize); + svg_general(">\n"); - /* set the background by drawing a rectangle that is the size of - of the canvas and filling it with the background color. */ + /* set the background by drawing a rectangle that is the size of + of the canvas and filling it with the background color. */ - svg_open("rect"); - svg_attr_values("x", "%d", 0); - svg_attr_values("y", "%d", 0); - svg_attr_values("width", "%d", canvasXSize); - svg_attr_values("height", "%d", canvasYSize); - svg_attr_value("stroke", "none"); - svg_fill_background_color(pls); - svg_open_end(); + svg_open("rect"); + svg_attr_values("x", "%d", 0); + svg_attr_values("y", "%d", 0); + svg_attr_values("width", "%d", canvasXSize); + svg_attr_values("height", "%d", canvasYSize); + svg_attr_value("stroke", "none"); + svg_fill_background_color(pls); + svg_open_end(); - /* invert the coordinate system so that PLplot graphs appear right side up */ + /* invert the coordinate system so that PLplot graphs appear right side up */ - svg_open("g"); - svg_attr_values("transform", "matrix(1 0 0 -1 0 %d)", canvasYSize); - svg_general(">\n"); + svg_open("g"); + svg_attr_values("transform", "matrix(1 0 0 -1 0 %d)", canvasYSize); + svg_general(">\n"); } /*--------------------------------------------------------------------- @@ -269,14 +269,14 @@ void plD_line_svg(PLStream *pls, short x1a, short y1a, short x2a, short y2a) { - if(svg_family_check(pls)) {return;} - svg_open("polyline"); - svg_stroke_width(pls); - svg_stroke_color(pls); - svg_attr_value("fill", "none"); - /* svg_attr_value("shape-rendering", "crisp-edges"); */ - svg_attr_values("points", "%r,%r %r,%r", (double)x1a/scale, (double)y1a/scale, (double)x2a/scale, (double)y2a/scale); - svg_open_end(); + if(svg_family_check(pls)) {return;} + svg_open("polyline"); + svg_stroke_width(pls); + svg_stroke_color(pls); + svg_attr_value("fill", "none"); + /* svg_attr_value("shape-rendering", "crisp-edges"); */ + svg_attr_values("points", "%r,%r %r,%r", (double)x1a/scale, (double)y1a/scale, (double)x2a/scale, (double)y2a/scale); + svg_open_end(); } /*--------------------------------------------------------------------- @@ -287,8 +287,8 @@ void plD_polyline_svg(PLStream *pls, short *xa, short *ya, PLINT npts) { - if(svg_family_check(pls)) {return;} - poly_line(pls, xa, ya, npts, 0); + if(svg_family_check(pls)) {return;} + poly_line(pls, xa, ya, npts, 0); } /*--------------------------------------------------------------------- @@ -299,11 +299,11 @@ void plD_eop_svg(PLStream *pls) { - if(svg_family_check(pls)) {return;} + if(svg_family_check(pls)) {return;} /* write the closing svg tag */ - svg_close("g"); - svg_close("svg"); + svg_close("g"); + svg_close("svg"); } /*--------------------------------------------------------------------- @@ -314,8 +314,8 @@ void plD_tidy_svg(PLStream *pls) { - if(svg_family_check(pls)) {return;} - fclose(svgFile); + if(svg_family_check(pls)) {return;} + fclose(svgFile); } /*--------------------------------------------------------------------- @@ -359,28 +359,28 @@ void poly_line(PLStream *pls, short *xa, short *ya, PLINT npts, short fill) { - int i; + int i; - svg_open("polyline"); - svg_stroke_width(pls); - svg_stroke_color(pls); - if(fill){ - svg_fill_color(pls); - } else { - svg_attr_value("fill", "none"); - } - /* svg_attr_value("shape-rendering", "crisp-edges"); */ - svg_indent(); - fprintf(svgFile, "points=\""); - for (i = 0; i < npts; i++){ - fprintf(svgFile, "%.2f,%.2f ", (double)xa[i]/scale, (double)ya[i]/scale); - if(((i+1)%10) == 0){ - fprintf(svgFile,"\n"); - svg_indent(); - } - } - fprintf(svgFile, "\"/>\n"); - svgIndent -= 2; + svg_open("polyline"); + svg_stroke_width(pls); + svg_stroke_color(pls); + if(fill){ + svg_fill_color(pls); + } else { + svg_attr_value("fill", "none"); + } + /* svg_attr_value("shape-rendering", "crisp-edges"); */ + svg_indent(); + fprintf(svgFile, "points=\""); + for (i = 0; i < npts; i++){ + fprintf(svgFile, "%.2f,%.2f ", (double)xa[i]/scale, (double)ya[i]/scale); + if(((i+1)%10) == 0){ + fprintf(svgFile,"\n"); + svg_indent(); + } + } + fprintf(svgFile, "\"/>\n"); + svgIndent -= 2; } /*--------------------------------------------------------------------- @@ -414,219 +414,219 @@ void proc_str (PLStream *pls, EscText *args) { - char plplot_esc; - short static which_clip = 0; - short i; - short upDown = 0; - short totalTags = 1; - short ucs4Len = args->unicode_array_len; - short lastOffset = 0; - double ftHt; - PLUNICODE fci; - PLFLT rotation, shear, stride, cos_rot, sin_rot, sin_shear, cos_shear; - PLFLT t[4]; - /* PLFLT *t = args->xform; */ - PLUNICODE *ucs4 = args->unicode_array; - SVG *aStream; + char plplot_esc; + short static which_clip = 0; + short i; + short upDown = 0; + short totalTags = 1; + short ucs4Len = args->unicode_array_len; + short lastOffset = 0; + double ftHt; + PLUNICODE fci; + PLFLT rotation, shear, stride, cos_rot, sin_rot, sin_shear, cos_shear; + PLFLT t[4]; + /* PLFLT *t = args->xform; */ + PLUNICODE *ucs4 = args->unicode_array; + SVG *aStream; - /* check that we got unicode */ - if(ucs4Len == 0){ - printf("Non unicode string passed to SVG driver, ignoring\n"); - return; - } + /* check that we got unicode */ + if(ucs4Len == 0){ + printf("Non unicode string passed to SVG driver, ignoring\n"); + return; + } - /* get plplot escape character and the current font */ - plgesc(&plplot_esc); - plgfci(&fci); + /* get plplot escape character and the current font */ + plgesc(&plplot_esc); + plgfci(&fci); - /* determine the font height in pixels*/ - ftHt = 1.5 * pls->chrht * DPI/25.4; + /* determine the font height in pixels*/ + ftHt = 1.5 * pls->chrht * DPI/25.4; - /* Setup & apply text clipping area if desired */ - aStream = (SVG*)pls->dev; - if(aStream->textClipping){ - svg_open("clipPath"); - svg_attr_values("id","text-clipping%d", which_clip); - svg_general(">\n"); - svg_open("rect"); - svg_attr_values("x","%f", pls->clpxmi/scale); - svg_attr_values("y","%f", pls->clpymi/scale); - svg_attr_values("width","%f", (pls->clpxma - pls->clpxmi)/scale); - svg_attr_values("height","%f", (pls->clpyma - pls->clpymi)/scale); - svg_open_end(); - svg_close("clipPath"); + /* Setup & apply text clipping area if desired */ + aStream = (SVG*)pls->dev; + if(aStream->textClipping){ + svg_open("clipPath"); + svg_attr_values("id","text-clipping%d", which_clip); + svg_general(">\n"); + svg_open("rect"); + svg_attr_values("x","%f", pls->clpxmi/scale); + svg_attr_values("y","%f", pls->clpymi/scale); + svg_attr_values("width","%f", (pls->clpxma - pls->clpxmi)/scale); + svg_attr_values("height","%f", (pls->clpyma - pls->clpymi)/scale); + svg_open_end(); + svg_close("clipPath"); - svg_open("g"); - svg_attr_values("clip-path", "url(#text-clipping%d)", which_clip); - svg_general(">\n"); + svg_open("g"); + svg_attr_values("clip-path", "url(#text-clipping%d)", which_clip); + svg_general(">\n"); - which_clip++; - } + which_clip++; + } - /* Calculate the tranformation matrix for SVG based on the - transformation matrix provided by PLplot. */ - plRotationShear(args->xform, &rotation, &shear, &stride); - /* N.B. Experimentally, I (AWI) have found the svg rotation angle is - the negative of the libcairo rotation angle, and the svg shear angle - is pi minus the libcairo shear angle. */ - rotation -= pls->diorot * PI / 2.0; - cos_rot = cos(rotation); - sin_rot = -sin(rotation); - sin_shear = sin(shear); - cos_shear = -cos(shear); - t[0] = cos_rot; - t[1] = -sin_rot; - t[2] = cos_rot * sin_shear + sin_rot * cos_shear; - t[3] = -sin_rot * sin_shear + cos_rot * cos_shear; + /* Calculate the tranformation matrix for SVG based on the + transformation matrix provided by PLplot. */ + plRotationShear(args->xform, &rotation, &shear, &stride); + /* N.B. Experimentally, I (AWI) have found the svg rotation angle is + the negative of the libcairo rotation angle, and the svg shear angle + is pi minus the libcairo shear angle. */ + rotation -= pls->diorot * PI / 2.0; + cos_rot = cos(rotation); + sin_rot = -sin(rotation); + sin_shear = sin(shear); + cos_shear = -cos(shear); + t[0] = cos_rot; + t[1] = -sin_rot; + t[2] = cos_rot * sin_shear + sin_rot * cos_shear; + t[3] = -sin_rot * sin_shear + cos_rot * cos_shear; - /* Apply coordinate transform for text display. - The transformation also defines the location of the text in x and y. - The value of the ftHT multiplicative factor has been determined - empirically by looking at example 1 and example 2 results. */ - svg_open("g"); - svg_attr_values("transform", "matrix(%f %f %f %f %f %f)", t[0], t[1], t[2], t[3], (double)(args->x/scale), (double)(args->y/scale)); - svg_general(">\n"); + /* Apply coordinate transform for text display. + The transformation also defines the location of the text in x and y. + The value of the ftHT multiplicative factor has been determined + empirically by looking at example 1 and example 2 results. */ + svg_open("g"); + svg_attr_values("transform", "matrix(%f %f %f %f %f %f)", t[0], t[1], t[2], t[3], (double)(args->x/scale), (double)(args->y/scale)); + svg_general(">\n"); - svg_open("g"); - svg_attr_values("transform", "matrix(1.0 0.0 0.0 1.0 0.0 %f)", 0.38*ftHt - 0.5); - svg_general(">\n"); + svg_open("g"); + svg_attr_values("transform", "matrix(1.0 0.0 0.0 1.0 0.0 %f)", 0.38*ftHt - 0.5); + svg_general(">\n"); - /*-------------- - open text tag - --------------*/ + /*-------------- + open text tag + --------------*/ - svg_open("text"); + svg_open("text"); - /* I believe this property to be important, but I'm not sure what the right value is. - In example 2 the numbers are all over the place vertically. Perhaps that could - be controlled in some way with this parameter? */ - svg_attr_value("dominant-baseline","no-change"); + /* I believe this property to be important, but I'm not sure what the right value is. + In example 2 the numbers are all over the place vertically. Perhaps that could + be controlled in some way with this parameter? */ + svg_attr_value("dominant-baseline","no-change"); - /* The text goes at zero in x since the coordinate transform also defined the location of the text */ - svg_attr_value("x", "0"); - svg_attr_value("y", "0"); + /* The text goes at zero in x since the coordinate transform also defined the location of the text */ + svg_attr_value("x", "0"); + svg_attr_value("y", "0"); -/* Tentavively removed. The examples, or at least Example 1, seem to expect - the driver to ignore the text baseline, so the baseline adjustment is - now done the text transform is applied above. + /* Tentavively removed. The examples, or at least Example 1, seem to expect + the driver to ignore the text baseline, so the baseline adjustment is + now done the text transform is applied above. - /* Set the baseline of the string by adjusting the y offset - Values were arrived at by trial and error. Unfortunately they don't seem to - right in all cases, presumably due to adjustments being performed by - my svg renderer. + /* Set the baseline of the string by adjusting the y offset + Values were arrived at by trial and error. Unfortunately they don't seem to + right in all cases, presumably due to adjustments being performed by + my svg renderer. - if (args->base == 2){ + if (args->base == 2){ /* Align to the top of the text, and probably wrong. - svg_attr_values("y", "%d", (int)(0.7*ftHt + 0.5)); - } - else if (args->base == 1){ + svg_attr_values("y", "%d", (int)(0.7*ftHt + 0.5)); + } + else if (args->base == 1){ /* Align to the bottom of the text. This was adjusted based on example1 so that the symbols would be centered on the line. It is strange that it should have the same value as align to the middle of the text. - svg_attr_values("y", "%d", (int)(0.3*ftHt + 0.5)); - } - else{ + svg_attr_values("y", "%d", (int)(0.3*ftHt + 0.5)); + } + else{ /* Align to the middle of the text This was adjusted based on example1 so that the axis label text would be centered on the appropriate tick mark. Strangely, some seem to end up on the high side and others on the low side. Perhaps this is due rounding to the nearest pixel? - svg_attr_values("y", "%d", (int)(0.3*ftHt + 0.5)); - } -*/ + svg_attr_values("y", "%d", (int)(0.3*ftHt + 0.5)); + } + */ - /* set font color */ - svg_fill_color(pls); + /* set font color */ + svg_fill_color(pls); - /* white space preserving mode */ - svg_attr_value("xml:space","preserve"); + /* white space preserving mode */ + svg_attr_value("xml:space","preserve"); - /* set the font size */ - svg_attr_values("font-size","%d", (int)ftHt); + /* set the font size */ + svg_attr_values("font-size","%d", (int)ftHt); - /* set the justification, svg only supports 3 options so we round appropriately */ + /* set the justification, svg only supports 3 options so we round appropriately */ - if (args->just < 0.33) - svg_attr_value("text-anchor", "start"); /* left justification */ - else if (args->just > 0.66) - svg_attr_value("text-anchor", "end"); /* right justification */ - else - svg_attr_value("text-anchor", "middle"); /* center */ + if (args->just < 0.33) + svg_attr_value("text-anchor", "start"); /* left justification */ + else if (args->just > 0.66) + svg_attr_value("text-anchor", "end"); /* right justification */ + else + svg_attr_value("text-anchor", "middle"); /* center */ - fprintf(svgFile,">"); + fprintf(svgFile,">"); - /* specify the initial font */ - specify_font(fci); + /* specify the initial font */ + specify_font(fci); - /*---------------------------------------------------------- - Write the text with formatting - We just keep stacking up tspan tags, then close them all - after we have written out all of the text. - ----------------------------------------------------------*/ + /*---------------------------------------------------------- + Write the text with formatting + We just keep stacking up tspan tags, then close them all + after we have written out all of the text. + ----------------------------------------------------------*/ - i = 0; - while (i < ucs4Len){ - if (ucs4[i] < PL_FCI_MARK){ /* not a font change */ - if (ucs4[i] != (PLUNICODE)plplot_esc) { /* a character to display */ - write_unicode(ucs4[i]); - i++; - continue; - } - i++; - if (ucs4[i] == (PLUNICODE)plplot_esc){ /* a escape character to display */ - write_unicode(ucs4[i]); - i++; - continue; - } - else { - if(ucs4[i] == (PLUNICODE)'u'){ /* Superscript */ - totalTags++; - upDown++; - fprintf(svgFile,"<tspan dy=\"%d\" font-size=\"%d\">", desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown)))); - lastOffset = desired_offset(upDown, ftHt); - } - if(ucs4[i] == (PLUNICODE)'d'){ /* Subscript */ - totalTags++; - upDown--; - fprintf(svgFile,"<tspan dy=\"%d\" font-size=\"%d\">", desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown)))); - lastOffset = desired_offset(upDown, ftHt); - } - i++; - } - } - else { /* a font change */ - specify_font(ucs4[i]); - totalTags++; - i++; - } - } + i = 0; + while (i < ucs4Len){ + if (ucs4[i] < PL_FCI_MARK){ /* not a font change */ + if (ucs4[i] != (PLUNICODE)plplot_esc) { /* a character to display */ + write_unicode(ucs4[i]); + i++; + continue; + } + i++; + if (ucs4[i] == (PLUNICODE)plplot_esc){ /* a escape character to display */ + write_unicode(ucs4[i]); + i++; + continue; + } + else { + if(ucs4[i] == (PLUNICODE)'u'){ /* Superscript */ + totalTags++; + upDown++; + fprintf(svgFile,"<tspan dy=\"%d\" font-size=\"%d\">", desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown)))); + lastOffset = desired_offset(upDown, ftHt); + } + if(ucs4[i] == (PLUNICODE)'d'){ /* Subscript */ + totalTags++; + upDown--; + fprintf(svgFile,"<tspan dy=\"%d\" font-size=\"%d\">", desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown)))); + lastOffset = desired_offset(upDown, ftHt); + } + i++; + } + } + else { /* a font change */ + specify_font(ucs4[i]); + totalTags++; + i++; + } + } - /*---------------------------------------------- - close out all the tspan tags and the text tag - ----------------------------------------------*/ + /*---------------------------------------------- + close out all the tspan tags and the text tag + ----------------------------------------------*/ - for(i=0;i<totalTags;i++){ - fprintf(svgFile,"</tspan>"); - } - /* The following commented out (by AWI) because it is a bad idea to - * put line ends in the middle of a text tag. This was the key to - * all the text rendering issues we had. */ - /*fprintf(svgFile,"\n");*/ - /* For the same reason use fprintf and svgIndent -= 2; - * to close the text tag rather than svg_close("text"); since - * we don't want indentation spaces entering the text. */ - /* svg_close("text"); */ - fprintf(svgFile,"</text>\n"); - svgIndent -= 2; - svg_close("g"); - svg_close("g"); - if(aStream->textClipping){ - svg_close("g"); - } + for(i=0;i<totalTags;i++){ + fprintf(svgFile,"</tspan>"); + } + /* The following commented out (by AWI) because it is a bad idea to + * put line ends in the middle of a text tag. This was the key to + * all the text rendering issues we had. */ + /*fprintf(svgFile,"\n");*/ + /* For the same reason use fprintf and svgIndent -= 2; + * to close the text tag rather than svg_close("text"); since + * we don't want indentation spaces entering the text. */ + /* svg_close("text"); */ + fprintf(svgFile,"</text>\n"); + svgIndent -= 2; + svg_close("g"); + svg_close("g"); + if(aStream->textClipping){ + svg_close("g"); + } } /*--------------------------------------------------------------------- @@ -637,9 +637,9 @@ void svg_open (char *tag) { - svg_indent(); - fprintf(svgFile, "<%s\n", tag); - svgIndent += 2; + svg_indent(); + fprintf(svgFile, "<%s\n", tag); + svgIndent += 2; } /*--------------------------------------------------------------------- @@ -651,9 +651,9 @@ void svg_open_end (void) { - svg_indent(); - fprintf(svgFile, "/>\n"); - svgIndent -= 2; + svg_indent(); + fprintf(svgFile, "/>\n"); + svgIndent -= 2; } /*--------------------------------------------------------------------- @@ -665,8 +665,8 @@ void svg_attr_value (char *attribute, char *value) { - svg_indent(); - fprintf(svgFile, "%s=\"%s\"\n", attribute, value); + svg_indent(); + fprintf(svgFile, "%s=\"%s\"\n", attribute, value); } /*--------------------------------------------------------------------- @@ -682,44 +682,44 @@ void svg_attr_values (char *attribute, char *format, ...) { - va_list ap; - char *p, *sval; - int ival; - double dval; + va_list ap; + char *p, *sval; + int ival; + double dval; - svg_indent(); - fprintf(svgFile, "%s=\"", attribute); - va_start(ap, format); - for(p=format; *p; p++){ - if(*p != '%'){ - fprintf(svgFile, "%c", *p); - continue; - } - switch(*++p){ - case 'd': - ival = va_arg(ap, int); - fprintf(svgFile, "%d", ival); - break; - case 'f': - dval = va_arg(ap, double); - fprintf(svgFile, "%f", dval); - break; - case 'r': - /* r is non-standard, but use it here to format rounded value */ - dval = va_arg(ap, double); - fprintf(svgFile, "%.2f", dval); - break; - case 's': - sval = va_arg(ap, char *); - fprintf(svgFile, "%s", sval); - break; - default: - fprintf(svgFile, "%c", *p); - break; - } - } - fprintf(svgFile, "\"\n"); - va_end(ap); + svg_indent(); + fprintf(svgFile, "%s=\"", attribute); + va_start(ap, format); + for(p=format; *p; p++){ + if(*p != '%'){ + fprintf(svgFile, "%c", *p); + continue; + } + switch(*++p){ + case 'd': + ival = va_arg(ap, int); + fprintf(svgFile, "%d", ival); + break; + case 'f': + dval = va_arg(ap, double); + fprintf(svgFile, "%f", dval); + break; + case 'r': + /* r is non-standard, but use it here to format rounded value */ + dval = va_arg(ap, double); + fprintf(svgFile, "%.2f", dval); + break; + case 's': + sval = va_arg(ap, char *); + fprintf(svgFile, "%s", sval); + break; + default: + fprintf(svgFile, "%c", *p); + break; + } + } + fprintf(svgFile, "\"\n"); + va_end(ap); } /*--------------------------------------------------------------------- @@ -730,13 +730,13 @@ void svg_close (char *tag) { - svgIndent -= 2; - svg_indent(); - if(strlen(tag) > 0){ - fprintf(svgFile, "</%s>\n", tag); - } else { - fprintf(svgFile, "/>\n"); - } + svgIndent -= 2; + svg_indent(); + if(strlen(tag) > 0){ + fprintf(svgFile, "</%s>\n", tag); + } else { + fprintf(svgFile, "/>\n"); + } } /*--------------------------------------------------------------------- @@ -747,8 +747,8 @@ void svg_general (char *text) { - svg_indent(); - fprintf(svgFile, "%s", text); + svg_indent(); + fprintf(svgFile, "%s", text); } /*--------------------------------------------------------------------- @@ -759,10 +759,10 @@ void svg_indent(void) { - short i; - for(i=0;i<svgIndent;i++){ - fprintf(svgFile, " "); - } + short i; + for(i=0;i<svgIndent;i++){ + fprintf(svgFile, " "); + } } /*--------------------------------------------------------------------- @@ -775,8 +775,8 @@ void svg_stroke_width(PLStream *pls) { - svg_indent(); - fprintf(svgFile, "stroke-width=\"%d\"\n", MAX(1,pls->width)); + svg_indent(); + fprintf(svgFile, "stroke-width=\"%d\"\n", MAX(1,pls->width)); } /*--------------------------------------------------------------------- @@ -787,14 +787,14 @@ void svg_stroke_color(PLStream *pls) { - svg_indent(); - fprintf(svgFile, "stroke=\"#"); - write_hex(pls->curcolor.r); - write_hex(pls->curcolor.g); - write_hex(pls->curcolor.b); - fprintf(svgFile, "\"\n"); - svg_indent(); - fprintf(svgFile, "stroke-opacity=\"%f\"\n", pls->curcolor.a); + svg_indent(); + fprintf(svgFile, "stroke=\"#"); + write_hex(pls->curcolor.r); + write_hex(pls->curcolor.g); + write_hex(pls->curcolor.b); + fprintf(svgFile, "\"\n"); + svg_indent(); + fprintf(svgFile, "stroke-opacity=\"%f\"\n", pls->curcolor.a); } /*--------------------------------------------------------------------- @@ -805,14 +805,14 @@ void svg_fill_color(PLStream *pls) { - svg_indent(); - fprintf(svgFile, "fill=\"#"); - write_hex(pls->curcolor.r); - write_hex(pls->curcolor.g); - write_hex(pls->curcolor.b); - fprintf(svgFile, "\"\n"); - svg_indent(); - fprintf(svgFile, "fill-opacity=\"%f\"\n", pls->curcolor.a); + svg_indent(); + fprintf(svgFile, "fill=\"#"); + write_hex(pls->curcolor.r); + write_hex(pls->curcolor.g); + write_hex(pls->curcolor.b); + fprintf(svgFile, "\"\n"); + svg_indent(); + fprintf(svgFile, "fill-opacity=\"%f\"\n", pls->curcolor.a); } /*--------------------------------------------------------------------- @@ -823,12 +823,12 @@ void svg_fill_background_color(PLStream *pls) { - svg_indent(); - fprintf(svgFile, "fill=\"#"); - write_hex(pls->cmap0[0].r); - write_hex(pls->cmap0[0].g); - write_hex(pls->cmap0[0].b); - fprintf(svgFile, "\"\n"); + svg_indent(); + fprintf(svgFile, "fill=\"#"); + write_hex(pls->cmap0[0].r); + write_hex(pls->cmap0[0].g); + write_hex(pls->cmap0[0].b); + fprintf(svgFile, "\"\n"); } /*--------------------------------------------------------------------- @@ -840,19 +840,19 @@ int svg_family_check(PLStream *pls) { - if (pls->family || pls->page == 1) - { - return 0; - } - else - { - if(! already_warned) - { - already_warned = 1; - plwarn("All pages after the first skipped because family file output not specified.\n"); - } - return 1; - } + if (pls->family || pls->page == 1) + { + return 0; + } + else + { + if(! already_warned) + { + already_warned = 1; + plwarn("All pages after the first skipped because family file output not specified.\n"); + } + return 1; + } } /*--------------------------------------------------------------------- @@ -863,11 +863,11 @@ void write_hex(unsigned char val) { - if(val < 16){ - fprintf(svgFile, "0%X", val); - } else { - fprintf(svgFile, "%X", val); - } + if(val < 16){ + fprintf(svgFile, "0%X", val); + } else { + fprintf(svgFile, "%X", val); + } } /*--------------------------------------------------------------------- @@ -878,7 +878,7 @@ void write_unicode(PLUNICODE ucs4_char) { - fprintf(svgFile, "&#x%x;", ucs4_char); + fprintf(svgFile, "&#x%x;", ucs4_char); } /*--------------------------------------------------------------------- @@ -914,38 +914,38 @@ void specify_font(PLUNICODE ucs4_char) { - fprintf(svgFile,"<tspan "); + fprintf(svgFile,"<tspan "); - /* sans, serif, mono, script, symbol */ + /* sans, serif, mono, script, symbol */ - if((ucs4_char&0x00F) == 0x000){ - fprintf(svgFile, "font-family=\"sans-serif\" "); - } else if ((ucs4_char&0x00F) == 0x001) { - fprintf(svgFile, "font-family=\"serif\" "); - } else if ((ucs4_char&0x00F) == 0x002) { - fprintf(svgFile, "font-family=\"mono-space\" "); - } else if ((ucs4_char&0x00F) == 0x003) { - fprintf(svgFile, "font-family=\"cursive\" "); - } else if ((ucs4_char&0x00F) == 0x004) { - /* this should be symbol, but that doesn't seem to be available */ - fprintf(svgFile, "font-family=\"sans-serif\" "); - } + if((ucs4_char&0x00F) == 0x000){ + fprintf(svgFile, "font-family=\"sans-serif\" "); + } else if ((ucs4_char&0x00F) == 0x001) { + fprintf(svgFile, "font-family=\"serif\" "); + } else if ((ucs4_char&0x00F) == 0x002) { + fprintf(svgFile, "font-family=\"mono-space\" "); + } else if ((ucs4_char&0x00F) == 0x003) { + fprintf(svgFile, "font-family=\"cursive\" "); + } else if ((ucs4_char&0x00F) == 0x004) { + /* this should be symbol, but that doesn't seem to be available */ + fprintf(svgFile, "font-family=\"sans-serif\" "); + } - /* normal, italic, oblique */ + /* normal, italic, oblique */ - if((ucs4_char&0x0F0) == 0x000){ - fprintf(svgFile, "font-style=\"normal\" "); - } else if ((ucs4_char&0x0F0) == 0x010) { - fprintf(svgFile, "font-style=\"italic\" "); - } else if ((ucs4_char&0x0F0) == 0x020) { - fprintf(svgFile, "font-style=\"oblique\" "); - } + if((ucs4_char&0x0F0) == 0x000){ + fprintf(svgFile, "font-style=\"normal\" "); + } else if ((ucs4_char&0x0F0) == 0x010) { + fprintf(svgFile, "font-style=\"italic\" "); + } else if ((ucs4_char&0x0F0) == 0x020) { + fprintf(svgFile, "font-style=\"oblique\" "); + } - /* normal, bold */ + /* normal, bold */ - if((ucs4_char&0xF00) == 0x000){ - fprintf(svgFile, "font-weight=\"normal\">"); - } else if ((ucs4_char&0xF00) == 0x100) { - fprintf(svgFile, "font-weight=\"bold\">"); - } + if((ucs4_char&0xF00) == 0x000){ + fprintf(svgFile, "font-weight=\"normal\">"); + } else if ((ucs4_char&0xF00) == 0x100) { + fprintf(svgFile, "font-weight=\"bold\">"); + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-10-12 19:58:19
|
Revision: 8886 http://plplot.svn.sourceforge.net/plplot/?rev=8886&view=rev Author: airwin Date: 2008-10-12 19:58:13 +0000 (Sun, 12 Oct 2008) Log Message: ----------- Put infrastructure in place for calculating the sum of the glyph sizes for the complete unicode text, but don't use this infrastructure, yet so the result is the same except for some xml attribute reordering. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-10-12 19:13:33 UTC (rev 8885) +++ trunk/drivers/svg.c 2008-10-12 19:58:13 UTC (rev 8886) @@ -417,7 +417,7 @@ char plplot_esc; short static which_clip = 0; short i; - short upDown = 0; + short upDown; short totalTags = 1; short ucs4Len = args->unicode_array_len; short lastOffset = 0; @@ -425,6 +425,8 @@ PLUNICODE fci; PLFLT rotation, shear, stride, cos_rot, sin_rot, sin_shear, cos_shear; PLFLT t[4]; + PLFLT glyph_size, sum_glyph_size; + short if_write; /* PLFLT *t = args->xform; */ PLUNICODE *ucs4 = args->unicode_array; SVG *aStream; @@ -502,13 +504,9 @@ be controlled in some way with this parameter? */ svg_attr_value("dominant-baseline","no-change"); - /* The text goes at zero in x since the coordinate transform also defined the location of the text */ - svg_attr_value("x", "0"); - svg_attr_value("y", "0"); - - /* Tentavively removed. The examples, or at least Example 1, seem to expect + /* Tentatively removed. The examples, or at least Example 1, seem to expect the driver to ignore the text baseline, so the baseline adjustment is - now done the text transform is applied above. + now done to the text transform as applied above. /* Set the baseline of the string by adjusting the y offset Values were arrived at by trial and error. Unfortunately they don't seem to @@ -546,62 +544,104 @@ svg_attr_value("xml:space","preserve"); /* set the font size */ - svg_attr_values("font-size","%d", (int)ftHt); + svg_attr_values("font-size","%f", ftHt); - /* set the justification, svg only supports 3 options so we round appropriately */ - - if (args->just < 0.33) - svg_attr_value("text-anchor", "start"); /* left justification */ - else if (args->just > 0.66) - svg_attr_value("text-anchor", "end"); /* right justification */ - else - svg_attr_value("text-anchor", "middle"); /* center */ - - fprintf(svgFile,">"); - - /* specify the initial font */ - specify_font(fci); - /*---------------------------------------------------------- Write the text with formatting We just keep stacking up tspan tags, then close them all after we have written out all of the text. ----------------------------------------------------------*/ - i = 0; - while (i < ucs4Len){ - if (ucs4[i] < PL_FCI_MARK){ /* not a font change */ - if (ucs4[i] != (PLUNICODE)plplot_esc) { /* a character to display */ - write_unicode(ucs4[i]); + /* For if_write = 0, we write nothing and instead accumulate the + * total sum_glyph_size from the fontsize of the individual glyphs which + * is then used to figure out the initial x position from text-anchor and + * args->just that is used to write out the SVG xml for if_write = 1. */ + + glyph_size = ftHt; + sum_glyph_size = 0.; + if_write = 0; + while (if_write < 2) { + i = 0; + upDown = 0; + while (i < ucs4Len){ + if (ucs4[i] < PL_FCI_MARK){ /* not a font change */ + if (ucs4[i] != (PLUNICODE)plplot_esc) { /* a character to display */ + if(if_write) { + write_unicode(ucs4[i]); + } + else{ + sum_glyph_size += glyph_size; + } + i++; + continue; + } i++; - continue; + if (ucs4[i] == (PLUNICODE)plplot_esc){ /* a escape character to display */ + if(if_write) { + write_unicode(ucs4[i]); + } + else{ + sum_glyph_size += glyph_size; + } + i++; + continue; + } + else { + if(ucs4[i] == (PLUNICODE)'u'){ /* Superscript */ + upDown++; + if(if_write) { + totalTags++; + fprintf(svgFile,"<tspan dy=\"%d\" font-size=\"%d\">", desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown)))); + } + else{ + glyph_size = desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown))); + } + lastOffset = desired_offset(upDown, ftHt); + } + if(ucs4[i] == (PLUNICODE)'d'){ /* Subscript */ + upDown--; + if(if_write) { + totalTags++; + fprintf(svgFile,"<tspan dy=\"%d\" font-size=\"%d\">", desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown)))); + } + else{ + glyph_size = desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown))); + } + lastOffset = desired_offset(upDown, ftHt); + } + i++; + } } - i++; - if (ucs4[i] == (PLUNICODE)plplot_esc){ /* a escape character to display */ - write_unicode(ucs4[i]); - i++; - continue; - } - else { - if(ucs4[i] == (PLUNICODE)'u'){ /* Superscript */ + else { /* a font change */ + if(if_write) { + specify_font(ucs4[i]); totalTags++; - upDown++; - fprintf(svgFile,"<tspan dy=\"%d\" font-size=\"%d\">", desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown)))); - lastOffset = desired_offset(upDown, ftHt); } - if(ucs4[i] == (PLUNICODE)'d'){ /* Subscript */ - totalTags++; - upDown--; - fprintf(svgFile,"<tspan dy=\"%d\" font-size=\"%d\">", desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown)))); - lastOffset = desired_offset(upDown, ftHt); - } i++; } } - else { /* a font change */ - specify_font(ucs4[i]); - totalTags++; - i++; + if_write++; + if(if_write == 1) { + if (args->just < 0.33) + svg_attr_value("text-anchor", "start"); /* left justification */ + else if (args->just > 0.66) + svg_attr_value("text-anchor", "end"); /* right justification */ + else + svg_attr_value("text-anchor", "middle"); /* center */ + + /* The above coordinate transform defines the _raw_ x position of the + * text without justification so this attribute value depends on + * text-anchor and args->just. */ + svg_attr_value("x", "0"); + + /* The text goes at zero in y since the above + * coordinate transform defines the y position of the text */ + svg_attr_value("y", "0"); + fprintf(svgFile,">"); + + /* specify the initial font */ + specify_font(fci); + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-10-13 05:57:31
|
Revision: 8888 http://plplot.svn.sourceforge.net/plplot/?rev=8888&view=rev Author: airwin Date: 2008-10-13 05:57:25 +0000 (Mon, 13 Oct 2008) Log Message: ----------- Correct lastOffset = 0; bug and return to integer format for font size output to the file so that new infrastructure for calculating sum_glyph_size (but not using it yet) really does produce exactly the same results as revision 8884 and 8885 except for some attribute reordering. Code cleanup. Revision Links: -------------- http://plplot.svn.sourceforge.net/plplot/?rev=8884&view=rev Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-10-12 21:28:14 UTC (rev 8887) +++ trunk/drivers/svg.c 2008-10-13 05:57:25 UTC (rev 8888) @@ -46,6 +46,12 @@ #define MAX_STRING_LEN 1000 +/* This has been generated empirically by looking carefully at results from + * examples 1 and 2. It may be significant that the actual value is awful + * close to 0.80, the ratio of number of points/inch (72) and DPI. */ + +#define FONT_SIZE_RATIO 0.76 + /* local variables */ PLDLLIMPEXP_DRIVER const char* plD_DEVICE_INFO_svg = "svg:Scalable Vector Graphics (SVG 1.1):1:svg:57:svg"; @@ -420,7 +426,7 @@ short upDown; short totalTags = 1; short ucs4Len = args->unicode_array_len; - short lastOffset = 0; + short lastOffset; double ftHt; PLUNICODE fci; PLFLT rotation, shear, stride, cos_rot, sin_rot, sin_shear, cos_shear; @@ -482,15 +488,13 @@ t[3] = -sin_rot * sin_shear + cos_rot * cos_shear; /* Apply coordinate transform for text display. - The transformation also defines the location of the text in x and y. - The value of the ftHT multiplicative factor has been determined - empirically by looking at example 1 and example 2 results. */ + The transformation also defines the location of the text in x and y. */ svg_open("g"); svg_attr_values("transform", "matrix(%f %f %f %f %f %f)", t[0], t[1], t[2], t[3], (double)(args->x/scale), (double)(args->y/scale)); svg_general(">\n"); svg_open("g"); - svg_attr_values("transform", "matrix(1.0 0.0 0.0 1.0 0.0 %f)", 0.38*ftHt - 0.5); + svg_attr_values("transform", "matrix(1.0 0.0 0.0 1.0 0.0 %f)", FONT_SIZE_RATIO*0.5*ftHt - 0.5); svg_general(">\n"); /*-------------- @@ -499,44 +503,8 @@ svg_open("text"); - /* I believe this property to be important, but I'm not sure what the right value is. - In example 2 the numbers are all over the place vertically. Perhaps that could - be controlled in some way with this parameter? */ svg_attr_value("dominant-baseline","no-change"); - /* Tentatively removed. The examples, or at least Example 1, seem to expect - the driver to ignore the text baseline, so the baseline adjustment is - now done to the text transform as applied above. - - /* Set the baseline of the string by adjusting the y offset - Values were arrived at by trial and error. Unfortunately they don't seem to - right in all cases, presumably due to adjustments being performed by - my svg renderer. - - if (args->base == 2){ - /* Align to the top of the text, and probably wrong. - svg_attr_values("y", "%d", (int)(0.7*ftHt + 0.5)); - } - else if (args->base == 1){ - /* Align to the bottom of the text. - - This was adjusted based on example1 so that the symbols would be centered - on the line. It is strange that it should have the same value as align - to the middle of the text. - - svg_attr_values("y", "%d", (int)(0.3*ftHt + 0.5)); - } - else{ - /* Align to the middle of the text - - This was adjusted based on example1 so that the axis label text would be centered - on the appropriate tick mark. Strangely, some seem to end up on the high side - and others on the low side. Perhaps this is due rounding to the nearest pixel? - - svg_attr_values("y", "%d", (int)(0.3*ftHt + 0.5)); - } - */ - /* set font color */ svg_fill_color(pls); @@ -544,7 +512,7 @@ svg_attr_value("xml:space","preserve"); /* set the font size */ - svg_attr_values("font-size","%f", ftHt); + svg_attr_values("font-size","%d", (int)ftHt); /*---------------------------------------------------------- Write the text with formatting @@ -553,7 +521,7 @@ ----------------------------------------------------------*/ /* For if_write = 0, we write nothing and instead accumulate the - * total sum_glyph_size from the fontsize of the individual glyphs which + * sum_glyph_size from the fontsize of the individual glyphs which * is then used to figure out the initial x position from text-anchor and * args->just that is used to write out the SVG xml for if_write = 1. */ @@ -561,7 +529,32 @@ sum_glyph_size = 0.; if_write = 0; while (if_write < 2) { + if(if_write == 1) { + sum_glyph_size *= FONT_SIZE_RATIO; + if (args->just < 0.33) + svg_attr_value("text-anchor", "start"); /* left justification */ + else if (args->just > 0.66) + svg_attr_value("text-anchor", "end"); /* right justification */ + else + svg_attr_value("text-anchor", "middle"); /* center */ + + /* The above coordinate transform defines the _raw_ x position of the + * text without justification so this attribute value depends on + * text-anchor and args->just*sum_glyph_size */ + //svg_attr_values("x", "%f", (double)(-args->just*sum_glyph_size)); + + /* The text goes at zero in y since the above + * coordinate transform defines the y position of the text */ + svg_attr_value("x", "0"); + svg_attr_value("y", "0"); + fprintf(svgFile,">"); + + /* specify the initial font */ + specify_font(fci); + + } i = 0; + lastOffset = 0; upDown = 0; while (i < ucs4Len){ if (ucs4[i] < PL_FCI_MARK){ /* not a font change */ @@ -621,28 +614,6 @@ } } if_write++; - if(if_write == 1) { - if (args->just < 0.33) - svg_attr_value("text-anchor", "start"); /* left justification */ - else if (args->just > 0.66) - svg_attr_value("text-anchor", "end"); /* right justification */ - else - svg_attr_value("text-anchor", "middle"); /* center */ - - /* The above coordinate transform defines the _raw_ x position of the - * text without justification so this attribute value depends on - * text-anchor and args->just. */ - svg_attr_value("x", "0"); - - /* The text goes at zero in y since the above - * coordinate transform defines the y position of the text */ - svg_attr_value("y", "0"); - fprintf(svgFile,">"); - - /* specify the initial font */ - specify_font(fci); - - } } /*---------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2008-10-14 07:48:30
|
Revision: 8892 http://plplot.svn.sourceforge.net/plplot/?rev=8892&view=rev Author: airwin Date: 2008-10-14 07:48:25 +0000 (Tue, 14 Oct 2008) Log Message: ----------- Sort out several issues with glyph_size and sum_glyph_size. N.B. this sort of calculation only works properly for monospaced fonts. However, the justification correction is differentially applied with respect to the start, middle, or end of the string of glyphs depending on which anchor tag is used. Thus, justifications of 0., 0.5, or 1.0 should be perfect, and intermediate points will roughly be correct with the positioning errors depending on the font being used and the mix of glyphs in the string. Anyhow, the only justification other than 0., 0.5, or 1. used throughout the standard examples is example 3, and that result looks okay with this algorithm because it is not that far from 0. and 1. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-10-14 01:41:12 UTC (rev 8891) +++ trunk/drivers/svg.c 2008-10-14 07:48:25 UTC (rev 8892) @@ -431,7 +431,7 @@ PLUNICODE fci; PLFLT rotation, shear, stride, cos_rot, sin_rot, sin_shear, cos_shear; PLFLT t[4]; - PLFLT glyph_size, sum_glyph_size; + int glyph_size, sum_glyph_size; short if_write; /* PLFLT *t = args->xform; */ PLUNICODE *ucs4 = args->unicode_array; @@ -525,27 +525,34 @@ * is then used to figure out the initial x position from text-anchor and * args->just that is used to write out the SVG xml for if_write = 1. */ - glyph_size = ftHt; - sum_glyph_size = 0.; + glyph_size = (int)ftHt; + sum_glyph_size = 0; if_write = 0; while (if_write < 2) { if(if_write == 1) { - sum_glyph_size *= FONT_SIZE_RATIO; - if (args->just < 0.33) + /*printf("number of characters = %f\n", sum_glyph_size/(double)(int)ftHt);*/ + /* The above coordinate transform defines the _raw_ x position of the + * text without justification so this attribute value depends on + * text-anchor and args->just*FONT_SIZE_RATIO*sum_glyph_size */ + /* N.B. sum_glyph_size calculation only correct for monospaced fonts + * so generally sum_glyph_size will be overestimated by various amounts + * depending on what glyphs are to be rendered, the font, etc. However, + * this correction is differential respect to the end points or the + * middle so you should be okay so long as you don't deviate too far + * from those anchor points. */ + if (args->just < 0.33) { svg_attr_value("text-anchor", "start"); /* left justification */ - else if (args->just > 0.66) + svg_attr_values("x", "%f", (double)(-args->just*FONT_SIZE_RATIO*sum_glyph_size)); + }else if (args->just > 0.66) { svg_attr_value("text-anchor", "end"); /* right justification */ - else + svg_attr_values("x", "%f", (double)((1.-args->just)*FONT_SIZE_RATIO*sum_glyph_size)); + }else { svg_attr_value("text-anchor", "middle"); /* center */ + svg_attr_values("x", "%f", (double)((0.5-args->just)*FONT_SIZE_RATIO*sum_glyph_size)); + } - /* The above coordinate transform defines the _raw_ x position of the - * text without justification so this attribute value depends on - * text-anchor and args->just*sum_glyph_size */ - //svg_attr_values("x", "%f", (double)(-args->just*sum_glyph_size)); - /* The text goes at zero in y since the above * coordinate transform defines the y position of the text */ - svg_attr_value("x", "0"); svg_attr_value("y", "0"); fprintf(svgFile,">"); @@ -587,7 +594,7 @@ fprintf(svgFile,"<tspan dy=\"%d\" font-size=\"%d\">", desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown)))); } else{ - glyph_size = desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown))); + glyph_size = (int)(ftHt * pow(0.8, abs(upDown))); } lastOffset = desired_offset(upDown, ftHt); } @@ -598,7 +605,7 @@ fprintf(svgFile,"<tspan dy=\"%d\" font-size=\"%d\">", desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown)))); } else{ - glyph_size = desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown))); + glyph_size = (int)(ftHt * pow(0.8, abs(upDown))); } lastOffset = desired_offset(upDown, ftHt); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hba...@us...> - 2008-10-25 03:06:03
|
Revision: 8965 http://plplot.svn.sourceforge.net/plplot/?rev=8965&view=rev Author: hbabcock Date: 2008-10-25 03:05:58 +0000 (Sat, 25 Oct 2008) Log Message: ----------- Moved a whole raft of static global variables into the SVG structure and updated the code accordingly. This driver now passes Hez's multiple stream test. Modified Paths: -------------- trunk/drivers/svg.c Modified: trunk/drivers/svg.c =================================================================== --- trunk/drivers/svg.c 2008-10-25 02:19:38 UTC (rev 8964) +++ trunk/drivers/svg.c 2008-10-25 03:05:58 UTC (rev 8965) @@ -56,14 +56,6 @@ PLDLLIMPEXP_DRIVER const char* plD_DEVICE_INFO_svg = "svg:Scalable Vector Graphics (SVG 1.1):1:svg:57:svg"; -static int canvasXSize = 0; -static int canvasYSize = 0; -static PLFLT scale = 0.; - -static int svgIndent = 0; -static FILE *svgFile; - -static char curColor[7]; static int already_warned = 0; static int text_clipping = 1; @@ -71,6 +63,12 @@ typedef struct { short textClipping; + int canvasXSize; + int canvasYSize; + PLFLT scale; + int svgIndent; + FILE *svgFile; + /* char curColor[7]; */ } SVG; /* font stuff */ @@ -83,13 +81,13 @@ /* Functions for writing XML SVG tags to a file */ -static void svg_open(char *); -static void svg_open_end(void); -static void svg_attr_value(char *, char *); -static void svg_attr_values(char *, char *, ...); -static void svg_close(char *); -static void svg_general(char *); -static void svg_indent(void); +static void svg_open(SVG *, char *); +static void svg_open_end(SVG *); +static void svg_attr_value(SVG *, char *, char *); +static void svg_attr_values(SVG *, char *, char *, ...); +static void svg_close(SVG *, char *); +static void svg_general(SVG *, char *); +static void svg_indent(SVG *); static void svg_stroke_width(PLStream *); static void svg_stroke_color(PLStream *); static void svg_fill_color(PLStream *); @@ -100,10 +98,10 @@ /* General */ static void poly_line(PLStream *, short *, short *, PLINT, short); -static void write_hex(unsigned char); -static void write_unicode(PLUNICODE); +static void write_hex(FILE *, unsigned char); +static void write_unicode(FILE *, PLUNICODE); static short desired_offset(short, double); -static void specify_font(PLUNICODE); +static void specify_font(FILE *, PLUNICODE); /* String processing */ @@ -114,7 +112,7 @@ void plD_dispatch_init_svg (PLDispatchTable *pdt); void plD_init_svg (PLStream *); void plD_line_svg (PLStream *, short, short, short, short); -void plD_polyline_svg (PLStream *, short *, short *, PLINT); +void plD_polyline_svg (PLStream *, short *, short *, PLINT); void plD_eop_svg (PLStream *); void plD_bop_svg (PLStream *); void plD_tidy_svg (PLStream *); @@ -172,40 +170,40 @@ if (!pls->colorset) pls->color = 1; - /* Set up device parameters */ - + /* Set up device parameters */ + aStream = malloc(sizeof(SVG)); + /* Set the bounds for plotting. default is SVG_Default_X x SVG_Default_Y unless otherwise specified. */ if (pls->xlength <= 0 || pls->ylength <= 0){ - canvasXSize = SVG_Default_X; - canvasYSize = SVG_Default_Y; + aStream->canvasXSize = SVG_Default_X; + aStream->canvasYSize = SVG_Default_Y; } else { - canvasXSize = pls->xlength; - canvasYSize = pls->ylength; + aStream->canvasXSize = pls->xlength; + aStream->canvasYSize = pls->ylength; } /* Calculate ratio of (larger) internal PLplot coordinates to external coordinates used for svg file. */ - if (canvasXSize > canvasYSize) - scale = (PLFLT)(PIXELS_X-1)/(PLFLT)canvasXSize; + if (aStream->canvasXSize > aStream->canvasYSize) + aStream->scale = (PLFLT)(PIXELS_X-1)/(PLFLT)aStream->canvasXSize; else - scale = (PLFLT)PIXELS_Y/(PLFLT)canvasYSize; + aStream->scale = (PLFLT)PIXELS_Y/(PLFLT)aStream->canvasYSize; /* to return to old behaviour use scale = 1.; */ - plP_setphy((PLINT) 0, (PLINT) (scale*canvasXSize), (PLINT) 0, (PLINT) (scale*canvasYSize)); + plP_setphy((PLINT) 0, (PLINT) (aStream->scale*aStream->canvasXSize), (PLINT) 0, (PLINT) (aStream->scale*aStream->canvasYSize)); - plP_setpxl(scale*DPI/25.4, scale*DPI/25.4); /* Pixels/mm. */ + plP_setpxl(aStream->scale*DPI/25.4, aStream->scale*DPI/25.4); /* Pixels/mm. */ /* Initialize family file info */ plFamInit(pls); /* Prompt for a file name if not already set */ plOpenFile(pls); - svgFile = pls->OutFile; + aStream->svgFile = pls->OutFile; /* Handle the text clipping option */ - aStream = malloc(sizeof(SVG)); plParseDrvOpts(svg_options); /* Turn on text clipping if the user desires this */ @@ -215,10 +213,10 @@ aStream->textClipping = text_clipping; pls->dev = aStream; - svgIndent = 0; - svg_general("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); - svg_general("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n"); - svg_general(" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n"); + aStream->svgIndent = 0; + svg_general(aStream, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); + svg_general(aStream, "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n"); + svg_general(aStream, " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n"); } /*---------------------------------------------------------------------- @@ -229,6 +227,10 @@ void plD_bop_svg(PLStream *pls) { + SVG *aStream; + + aStream = pls->dev; + /* Plot familying stuff. Not really understood, just copying gd.c */ plGetFam(pls); pls->famadv = 1; @@ -237,34 +239,34 @@ /* write opening svg tag for the new page */ - svg_open("svg"); - svg_attr_value("xmlns", "http://www.w3.org/2000/svg"); - svg_attr_value("xmlns:xlink", "http://www.w3.org/1999/xlink"); - svg_attr_value("version", "1.1"); + svg_open(aStream, "svg"); + svg_attr_value(aStream, "xmlns", "http://www.w3.org/2000/svg"); + svg_attr_value(aStream, "xmlns:xlink", "http://www.w3.org/1999/xlink"); + svg_attr_value(aStream, "version", "1.1"); /* svg_attr_values("width", "%dcm", (int)((double)canvasXSize/DPI * 2.54)); */ /* svg_attr_values("height", "%dcm", (int)((double)canvasYSize/DPI * 2.54)); */ - svg_attr_values("width", "%dpx", canvasXSize); - svg_attr_values("height", "%dpx", canvasYSize); - svg_attr_values("viewBox", "%d %d %d %d", 0, 0, canvasXSize, canvasYSize); - svg_general(">\n"); + svg_attr_values(aStream, "width", "%dpx", aStream->canvasXSize); + svg_attr_values(aStream, "height", "%dpx", aStream->canvasYSize); + svg_attr_values(aStream, "viewBox", "%d %d %d %d", 0, 0, aStream->canvasXSize, aStream->canvasYSize); + svg_general(aStream, ">\n"); /* set the background by drawing a rectangle that is the size of of the canvas and filling it with the background color. */ - svg_open("rect"); - svg_attr_values("x", "%d", 0); - svg_attr_values("y", "%d", 0); - svg_attr_values("width", "%d", canvasXSize); - svg_attr_values("height", "%d", canvasYSize); - svg_attr_value("stroke", "none"); + svg_open(aStream, "rect"); + svg_attr_values(aStream, "x", "%d", 0); + svg_attr_values(aStream, "y", "%d", 0); + svg_attr_values(aStream, "width", "%d", aStream->canvasXSize); + svg_attr_values(aStream, "height", "%d", aStream->canvasYSize); + svg_attr_value(aStream, "stroke", "none"); svg_fill_background_color(pls); - svg_open_end(); + svg_open_end(aStream); /* invert the coordinate system so that PLplot graphs appear right side up */ - svg_open("g"); - svg_attr_values("transform", "matrix(1 0 0 -1 0 %d)", canvasYSize); - svg_general(">\n"); + svg_open(aStream, "g"); + svg_attr_values(aStream, "transform", "matrix(1 0 0 -1 0 %d)", aStream->canvasYSize); + svg_general(aStream, ">\n"); } /*--------------------------------------------------------------------- @@ -275,14 +277,18 @@ void plD_line_svg(PLStream *pls, short x1a, short y1a, short x2a, short y2a) { + SVG *aStream; + + aStream = pls->dev; + if(svg_family_check(pls)) {return;} - svg_open("polyline"); + svg_open(aStream, "polyline"); svg_stroke_width(pls); svg_stroke_color(pls); - svg_attr_value("fill", "none"); + svg_attr_value(aStream, "fill", "none"); /* svg_attr_value("shape-rendering", "crisp-edges"); */ - svg_attr_values("points", "%r,%r %r,%r", (double)x1a/scale, (double)y1a/scale, (double)x2a/scale, (double)y2a/scale); - svg_open_end(); + svg_attr_values(aStream, "points", "%r,%r %r,%r", (double)x1a/aStream->scale, (double)y1a/aStream->scale, (double)x2a/aStream->scale, (double)y2a/aStream->scale); + svg_open_end(aStream); } /*--------------------------------------------------------------------- @@ -305,11 +311,15 @@ void plD_eop_svg(PLStream *pls) { + SVG *aStream; + + aStream = pls->dev; + if(svg_family_check(pls)) {return;} /* write the closing svg tag */ - svg_close("g"); - svg_close("svg"); + svg_close(aStream, "g"); + svg_close(aStream, "svg"); } /*--------------------------------------------------------------------- @@ -320,8 +330,11 @@ void plD_tidy_svg(PLStream *pls) { + SVG *aStream; + + aStream = pls->dev; if(svg_family_check(pls)) {return;} - fclose(svgFile); + fclose(aStream->svgFile); } /*--------------------------------------------------------------------- @@ -366,27 +379,30 @@ void poly_line(PLStream *pls, short *xa, short *ya, PLINT npts, short fill) { int i; + SVG *aStream; - svg_open("polyline"); + aStream = pls->dev; + + svg_open(aStream, "polyline"); svg_stroke_width(pls); svg_stroke_color(pls); if(fill){ svg_fill_color(pls); } else { - svg_attr_value("fill", "none"); + svg_attr_value(aStream, "fill", "none"); } /* svg_attr_value("shape-rendering", "crisp-edges"); */ - svg_indent(); - fprintf(svgFile, "points=\""); + svg_indent(aStream); + fprintf(aStream->svgFile, "points=\""); for (i = 0; i < npts; i++){ - fprintf(svgFile, "%.2f,%.2f ", (double)xa[i]/scale, (double)ya[i]/scale); + fprintf(aStream->svgFile, "%.2f,%.2f ", (double)xa[i]/aStream->scale, (double)ya[i]/aStream->scale); if(((i+1)%10) == 0){ - fprintf(svgFile,"\n"); - svg_indent(); + fprintf(aStream->svgFile,"\n"); + svg_indent(aStream); } } - fprintf(svgFile, "\"/>\n"); - svgIndent -= 2; + fprintf(aStream->svgFile, "\"/>\n"); + aStream->svgIndent -= 2; } /*--------------------------------------------------------------------- @@ -453,20 +469,20 @@ /* Setup & apply text clipping area if desired */ aStream = (SVG*)pls->dev; if(aStream->textClipping){ - svg_open("clipPath"); - svg_attr_values("id","text-clipping%d", which_clip); - svg_general(">\n"); - svg_open("rect"); - svg_attr_values("x","%f", pls->clpxmi/scale); - svg_attr_values("y","%f", pls->clpymi/scale); - svg_attr_values("width","%f", (pls->clpxma - pls->clpxmi)/scale); - svg_attr_values("height","%f", (pls->clpyma - pls->clpymi)/scale); - svg_open_end(); - svg_close("clipPath"); + svg_open(aStream, "clipPath"); + svg_attr_values(aStream, "id","text-clipping%d", which_clip); + svg_general(aStream, ">\n"); + svg_open(aStream, "rect"); + svg_attr_values(aStream, "x","%f", pls->clpxmi/aStream->scale); + svg_attr_values(aStream, "y","%f", pls->clpymi/aStream->scale); + svg_attr_values(aStream, "width","%f", (pls->clpxma - pls->clpxmi)/aStream->scale); + svg_attr_values(aStream, "height","%f", (pls->clpyma - pls->clpymi)/aStream->scale); + svg_open_end(aStream); + svg_close(aStream, "clipPath"); - svg_open("g"); - svg_attr_values("clip-path", "url(#text-clipping%d)", which_clip); - svg_general(">\n"); + svg_open(aStream, "g"); + svg_attr_values(aStream, "clip-path", "url(#text-clipping%d)", which_clip); + svg_general(aStream, ">\n"); which_clip++; } @@ -489,30 +505,30 @@ /* Apply coordinate transform for text display. The transformation also defines the location of the text in x and y. */ - svg_open("g"); - svg_attr_values("transform", "matrix(%f %f %f %f %f %f)", t[0], t[1], t[2], t[3], (double)(args->x/scale), (double)(args->y/scale)); - svg_general(">\n"); + svg_open(aStream, "g"); + svg_attr_values(aStream, "transform", "matrix(%f %f %f %f %f %f)", t[0], t[1], t[2], t[3], (double)(args->x/aStream->scale), (double)(args->y/aStream->scale)); + svg_general(aStream, ">\n"); - svg_open("g"); - svg_attr_values("transform", "matrix(1.0 0.0 0.0 1.0 0.0 %f)", FONT_SIZE_RATIO*0.5*ftHt - 0.5); - svg_general(">\n"); + svg_open(aStream, "g"); + svg_attr_values(aStream, "transform", "matrix(1.0 0.0 0.0 1.0 0.0 %f)", FONT_SIZE_RATIO*0.5*ftHt - 0.5); + svg_general(aStream, ">\n"); /*-------------- open text tag --------------*/ - svg_open("text"); + svg_open(aStream, "text"); - svg_attr_value("dominant-baseline","no-change"); + svg_attr_value(aStream, "dominant-baseline","no-change"); /* set font color */ svg_fill_color(pls); /* white space preserving mode */ - svg_attr_value("xml:space","preserve"); + svg_attr_value(aStream, "xml:space","preserve"); /* set the font size */ - svg_attr_values("font-size","%d", (int)ftHt); + svg_attr_values(aStream, "font-size","%d", (int)ftHt); /*---------------------------------------------------------- Write the text with formatting @@ -541,23 +557,23 @@ * middle so you should be okay so long as you don't deviate too far * from those anchor points. */ if (args->just < 0.33) { - svg_attr_value("text-anchor", "start"); /* left justification */ - svg_attr_values("x", "%f", (double)(-args->just*FONT_SIZE_RATIO*sum_glyph_size)); + svg_attr_value(aStream, "text-anchor", "start"); /* left justification */ + svg_attr_values(aStream, "x", "%f", (double)(-args->just*FONT_SIZE_RATIO*sum_glyph_size)); }else if (args->just > 0.66) { - svg_attr_value("text-anchor", "end"); /* right justification */ - svg_attr_values("x", "%f", (double)((1.-args->just)*FONT_SIZE_RATIO*sum_glyph_size)); + svg_attr_value(aStream, "text-anchor", "end"); /* right justification */ + svg_attr_values(aStream, "x", "%f", (double)((1.-args->just)*FONT_SIZE_RATIO*sum_glyph_size)); }else { - svg_attr_value("text-anchor", "middle"); /* center */ - svg_attr_values("x", "%f", (double)((0.5-args->just)*FONT_SIZE_RATIO*sum_glyph_size)); + svg_attr_value(aStream, "text-anchor", "middle"); /* center */ + svg_attr_values(aStream, "x", "%f", (double)((0.5-args->just)*FONT_SIZE_RATIO*sum_glyph_size)); } /* The text goes at zero in y since the above * coordinate transform defines the y position of the text */ - svg_attr_value("y", "0"); - fprintf(svgFile,">"); + svg_attr_value(aStream, "y", "0"); + fprintf(aStream->svgFile, ">"); /* specify the initial font */ - specify_font(fci); + specify_font(aStream->svgFile, fci); } i = 0; @@ -567,7 +583,7 @@ if (ucs4[i] < PL_FCI_MARK){ /* not a font change */ if (ucs4[i] != (PLUNICODE)plplot_esc) { /* a character to display */ if(if_write) { - write_unicode(ucs4[i]); + write_unicode(aStream->svgFile, ucs4[i]); } else{ sum_glyph_size += glyph_size; @@ -578,7 +594,7 @@ i++; if (ucs4[i] == (PLUNICODE)plplot_esc){ /* a escape character to display */ if(if_write) { - write_unicode(ucs4[i]); + write_unicode(aStream->svgFile, ucs4[i]); } else{ sum_glyph_size += glyph_size; @@ -591,7 +607,7 @@ upDown++; if(if_write) { totalTags++; - fprintf(svgFile,"<tspan dy=\"%d\" font-size=\"%d\">", desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown)))); + fprintf(aStream->svgFile, "<tspan dy=\"%d\" font-size=\"%d\">", desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown)))); } else{ glyph_size = (int)(ftHt * pow(0.8, abs(upDown))); @@ -602,7 +618,7 @@ upDown--; if(if_write) { totalTags++; - fprintf(svgFile,"<tspan dy=\"%d\" font-size=\"%d\">", desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown)))); + fprintf(aStream->svgFile, "<tspan dy=\"%d\" font-size=\"%d\">", desired_offset(upDown, ftHt) - lastOffset, (int)(ftHt * pow(0.8, abs(upDown)))); } else{ glyph_size = (int)(ftHt * pow(0.8, abs(upDown))); @@ -614,7 +630,7 @@ } else { /* a font change */ if(if_write) { - specify_font(ucs4[i]); + specify_font(aStream->svgFile, ucs4[i]); totalTags++; } i++; @@ -628,7 +644,7 @@ ----------------------------------------------*/ for(i=0;i<totalTags;i++){ - fprintf(svgFile,"</tspan>"); + fprintf(aStream->svgFile,"</tspan>"); } /* The following commented out (by AWI) because it is a bad idea to * put line ends in the middle of a text tag. This was the key to @@ -638,12 +654,12 @@ * to close the text tag rather than svg_close("text"); since * we don't want indentation spaces entering the text. */ /* svg_close("text"); */ - fprintf(svgFile,"</text>\n"); - svgIndent -= 2; - svg_close("g"); - svg_close("g"); + fprintf(aStream->svgFile,"</text>\n"); + aStream->svgIndent -= 2; + svg_close(aStream, "g"); + svg_close(aStream, "g"); if(aStream->textClipping){ - svg_close("g"); + svg_close(aStream, "g"); } } @@ -653,11 +669,11 @@ Used to open a new XML expression, sets the indent level appropriately ---------------------------------------------------------------------*/ -void svg_open (char *tag) +void svg_open (SVG *aStream, char *tag) { - svg_indent(); - fprintf(svgFile, "<%s\n", tag); - svgIndent += 2; + svg_indent(aStream); + fprintf(aStream->svgFile, "<%s\n", tag); + aStream->svgIndent += 2; } /*--------------------------------------------------------------------- @@ -667,11 +683,11 @@ the final ">". ---------------------------------------------------------------------*/ -void svg_open_end (void) +void svg_open_end (SVG *aStream) { - svg_indent(); - fprintf(svgFile, "/>\n"); - svgIndent -= 2; + svg_indent(aStream); + fprintf(aStream->svgFile, "/>\n"); + aStream->svgIndent -= 2; } /*--------------------------------------------------------------------- @@ -681,10 +697,10 @@ i.e. foo="bar" ---------------------------------------------------------------------*/ -void svg_attr_value (char *attribute, char *value) +void svg_attr_value (SVG *aStream, char *attribute, char *value) { - svg_indent(); - fprintf(svgFile, "%s=\"%s\"\n", attribute, value); + svg_indent(aStream); + fprintf(aStream->svgFile, "%s=\"%s\"\n", attribute, value); } /*--------------------------------------------------------------------- @@ -698,45 +714,45 @@ ---------------------------------------------------------------------*/ -void svg_attr_values (char *attribute, char *format, ...) +void svg_attr_values (SVG *aStream, char *attribute, char *format, ...) { va_list ap; char *p, *sval; int ival; double dval; - svg_indent(); - fprintf(svgFile, "%s=\"", attribute); + svg_indent(aStream); + fprintf(aStream->svgFile, "%s=\"", attribute); va_start(ap, format); for(p=format; *p; p++){ if(*p != '%'){ - fprintf(svgFile, "%c", *p); + fprintf(aStream->svgFile, "%c", *p); continue; } switch(*++p){ case 'd': ival = va_arg(ap, int); - fprintf(svgFile, "%d", ival); + fprintf(aStream->svgFile, "%d", ival); break; case 'f': dval = va_arg(ap, double); - fprintf(svgFile, "%f", dval); + fprintf(aStream->svgFile, "%f", dval); break; case 'r': /* r is non-standard, but use it here to format rounded value */ dval = va_arg(ap, double); - fprintf(svgFile, "%.2f", dval); + fprintf(aStream->svgFile, "%.2f", dval); break; case 's': sval = va_arg(ap, char *); - fprintf(svgFile, "%s", sval); + fprintf(aStream->svgFile, "%s", sval); break; default: - fprintf(svgFile, "%c", *p); + fprintf(aStream->svgFile, "%c", *p); break; } } - fprintf(svgFile, "\"\n"); + fprintf(aStream->svgFile, "\"\n"); va_end(ap); } @@ -746,14 +762,14 @@ Used to close a XML expression, sets the indent level appropriately ---------------------------------------------------------------------*/ -void svg_close (char *tag) +void svg_close (SVG *aStream, char *tag) { - svgIndent -= 2; - svg_indent(); + aStream->svgIndent -= 2; + svg_indent(aStream); if(strlen(tag) > 0){ - fprintf(svgFile, "</%s>\n", tag); + fprintf(aStream->svgFile, "</%s>\n", tag); } else { - fprintf(svgFile, "/>\n"); + fprintf(aStream->svgFile, "/>\n"); } } @@ -763,10 +779,10 @@ Used to print any text into the svgFile ---------------------------------------------------------------------*/ -void svg_general (char *text) +void svg_general (SVG *aStream, char *text) { - svg_indent(); - fprintf(svgFile, "%s", text); + svg_indent(aStream); + fprintf(aStream->svgFile, "%s", text); } /*--------------------------------------------------------------------- @@ -775,11 +791,11 @@ Indents properly based on the current indent level ---------------------------------------------------------------------*/ -void svg_indent(void) +void svg_indent(SVG *aStream) { short i; - for(i=0;i<svgIndent;i++){ - fprintf(svgFile, " "); + for(i=0;i<aStream->svgIndent;i++){ + fprintf(aStream->svgFile, " "); } } @@ -793,8 +809,11 @@ void svg_stroke_width(PLStream *pls) { - svg_indent(); - fprintf(svgFile, "stroke-width=\"%d\"\n", MAX(1,pls->width)); + SVG *aStream; + + aStream = pls->dev; + svg_indent(aStream); + fprintf(aStream->svgFile, "stroke-width=\"%d\"\n", MAX(1,pls->width)); } /*--------------------------------------------------------------------- @@ -805,14 +824,17 @@ void svg_stroke_color(PLStream *pls) { - svg_indent(); - fprintf(svgFile, "stroke=\"#"); - write_hex(pls->curcolor.r); - write_hex(pls->curcolor.g); - write_hex(pls->curcolor.b); - fprintf(svgFile, "\"\n"); - svg_indent(); - fprintf(svgFile, "stroke-opacity=\"%f\"\n", pls->curcolor.a); + SVG *aStream; + + aStream = pls->dev; + svg_indent(aStream); + fprintf(aStream->svgFile, "stroke=\"#"); + write_hex(aStream->svgFile, pls->curcolor.r); + write_hex(aStream->svgFile, pls->curcolor.g); + write_hex(aStream->svgFile, pls->curcolor.b); + fprintf(aStream->svgFile, "\"\n"); + svg_indent(aStream); + fprintf(aStream->svgFile, "stroke-opacity=\"%f\"\n", pls->curcolor.a); } /*--------------------------------------------------------------------- @@ -823,14 +845,17 @@ void svg_fill_color(PLStream *pls) { - svg_indent(); - fprintf(svgFile, "fill=\"#"); - write_hex(pls->curcolor.r); - write_hex(pls->curcolor.g); - write_hex(pls->curcolor.b); - fprintf(svgFile, "\"\n"); - svg_indent(); - fprintf(svgFile, "fill-opacity=\"%f\"\n", pls->curcolor.a); + SVG *aStream; + + aStream = pls->dev; + svg_indent(aStream); + fprintf(aStream->svgFile, "fill=\"#"); + write_hex(aStream->svgFile, pls->curcolor.r); + write_hex(aStream->svgFile, pls->curcolor.g); + write_hex(aStream->svgFile, pls->curcolor.b); + fprintf(aStream->svgFile, "\"\n"); + svg_indent(aStream); + fprintf(aStream->svgFile, "fill-opacity=\"%f\"\n", pls->curcolor.a); } /*--------------------------------------------------------------------- @@ -841,12 +866,15 @@ void svg_fill_background_color(PLStream *pls) { - svg_indent(); - fprintf(svgFile, "fill=\"#"); - write_hex(pls->cmap0[0].r); - write_hex(pls->cmap0[0].g); - write_hex(pls->cmap0[0].b); - fprintf(svgFile, "\"\n"); + SVG *aStream; + + aStream = pls->dev; + svg_indent(aStream); + fprintf(aStream->svgFile, "fill=\"#"); + write_hex(aStream->svgFile, pls->cmap0[0].r); + write_hex(aStream->svgFile, pls->cmap0[0].g); + write_hex(aStream->svgFile, pls->cmap0[0].b); + fprintf(aStream->svgFile, "\"\n"); } /*--------------------------------------------------------------------- @@ -879,7 +907,7 @@ writes a unsigned char as an appropriately formatted hex value ---------------------------------------------------------------------*/ -void write_hex(unsigned char val) +void write_hex(FILE *svgFile, unsigned char val) { if(val < 16){ fprintf(svgFile, "0%X", val); @@ -894,7 +922,7 @@ writes a unicode character, appropriately formatted (i.e. &#xNNN) ---------------------------------------------------------------------*/ -void write_unicode(PLUNICODE ucs4_char) +void write_unicode(FILE *svgFile, PLUNICODE ucs4_char) { fprintf(svgFile, "&#x%x;", ucs4_char); } @@ -930,7 +958,7 @@ ---------------------------------------------------------------------*/ -void specify_font(PLUNICODE ucs4_char) +void specify_font(FILE *svgFile, PLUNICODE ucs4_char) { fprintf(svgFile,"<tspan "); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |