ROOT logo
// @(#)root/postscript:$Id$
// Author: Olivier Couet

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifdef WIN32
#pragma optimize("",off)
#endif

#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#include "Riostream.h"
#include "TROOT.h"
#include "TColor.h"
#include "TVirtualPad.h"
#include "TPoints.h"
#include "TSVG.h"
#include "TStyle.h"
#include "TMath.h"
#include "TObjString.h"
#include "TObjArray.h"
#include "TClass.h"

ClassImp(TSVG)


//______________________________________________________________________________
/*Begin_Html
<center><h2>TSVG: Graphics interface to SVG</h2></center>
<a href="http://www.w3.org/Graphics/SVG/Overview.htm8"><b>SVG</b></a>
(Scalable Vector Graphics) is a language for describing two-dimensional
graphics in XML. <b>SVG</b> allows high quality vector graphics in
HTML pages.
<p>
To print a ROOT canvas "c1" into an <b>SVG</b> file simply do:
<PRE>
   c1->Print("c1.svg");
</PRE>
The result is the ASCII file <tt>c1.svg</tt>.
<p>
It can be open direclty using a web browser or included in a html document
the following way:
<pre>
&lt;embed width="95%" height="500" src="c1.svg" /&gt;>
</pre>
It is best viewed with Internet Explorer and you need the
<a href="http://www.adobe.com/svg/viewer/install/main.html">Adobe <b>SVG</b>
Viewer</a>.
<p>
To zoom using the Adobe <b>SVG</b> Viewer, position the mouse over
the area you want to zoom and click the right button.
<p>
To define the zoom area,
use Control+drag to mark the boundaries of the zoom area.
<p>
To pan, use Alt+drag.
By clicking with the right mouse button on the <b>SVG</b> graphics you will get
a pop-up menu giving other ways to interact with the image.
<p>
<b>SVG</b> files can be used directly in compressed mode to minimize the time
transfer over the network. Compressed <b>SVG</b> files should be created using
<tt>gzip</tt> on a normal ASCII <b>SVG</b> file and should then be renamed
using the file extension <tt>.svgz</tt>.
End_Html */


//______________________________________________________________________________
TSVG::TSVG() : TVirtualPS()
{
   // Default SVG constructor

   fStream      = 0;
   fType        = 0;
   gVirtualPS   = this;
   fBoundingBox = kFALSE;
   fRange       = kFALSE;
   fXsize       = 0.;
   fYsize       = 0.;
   fYsizeSVG    = 0;
   SetTitle("SVG");
}


//______________________________________________________________________________
TSVG::TSVG(const char *fname, Int_t wtype) : TVirtualPS(fname, wtype)
{
   // Initialize the SVG interface
   //
   //  fname : SVG file name
   //  wtype : SVG workstation type. Not used in the SVG driver. But as TSVG
   //          inherits from TVirtualPS it should be kept. Anyway it is not
   //          necessary to specify this parameter at creation time because it
   //          has a default value (which is ignore in the SVG case).

   fStream = 0;
   SetTitle("SVG");
   Open(fname, wtype);
}


//______________________________________________________________________________
void TSVG::Open(const char *fname, Int_t wtype)
{
   // Open a SVG file

   if (fStream) {
      Warning("Open", "SVG file already open");
      return;
   }

   fLenBuffer = 0;
   fType      = abs(wtype);
   SetLineScale(gStyle->GetLineScalePS());
   gStyle->GetPaperSize(fXsize, fYsize);
   Float_t xrange, yrange;
   if (gPad) {
      Double_t ww = gPad->GetWw();
      Double_t wh = gPad->GetWh();
      ww *= gPad->GetWNDC();
      wh *= gPad->GetHNDC();
      Double_t ratio = wh/ww;
      xrange = fXsize;
      yrange = fXsize*ratio;
      if (yrange > fYsize) { yrange = fYsize; xrange = yrange/ratio;}
      fXsize = xrange; fYsize = yrange;
   }

   // Open OS file
   fStream   = new std::ofstream(fname,std::ios::out);
   if (fStream == 0 || !fStream->good()) {
      printf("ERROR in TSVG::Open: Cannot open file:%s\n",fname);
      if (fStream == 0) return;
   }

   gVirtualPS = this;

   for (Int_t i=0;i<fSizBuffer;i++) fBuffer[i] = ' ';

   fBoundingBox = kFALSE;

   fRange       = kFALSE;

   // Set a default range
   Range(fXsize, fYsize);

   NewPage();
}


//______________________________________________________________________________
TSVG::~TSVG()
{
   // Default SVG destructor

   Close();
}


//______________________________________________________________________________
void TSVG::Close(Option_t *)
{
   // Close a SVG file
   if (!gVirtualPS) return;
   if (!fStream) return;
   if (gPad) gPad->Update();
   PrintStr("</svg>@");

   // Close file stream
   if (fStream) { fStream->close(); delete fStream; fStream = 0;}

   gVirtualPS = 0;
}


//______________________________________________________________________________
void TSVG::On()
{
   // Activate an already open SVG file

   // fType is used to know if the SVG file is open. Unlike TPostScript, TSVG
   // has no "workstation type". In fact there is only one SVG type.

   if (!fType) {
      Error("On", "no SVG file open");
      Off();
      return;
   }
   gVirtualPS = this;
}


//______________________________________________________________________________
void TSVG::Off()
{
   // Deactivate an already open SVG file

   gVirtualPS = 0;
}


//______________________________________________________________________________
void TSVG::DrawBox(Double_t x1, Double_t y1, Double_t x2, Double_t  y2)
{
   // Draw a Box

   static Double_t x[4], y[4];
   Double_t ix1 = XtoSVG(x1);
   Double_t ix2 = XtoSVG(x2);
   Double_t iy1 = YtoSVG(y1);
   Double_t iy2 = YtoSVG(y2);
   Int_t fillis = fFillStyle/1000;
   Int_t fillsi = fFillStyle%1000;

   if (fillis == 3 || fillis == 2) {
      if (fillsi > 99) {
         x[0] = x1;   y[0] = y1;
         x[1] = x2;   y[1] = y1;
         x[2] = x2;   y[2] = y2;
         x[3] = x1;   y[3] = y2;
         return;
      }
      if (fillsi > 0 && fillsi < 26) {
         x[0] = x1;   y[0] = y1;
         x[1] = x2;   y[1] = y1;
         x[2] = x2;   y[2] = y2;
         x[3] = x1;   y[3] = y2;
         DrawPS(-4, &x[0], &y[0]);
      }
      if (fillsi == -3) {
         PrintStr("@");
         PrintFast(9,"<rect x=\"");
         WriteReal(ix1, kFALSE);
         PrintFast(5,"\" y=\"");
         WriteReal(iy2, kFALSE);
         PrintFast(9,"\" width=\"");
         WriteReal(ix2-ix1, kFALSE);
         PrintFast(10,"\" height=\"");
         WriteReal(iy1-iy2, kFALSE);
         PrintFast(7,"\" fill=");
         SetColor(5);
         PrintFast(2,"/>");
      }
   }
   if (fillis == 1) {
      PrintStr("@");
      PrintFast(9,"<rect x=\"");
      WriteReal(ix1, kFALSE);
      PrintFast(5,"\" y=\"");
      WriteReal(iy2, kFALSE);
      PrintFast(9,"\" width=\"");
      WriteReal(ix2-ix1, kFALSE);
      PrintFast(10,"\" height=\"");
      WriteReal(iy1-iy2, kFALSE);
      PrintFast(7,"\" fill=");
      SetColor(fFillColor);
      PrintFast(2,"/>");
   }
   if (fillis == 0) {
      PrintStr("@");
      PrintFast(9,"<rect x=\"");
      WriteReal(ix1, kFALSE);
      PrintFast(5,"\" y=\"");
      WriteReal(iy2, kFALSE);
      PrintFast(9,"\" width=\"");
      WriteReal(ix2-ix1, kFALSE);
      PrintFast(10,"\" height=\"");
      WriteReal(iy1-iy2, kFALSE);
      PrintFast(21,"\" fill=\"none\" stroke=");
      SetColor(fLineColor);
      PrintFast(2,"/>");
   }
}


//______________________________________________________________________________
void TSVG::DrawFrame(Double_t xl, Double_t yl, Double_t xt, Double_t  yt,
                            Int_t mode, Int_t border, Int_t dark, Int_t light)
{
   // Draw a Frame around a box
   //
   // mode = -1  the box looks as it is behind the screen
   // mode =  1  the box looks as it is in front of the screen
   // border is the border size in already pre-computed SVG units dark is the
   // color for the dark part of the frame light is the color for the light
   // part of the frame

   static Double_t xps[7], yps[7];
   Int_t i;
   Double_t ixd0, iyd0, ixdi, iydi, ix, iy;
   Int_t idx, idy;

   //- Draw top&left part of the box

   xps[0] = XtoSVG(xl);          yps[0] = YtoSVG(yl);
   xps[1] = xps[0] + border;     yps[1] = yps[0] - border;
   xps[2] = xps[1];              yps[2] = YtoSVG(yt) + border;
   xps[3] = XtoSVG(xt) - border; yps[3] = yps[2];
   xps[4] = XtoSVG(xt);          yps[4] = YtoSVG(yt);
   xps[5] = xps[0];              yps[5] = yps[4];
   xps[6] = xps[0];              yps[6] = yps[0];

   ixd0 = xps[0];
   iyd0 = yps[0];
   PrintStr("@");
   PrintFast(10,"<path d=\"M");
   WriteReal(ixd0, kFALSE);
   PrintFast(1,",");
   WriteReal(iyd0, kFALSE);

   idx = 0;
   idy = 0;
   for (i=1; i<7; i++) {
      ixdi = xps[i];
      iydi = yps[i];
      ix   = ixdi - ixd0;
      iy   = iydi - iyd0;
      ixd0 = ixdi;
      iyd0 = iydi;
      if( ix && iy) {
         if( idx ) { MovePS(idx,0); idx = 0; }
         if( idy ) { MovePS(0,idy); idy = 0; }
         MovePS(ix,iy);
         continue;
      }
      if ( ix ) {
         if( idy )  { MovePS(0,idy); idy = 0; }
         if( !idx ) { idx = ix; continue;}
         if( ix*idx > 0 ) {
            idx += ix;
         } else {
            MovePS(idx,0);
            idx  = ix;
         }
         continue;
      }
      if( iy ) {
         if( idx ) { MovePS(idx,0); idx = 0; }
         if( !idy) { idy = iy; continue;}
         if( iy*idy > 0 ) {
            idy += iy;
         } else {
            MovePS(0,idy);
            idy  = iy;
         }
      }
   }
   if( idx ) MovePS(idx,0);
   if( idy ) MovePS(0,idy);
   PrintFast(8,"z\" fill=");
   if (mode == -1) {
      SetColor(dark);
   } else {
      SetColor(light);
   }
   PrintFast(2,"/>");

   //- Draw bottom&right part of the box
   xps[0] = XtoSVG(xl);          yps[0] = YtoSVG(yl);
   xps[1] = xps[0] + border;     yps[1] = yps[0] - border;
   xps[2] = XtoSVG(xt) - border; yps[2] = yps[1];
   xps[3] = xps[2];              yps[3] = YtoSVG(yt) + border;
   xps[4] = XtoSVG(xt);          yps[4] = YtoSVG(yt);
   xps[5] = xps[4];              yps[5] = yps[0];
   xps[6] = xps[0];              yps[6] = yps[0];

   ixd0 = xps[0];
   iyd0 = yps[0];
   PrintStr("@");
   PrintFast(10,"<path d=\"M");
   WriteReal(ixd0, kFALSE);
   PrintFast(1,",");
   WriteReal(iyd0, kFALSE);

   idx = 0;
   idy = 0;
   for (i=1;i<7;i++) {
      ixdi = xps[i];
      iydi = yps[i];
      ix   = ixdi - ixd0;
      iy   = iydi - iyd0;
      ixd0 = ixdi;
      iyd0 = iydi;
      if( ix && iy) {
         if( idx ) { MovePS(idx,0); idx = 0; }
         if( idy ) { MovePS(0,idy); idy = 0; }
         MovePS(ix,iy);
         continue;
      }
      if ( ix ) {
         if( idy )  { MovePS(0,idy); idy = 0; }
         if( !idx ) { idx = ix; continue;}
         if( ix*idx > 0 ) {
            idx += ix;
         } else {
            MovePS(idx,0);
            idx  = ix;
         }
         continue;
      }
      if( iy ) {
         if( idx ) { MovePS(idx,0); idx = 0; }
         if( !idy) { idy = iy; continue;}
         if( iy*idy > 0 ) {
            idy += iy;
         } else {
            MovePS(0,idy);
            idy  = iy;
         }
      }
   }
   if( idx ) MovePS(idx,0);
   if( idy ) MovePS(0,idy);
   PrintFast(8,"z\" fill=");
   if (mode == -1) {
      SetColor(light);
   } else {
      SetColor(dark);
   }
   PrintFast(2,"/>");
}


