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. |