484 svg_open( aStream,
"linearGradient" );
486 sprintf(
buffer,
"MyGradient%010d", aStream->gradient_index );
489 sprintf(
buffer,
"%.2f",
pls->xgradient[0] / aStream->scale );
491 sprintf(
buffer,
"%.2f",
pls->ygradient[0] / aStream->scale );
493 sprintf(
buffer,
"%.2f",
pls->xgradient[1] / aStream->scale );
495 sprintf(
buffer,
"%.2f",
pls->ygradient[1] / aStream->scale );
499 for ( i = 0; i <
pls->ncol1; i++ )
502 fprintf( aStream->svgFile,
"<stop offset=\"%.3f\" ",
503 (
double) i / (
double) (
pls->ncol1 - 1 ) );
504 fprintf( aStream->svgFile,
"stop-color=\"#" );
508 fprintf( aStream->svgFile,
"\" " );
509 fprintf( aStream->svgFile,
"stop-opacity=\"%.3f\"/>\n",
pls->cmap1[i].a );
515 sprintf(
buffer,
"url(#MyGradient%010d)", aStream->gradient_index++ );
518 fprintf( aStream->svgFile,
"points=\"" );
519 for ( i = 0; i < npts; i++ )
521 fprintf( aStream->svgFile,
"%.2f,%.2f ", (
double) xa[i] / aStream->scale, (
double) ya[i] / aStream->scale );
522 if ( ( ( i + 1 ) % 10 ) == 0 )
524 fprintf( aStream->svgFile,
"\n" );
528 fprintf( aStream->svgFile,
"\"/>\n" );
529 aStream->svgIndent -= 2;
567 short ucs4Len = (short) args->unicode_array_len;
568 double ftHt, scaled_offset, scaled_ftHt;
570 PLINT rcx[4], rcy[4];
571 static PLINT prev_rcx[4], prev_rcy[4];
572 PLFLT rotation, shear, stride, cos_rot, sin_rot, sin_shear, cos_shear;
574 int glyph_size, sum_glyph_size;
579 PLFLT old_sscale, sscale, old_soffset, soffset, old_dup, ddup;
586 printf(
"Non unicode string passed to SVG driver, ignoring\n" );
598 aStream = (
SVG *)
pls->dev;
599 if ( aStream->textClipping )
605 if ( aStream->which_clip == 0 )
611 for ( i = 0; i < 4; i++ )
613 if ( rcx[i] != prev_rcx[i] ||
614 rcy[i] != prev_rcy[i] )
621 svg_attr_values( aStream,
"id",
"text-clipping%d", aStream->which_clip );
628 "%f,%f %f,%f %f,%f %f,%f",
629 ( (
PLFLT) rcx[0] ) / aStream->scale,
630 ( (
PLFLT) rcy[0] ) / aStream->scale,
631 ( (
PLFLT) rcx[1] ) / aStream->scale,
632 ( (
PLFLT) rcy[1] ) / aStream->scale,
633 ( (
PLFLT) rcx[2] ) / aStream->scale,
634 ( (
PLFLT) rcy[2] ) / aStream->scale,
635 ( (
PLFLT) rcx[3] ) / aStream->scale,
636 ( (
PLFLT) rcy[3] ) / aStream->scale );
640 for ( i = 0; i < 4; i++ )
642 prev_rcx[i] = rcx[i];
643 prev_rcy[i] = rcy[i];
645 aStream->which_clip++;
649 "url(#text-clipping%d)", aStream->which_clip - 1 );
681 rotation -=
pls->diorot *
PI / 2.0;
682 cos_rot = cos( rotation );
683 sin_rot = -sin( rotation );
684 sin_shear = sin( shear );
685 cos_shear = -cos( shear );
686 t[0] = cos_rot * stride;
687 t[1] = -sin_rot * stride;
688 t[2] = cos_rot * sin_shear + sin_rot * cos_shear;
689 t[3] = -sin_rot * sin_shear + cos_rot * cos_shear;
711 t[0], t[1], t[2], t[3],
712 (
double) ( args->x / aStream->scale ),
713 (
double) ( args->y / aStream->scale ) );
727 glyph_size = (int) ftHt;
730 while ( if_write < 2 )
744 if ( args->just < 0.33 )
747 svg_attr_values( aStream,
"x",
"%f", (
double) ( -args->just * sum_glyph_size ) );
749 else if ( args->just > 0.66 )
752 svg_attr_values( aStream,
"x",
"%f", (
double) ( ( 1. - args->just ) * sum_glyph_size ) );
757 svg_attr_values( aStream,
"x",
"%f", (
double) ( ( 0.5 - args->just ) * sum_glyph_size ) );
766 fprintf( aStream->svgFile,
">" );
775 while ( i < ucs4Len )
787 sum_glyph_size += glyph_size;
801 sum_glyph_size += glyph_size;
814 &old_sscale, &sscale, &old_soffset, &soffset );
820 ddup = 0.5 * ( 1.0 - sscale );
823 scaled_offset =
FONT_SHIFT_RATIO * ftHt * ( 0.80 * ( soffset - old_soffset ) - ( ddup - old_dup ) );
827 scaled_offset = -
FONT_SHIFT_RATIO * ftHt * ( 0.80 * ( soffset - old_soffset ) + ( ddup - old_dup ) );
829 scaled_ftHt = sscale * ftHt;
833 fprintf( aStream->svgFile,
"<tspan dy=\"%f\" font-size=\"%d\">", scaled_offset, (
int) scaled_ftHt );
837 glyph_size = (int) scaled_ftHt;
843 &old_sscale, &sscale, &old_soffset, &soffset );
849 ddup = 0.5 * ( 1.0 - sscale );
852 scaled_offset =
FONT_SHIFT_RATIO * ftHt * ( 0.80 * ( soffset - old_soffset ) - ( ddup - old_dup ) );
856 scaled_offset = -
FONT_SHIFT_RATIO * ftHt * ( 0.80 * ( soffset - old_soffset ) + ( ddup - old_dup ) );
858 scaled_ftHt = sscale * ftHt;
862 fprintf( aStream->svgFile,
"<tspan dy=\"%f\" font-size=\"%d\">", scaled_offset, (
int) scaled_ftHt );
866 glyph_size = (int) scaled_ftHt;
889 for ( i = 0; i < totalTags; i++ )
891 fprintf( aStream->svgFile,
"</tspan>" );
901 fprintf( aStream->svgFile,
"</text>\n" );
902 aStream->svgIndent -= 2;
903 if ( aStream->textClipping )
963 const char *p, *sval;
968 fprintf( aStream->svgFile,
"%s=\"", attribute );
969 va_start( ap, format );
970 for ( p = format; *p; p++ )
974 fprintf( aStream->svgFile,
"%c", *p );
980 ival = va_arg( ap,
int );
981 fprintf( aStream->svgFile,
"%d", ival );
984 dval = va_arg( ap,
double );
985 fprintf( aStream->svgFile,
"%f", dval );
989 dval = va_arg( ap,
double );
990 fprintf( aStream->svgFile,
"%.2f", dval );
993 sval = va_arg( ap,
char * );
994 fprintf( aStream->svgFile,
"%s", sval );
997 fprintf( aStream->svgFile,
"%c", *p );
1001 fprintf( aStream->svgFile,
"\"\n" );