//______________________________________________________________________________
void TSVG::DrawPolyLine(Int_t nn, TPoints *xy)
{
   // Draw a PolyLine
   //
   //  Draw a polyline through  the points  xy.
   //  If NN=1 moves only to point x,y.
   //  If NN=0 the x,y are  written  in the SVG        file
   //     according to the current transformation.
   //  If NN>0 the line is clipped as a line.
   //  If NN<0 the line is clipped as a fill area.

   Int_t  n, idx, idy;
   Double_t ixd0, iyd0, ixdi, iydi, ix, iy;

   if (nn > 0) {
      n = nn;
   } else {
      n = -nn;
   }

   ixd0 = XtoSVG(xy[0].GetX());
   iyd0 = YtoSVG(xy[0].GetY());
   if( n <= 1) {
      if( n == 0) return;
      return;
   }

   PrintFast(2," m");
   idx = 0;
   idy = 0;
   for (Int_t i=1;i<n;i++) {
      ixdi = XtoSVG(xy[i].GetX());
      iydi = YtoSVG(xy[i].GetY());
      ix   = ixdi - ixd0;
      iy   = iydi - iyd0;
      ixd0 = ixdi;
      iyd0 = iydi;
      if( ix && iy) {
         if( idx ) { MovePS(idx,0); idx = 0; }
         if( idy ) { MovePS(0,idy); idy = 0; }
         MovePS(ix,iy);
         continue;
      }
      if ( ix ) {
         if( idy )  { MovePS(0,idy); idy = 0; }
         if( !idx ) { idx = ix; continue;}
         if( ix*idx > 0 ) {
            idx += ix;
         } else {
            MovePS(idx,0);
            idx  = ix;
         }
         continue;
      }
      if( iy ) {
         if( idx ) { MovePS(idx,0); idx = 0; }
         if( !idy) { idy = iy; continue;}
         if( iy*idy > 0 ) {
            idy += iy;
         } else {
            MovePS(0,idy);
            idy  = iy;
         }
      }
   }
   if( idx ) MovePS(idx,0);
   if( idy ) MovePS(0,idy);

   if (nn > 0 ) {
   } else {
   }
}


//______________________________________________________________________________
void TSVG::DrawPolyLineNDC(Int_t nn, TPoints *xy)
{
   // Draw a PolyLine in NDC space
   //
   //  Draw a polyline through  the points  xy.
   //  If NN=1 moves only to point x,y.
   //  If NN=0 the x,y are  written  in the SVG        file
   //     according to the current transformation.
   //  If NN>0 the line is clipped as a line.
   //  If NN<0 the line is clipped as a fill area.

   Int_t  n, idx, idy;
   Double_t ixd0, iyd0, ixdi, iydi, ix, iy;

   if (nn > 0) {
      n = nn;
   } else {
      n = -nn;
   }

   ixd0 = UtoSVG(xy[0].GetX());
   iyd0 = VtoSVG(xy[0].GetY());
   if( n <= 1) {
      if( n == 0) return;
      return;
   }

   idx = 0;
   idy = 0;
   for (Int_t i=1;i<n;i++) {
      ixdi = UtoSVG(xy[i].GetX());
      iydi = VtoSVG(xy[i].GetY());
      ix   = ixdi - ixd0;
      iy   = iydi - iyd0;
      ixd0 = ixdi;
      iyd0 = iydi;
      if( ix && iy) {
         if( idx ) { MovePS(idx,0); idx = 0; }
         if( idy ) { MovePS(0,idy); idy = 0; }
         MovePS(ix,iy);
         continue;
      }
      if ( ix ) {
         if( idy )  { MovePS(0,idy); idy = 0; }
         if( !idx ) { idx = ix; continue;}
         if( ix*idx > 0 ) {
            idx += ix;
         } else {
            MovePS(idx,0);
            idx  = ix;
         }
         continue;
      }
      if( iy ) {
         if( idx ) { MovePS(idx,0); idx = 0; }
         if( !idy) { idy = iy; continue;}
         if( iy*idy > 0 ) {
            idy += iy;
         } else {
            MovePS(0,idy);
            idy  = iy;
         }
      }
   }
   if( idx ) MovePS(idx,0);
   if( idy ) MovePS(0,idy);

   if (nn > 0 ) {
      if (xy[0].GetX() == xy[n-1].GetX() && xy[0].GetY() == xy[n-1].GetY()) PrintFast(3," cl");
   } else {
   }
}


//______________________________________________________________________________
void TSVG::DrawPolyMarker(Int_t n, Float_t *xw, Float_t *yw)
{
   // Paint PolyMarker

   Int_t ms = abs(fMarkerStyle);

   if (ms >= 6 && ms <= 19) ms = 20;
   if (ms == 4) ms = 24;

   // Define the marker size
   Float_t msize  = fMarkerSize;
   if (fMarkerStyle == 1) msize = 0.01;
   if (fMarkerStyle == 6) msize = 0.02;
   if (fMarkerStyle == 7) msize = 0.04;

   const Int_t kBASEMARKER = 8;
   Float_t sbase = msize*kBASEMARKER;
   Float_t s2x = sbase / Float_t(gPad->GetWw() * gPad->GetAbsWNDC());
   msize = this->UtoSVG(s2x) - this->UtoSVG(0);

   Double_t m  = msize;
   Double_t m2 = m/2;
   Double_t m3 = m/3;
   Double_t m6 = m/6;

   // Draw the marker according to the type
   PrintStr("@");
   if ((ms > 19 && ms < 24) || ms == 29 || ms == 33 || ms == 34) {
      PrintStr("<g stroke=");
      SetColor(Int_t(fMarkerColor));
      PrintStr(" stroke-width=\"");
      WriteReal(fLineWidth, kFALSE);
      PrintStr("\" fill=");
      SetColor(Int_t(fMarkerColor));
      PrintStr(">");
   } else {
      PrintStr("<g stroke=");
      SetColor(Int_t(fMarkerColor));
      PrintStr(" stroke-width=\"");
      WriteReal(fLineWidth, kFALSE);
      PrintStr("\" fill=\"none\"");
      PrintStr(">");
   }
   Double_t ix,iy;
   for (Int_t i=0;i<n;i++) {
      ix = XtoSVG(xw[i]);
      iy = YtoSVG(yw[i]);
      PrintStr("@");
      // Dot (.)
      if (ms == 1) {
         PrintStr("<line x1=\"");
         WriteReal(ix-1, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\"/>");
      // Plus (+)
      } else if (ms == 2) {
         PrintStr("<line x1=\"");
         WriteReal(ix-m2, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix+m2, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\"/>");

         PrintStr("<line x1=\"");
         WriteReal(ix, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy-m2, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy+m2, kFALSE);
         PrintStr("\"/>");
      // X shape (X)
      } else if (ms == 5) {
         PrintStr("<line x1=\"");
         WriteReal(ix-m2, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy-m2, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix+m2, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy+m2, kFALSE);
         PrintStr("\"/>");

         PrintStr("<line x1=\"");
         WriteReal(ix-m2, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy+m2, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix+m2, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy-m2, kFALSE);
         PrintStr("\"/>");
      // Asterisk shape (*)
      } else if (ms == 3 || ms == 31) {
         PrintStr("<line x1=\"");
         WriteReal(ix-m2, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix+m2, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\"/>");

         PrintStr("<line x1=\"");
         WriteReal(ix, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy-m2, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy+m2, kFALSE);
         PrintStr("\"/>");

         PrintStr("<line x1=\"");
         WriteReal(ix-m2, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy-m2, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix+m2, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy+m2, kFALSE);
         PrintStr("\"/>");

         PrintStr("<line x1=\"");
         WriteReal(ix-m2, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy+m2, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix+m2, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy-m2, kFALSE);
         PrintStr("\"/>");
      // Circle
      } else if (ms == 24 || ms == 20) {
         PrintStr("<circle cx=\"");
         WriteReal(ix, kFALSE);
         PrintStr("\" cy=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\" r=\"");
         if (m2<=0) m2=1;
         WriteReal(m2, kFALSE);
         PrintStr("\" fill=\"none\"");
         PrintStr("/>");
      // Square
      } else if (ms == 25 || ms == 21) {
         PrintStr("<rect x=\"");
         WriteReal(ix-m2, kFALSE);
         PrintStr("\" y=\"");
         WriteReal(iy-m2, kFALSE);
         PrintStr("\" width=\"");
         WriteReal(m, kFALSE);
         PrintStr("\" height=\"");
         WriteReal(m, kFALSE);
         PrintStr("\" fill=\"none\"");
         PrintStr("/>");
      // Down triangle
      } else if (ms == 26 || ms == 22) {
         PrintStr("<polygon points=\"");
         WriteReal(ix); PrintStr(","); WriteReal(iy-m2);
         WriteReal(ix+m2); PrintStr(","); WriteReal(iy+m2);
         WriteReal(ix-m2); PrintStr(","); WriteReal(iy+m2);
         PrintStr("\"/>");
      // Up triangle
      } else if (ms == 23 || ms == 32) {
         PrintStr("<polygon points=\"");
         WriteReal(ix-m2); PrintStr(","); WriteReal(iy-m2);
         WriteReal(ix+m2); PrintStr(","); WriteReal(iy-m2);
         WriteReal(ix); PrintStr(","); WriteReal(iy+m2);
         PrintStr("\"/>");
      // Diamond
      } else if (ms == 27 || ms == 33) {
         PrintStr("<polygon points=\"");
         WriteReal(ix); PrintStr(","); WriteReal(iy-m2);
         WriteReal(ix+m3); PrintStr(","); WriteReal(iy);
         WriteReal(ix); PrintStr(","); WriteReal(iy+m2);
         WriteReal(ix-m3); PrintStr(","); WriteReal(iy);
         PrintStr("\"/>");
      // Cross
      } else if (ms == 28 || ms == 34) {
         PrintStr("<polygon points=\"");
         WriteReal(ix-m6); PrintStr(","); WriteReal(iy-m6);
         WriteReal(ix-m6); PrintStr(","); WriteReal(iy-m2);
         WriteReal(ix+m6); PrintStr(","); WriteReal(iy-m2);
         WriteReal(ix+m6); PrintStr(","); WriteReal(iy-m6);
         WriteReal(ix+m2); PrintStr(","); WriteReal(iy-m6);
         WriteReal(ix+m2); PrintStr(","); WriteReal(iy+m6);
         WriteReal(ix+m6); PrintStr(","); WriteReal(iy+m6);
         WriteReal(ix+m6); PrintStr(","); WriteReal(iy+m2);
         WriteReal(ix-m6); PrintStr(","); WriteReal(iy+m2);
         WriteReal(ix-m6); PrintStr(","); WriteReal(iy+m6);
         WriteReal(ix-m2); PrintStr(","); WriteReal(iy+m6);
         WriteReal(ix-m2); PrintStr(","); WriteReal(iy-m6);
         PrintStr("\"/>");
      } else if (ms == 29 || ms == 30) {
         PrintStr("<polygon points=\"");
         WriteReal(ix); PrintStr(","); WriteReal(iy+m2);
         WriteReal(ix+0.112255*m); PrintStr(","); WriteReal(iy+0.15451*m);
         WriteReal(ix+0.47552*m); PrintStr(","); WriteReal(iy+0.15451*m);
         WriteReal(ix+0.181635*m); PrintStr(","); WriteReal(iy-0.05902*m);
         WriteReal(ix+0.29389*m); PrintStr(","); WriteReal(iy-0.40451*m);
         WriteReal(ix); PrintStr(","); WriteReal(iy-0.19098*m);
         WriteReal(ix-0.29389*m); PrintStr(","); WriteReal(iy-0.40451*m);
         WriteReal(ix-0.181635*m); PrintStr(","); WriteReal(iy-0.05902*m);
         WriteReal(ix-0.47552*m); PrintStr(","); WriteReal(iy+0.15451*m);
         WriteReal(ix-0.112255*m); PrintStr(","); WriteReal(iy+0.15451*m);
         PrintStr("\"/>");
      } else {
         PrintStr("<line x1=\"");
         WriteReal(ix-1, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\"/>");
      }
   }
   PrintStr("@");
   PrintStr("</g>");
}


//______________________________________________________________________________
void TSVG::DrawPolyMarker(Int_t n, Double_t *xw, Double_t *yw)
{
   // Paint PolyMarker

   Int_t ms = abs(fMarkerStyle);

   if (ms >= 6 && ms <= 19) ms = 20;
   if (ms == 4) ms = 24;

   // Define the marker size
   Float_t msize  = fMarkerSize;
   if (fMarkerStyle == 1) msize = 0.01;
   if (fMarkerStyle == 6) msize = 0.02;
   if (fMarkerStyle == 7) msize = 0.04;

   const Int_t kBASEMARKER = 8;
   Float_t sbase = msize*kBASEMARKER;
   Float_t s2x = sbase / Float_t(gPad->GetWw() * gPad->GetAbsWNDC());
   msize = this->UtoSVG(s2x) - this->UtoSVG(0);

   Double_t m  = msize;
   Double_t m2 = m/2;
   Double_t m3 = m/3;
   Double_t m6 = m/6;

   // Draw the marker according to the type
   PrintStr("@");
   if ((ms > 19 && ms < 24) || ms == 29 || ms == 33 || ms == 34) {
      PrintStr("<g stroke=");
      SetColor(Int_t(fMarkerColor));
      PrintStr(" stroke-width=\"");
      WriteReal(fLineWidth, kFALSE);
      PrintStr("\" fill=");
      SetColor(Int_t(fMarkerColor));
      PrintStr(">");
   } else {
      PrintStr("<g stroke=");
      SetColor(Int_t(fMarkerColor));
      PrintStr(" stroke-width=\"");
      WriteReal(fLineWidth, kFALSE);
      PrintStr("\" fill=\"none\"");
      PrintStr(">");
   }
   Double_t ix,iy;
   for (Int_t i=0;i<n;i++) {
      ix = XtoSVG(xw[i]);
      iy = YtoSVG(yw[i]);
      PrintStr("@");
      // Dot (.)
      if (ms == 1) {
         PrintStr("<line x1=\"");
         WriteReal(ix-1, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\"/>");
      // Plus (+)
      } else if (ms == 2) {
         PrintStr("<line x1=\"");
         WriteReal(ix-m2, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix+m2, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\"/>");

         PrintStr("<line x1=\"");
         WriteReal(ix, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy-m2, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy+m2, kFALSE);
         PrintStr("\"/>");
      // X shape (X)
      } else if (ms == 5) {
         PrintStr("<line x1=\"");
         WriteReal(ix-m2, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy-m2, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix+m2, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy+m2, kFALSE);
         PrintStr("\"/>");

         PrintStr("<line x1=\"");
         WriteReal(ix-m2, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy+m2, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix+m2, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy-m2, kFALSE);
         PrintStr("\"/>");
      // Asterisk shape (*)
      } else if (ms == 3 || ms == 31) {
         PrintStr("<line x1=\"");
         WriteReal(ix-m2, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix+m2, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\"/>");

         PrintStr("<line x1=\"");
         WriteReal(ix, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy-m2, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy+m2, kFALSE);
         PrintStr("\"/>");

         PrintStr("<line x1=\"");
         WriteReal(ix-m2, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy-m2, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix+m2, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy+m2, kFALSE);
         PrintStr("\"/>");

         PrintStr("<line x1=\"");
         WriteReal(ix-m2, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy+m2, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix+m2, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy-m2, kFALSE);
         PrintStr("\"/>");
      // Circle
      } else if (ms == 24 || ms == 20) {
         PrintStr("<circle cx=\"");
         WriteReal(ix, kFALSE);
         PrintStr("\" cy=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\" r=\"");
         if (m2<=0) m2=1;
         WriteReal(m2, kFALSE);
         PrintStr("\"/>");
      // Square
      } else if (ms == 25 || ms == 21) {
         PrintStr("<rect x=\"");
         WriteReal(ix-m2, kFALSE);
         PrintStr("\" y=\"");
         WriteReal(iy-m2, kFALSE);
         PrintStr("\" width=\"");
         WriteReal(m, kFALSE);
         PrintStr("\" height=\"");
         WriteReal(m, kFALSE);
         PrintStr("\"/>");
      // Down triangle
      } else if (ms == 26 || ms == 22) {
         PrintStr("<polygon points=\"");
         WriteReal(ix); PrintStr(","); WriteReal(iy-m2);
         WriteReal(ix+m2); PrintStr(","); WriteReal(iy+m2);
         WriteReal(ix-m2); PrintStr(","); WriteReal(iy+m2);
         PrintStr("\"/>");
      // Up triangle
      } else if (ms == 23 || ms == 32) {
         PrintStr("<polygon points=\"");
         WriteReal(ix-m2); PrintStr(","); WriteReal(iy-m2);
         WriteReal(ix+m2); PrintStr(","); WriteReal(iy-m2);
         WriteReal(ix); PrintStr(","); WriteReal(iy+m2);
         PrintStr("\"/>");
      // Diamond
      } else if (ms == 27 || ms == 33) {
         PrintStr("<polygon points=\"");
         WriteReal(ix); PrintStr(","); WriteReal(iy-m2);
         WriteReal(ix+m3); PrintStr(","); WriteReal(iy);
         WriteReal(ix); PrintStr(","); WriteReal(iy+m2);
         WriteReal(ix-m3); PrintStr(","); WriteReal(iy);
         PrintStr("\"/>");
      // Cross
      } else if (ms == 28 || ms == 34) {
         PrintStr("<polygon points=\"");
         WriteReal(ix-m6); PrintStr(","); WriteReal(iy-m6);
         WriteReal(ix-m6); PrintStr(","); WriteReal(iy-m2);
         WriteReal(ix+m6); PrintStr(","); WriteReal(iy-m2);
         WriteReal(ix+m6); PrintStr(","); WriteReal(iy-m6);
         WriteReal(ix+m2); PrintStr(","); WriteReal(iy-m6);
         WriteReal(ix+m2); PrintStr(","); WriteReal(iy+m6);
         WriteReal(ix+m6); PrintStr(","); WriteReal(iy+m6);
         WriteReal(ix+m6); PrintStr(","); WriteReal(iy+m2);
         WriteReal(ix-m6); PrintStr(","); WriteReal(iy+m2);
         WriteReal(ix-m6); PrintStr(","); WriteReal(iy+m6);
         WriteReal(ix-m2); PrintStr(","); WriteReal(iy+m6);
         WriteReal(ix-m2); PrintStr(","); WriteReal(iy-m6);
         PrintStr("\"/>");
      } else if (ms == 29 || ms == 30) {
         PrintStr("<polygon points=\"");
         WriteReal(ix); PrintStr(","); WriteReal(iy+m2);
         WriteReal(ix+0.112255*m); PrintStr(","); WriteReal(iy+0.15451*m);
         WriteReal(ix+0.47552*m); PrintStr(","); WriteReal(iy+0.15451*m);
         WriteReal(ix+0.181635*m); PrintStr(","); WriteReal(iy-0.05902*m);
         WriteReal(ix+0.29389*m); PrintStr(","); WriteReal(iy-0.40451*m);
         WriteReal(ix); PrintStr(","); WriteReal(iy-0.19098*m);
         WriteReal(ix-0.29389*m); PrintStr(","); WriteReal(iy-0.40451*m);
         WriteReal(ix-0.181635*m); PrintStr(","); WriteReal(iy-0.05902*m);
         WriteReal(ix-0.47552*m); PrintStr(","); WriteReal(iy+0.15451*m);
         WriteReal(ix-0.112255*m); PrintStr(","); WriteReal(iy+0.15451*m);
         PrintStr("\"/>");
      } else {
         PrintStr("<line x1=\"");
         WriteReal(ix-1, kFALSE);
         PrintStr("\" y1=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\" x2=\"");
         WriteReal(ix, kFALSE);
         PrintStr("\" y2=\"");
         WriteReal(iy, kFALSE);
         PrintStr("\"/>");
      }
   }
   PrintStr("@");
   PrintStr("</g>");
}


//______________________________________________________________________________
void TSVG::DrawPS(Int_t nn, Double_t *xw, Double_t *yw)
{
   // This function defines a path with xw and yw and draw it according the
   // value of nn:
   //
   //  If nn>0 a line is drawn.
   //  If nn<0 a closed polygon is drawn.

   Int_t  n, fais, fasi;
   Double_t ixd0, iyd0, idx, idy, ixdi, iydi, ix, iy;
   fais = fasi = 0;

   if (nn > 0) {
      n = nn;
   } else {
      n = -nn;
      fais = fFillStyle/1000;
      fasi = fFillStyle%1000;
      if (fais == 3 || fais == 2) {
         if (fasi > 100 && fasi <125) {
            return;
         }
         if (fasi > 0 && fasi < 26) {
         }
      }
   }

   if( n <= 1) {
      Error("DrawPS", "Two points are needed");
      return;
   }

   ixd0 = XtoSVG(xw[0]);
   iyd0 = YtoSVG(yw[0]);

   PrintStr("@");
   PrintFast(10,"<path d=\"M");
   WriteReal(ixd0, kFALSE);
   PrintFast(1,",");
   WriteReal(iyd0, kFALSE);

   idx = idy = 0;
   for (Int_t i=1;i<n;i++) {
      ixdi = XtoSVG(xw[i]);
      iydi = YtoSVG(yw[i]);
      ix   = ixdi - ixd0;
      iy   = iydi - iyd0;
      ixd0 = ixdi;
      iyd0 = iydi;
      if( ix && iy) {
         if( idx ) { MovePS(idx,0); idx = 0; }
         if( idy ) { MovePS(0,idy); idy = 0; }
         MovePS(ix,iy);
      } else if ( ix ) {
         if( idy )  { MovePS(0,idy); idy = 0;}
         if( !idx ) { idx = ix;}
         else if( TMath::Sign(ix,idx) == ix )       idx += ix;
         else { MovePS(idx,0);  idx  = ix;}
      } else if( iy ) {
         if( idx ) { MovePS(idx,0); idx = 0;}
         if( !idy) { idy = iy;}
         else if( TMath::Sign(iy,idy) == iy)         idy += iy;
         else { MovePS(0,idy);    idy  = iy;}
      }
   }
   if (idx) MovePS(idx,0);
   if (idy) MovePS(0,idy);

   if (nn > 0 ) {
      if (xw[0] == xw[n-1] && yw[0] == yw[n-1]) PrintFast(1,"z");
      PrintFast(21,"\" fill=\"none\" stroke=");
      SetColor(fLineColor);
      if(fLineWidth > 1.) {
         PrintFast(15," stroke-width=\"");
         WriteReal(fLineWidth, kFALSE);
         PrintFast(1,"\"");
      }
      if (fLineStyle > 1) {
         PrintFast(19," stroke-dasharray=\"");
         TString st = (TString)gStyle->GetLineStyleString(fLineStyle);
         TObjArray *tokens = st.Tokenize(" ");
         for (Int_t j = 0; j<tokens->GetEntries(); j++) {
            Int_t it;
            sscanf(((TObjString*)tokens->At(j))->GetName(), "%d", &it);
            if (j>0) PrintFast(1,",");
            WriteReal(it/4);
         }
         delete tokens;
         PrintFast(1,"\"");
      }
      PrintFast(2,"/>");
   } else {
      PrintFast(8,"z\" fill=");
      if (fais == 0) {
         PrintFast(14,"\"none\" stroke=");
         SetColor(fFillColor);
      } else {
         SetColor(fFillColor);
      }
      PrintFast(2,"/>");
   }
}


//______________________________________________________________________________
void TSVG::Initialize()
{
   // Initialize the SVG file. The main task of the function is to output the
   // SVG header file which consist in <title>, <desc> and <defs>. The
   // HeaderPS provided by the user program is written in the <defs> part.

   // Title
   PrintStr("<title>@");
   PrintStr(GetName());
   PrintStr("@");
   PrintStr("</title>@");

   // Description
   PrintStr("<desc>@");
   PrintFast(22,"Creator: ROOT Version ");
   PrintStr(gROOT->GetVersion());
   PrintStr("@");
   PrintFast(14,"CreationDate: ");
   TDatime t;
   PrintStr(t.AsString());
   //Check a special header is defined in the current style
   Int_t nh = strlen(gStyle->GetHeaderPS());
   if (nh) {
      PrintFast(nh,gStyle->GetHeaderPS());
   }
   PrintStr("</desc>@");

   // Definitions
   PrintStr("<defs>@");
   PrintStr("</defs>@");

}


//______________________________________________________________________________
void TSVG::MovePS(Double_t ix, Double_t iy)
{
   // Move to a new position (ix, iy). The move is done in relative coordinates
   // which allows to have short numbers which decrease the size of the file.
   // This function use the full power of the SVG's paths by using the
   // horizontal and vertical move whenever it is possible.

   if (ix != 0 && iy != 0)  {
      PrintFast(1,"l");
      WriteReal(ix);
      PrintFast(1,",");
      WriteReal(iy);
   } else if (ix != 0)  {
      PrintFast(1,"h");
      WriteReal(ix);
   } else if (iy != 0)  {
      PrintFast(1,"v");
      WriteReal(iy);
   }
}


//______________________________________________________________________________
void TSVG::NewPage()
{
   // Start the SVG page. This function initialize the pad conversion
   // coefficients and output the <svg> directive which is close later in the
   // the function Close.

   // Compute pad conversion coefficients
   if (gPad) {
      Double_t ww   = gPad->GetWw();
      Double_t wh   = gPad->GetWh();
      fYsize        = fXsize*wh/ww;
   } else {
      fYsize = 27;
   }

   // <svg> directive. It defines the viewBox.
   if(!fBoundingBox) {
      PrintStr("@<?xml version=\"1.0\" standalone=\"no\"?>");
      PrintStr("@<svg width=\"");
      WriteReal(CMtoSVG(fXsize), kFALSE);
      PrintStr("\" height=\"");
      fYsizeSVG = CMtoSVG(fYsize);
      WriteReal(fYsizeSVG, kFALSE);
      PrintStr("\" viewBox=\"0 0");
      WriteReal(CMtoSVG(fXsize));
      WriteReal(fYsizeSVG);
      PrintStr("\" xmlns=\"http://www.w3.org/2000/svg\">");
      PrintStr("@");
      Initialize();
      fBoundingBox  = kTRUE;
   }
}


//______________________________________________________________________________
void TSVG::Range(Float_t xsize, Float_t ysize)
{
   // Set the range for the paper in centimetres

   Float_t xps, yps, xncm, yncm, dxwn, dywn, xwkwn, ywkwn, xymax;

   fXsize = xsize;
   fYsize = ysize;

   xps = xsize;
   yps = ysize;

   if( xsize <= xps && ysize < yps) {
      if ( xps > yps ) xymax = xps;
      else             xymax = yps;
      xncm  = xsize/xymax;
      yncm  = ysize/xymax;
      dxwn  = ((xps/xymax)-xncm)/2;
      dywn  = ((yps/xymax)-yncm)/2;
   } else {
      if (xps/yps < 1) xwkwn = xps/yps;
      else             xwkwn = 1;
      if (yps/xps < 1) ywkwn = yps/xps;
      else             ywkwn = 1;

      if (xsize < ysize)  {
         xncm = ywkwn*xsize/ysize;
         yncm = ywkwn;
         dxwn = (xwkwn-xncm)/2;
         dywn = 0;
         if( dxwn < 0) {
            xncm = xwkwn;
            dxwn = 0;
            yncm = xwkwn*ysize/xsize;
            dywn = (ywkwn-yncm)/2;
         }
      } else {
         xncm = xwkwn;
         yncm = xwkwn*ysize/xsize;
         dxwn = 0;
         dywn = (ywkwn-yncm)/2;
         if( dywn < 0) {
            yncm = ywkwn;
            dywn = 0;
            xncm = ywkwn*xsize/ysize;
            dxwn = (xwkwn-xncm)/2;
         }
      }
   }
   fRange = kTRUE;
}


//______________________________________________________________________________
void TSVG::SetFillColor( Color_t cindex )
{
   // Set color index for fill areas

   fFillColor = cindex;
   if (gStyle->GetFillColor() <= 0) cindex = 0;
}


//______________________________________________________________________________
void TSVG::SetLineColor( Color_t cindex )
{
   // Set color index for lines

   fLineColor = cindex;
}


//______________________________________________________________________________
void TSVG::SetLineStyle(Style_t linestyle)
{
   // Change the line style
   //
   // linestyle = 2 dashed
   //           = 3 dotted
   //           = 4 dash-dotted
   //           = else solid (1 in is used most of the time)

   fLineStyle = linestyle;
}


//______________________________________________________________________________
void TSVG::SetLineWidth(Width_t linewidth)
{
   // Set the lines width.

   fLineWidth = linewidth;
}


//______________________________________________________________________________
void TSVG::SetMarkerColor( Color_t cindex )
{
   // Set color index for markers.

   fMarkerColor = cindex;
}


//______________________________________________________________________________
void TSVG::SetColor(Int_t color)
{
   // Set color with its color index

   if (color < 0) color = 0;
   TColor *col = gROOT->GetColor(color);
   if (col) {
      SetColor(col->GetRed(), col->GetGreen(), col->GetBlue());
      Float_t a = col->GetAlpha();
      if (a<1.) PrintStr(Form(" fill-opacity=\"%3.2f\" stroke-opacity=\"%3.2f\"",a,a));
   } else {
      SetColor(1., 1., 1.);
   }
}


//______________________________________________________________________________
void TSVG::SetColor(Float_t r, Float_t g, Float_t b)
{
   // Set color with its R G B components
   //
   //  r: % of red in [0,1]
   //  g: % of green in [0,1]
   //  b: % of blue in [0,1]

   if (r <= 0. && g <= 0. && b <= 0. ) {
      PrintFast(7,"\"black\"");
   } else if (r >= 1. && g >= 1. && b >= 1. ) {
      PrintFast(7,"\"white\"");
   } else {
      char str[12];
      snprintf(str,12,"\"#%2.2x%2.2x%2.2x\"",Int_t(255.*r)
                                            ,Int_t(255.*g)
                                            ,Int_t(255.*b));
      PrintStr(str);
   }
}


//______________________________________________________________________________
void TSVG::SetTextColor( Color_t cindex )
{
   // Set color index for text

   fTextColor = cindex;
}


//______________________________________________________________________________
void TSVG::Text(Double_t xx, Double_t yy, const char *chars)
{
   // Draw text
   //
   // xx: x position of the text
   // yy: y position of the text
   // chars: text to be drawn

   static const char *fontFamily[] = {
   "Times"    , "Times"    , "Times",
   "Helvetica", "Helvetica", "Helvetica"   , "Helvetica",
   "Courier"  , "Courier"  , "Courier"     , "Courier",
   "Times"    ,"Times"     , "ZapfDingbats", "Times"};

   static const char *fontWeight[] = {
   "normal", "bold", "bold",
   "normal", "normal", "bold"  , "bold",
   "normal", "normal", "bold"  , "bold",
   "normal", "normal", "normal", "normal"};

   static const char *fontStyle[] = {
   "italic", "normal" , "italic",
   "normal", "oblique", "normal", "oblique",
   "normal", "oblique", "normal", "oblique",
   "normal", "normal" , "normal", "italic"};

   Double_t ix    = XtoSVG(xx);
   Double_t iy    = YtoSVG(yy);
   Double_t txalh = fTextAlign/10;
   if (txalh <1) txalh = 1; if (txalh > 3) txalh = 3;
   Double_t txalv = fTextAlign%10;
   if (txalv <1) txalv = 1; if (txalv > 3) txalv = 3;

   Double_t     wh = (Double_t)gPad->XtoPixel(gPad->GetX2());
   Double_t     hh = (Double_t)gPad->YtoPixel(gPad->GetY1());
   Float_t fontrap = 1.09; //scale down compared to X11
   Float_t ftsize;

   Int_t font  = abs(fTextFont)/10;
   if (font > 42 || font < 1) font = 1;
   if (wh < hh) {
      ftsize = fTextSize*fXsize*gPad->GetAbsWNDC();
   } else {
      ftsize = fTextSize*fYsize*gPad->GetAbsHNDC();
   }
   Int_t ifont = font-1;

   Double_t fontsize = CMtoSVG(ftsize/fontrap);
   if( fontsize <= 0) return;

   if (txalv == 3) iy = iy+fontsize;
   if (txalv == 2) iy = iy+(fontsize/2);

   if (fTextAngle != 0.) {
      PrintStr("@");
      PrintFast(21,"<g transform=\"rotate(");
      WriteReal(-fTextAngle, kFALSE);
      PrintFast(1,",");
      WriteReal(ix, kFALSE);
      PrintFast(1,",");
      WriteReal(iy, kFALSE);
      PrintFast(3,")\">");
   }

   PrintStr("@");
   PrintFast(9,"<text x=\"");
   WriteReal(ix, kFALSE);
   PrintFast(5,"\" y=\"");
   WriteReal(iy, kFALSE);
   PrintFast(1,"\"");
   if (txalh == 2) {
      PrintFast(21," text-anchor=\"middle\"");
   } else if (txalh == 3) {
      PrintFast(18," text-anchor=\"end\"");
   }
   PrintFast(6," fill=");
   SetColor(Int_t(fTextColor));
   PrintFast(12," font-size=\"");
   WriteReal(fontsize, kFALSE);
   PrintFast(15,"\" font-family=\"");
   PrintStr(fontFamily[ifont]);
   if (strcmp(fontWeight[ifont],"normal")) {
      PrintFast(15,"\" font-weight=\"");
      PrintStr(fontWeight[ifont]);
   }
   if (strcmp(fontStyle[ifont],"normal")) {
      PrintFast(14,"\" font-style=\"");
      PrintStr(fontStyle[ifont]);
   }
   PrintFast(2,"\">");
   PrintStr("@");

   if (font == 12 || font == 15) {
      Int_t ichar = chars[0]+848;
      Int_t ic    = ichar;

      // Math Symbols (cf: http://www.fileformat.info/info/unicode/category/Sm/list.htm)
      if (ic == 755) ichar =  8804;
      if (ic == 759) ichar =  9827;
      if (ic == 760) ichar =  9830;
      if (ic == 761) ichar =  9829;
      if (ic == 762) ichar =  9824;
      if (ic == 766) ichar =  8594;
      if (ic == 776) ichar =   247;
      if (ic == 757) ichar =  8734;
      if (ic == 758) ichar =   402;
      if (ic == 771) ichar =  8805;
      if (ic == 774) ichar =  8706;
      if (ic == 775) ichar =  8226;
      if (ic == 779) ichar =  8776;
      if (ic == 805) ichar =  8719;
      if (ic == 821) ichar =  8721;
      if (ic == 834) ichar =  8747;
      if (ic == 769) ichar =   177;
      if (ic == 772) ichar =   215;
      if (ic == 768) ichar =   176;
      if (ic == 791) ichar =  8745;
      if (ic == 793) ichar =  8835; // SUPERSET OF
      if (ic == 794) ichar =  8839; // SUPERSET OF OR EQUAL TO
      if (ic == 795) ichar =  8836; // NOT A SUBSET OF
      if (ic == 796) ichar =  8834;
      if (ic == 893) ichar =  8722;
      if (ic == 803) ichar =   169; // COPYRIGHT SIGN
      if (ic == 819) ichar =   169; // COPYRIGHT SIGN
      if (ic == 804) ichar =  8482;
      if (ic == 770) ichar =    34;
      if (ic == 823) ichar = 10072;
      if (ic == 781) ichar = 10072;
      if (ic == 824) ichar =  9117; // LEFT PARENTHESIS LOWER HOOK
      if (ic == 822) ichar =  9115; // LEFT PARENTHESIS UPPER HOOK
      if (ic == 767) ichar =  8595; // DOWNWARDS ARROW
      if (ic == 763) ichar =  8596; // LEFT RIGHT ARROW
      if (ic == 764) ichar =  8592; // LEFTWARDS ARROW
      if (ic == 788) ichar =  8855; // CIRCLED TIMES
      if (ic == 784) ichar =  8501;
      if (ic == 777) ichar =  8800;
      if (ic == 797) ichar =  8838;
      if (ic == 800) ichar =  8736;
      if (ic == 812) ichar =  8656; // LEFTWARDS DOUBLE ARROW
      if (ic == 817) ichar =    60; // LESS-THAN SIGN
      if (ic == 833) ichar =    62; // GREATER-THAN SIGN
      if (ic == 778) ichar =  8803; // STRICTLY EQUIVALENT TO
      if (ic == 809) ichar =  8743; // LOGICAL AND
      if (ic == 802) ichar =  9415; // CIRCLED LATIN CAPITAL LETTER R
      if (ic == 780) ichar =  8230; // HORIZONTAL ELLIPSIS
      if (ic == 801) ichar =  8711; // NABLA
      if (ic == 783) ichar =  8629; // DOWNWARDS ARROW WITH CORNER LEFTWARDS
      if (ic == 782) ichar =  8213;
      if (ic == 799) ichar =  8713;
      if (ic == 792) ichar =  8746;
      if (ic == 828) ichar =  9127;
      if (ic == 765) ichar =  8593; // UPWARDS ARROW
      if (ic == 789) ichar =  8853; // CIRCLED PLUS
      if (ic == 813) ichar =  8657; // UPWARDS DOUBLE ARROW
      if (ic == 773) ichar =  8733; // PROPORTIONAL TO
      if (ic == 790) ichar =  8709; // EMPTY SET
      if (ic == 810) ichar =  8744;
      if (ic == 756) ichar =  8260;
      if (ic == 807) ichar =  8231;
      if (ic == 808) ichar =  8989; // TOP RIGHT CORNER
      if (ic == 814) ichar =  8658; // RIGHTWARDS DOUBLE ARROW
      if (ic == 806) ichar =  8730; // SQUARE ROOT
      if (ic == 827) ichar =  9123;
      if (ic == 829) ichar =  9128;
      if (ic == 786) ichar =  8476;
      if (ic == 785) ichar =  8465;
      if (ic == 787) ichar =  8472;

      // Greek characters
      if (ic == 918) ichar = 934;
      if (ic == 919) ichar = 915;
      if (ic == 920) ichar = 919;
      if (ic == 923) ichar = 922;
      if (ic == 924) ichar = 923;
      if (ic == 925) ichar = 924;
      if (ic == 926) ichar = 925;
      if (ic == 929) ichar = 920;
      if (ic == 930) ichar = 929;
      if (ic == 936) ichar = 926;
      if (ic == 915) ichar = 935;
      if (ic == 937) ichar = 936;
      if (ic == 935) ichar = 937;
      if (ic == 938) ichar = 918;
      if (ic == 951) ichar = 947;
      if (ic == 798) ichar = 949;
      if (ic == 970) ichar = 950;
      if (ic == 952) ichar = 951;
      if (ic == 961) ichar = 952;
      if (ic == 955) ichar = 954;
      if (ic == 956) ichar = 955;
      if (ic == 957) ichar = 956;
      if (ic == 958) ichar = 957;
      if (ic == 968) ichar = 958;
      if (ic == 934) ichar = 962;
      if (ic == 962) ichar = 961;
      if (ic == 966) ichar = 969;
      if (ic == 950) ichar = 966;
      if (ic == 947) ichar = 967;
      if (ic == 969) ichar = 968;
      if (ic == 967) ichar = 969;
      if (ic == 954) ichar = 966;
      if (ic == 922) ichar = 952;
      if (ic == 753) ichar = 965;
      PrintStr(Form("&#%4.4d;",ichar));
   } else {
      Int_t len=strlen(chars);
      for (Int_t i=0; i<len;i++) {
         if (chars[i]!='\n') {
            if (chars[i]=='<') {
               PrintFast(4,"&lt;");
            } else if (chars[i]=='>') {
               PrintFast(4,"&gt;");
            } else if (chars[i]=='\305') {
               PrintFast(7,"&#8491;"); // ANGSTROM SIGN
            } else if (chars[i]=='\345') {
               PrintFast(6,"&#229;");
            } else if (chars[i]=='&') {
               PrintFast(5,"&amp;");
            } else {
               PrintFast(1,&chars[i]);
            }
         }
      }
   }
   PrintStr("@");
   PrintFast(7,"</text>");

   if (fTextAngle != 0.) {
      PrintStr("@");
      PrintFast(4,"</g>");
   }
}


//______________________________________________________________________________
void TSVG::TextNDC(Double_t u, Double_t v, const char *chars)
{
   // Write a string of characters in NDC

   Double_t x = gPad->GetX1() + u*(gPad->GetX2() - gPad->GetX1());
   Double_t y = gPad->GetY1() + v*(gPad->GetY2() - gPad->GetY1());
   Text(x, y, chars);
}


//______________________________________________________________________________
Double_t TSVG::UtoSVG(Double_t u)
{
   // Convert U from NDC coordinate to SVG

   Double_t cm = fXsize*(gPad->GetAbsXlowNDC() + u*gPad->GetAbsWNDC());
   return 0.5 + 72*cm/2.54;
}


//______________________________________________________________________________
Double_t TSVG::VtoSVG(Double_t v)
{
   // Convert V from NDC coordinate to SVG

   Double_t cm = fYsize*(gPad->GetAbsYlowNDC() + v*gPad->GetAbsHNDC());
   return 0.5 + 72*cm/2.54;
}


//______________________________________________________________________________
Double_t TSVG::XtoSVG(Double_t x)
{
   // Convert X from world coordinate to SVG

   Double_t u = (x - gPad->GetX1())/(gPad->GetX2() - gPad->GetX1());
   return  UtoSVG(u);
}


//______________________________________________________________________________
Double_t TSVG::YtoSVG(Double_t y)
{
   // Convert Y from world coordinate to SVG

   Double_t v = (y - gPad->GetY1())/(gPad->GetY2() - gPad->GetY1());
   return  fYsizeSVG-VtoSVG(v);
}


//______________________________________________________________________________
void TSVG::CellArrayBegin(Int_t, Int_t, Double_t, Double_t, Double_t,
                          Double_t)
{
   // Begin the Cell Array painting

   Warning("TSVG::CellArrayBegin", "not yet implemented");
}


//______________________________________________________________________________
void TSVG::CellArrayFill(Int_t, Int_t, Int_t)
{
   // Paint the Cell Array

   Warning("TSVG::CellArrayFill", "not yet implemented");
}


//______________________________________________________________________________
void TSVG::CellArrayEnd()
{
   // End the Cell Array painting

   Warning("TSVG::CellArrayEnd", "not yet implemented");
}


//______________________________________________________________________________
void TSVG::DrawPS(Int_t, Float_t *, Float_t *)
{
   // Not needed in SVG case

   Warning("TSVG::DrawPS", "not yet implemented");
}
 TSVG.cxx:1
 TSVG.cxx:2
 TSVG.cxx:3
 TSVG.cxx:4
 TSVG.cxx:5
 TSVG.cxx:6
 TSVG.cxx:7
 TSVG.cxx:8
 TSVG.cxx:9
 TSVG.cxx:10
 TSVG.cxx:11
 TSVG.cxx:12
 TSVG.cxx:13
 TSVG.cxx:14
 TSVG.cxx:15
 TSVG.cxx:16
 TSVG.cxx:17
 TSVG.cxx:18
 TSVG.cxx:19
 TSVG.cxx:20
 TSVG.cxx:21
 TSVG.cxx:22
 TSVG.cxx:23
 TSVG.cxx:24
 TSVG.cxx:25
 TSVG.cxx:26
 TSVG.cxx:27
 TSVG.cxx:28
 TSVG.cxx:29
 TSVG.cxx:30
 TSVG.cxx:31
 TSVG.cxx:32
 TSVG.cxx:33
 TSVG.cxx:34
 TSVG.cxx:35
 TSVG.cxx:36
 TSVG.cxx:37
 TSVG.cxx:38
 TSVG.cxx:39
 TSVG.cxx:40
 TSVG.cxx:41
 TSVG.cxx:42
 TSVG.cxx:43
 TSVG.cxx:44
 TSVG.cxx:45
 TSVG.cxx:46
 TSVG.cxx:47
 TSVG.cxx:48
 TSVG.cxx:49
 TSVG.cxx:50
 TSVG.cxx:51
 TSVG.cxx:52
 TSVG.cxx:53
 TSVG.cxx:54
 TSVG.cxx:55
 TSVG.cxx:56
 TSVG.cxx:57
 TSVG.cxx:58
 TSVG.cxx:59
 TSVG.cxx:60
 TSVG.cxx:61
 TSVG.cxx:62
 TSVG.cxx:63
 TSVG.cxx:64
 TSVG.cxx:65
 TSVG.cxx:66
 TSVG.cxx:67
 TSVG.cxx:68
 TSVG.cxx:69
 TSVG.cxx:70
 TSVG.cxx:71
 TSVG.cxx:72
 TSVG.cxx:73
 TSVG.cxx:74
 TSVG.cxx:75
 TSVG.cxx:76
 TSVG.cxx:77
 TSVG.cxx:78
 TSVG.cxx:79
 TSVG.cxx:80
 TSVG.cxx:81
 TSVG.cxx:82
 TSVG.cxx:83
 TSVG.cxx:84
 TSVG.cxx:85
 TSVG.cxx:86
 TSVG.cxx:87
 TSVG.cxx:88
 TSVG.cxx:89
 TSVG.cxx:90
 TSVG.cxx:91
 TSVG.cxx:92
 TSVG.cxx:93
 TSVG.cxx:94
 TSVG.cxx:95
 TSVG.cxx:96
 TSVG.cxx:97
 TSVG.cxx:98
 TSVG.cxx:99
 TSVG.cxx:100
 TSVG.cxx:101
 TSVG.cxx:102
 TSVG.cxx:103
 TSVG.cxx:104
 TSVG.cxx:105
 TSVG.cxx:106
 TSVG.cxx:107
 TSVG.cxx:108
 TSVG.cxx:109
 TSVG.cxx:110
 TSVG.cxx:111
 TSVG.cxx:112
 TSVG.cxx:113
 TSVG.cxx:114
 TSVG.cxx:115
 TSVG.cxx:116
 TSVG.cxx:117
 TSVG.cxx:118
 TSVG.cxx:119
 TSVG.cxx:120
 TSVG.cxx:121
 TSVG.cxx:122
 TSVG.cxx:123
 TSVG.cxx:124
 TSVG.cxx:125
 TSVG.cxx:126
 TSVG.cxx:127
 TSVG.cxx:128
 TSVG.cxx:129
 TSVG.cxx:130
 TSVG.cxx:131
 TSVG.cxx:132
 TSVG.cxx:133
 TSVG.cxx:134
 TSVG.cxx:135
 TSVG.cxx:136
 TSVG.cxx:137
 TSVG.cxx:138
 TSVG.cxx:139
 TSVG.cxx:140
 TSVG.cxx:141
 TSVG.cxx:142
 TSVG.cxx:143
 TSVG.cxx:144
 TSVG.cxx:145
 TSVG.cxx:146
 TSVG.cxx:147
 TSVG.cxx:148
 TSVG.cxx:149
 TSVG.cxx:150
 TSVG.cxx:151
 TSVG.cxx:152
 TSVG.cxx:153
 TSVG.cxx:154
 TSVG.cxx:155
 TSVG.cxx:156
 TSVG.cxx:157
 TSVG.cxx:158
 TSVG.cxx:159
 TSVG.cxx:160
 TSVG.cxx:161
 TSVG.cxx:162
 TSVG.cxx:163
 TSVG.cxx:164
 TSVG.cxx:165
 TSVG.cxx:166
 TSVG.cxx:167
 TSVG.cxx:168
 TSVG.cxx:169
 TSVG.cxx:170
 TSVG.cxx:171
 TSVG.cxx:172
 TSVG.cxx:173
 TSVG.cxx:174
 TSVG.cxx:175
 TSVG.cxx:176
 TSVG.cxx:177
 TSVG.cxx:178
 TSVG.cxx:179
 TSVG.cxx:180
 TSVG.cxx:181
 TSVG.cxx:182
 TSVG.cxx:183
 TSVG.cxx:184
 TSVG.cxx:185
 TSVG.cxx:186
 TSVG.cxx:187
 TSVG.cxx:188
 TSVG.cxx:189
 TSVG.cxx:190
 TSVG.cxx:191
 TSVG.cxx:192
 TSVG.cxx:193
 TSVG.cxx:194
 TSVG.cxx:195
 TSVG.cxx:196
 TSVG.cxx:197
 TSVG.cxx:198
 TSVG.cxx:199
 TSVG.cxx:200
 TSVG.cxx:201
 TSVG.cxx:202
 TSVG.cxx:203
 TSVG.cxx:204
 TSVG.cxx:205
 TSVG.cxx:206
 TSVG.cxx:207
 TSVG.cxx:208
 TSVG.cxx:209
 TSVG.cxx:210
 TSVG.cxx:211
 TSVG.cxx:212
 TSVG.cxx:213
 TSVG.cxx:214
 TSVG.cxx:215
 TSVG.cxx:216
 TSVG.cxx:217
 TSVG.cxx:218
 TSVG.cxx:219
 TSVG.cxx:220
 TSVG.cxx:221
 TSVG.cxx:222
 TSVG.cxx:223
 TSVG.cxx:224
 TSVG.cxx:225
 TSVG.cxx:226
 TSVG.cxx:227
 TSVG.cxx:228
 TSVG.cxx:229
 TSVG.cxx:230
 TSVG.cxx:231
 TSVG.cxx:232
 TSVG.cxx:233
 TSVG.cxx:234
 TSVG.cxx:235
 TSVG.cxx:236
 TSVG.cxx:237
 TSVG.cxx:238
 TSVG.cxx:239
 TSVG.cxx:240
 TSVG.cxx:241
 TSVG.cxx:242
 TSVG.cxx:243
 TSVG.cxx:244
 TSVG.cxx:245
 TSVG.cxx:246
 TSVG.cxx:247
 TSVG.cxx:248
 TSVG.cxx:249
 TSVG.cxx:250
 TSVG.cxx:251
 TSVG.cxx:252
 TSVG.cxx:253
 TSVG.cxx:254
 TSVG.cxx:255
 TSVG.cxx:256
 TSVG.cxx:257
 TSVG.cxx:258
 TSVG.cxx:259
 TSVG.cxx:260
 TSVG.cxx:261
 TSVG.cxx:262
 TSVG.cxx:263
 TSVG.cxx:264
 TSVG.cxx:265
 TSVG.cxx:266
 TSVG.cxx:267
 TSVG.cxx:268
 TSVG.cxx:269
 TSVG.cxx:270
 TSVG.cxx:271
 TSVG.cxx:272
 TSVG.cxx:273
 TSVG.cxx:274
 TSVG.cxx:275
 TSVG.cxx:276
 TSVG.cxx:277
 TSVG.cxx:278
 TSVG.cxx:279
 TSVG.cxx:280
 TSVG.cxx:281
 TSVG.cxx:282
 TSVG.cxx:283
 TSVG.cxx:284
 TSVG.cxx:285
 TSVG.cxx:286
 TSVG.cxx:287
 TSVG.cxx:288
 TSVG.cxx:289
 TSVG.cxx:290
 TSVG.cxx:291
 TSVG.cxx:292
 TSVG.cxx:293
 TSVG.cxx:294
 TSVG.cxx:295
 TSVG.cxx:296
 TSVG.cxx:297
 TSVG.cxx:298
 TSVG.cxx:299
 TSVG.cxx:300
 TSVG.cxx:301
 TSVG.cxx:302
 TSVG.cxx:303
 TSVG.cxx:304
 TSVG.cxx:305
 TSVG.cxx:306
 TSVG.cxx:307
 TSVG.cxx:308
 TSVG.cxx:309
 TSVG.cxx:310
 TSVG.cxx:311
 TSVG.cxx:312
 TSVG.cxx:313
 TSVG.cxx:314
 TSVG.cxx:315
 TSVG.cxx:316
 TSVG.cxx:317
 TSVG.cxx:318
 TSVG.cxx:319
 TSVG.cxx:320
 TSVG.cxx:321
 TSVG.cxx:322
 TSVG.cxx:323
 TSVG.cxx:324
 TSVG.cxx:325
 TSVG.cxx:326
 TSVG.cxx:327
 TSVG.cxx:328
 TSVG.cxx:329
 TSVG.cxx:330
 TSVG.cxx:331
 TSVG.cxx:332
 TSVG.cxx:333
 TSVG.cxx:334
 TSVG.cxx:335
 TSVG.cxx:336
 TSVG.cxx:337
 TSVG.cxx:338
 TSVG.cxx:339
 TSVG.cxx:340
 TSVG.cxx:341
 TSVG.cxx:342
 TSVG.cxx:343
 TSVG.cxx:344
 TSVG.cxx:345
 TSVG.cxx:346
 TSVG.cxx:347
 TSVG.cxx:348
 TSVG.cxx:349
 TSVG.cxx:350
 TSVG.cxx:351
 TSVG.cxx:352
 TSVG.cxx:353
 TSVG.cxx:354
 TSVG.cxx:355
 TSVG.cxx:356
 TSVG.cxx:357
 TSVG.cxx:358
 TSVG.cxx:359
 TSVG.cxx:360
 TSVG.cxx:361
 TSVG.cxx:362
 TSVG.cxx:363
 TSVG.cxx:364
 TSVG.cxx:365
 TSVG.cxx:366
 TSVG.cxx:367
 TSVG.cxx:368
 TSVG.cxx:369
 TSVG.cxx:370
 TSVG.cxx:371
 TSVG.cxx:372
 TSVG.cxx:373
 TSVG.cxx:374
 TSVG.cxx:375
 TSVG.cxx:376
 TSVG.cxx:377
 TSVG.cxx:378
 TSVG.cxx:379
 TSVG.cxx:380
 TSVG.cxx:381
 TSVG.cxx:382
 TSVG.cxx:383
 TSVG.cxx:384
 TSVG.cxx:385
 TSVG.cxx:386
 TSVG.cxx:387
 TSVG.cxx:388
 TSVG.cxx:389
 TSVG.cxx:390
 TSVG.cxx:391
 TSVG.cxx:392
 TSVG.cxx:393
 TSVG.cxx:394
 TSVG.cxx:395
 TSVG.cxx:396
 TSVG.cxx:397
 TSVG.cxx:398
 TSVG.cxx:399
 TSVG.cxx:400
 TSVG.cxx:401
 TSVG.cxx:402
 TSVG.cxx:403
 TSVG.cxx:404
 TSVG.cxx:405
 TSVG.cxx:406
 TSVG.cxx:407
 TSVG.cxx:408
 TSVG.cxx:409
 TSVG.cxx:410
 TSVG.cxx:411
 TSVG.cxx:412
 TSVG.cxx:413
 TSVG.cxx:414
 TSVG.cxx:415
 TSVG.cxx:416
 TSVG.cxx:417
 TSVG.cxx:418
 TSVG.cxx:419
 TSVG.cxx:420
 TSVG.cxx:421
 TSVG.cxx:422
 TSVG.cxx:423
 TSVG.cxx:424
 TSVG.cxx:425
 TSVG.cxx:426
 TSVG.cxx:427
 TSVG.cxx:428
 TSVG.cxx:429
 TSVG.cxx:430
 TSVG.cxx:431
 TSVG.cxx:432
 TSVG.cxx:433
 TSVG.cxx:434
 TSVG.cxx:435
 TSVG.cxx:436
 TSVG.cxx:437
 TSVG.cxx:438
 TSVG.cxx:439
 TSVG.cxx:440
 TSVG.cxx:441
 TSVG.cxx:442
 TSVG.cxx:443
 TSVG.cxx:444
 TSVG.cxx:445
 TSVG.cxx:446
 TSVG.cxx:447
 TSVG.cxx:448
 TSVG.cxx:449
 TSVG.cxx:450
 TSVG.cxx:451
 TSVG.cxx:452
 TSVG.cxx:453
 TSVG.cxx:454
 TSVG.cxx:455
 TSVG.cxx:456
 TSVG.cxx:457
 TSVG.cxx:458
 TSVG.cxx:459
 TSVG.cxx:460
 TSVG.cxx:461
 TSVG.cxx:462
 TSVG.cxx:463
 TSVG.cxx:464
 TSVG.cxx:465
 TSVG.cxx:466
 TSVG.cxx:467
 TSVG.cxx:468
 TSVG.cxx:469
 TSVG.cxx:470
 TSVG.cxx:471
 TSVG.cxx:472
 TSVG.cxx:473
 TSVG.cxx:474
 TSVG.cxx:475
 TSVG.cxx:476
 TSVG.cxx:477
 TSVG.cxx:478
 TSVG.cxx:479
 TSVG.cxx:480
 TSVG.cxx:481
 TSVG.cxx:482
 TSVG.cxx:483
 TSVG.cxx:484
 TSVG.cxx:485
 TSVG.cxx:486
 TSVG.cxx:487
 TSVG.cxx:488
 TSVG.cxx:489
 TSVG.cxx:490
 TSVG.cxx:491
 TSVG.cxx:492
 TSVG.cxx:493
 TSVG.cxx:494
 TSVG.cxx:495
 TSVG.cxx:496
 TSVG.cxx:497
 TSVG.cxx:498
 TSVG.cxx:499
 TSVG.cxx:500
 TSVG.cxx:501
 TSVG.cxx:502
 TSVG.cxx:503
 TSVG.cxx:504
 TSVG.cxx:505
 TSVG.cxx:506
 TSVG.cxx:507
 TSVG.cxx:508
 TSVG.cxx:509
 TSVG.cxx:510
 TSVG.cxx:511
 TSVG.cxx:512
 TSVG.cxx:513
 TSVG.cxx:514
 TSVG.cxx:515
 TSVG.cxx:516
 TSVG.cxx:517
 TSVG.cxx:518
 TSVG.cxx:519
 TSVG.cxx:520
 TSVG.cxx:521
 TSVG.cxx:522
 TSVG.cxx:523
 TSVG.cxx:524
 TSVG.cxx:525
 TSVG.cxx:526
 TSVG.cxx:527
 TSVG.cxx:528
 TSVG.cxx:529
 TSVG.cxx:530
 TSVG.cxx:531
 TSVG.cxx:532
 TSVG.cxx:533
 TSVG.cxx:534
 TSVG.cxx:535
 TSVG.cxx:536
 TSVG.cxx:537
 TSVG.cxx:538
 TSVG.cxx:539
 TSVG.cxx:540
 TSVG.cxx:541
 TSVG.cxx:542
 TSVG.cxx:543
 TSVG.cxx:544
 TSVG.cxx:545
 TSVG.cxx:546
 TSVG.cxx:547
 TSVG.cxx:548
 TSVG.cxx:549
 TSVG.cxx:550
 TSVG.cxx:551
 TSVG.cxx:552
 TSVG.cxx:553
 TSVG.cxx:554
 TSVG.cxx:555
 TSVG.cxx:556
 TSVG.cxx:557
 TSVG.cxx:558
 TSVG.cxx:559
 TSVG.cxx:560
 TSVG.cxx:561
 TSVG.cxx:562
 TSVG.cxx:563
 TSVG.cxx:564
 TSVG.cxx:565
 TSVG.cxx:566
 TSVG.cxx:567
 TSVG.cxx:568
 TSVG.cxx:569
 TSVG.cxx:570
 TSVG.cxx:571
 TSVG.cxx:572
 TSVG.cxx:573
 TSVG.cxx:574
 TSVG.cxx:575
 TSVG.cxx:576
 TSVG.cxx:577
 TSVG.cxx:578
 TSVG.cxx:579
 TSVG.cxx:580
 TSVG.cxx:581
 TSVG.cxx:582
 TSVG.cxx:583
 TSVG.cxx:584
 TSVG.cxx:585
 TSVG.cxx:586
 TSVG.cxx:587
 TSVG.cxx:588
 TSVG.cxx:589
 TSVG.cxx:590
 TSVG.cxx:591
 TSVG.cxx:592
 TSVG.cxx:593
 TSVG.cxx:594
 TSVG.cxx:595
 TSVG.cxx:596
 TSVG.cxx:597
 TSVG.cxx:598
 TSVG.cxx:599
 TSVG.cxx:600
 TSVG.cxx:601
 TSVG.cxx:602
 TSVG.cxx:603
 TSVG.cxx:604
 TSVG.cxx:605
 TSVG.cxx:606
 TSVG.cxx:607
 TSVG.cxx:608
 TSVG.cxx:609
 TSVG.cxx:610
 TSVG.cxx:611
 TSVG.cxx:612
 TSVG.cxx:613
 TSVG.cxx:614
 TSVG.cxx:615
 TSVG.cxx:616
 TSVG.cxx:617
 TSVG.cxx:618
 TSVG.cxx:619
 TSVG.cxx:620
 TSVG.cxx:621
 TSVG.cxx:622
 TSVG.cxx:623
 TSVG.cxx:624
 TSVG.cxx:625
 TSVG.cxx:626
 TSVG.cxx:627
 TSVG.cxx:628
 TSVG.cxx:629
 TSVG.cxx:630
 TSVG.cxx:631
 TSVG.cxx:632
 TSVG.cxx:633
 TSVG.cxx:634
 TSVG.cxx:635
 TSVG.cxx:636
 TSVG.cxx:637
 TSVG.cxx:638
 TSVG.cxx:639
 TSVG.cxx:640
 TSVG.cxx:641
 TSVG.cxx:642
 TSVG.cxx:643
 TSVG.cxx:644
 TSVG.cxx:645
 TSVG.cxx:646
 TSVG.cxx:647
 TSVG.cxx:648
 TSVG.cxx:649
 TSVG.cxx:650
 TSVG.cxx:651
 TSVG.cxx:652
 TSVG.cxx:653
 TSVG.cxx:654
 TSVG.cxx:655
 TSVG.cxx:656
 TSVG.cxx:657
 TSVG.cxx:658
 TSVG.cxx:659
 TSVG.cxx:660
 TSVG.cxx:661
 TSVG.cxx:662
 TSVG.cxx:663
 TSVG.cxx:664
 TSVG.cxx:665
 TSVG.cxx:666
 TSVG.cxx:667
 TSVG.cxx:668
 TSVG.cxx:669
 TSVG.cxx:670
 TSVG.cxx:671
 TSVG.cxx:672
 TSVG.cxx:673
 TSVG.cxx:674
 TSVG.cxx:675
 TSVG.cxx:676
 TSVG.cxx:677
 TSVG.cxx:678
 TSVG.cxx:679
 TSVG.cxx:680
 TSVG.cxx:681
 TSVG.cxx:682
 TSVG.cxx:683
 TSVG.cxx:684
 TSVG.cxx:685
 TSVG.cxx:686
 TSVG.cxx:687
 TSVG.cxx:688
 TSVG.cxx:689
 TSVG.cxx:690
 TSVG.cxx:691
 TSVG.cxx:692
 TSVG.cxx:693
 TSVG.cxx:694
 TSVG.cxx:695
 TSVG.cxx:696
 TSVG.cxx:697
 TSVG.cxx:698
 TSVG.cxx:699
 TSVG.cxx:700
 TSVG.cxx:701
 TSVG.cxx:702
 TSVG.cxx:703
 TSVG.cxx:704
 TSVG.cxx:705
 TSVG.cxx:706
 TSVG.cxx:707
 TSVG.cxx:708
 TSVG.cxx:709
 TSVG.cxx:710
 TSVG.cxx:711
 TSVG.cxx:712
 TSVG.cxx:713
 TSVG.cxx:714
 TSVG.cxx:715
 TSVG.cxx:716
 TSVG.cxx:717
 TSVG.cxx:718
 TSVG.cxx:719
 TSVG.cxx:720
 TSVG.cxx:721
 TSVG.cxx:722
 TSVG.cxx:723
 TSVG.cxx:724
 TSVG.cxx:725
 TSVG.cxx:726
 TSVG.cxx:727
 TSVG.cxx:728
 TSVG.cxx:729
 TSVG.cxx:730
 TSVG.cxx:731
 TSVG.cxx:732
 TSVG.cxx:733
 TSVG.cxx:734
 TSVG.cxx:735
 TSVG.cxx:736
 TSVG.cxx:737
 TSVG.cxx:738
 TSVG.cxx:739
 TSVG.cxx:740
 TSVG.cxx:741
 TSVG.cxx:742
 TSVG.cxx:743
 TSVG.cxx:744
 TSVG.cxx:745
 TSVG.cxx:746
 TSVG.cxx:747
 TSVG.cxx:748
 TSVG.cxx:749
 TSVG.cxx:750
 TSVG.cxx:751
 TSVG.cxx:752
 TSVG.cxx:753
 TSVG.cxx:754
 TSVG.cxx:755
 TSVG.cxx:756
 TSVG.cxx:757
 TSVG.cxx:758
 TSVG.cxx:759
 TSVG.cxx:760
 TSVG.cxx:761
 TSVG.cxx:762
 TSVG.cxx:763
 TSVG.cxx:764
 TSVG.cxx:765
 TSVG.cxx:766
 TSVG.cxx:767
 TSVG.cxx:768
 TSVG.cxx:769
 TSVG.cxx:770
 TSVG.cxx:771
 TSVG.cxx:772
 TSVG.cxx:773
 TSVG.cxx:774
 TSVG.cxx:775
 TSVG.cxx:776
 TSVG.cxx:777
 TSVG.cxx:778
 TSVG.cxx:779
 TSVG.cxx:780
 TSVG.cxx:781
 TSVG.cxx:782
 TSVG.cxx:783
 TSVG.cxx:784
 TSVG.cxx:785
 TSVG.cxx:786
 TSVG.cxx:787
 TSVG.cxx:788
 TSVG.cxx:789
 TSVG.cxx:790
 TSVG.cxx:791
 TSVG.cxx:792
 TSVG.cxx:793
 TSVG.cxx:794
 TSVG.cxx:795
 TSVG.cxx:796
 TSVG.cxx:797
 TSVG.cxx:798
 TSVG.cxx:799
 TSVG.cxx:800
 TSVG.cxx:801
 TSVG.cxx:802
 TSVG.cxx:803
 TSVG.cxx:804
 TSVG.cxx:805
 TSVG.cxx:806
 TSVG.cxx:807
 TSVG.cxx:808
 TSVG.cxx:809
 TSVG.cxx:810
 TSVG.cxx:811
 TSVG.cxx:812
 TSVG.cxx:813
 TSVG.cxx:814
 TSVG.cxx:815
 TSVG.cxx:816
 TSVG.cxx:817
 TSVG.cxx:818
 TSVG.cxx:819
 TSVG.cxx:820
 TSVG.cxx:821
 TSVG.cxx:822
 TSVG.cxx:823
 TSVG.cxx:824
 TSVG.cxx:825
 TSVG.cxx:826
 TSVG.cxx:827
 TSVG.cxx:828
 TSVG.cxx:829
 TSVG.cxx:830
 TSVG.cxx:831
 TSVG.cxx:832
 TSVG.cxx:833
 TSVG.cxx:834
 TSVG.cxx:835
 TSVG.cxx:836
 TSVG.cxx:837
 TSVG.cxx:838
 TSVG.cxx:839
 TSVG.cxx:840
 TSVG.cxx:841
 TSVG.cxx:842
 TSVG.cxx:843
 TSVG.cxx:844
 TSVG.cxx:845
 TSVG.cxx:846
 TSVG.cxx:847
 TSVG.cxx:848
 TSVG.cxx:849
 TSVG.cxx:850
 TSVG.cxx:851
 TSVG.cxx:852
 TSVG.cxx:853
 TSVG.cxx:854
 TSVG.cxx:855
 TSVG.cxx:856
 TSVG.cxx:857
 TSVG.cxx:858
 TSVG.cxx:859
 TSVG.cxx:860
 TSVG.cxx:861
 TSVG.cxx:862
 TSVG.cxx:863
 TSVG.cxx:864
 TSVG.cxx:865
 TSVG.cxx:866
 TSVG.cxx:867
 TSVG.cxx:868
 TSVG.cxx:869
 TSVG.cxx:870
 TSVG.cxx:871
 TSVG.cxx:872
 TSVG.cxx:873
 TSVG.cxx:874
 TSVG.cxx:875
 TSVG.cxx:876
 TSVG.cxx:877
 TSVG.cxx:878
 TSVG.cxx:879
 TSVG.cxx:880
 TSVG.cxx:881
 TSVG.cxx:882
 TSVG.cxx:883
 TSVG.cxx:884
 TSVG.cxx:885
 TSVG.cxx:886
 TSVG.cxx:887
 TSVG.cxx:888
 TSVG.cxx:889
 TSVG.cxx:890
 TSVG.cxx:891
 TSVG.cxx:892
 TSVG.cxx:893
 TSVG.cxx:894
 TSVG.cxx:895
 TSVG.cxx:896
 TSVG.cxx:897
 TSVG.cxx:898
 TSVG.cxx:899
 TSVG.cxx:900
 TSVG.cxx:901
 TSVG.cxx:902
 TSVG.cxx:903
 TSVG.cxx:904
 TSVG.cxx:905
 TSVG.cxx:906
 TSVG.cxx:907
 TSVG.cxx:908
 TSVG.cxx:909
 TSVG.cxx:910
 TSVG.cxx:911
 TSVG.cxx:912
 TSVG.cxx:913
 TSVG.cxx:914
 TSVG.cxx:915
 TSVG.cxx:916
 TSVG.cxx:917
 TSVG.cxx:918
 TSVG.cxx:919
 TSVG.cxx:920
 TSVG.cxx:921
 TSVG.cxx:922
 TSVG.cxx:923
 TSVG.cxx:924
 TSVG.cxx:925
 TSVG.cxx:926
 TSVG.cxx:927
 TSVG.cxx:928
 TSVG.cxx:929
 TSVG.cxx:930
 TSVG.cxx:931
 TSVG.cxx:932
 TSVG.cxx:933
 TSVG.cxx:934
 TSVG.cxx:935
 TSVG.cxx:936
 TSVG.cxx:937
 TSVG.cxx:938
 TSVG.cxx:939
 TSVG.cxx:940
 TSVG.cxx:941
 TSVG.cxx:942
 TSVG.cxx:943
 TSVG.cxx:944
 TSVG.cxx:945
 TSVG.cxx:946
 TSVG.cxx:947
 TSVG.cxx:948
 TSVG.cxx:949
 TSVG.cxx:950
 TSVG.cxx:951
 TSVG.cxx:952
 TSVG.cxx:953
 TSVG.cxx:954
 TSVG.cxx:955
 TSVG.cxx:956
 TSVG.cxx:957
 TSVG.cxx:958
 TSVG.cxx:959
 TSVG.cxx:960
 TSVG.cxx:961
 TSVG.cxx:962
 TSVG.cxx:963
 TSVG.cxx:964
 TSVG.cxx:965
 TSVG.cxx:966
 TSVG.cxx:967
 TSVG.cxx:968
 TSVG.cxx:969
 TSVG.cxx:970
 TSVG.cxx:971
 TSVG.cxx:972
 TSVG.cxx:973
 TSVG.cxx:974
 TSVG.cxx:975
 TSVG.cxx:976
 TSVG.cxx:977
 TSVG.cxx:978
 TSVG.cxx:979
 TSVG.cxx:980
 TSVG.cxx:981
 TSVG.cxx:982
 TSVG.cxx:983
 TSVG.cxx:984
 TSVG.cxx:985
 TSVG.cxx:986
 TSVG.cxx:987
 TSVG.cxx:988
 TSVG.cxx:989
 TSVG.cxx:990
 TSVG.cxx:991
 TSVG.cxx:992
 TSVG.cxx:993
 TSVG.cxx:994
 TSVG.cxx:995
 TSVG.cxx:996
 TSVG.cxx:997
 TSVG.cxx:998
 TSVG.cxx:999
 TSVG.cxx:1000
 TSVG.cxx:1001
 TSVG.cxx:1002
 TSVG.cxx:1003
 TSVG.cxx:1004
 TSVG.cxx:1005
 TSVG.cxx:1006
 TSVG.cxx:1007
 TSVG.cxx:1008
 TSVG.cxx:1009
 TSVG.cxx:1010
 TSVG.cxx:1011
 TSVG.cxx:1012
 TSVG.cxx:1013
 TSVG.cxx:1014
 TSVG.cxx:1015
 TSVG.cxx:1016
 TSVG.cxx:1017
 TSVG.cxx:1018
 TSVG.cxx:1019
 TSVG.cxx:1020
 TSVG.cxx:1021
 TSVG.cxx:1022
 TSVG.cxx:1023
 TSVG.cxx:1024
 TSVG.cxx:1025
 TSVG.cxx:1026
 TSVG.cxx:1027
 TSVG.cxx:1028
 TSVG.cxx:1029
 TSVG.cxx:1030
 TSVG.cxx:1031
 TSVG.cxx:1032
 TSVG.cxx:1033
 TSVG.cxx:1034
 TSVG.cxx:1035
 TSVG.cxx:1036
 TSVG.cxx:1037
 TSVG.cxx:1038
 TSVG.cxx:1039
 TSVG.cxx:1040
 TSVG.cxx:1041
 TSVG.cxx:1042
 TSVG.cxx:1043
 TSVG.cxx:1044
 TSVG.cxx:1045
 TSVG.cxx:1046
 TSVG.cxx:1047
 TSVG.cxx:1048
 TSVG.cxx:1049
 TSVG.cxx:1050
 TSVG.cxx:1051
 TSVG.cxx:1052
 TSVG.cxx:1053
 TSVG.cxx:1054
 TSVG.cxx:1055
 TSVG.cxx:1056
 TSVG.cxx:1057
 TSVG.cxx:1058
 TSVG.cxx:1059
 TSVG.cxx:1060
 TSVG.cxx:1061
 TSVG.cxx:1062
 TSVG.cxx:1063
 TSVG.cxx:1064
 TSVG.cxx:1065
 TSVG.cxx:1066
 TSVG.cxx:1067
 TSVG.cxx:1068
 TSVG.cxx:1069
 TSVG.cxx:1070
 TSVG.cxx:1071
 TSVG.cxx:1072
 TSVG.cxx:1073
 TSVG.cxx:1074
 TSVG.cxx:1075
 TSVG.cxx:1076
 TSVG.cxx:1077
 TSVG.cxx:1078
 TSVG.cxx:1079
 TSVG.cxx:1080
 TSVG.cxx:1081
 TSVG.cxx:1082
 TSVG.cxx:1083
 TSVG.cxx:1084
 TSVG.cxx:1085
 TSVG.cxx:1086
 TSVG.cxx:1087
 TSVG.cxx:1088
 TSVG.cxx:1089
 TSVG.cxx:1090
 TSVG.cxx:1091
 TSVG.cxx:1092
 TSVG.cxx:1093
 TSVG.cxx:1094
 TSVG.cxx:1095
 TSVG.cxx:1096
 TSVG.cxx:1097
 TSVG.cxx:1098
 TSVG.cxx:1099
 TSVG.cxx:1100
 TSVG.cxx:1101
 TSVG.cxx:1102
 TSVG.cxx:1103
 TSVG.cxx:1104
 TSVG.cxx:1105
 TSVG.cxx:1106
 TSVG.cxx:1107
 TSVG.cxx:1108
 TSVG.cxx:1109
 TSVG.cxx:1110
 TSVG.cxx:1111
 TSVG.cxx:1112
 TSVG.cxx:1113
 TSVG.cxx:1114
 TSVG.cxx:1115
 TSVG.cxx:1116
 TSVG.cxx:1117
 TSVG.cxx:1118
 TSVG.cxx:1119
 TSVG.cxx:1120
 TSVG.cxx:1121
 TSVG.cxx:1122
 TSVG.cxx:1123
 TSVG.cxx:1124
 TSVG.cxx:1125
 TSVG.cxx:1126
 TSVG.cxx:1127
 TSVG.cxx:1128
 TSVG.cxx:1129
 TSVG.cxx:1130
 TSVG.cxx:1131
 TSVG.cxx:1132
 TSVG.cxx:1133
 TSVG.cxx:1134
 TSVG.cxx:1135
 TSVG.cxx:1136
 TSVG.cxx:1137
 TSVG.cxx:1138
 TSVG.cxx:1139
 TSVG.cxx:1140
 TSVG.cxx:1141
 TSVG.cxx:1142
 TSVG.cxx:1143
 TSVG.cxx:1144
 TSVG.cxx:1145
 TSVG.cxx:1146
 TSVG.cxx:1147
 TSVG.cxx:1148
 TSVG.cxx:1149
 TSVG.cxx:1150
 TSVG.cxx:1151
 TSVG.cxx:1152
 TSVG.cxx:1153
 TSVG.cxx:1154
 TSVG.cxx:1155
 TSVG.cxx:1156
 TSVG.cxx:1157
 TSVG.cxx:1158
 TSVG.cxx:1159
 TSVG.cxx:1160
 TSVG.cxx:1161
 TSVG.cxx:1162
 TSVG.cxx:1163
 TSVG.cxx:1164
 TSVG.cxx:1165
 TSVG.cxx:1166
 TSVG.cxx:1167
 TSVG.cxx:1168
 TSVG.cxx:1169
 TSVG.cxx:1170
 TSVG.cxx:1171
 TSVG.cxx:1172
 TSVG.cxx:1173
 TSVG.cxx:1174
 TSVG.cxx:1175
 TSVG.cxx:1176
 TSVG.cxx:1177
 TSVG.cxx:1178
 TSVG.cxx:1179
 TSVG.cxx:1180
 TSVG.cxx:1181
 TSVG.cxx:1182
 TSVG.cxx:1183
 TSVG.cxx:1184
 TSVG.cxx:1185
 TSVG.cxx:1186
 TSVG.cxx:1187
 TSVG.cxx:1188
 TSVG.cxx:1189
 TSVG.cxx:1190
 TSVG.cxx:1191
 TSVG.cxx:1192
 TSVG.cxx:1193
 TSVG.cxx:1194
 TSVG.cxx:1195
 TSVG.cxx:1196
 TSVG.cxx:1197
 TSVG.cxx:1198
 TSVG.cxx:1199
 TSVG.cxx:1200
 TSVG.cxx:1201
 TSVG.cxx:1202
 TSVG.cxx:1203
 TSVG.cxx:1204
 TSVG.cxx:1205
 TSVG.cxx:1206
 TSVG.cxx:1207
 TSVG.cxx:1208
 TSVG.cxx:1209
 TSVG.cxx:1210
 TSVG.cxx:1211
 TSVG.cxx:1212
 TSVG.cxx:1213
 TSVG.cxx:1214
 TSVG.cxx:1215
 TSVG.cxx:1216
 TSVG.cxx:1217
 TSVG.cxx:1218
 TSVG.cxx:1219
 TSVG.cxx:1220
 TSVG.cxx:1221
 TSVG.cxx:1222
 TSVG.cxx:1223
 TSVG.cxx:1224
 TSVG.cxx:1225
 TSVG.cxx:1226
 TSVG.cxx:1227
 TSVG.cxx:1228
 TSVG.cxx:1229
 TSVG.cxx:1230
 TSVG.cxx:1231
 TSVG.cxx:1232
 TSVG.cxx:1233
 TSVG.cxx:1234
 TSVG.cxx:1235
 TSVG.cxx:1236
 TSVG.cxx:1237
 TSVG.cxx:1238
 TSVG.cxx:1239
 TSVG.cxx:1240
 TSVG.cxx:1241
 TSVG.cxx:1242
 TSVG.cxx:1243
 TSVG.cxx:1244
 TSVG.cxx:1245
 TSVG.cxx:1246
 TSVG.cxx:1247
 TSVG.cxx:1248
 TSVG.cxx:1249
 TSVG.cxx:1250
 TSVG.cxx:1251
 TSVG.cxx:1252
 TSVG.cxx:1253
 TSVG.cxx:1254
 TSVG.cxx:1255
 TSVG.cxx:1256
 TSVG.cxx:1257
 TSVG.cxx:1258
 TSVG.cxx:1259
 TSVG.cxx:1260
 TSVG.cxx:1261
 TSVG.cxx:1262
 TSVG.cxx:1263
 TSVG.cxx:1264
 TSVG.cxx:1265
 TSVG.cxx:1266
 TSVG.cxx:1267
 TSVG.cxx:1268
 TSVG.cxx:1269
 TSVG.cxx:1270
 TSVG.cxx:1271
 TSVG.cxx:1272
 TSVG.cxx:1273
 TSVG.cxx:1274
 TSVG.cxx:1275
 TSVG.cxx:1276
 TSVG.cxx:1277
 TSVG.cxx:1278
 TSVG.cxx:1279
 TSVG.cxx:1280
 TSVG.cxx:1281
 TSVG.cxx:1282
 TSVG.cxx:1283
 TSVG.cxx:1284
 TSVG.cxx:1285
 TSVG.cxx:1286
 TSVG.cxx:1287
 TSVG.cxx:1288
 TSVG.cxx:1289
 TSVG.cxx:1290
 TSVG.cxx:1291
 TSVG.cxx:1292
 TSVG.cxx:1293
 TSVG.cxx:1294
 TSVG.cxx:1295
 TSVG.cxx:1296
 TSVG.cxx:1297
 TSVG.cxx:1298
 TSVG.cxx:1299
 TSVG.cxx:1300
 TSVG.cxx:1301
 TSVG.cxx:1302
 TSVG.cxx:1303
 TSVG.cxx:1304
 TSVG.cxx:1305
 TSVG.cxx:1306
 TSVG.cxx:1307
 TSVG.cxx:1308
 TSVG.cxx:1309
 TSVG.cxx:1310
 TSVG.cxx:1311
 TSVG.cxx:1312
 TSVG.cxx:1313
 TSVG.cxx:1314
 TSVG.cxx:1315
 TSVG.cxx:1316
 TSVG.cxx:1317
 TSVG.cxx:1318
 TSVG.cxx:1319
 TSVG.cxx:1320
 TSVG.cxx:1321
 TSVG.cxx:1322
 TSVG.cxx:1323
 TSVG.cxx:1324
 TSVG.cxx:1325
 TSVG.cxx:1326
 TSVG.cxx:1327
 TSVG.cxx:1328
 TSVG.cxx:1329
 TSVG.cxx:1330
 TSVG.cxx:1331
 TSVG.cxx:1332
 TSVG.cxx:1333
 TSVG.cxx:1334
 TSVG.cxx:1335
 TSVG.cxx:1336
 TSVG.cxx:1337
 TSVG.cxx:1338
 TSVG.cxx:1339
 TSVG.cxx:1340
 TSVG.cxx:1341
 TSVG.cxx:1342
 TSVG.cxx:1343
 TSVG.cxx:1344
 TSVG.cxx:1345
 TSVG.cxx:1346
 TSVG.cxx:1347
 TSVG.cxx:1348
 TSVG.cxx:1349
 TSVG.cxx:1350
 TSVG.cxx:1351
 TSVG.cxx:1352
 TSVG.cxx:1353
 TSVG.cxx:1354
 TSVG.cxx:1355
 TSVG.cxx:1356
 TSVG.cxx:1357
 TSVG.cxx:1358
 TSVG.cxx:1359
 TSVG.cxx:1360
 TSVG.cxx:1361
 TSVG.cxx:1362
 TSVG.cxx:1363
 TSVG.cxx:1364
 TSVG.cxx:1365
 TSVG.cxx:1366
 TSVG.cxx:1367
 TSVG.cxx:1368
 TSVG.cxx:1369
 TSVG.cxx:1370
 TSVG.cxx:1371
 TSVG.cxx:1372
 TSVG.cxx:1373
 TSVG.cxx:1374
 TSVG.cxx:1375
 TSVG.cxx:1376
 TSVG.cxx:1377
 TSVG.cxx:1378
 TSVG.cxx:1379
 TSVG.cxx:1380
 TSVG.cxx:1381
 TSVG.cxx:1382
 TSVG.cxx:1383
 TSVG.cxx:1384
 TSVG.cxx:1385
 TSVG.cxx:1386
 TSVG.cxx:1387
 TSVG.cxx:1388
 TSVG.cxx:1389
 TSVG.cxx:1390
 TSVG.cxx:1391
 TSVG.cxx:1392
 TSVG.cxx:1393
 TSVG.cxx:1394
 TSVG.cxx:1395
 TSVG.cxx:1396
 TSVG.cxx:1397
 TSVG.cxx:1398
 TSVG.cxx:1399
 TSVG.cxx:1400
 TSVG.cxx:1401
 TSVG.cxx:1402
 TSVG.cxx:1403
 TSVG.cxx:1404
 TSVG.cxx:1405
 TSVG.cxx:1406
 TSVG.cxx:1407
 TSVG.cxx:1408
 TSVG.cxx:1409
 TSVG.cxx:1410
 TSVG.cxx:1411
 TSVG.cxx:1412
 TSVG.cxx:1413
 TSVG.cxx:1414
 TSVG.cxx:1415
 TSVG.cxx:1416
 TSVG.cxx:1417
 TSVG.cxx:1418
 TSVG.cxx:1419
 TSVG.cxx:1420
 TSVG.cxx:1421
 TSVG.cxx:1422
 TSVG.cxx:1423
 TSVG.cxx:1424
 TSVG.cxx:1425
 TSVG.cxx:1426
 TSVG.cxx:1427
 TSVG.cxx:1428
 TSVG.cxx:1429
 TSVG.cxx:1430
 TSVG.cxx:1431
 TSVG.cxx:1432
 TSVG.cxx:1433
 TSVG.cxx:1434
 TSVG.cxx:1435
 TSVG.cxx:1436
 TSVG.cxx:1437
 TSVG.cxx:1438
 TSVG.cxx:1439
 TSVG.cxx:1440
 TSVG.cxx:1441
 TSVG.cxx:1442
 TSVG.cxx:1443
 TSVG.cxx:1444
 TSVG.cxx:1445
 TSVG.cxx:1446
 TSVG.cxx:1447
 TSVG.cxx:1448
 TSVG.cxx:1449
 TSVG.cxx:1450
 TSVG.cxx:1451
 TSVG.cxx:1452
 TSVG.cxx:1453
 TSVG.cxx:1454
 TSVG.cxx:1455
 TSVG.cxx:1456
 TSVG.cxx:1457
 TSVG.cxx:1458
 TSVG.cxx:1459
 TSVG.cxx:1460
 TSVG.cxx:1461
 TSVG.cxx:1462
 TSVG.cxx:1463
 TSVG.cxx:1464
 TSVG.cxx:1465
 TSVG.cxx:1466
 TSVG.cxx:1467
 TSVG.cxx:1468
 TSVG.cxx:1469
 TSVG.cxx:1470
 TSVG.cxx:1471
 TSVG.cxx:1472
 TSVG.cxx:1473
 TSVG.cxx:1474
 TSVG.cxx:1475
 TSVG.cxx:1476
 TSVG.cxx:1477
 TSVG.cxx:1478
 TSVG.cxx:1479
 TSVG.cxx:1480
 TSVG.cxx:1481
 TSVG.cxx:1482
 TSVG.cxx:1483
 TSVG.cxx:1484
 TSVG.cxx:1485
 TSVG.cxx:1486
 TSVG.cxx:1487
 TSVG.cxx:1488
 TSVG.cxx:1489
 TSVG.cxx:1490
 TSVG.cxx:1491
 TSVG.cxx:1492
 TSVG.cxx:1493
 TSVG.cxx:1494
 TSVG.cxx:1495
 TSVG.cxx:1496
 TSVG.cxx:1497
 TSVG.cxx:1498
 TSVG.cxx:1499
 TSVG.cxx:1500
 TSVG.cxx:1501
 TSVG.cxx:1502
 TSVG.cxx:1503
 TSVG.cxx:1504
 TSVG.cxx:1505
 TSVG.cxx:1506
 TSVG.cxx:1507
 TSVG.cxx:1508
 TSVG.cxx:1509
 TSVG.cxx:1510
 TSVG.cxx:1511
 TSVG.cxx:1512
 TSVG.cxx:1513
 TSVG.cxx:1514
 TSVG.cxx:1515
 TSVG.cxx:1516
 TSVG.cxx:1517
 TSVG.cxx:1518
 TSVG.cxx:1519
 TSVG.cxx:1520
 TSVG.cxx:1521
 TSVG.cxx:1522
 TSVG.cxx:1523
 TSVG.cxx:1524
 TSVG.cxx:1525
 TSVG.cxx:1526
 TSVG.cxx:1527
 TSVG.cxx:1528
 TSVG.cxx:1529
 TSVG.cxx:1530
 TSVG.cxx:1531
 TSVG.cxx:1532
 TSVG.cxx:1533
 TSVG.cxx:1534
 TSVG.cxx:1535
 TSVG.cxx:1536
 TSVG.cxx:1537
 TSVG.cxx:1538
 TSVG.cxx:1539
 TSVG.cxx:1540
 TSVG.cxx:1541
 TSVG.cxx:1542
 TSVG.cxx:1543
 TSVG.cxx:1544
 TSVG.cxx:1545
 TSVG.cxx:1546
 TSVG.cxx:1547
 TSVG.cxx:1548
 TSVG.cxx:1549
 TSVG.cxx:1550
 TSVG.cxx:1551
 TSVG.cxx:1552
 TSVG.cxx:1553
 TSVG.cxx:1554
 TSVG.cxx:1555
 TSVG.cxx:1556
 TSVG.cxx:1557
 TSVG.cxx:1558
 TSVG.cxx:1559
 TSVG.cxx:1560
 TSVG.cxx:1561
 TSVG.cxx:1562
 TSVG.cxx:1563
 TSVG.cxx:1564
 TSVG.cxx:1565
 TSVG.cxx:1566
 TSVG.cxx:1567
 TSVG.cxx:1568
 TSVG.cxx:1569
 TSVG.cxx:1570
 TSVG.cxx:1571
 TSVG.cxx:1572
 TSVG.cxx:1573
 TSVG.cxx:1574
 TSVG.cxx:1575
 TSVG.cxx:1576
 TSVG.cxx:1577
 TSVG.cxx:1578
 TSVG.cxx:1579
 TSVG.cxx:1580
 TSVG.cxx:1581
 TSVG.cxx:1582
 TSVG.cxx:1583
 TSVG.cxx:1584
 TSVG.cxx:1585
 TSVG.cxx:1586
 TSVG.cxx:1587
 TSVG.cxx:1588
 TSVG.cxx:1589
 TSVG.cxx:1590
 TSVG.cxx:1591
 TSVG.cxx:1592
 TSVG.cxx:1593
 TSVG.cxx:1594
 TSVG.cxx:1595
 TSVG.cxx:1596
 TSVG.cxx:1597
 TSVG.cxx:1598
 TSVG.cxx:1599
 TSVG.cxx:1600
 TSVG.cxx:1601
 TSVG.cxx:1602
 TSVG.cxx:1603
 TSVG.cxx:1604
 TSVG.cxx:1605
 TSVG.cxx:1606
 TSVG.cxx:1607
 TSVG.cxx:1608
 TSVG.cxx:1609
 TSVG.cxx:1610
 TSVG.cxx:1611
 TSVG.cxx:1612
 TSVG.cxx:1613
 TSVG.cxx:1614
 TSVG.cxx:1615
 TSVG.cxx:1616
 TSVG.cxx:1617
 TSVG.cxx:1618
 TSVG.cxx:1619
 TSVG.cxx:1620
 TSVG.cxx:1621
 TSVG.cxx:1622
 TSVG.cxx:1623
 TSVG.cxx:1624
 TSVG.cxx:1625
 TSVG.cxx:1626
 TSVG.cxx:1627
 TSVG.cxx:1628
 TSVG.cxx:1629
 TSVG.cxx:1630
 TSVG.cxx:1631
 TSVG.cxx:1632
 TSVG.cxx:1633
 TSVG.cxx:1634
 TSVG.cxx:1635
 TSVG.cxx:1636
 TSVG.cxx:1637
 TSVG.cxx:1638
 TSVG.cxx:1639
 TSVG.cxx:1640
 TSVG.cxx:1641
 TSVG.cxx:1642
 TSVG.cxx:1643
 TSVG.cxx:1644
 TSVG.cxx:1645
 TSVG.cxx:1646
 TSVG.cxx:1647
 TSVG.cxx:1648
 TSVG.cxx:1649
 TSVG.cxx:1650
 TSVG.cxx:1651
 TSVG.cxx:1652
 TSVG.cxx:1653
 TSVG.cxx:1654
 TSVG.cxx:1655
 TSVG.cxx:1656
 TSVG.cxx:1657
 TSVG.cxx:1658
 TSVG.cxx:1659
 TSVG.cxx:1660
 TSVG.cxx:1661
 TSVG.cxx:1662
 TSVG.cxx:1663
 TSVG.cxx:1664
 TSVG.cxx:1665
 TSVG.cxx:1666
 TSVG.cxx:1667
 TSVG.cxx:1668
 TSVG.cxx:1669
 TSVG.cxx:1670
 TSVG.cxx:1671
 TSVG.cxx:1672
 TSVG.cxx:1673
 TSVG.cxx:1674
 TSVG.cxx:1675
 TSVG.cxx:1676
 TSVG.cxx:1677
 TSVG.cxx:1678
 TSVG.cxx:1679
 TSVG.cxx:1680
 TSVG.cxx:1681
 TSVG.cxx:1682
 TSVG.cxx:1683
 TSVG.cxx:1684
 TSVG.cxx:1685
 TSVG.cxx:1686
 TSVG.cxx:1687
 TSVG.cxx:1688
 TSVG.cxx:1689
 TSVG.cxx:1690
 TSVG.cxx:1691
 TSVG.cxx:1692
 TSVG.cxx:1693
 TSVG.cxx:1694
 TSVG.cxx:1695
 TSVG.cxx:1696
 TSVG.cxx:1697
 TSVG.cxx:1698
 TSVG.cxx:1699
 TSVG.cxx:1700
 TSVG.cxx:1701
 TSVG.cxx:1702
 TSVG.cxx:1703
 TSVG.cxx:1704
 TSVG.cxx:1705
 TSVG.cxx:1706
 TSVG.cxx:1707
 TSVG.cxx:1708
 TSVG.cxx:1709
 TSVG.cxx:1710
 TSVG.cxx:1711
 TSVG.cxx:1712
 TSVG.cxx:1713
 TSVG.cxx:1714
 TSVG.cxx:1715
 TSVG.cxx:1716
 TSVG.cxx:1717
 TSVG.cxx:1718
 TSVG.cxx:1719