13 #pragma optimize("",off)
77 TSVG::TSVG() : TVirtualPS()
82 fBoundingBox = kFALSE;
99 TSVG::TSVG(
const char *fname, Int_t wtype) : TVirtualPS(fname, wtype)
109 void TSVG::Open(
const char *fname, Int_t wtype)
112 Warning(
"Open",
"SVG file already open");
118 SetLineScale(gStyle->GetLineScalePS());
119 gStyle->GetPaperSize(fXsize, fYsize);
120 Float_t xrange, yrange;
122 Double_t ww = gPad->GetWw();
123 Double_t wh = gPad->GetWh();
124 ww *= gPad->GetWNDC();
125 wh *= gPad->GetHNDC();
126 Double_t ratio = wh/ww;
128 yrange = fXsize*ratio;
129 if (yrange > fYsize) { yrange = fYsize; xrange = yrange/ratio;}
130 fXsize = xrange; fYsize = yrange;
134 fStream =
new std::ofstream(fname,std::ios::out);
135 if (fStream == 0 || !fStream->good()) {
136 printf(
"ERROR in TSVG::Open: Cannot open file:%s\n",fname);
137 if (fStream == 0)
return;
142 for (Int_t i=0;i<fSizBuffer;i++) fBuffer[i] =
' ';
144 fBoundingBox = kFALSE;
149 Range(fXsize, fYsize);
165 void TSVG::Close(Option_t *)
167 if (!gVirtualPS)
return;
168 if (!fStream)
return;
169 if (gPad) gPad->Update();
173 if (fStream) { fStream->close();
delete fStream; fStream = 0;}
187 Error(
"On",
"no SVG file open");
205 void TSVG::DrawBox(Double_t x1, Double_t y1, Double_t x2, Double_t y2)
207 static Double_t x[4], y[4];
208 Double_t ix1 = XtoSVG(TMath::Min(x1,x2));
209 Double_t ix2 = XtoSVG(TMath::Max(x1,x2));
210 Double_t iy1 = YtoSVG(TMath::Min(y1,y2));
211 Double_t iy2 = YtoSVG(TMath::Max(y1,y2));
212 Int_t fillis = fFillStyle/1000;
213 Int_t fillsi = fFillStyle%1000;
215 if (fillis == 3 || fillis == 2) {
217 x[0] = x1; y[0] = y1;
218 x[1] = x2; y[1] = y1;
219 x[2] = x2; y[2] = y2;
220 x[3] = x1; y[3] = y2;
223 if (fillsi > 0 && fillsi < 26) {
224 x[0] = x1; y[0] = y1;
225 x[1] = x2; y[1] = y1;
226 x[2] = x2; y[2] = y2;
227 x[3] = x1; y[3] = y2;
228 DrawPS(-4, &x[0], &y[0]);
232 PrintFast(9,
"<rect x=\"");
233 WriteReal(ix1, kFALSE);
234 PrintFast(5,
"\" y=\"");
235 WriteReal(iy2, kFALSE);
236 PrintFast(9,
"\" width=\"");
237 WriteReal(ix2-ix1, kFALSE);
238 PrintFast(10,
"\" height=\"");
239 WriteReal(iy1-iy2, kFALSE);
240 PrintFast(7,
"\" fill=");
247 PrintFast(9,
"<rect x=\"");
248 WriteReal(ix1, kFALSE);
249 PrintFast(5,
"\" y=\"");
250 WriteReal(iy2, kFALSE);
251 PrintFast(9,
"\" width=\"");
252 WriteReal(ix2-ix1, kFALSE);
253 PrintFast(10,
"\" height=\"");
254 WriteReal(iy1-iy2, kFALSE);
255 PrintFast(7,
"\" fill=");
256 SetColorAlpha(fFillColor);
260 if (fLineWidth<=0)
return;
262 PrintFast(9,
"<rect x=\"");
263 WriteReal(ix1, kFALSE);
264 PrintFast(5,
"\" y=\"");
265 WriteReal(iy2, kFALSE);
266 PrintFast(9,
"\" width=\"");
267 WriteReal(ix2-ix1, kFALSE);
268 PrintFast(10,
"\" height=\"");
269 WriteReal(iy1-iy2, kFALSE);
270 PrintFast(21,
"\" fill=\"none\" stroke=");
271 SetColorAlpha(fLineColor);
285 void TSVG::DrawFrame(Double_t xl, Double_t yl, Double_t xt, Double_t yt,
286 Int_t mode, Int_t border, Int_t dark, Int_t light)
288 static Double_t xps[7], yps[7];
290 Double_t ixd0, iyd0, ixdi, iydi, ix, iy;
295 xps[0] = XtoSVG(xl); yps[0] = YtoSVG(yl);
296 xps[1] = xps[0] + border; yps[1] = yps[0] - border;
297 xps[2] = xps[1]; yps[2] = YtoSVG(yt) + border;
298 xps[3] = XtoSVG(xt) - border; yps[3] = yps[2];
299 xps[4] = XtoSVG(xt); yps[4] = YtoSVG(yt);
300 xps[5] = xps[0]; yps[5] = yps[4];
301 xps[6] = xps[0]; yps[6] = yps[0];
306 PrintFast(10,
"<path d=\"M");
307 WriteReal(ixd0, kFALSE);
309 WriteReal(iyd0, kFALSE);
313 for (i=1; i<7; i++) {
321 if( idx ) { MovePS(idx,0); idx = 0; }
322 if( idy ) { MovePS(0,idy); idy = 0; }
327 if( idy ) { MovePS(0,idy); idy = 0; }
328 if( !idx ) { idx = ix;
continue;}
338 if( idx ) { MovePS(idx,0); idx = 0; }
339 if( !idy) { idy = iy;
continue;}
348 if( idx ) MovePS(idx,0);
349 if( idy ) MovePS(0,idy);
350 PrintFast(8,
"z\" fill=");
354 SetColorAlpha(light);
359 xps[0] = XtoSVG(xl); yps[0] = YtoSVG(yl);
360 xps[1] = xps[0] + border; yps[1] = yps[0] - border;
361 xps[2] = XtoSVG(xt) - border; yps[2] = yps[1];
362 xps[3] = xps[2]; yps[3] = YtoSVG(yt) + border;
363 xps[4] = XtoSVG(xt); yps[4] = YtoSVG(yt);
364 xps[5] = xps[4]; yps[5] = yps[0];
365 xps[6] = xps[0]; yps[6] = yps[0];
370 PrintFast(10,
"<path d=\"M");
371 WriteReal(ixd0, kFALSE);
373 WriteReal(iyd0, kFALSE);
385 if( idx ) { MovePS(idx,0); idx = 0; }
386 if( idy ) { MovePS(0,idy); idy = 0; }
391 if( idy ) { MovePS(0,idy); idy = 0; }
392 if( !idx ) { idx = ix;
continue;}
402 if( idx ) { MovePS(idx,0); idx = 0; }
403 if( !idy) { idy = iy;
continue;}
412 if( idx ) MovePS(idx,0);
413 if( idy ) MovePS(0,idy);
414 PrintFast(8,
"z\" fill=");
416 SetColorAlpha(light);
433 void TSVG::DrawPolyLine(Int_t nn, TPoints *xy)
436 Double_t ixd0, iyd0, ixdi, iydi, ix, iy;
444 ixd0 = XtoSVG(xy[0].GetX());
445 iyd0 = YtoSVG(xy[0].GetY());
451 for (Int_t i=1;i<n;i++) {
452 ixdi = XtoSVG(xy[i].GetX());
453 iydi = YtoSVG(xy[i].GetY());
459 if( idx ) { MovePS(idx,0); idx = 0; }
460 if( idy ) { MovePS(0,idy); idy = 0; }
465 if( idy ) { MovePS(0,idy); idy = 0; }
466 if( !idx ) { idx = ix;
continue;}
476 if( idx ) { MovePS(idx,0); idx = 0; }
477 if( !idy) { idy = iy;
continue;}
486 if( idx ) MovePS(idx,0);
487 if( idy ) MovePS(0,idy);
504 void TSVG::DrawPolyLineNDC(Int_t nn, TPoints *xy)
507 Double_t ixd0, iyd0, ixdi, iydi, ix, iy;
515 ixd0 = UtoSVG(xy[0].GetX());
516 iyd0 = VtoSVG(xy[0].GetY());
521 for (Int_t i=1;i<n;i++) {
522 ixdi = UtoSVG(xy[i].GetX());
523 iydi = VtoSVG(xy[i].GetY());
529 if( idx ) { MovePS(idx,0); idx = 0; }
530 if( idy ) { MovePS(0,idy); idy = 0; }
535 if( idy ) { MovePS(0,idy); idy = 0; }
536 if( !idx ) { idx = ix;
continue;}
546 if( idx ) { MovePS(idx,0); idx = 0; }
547 if( !idy) { idy = iy;
continue;}
556 if( idx ) MovePS(idx,0);
557 if( idy ) MovePS(0,idy);
560 if (xy[0].GetX() == xy[n-1].GetX() && xy[0].GetY() == xy[n-1].GetY()) PrintFast(3,
" cl");
568 void TSVG::DrawPolyMarker(Int_t n, Float_t *xw, Float_t *yw)
570 Int_t ms = abs(fMarkerStyle);
572 if (ms >= 6 && ms <= 19) ms = 20;
573 if (ms == 4) ms = 24;
576 Float_t msize = fMarkerSize;
577 if (fMarkerStyle == 1) msize = 0.01;
578 if (fMarkerStyle == 6) msize = 0.02;
579 if (fMarkerStyle == 7) msize = 0.04;
581 const Int_t kBASEMARKER = 8;
582 Float_t sbase = msize*kBASEMARKER;
583 Float_t s2x = sbase / Float_t(gPad->GetWw() * gPad->GetAbsWNDC());
584 msize = this->UtoSVG(s2x) - this->UtoSVG(0);
596 if ((ms > 19 && ms < 24) || ms == 29 || ms == 33 || ms == 34 ||
597 ms == 39 || ms == 41 || ms == 43 || ms == 45 ||
598 ms == 47 || ms == 48 || ms == 49) {
599 PrintStr(
"<g fill=");
600 SetColorAlpha(Int_t(fMarkerColor));
603 PrintStr(
"<g stroke=");
604 SetColorAlpha(Int_t(fMarkerColor));
605 PrintStr(
" stroke-width=\"");
606 WriteReal(fLineWidth, kFALSE);
607 PrintStr(
"\" fill=\"none\"");
611 for (Int_t i=0;i<n;i++) {
617 PrintStr(
"<line x1=\"");
618 WriteReal(ix-1, kFALSE);
619 PrintStr(
"\" y1=\"");
620 WriteReal(iy, kFALSE);
621 PrintStr(
"\" x2=\"");
622 WriteReal(ix, kFALSE);
623 PrintStr(
"\" y2=\"");
624 WriteReal(iy, kFALSE);
627 }
else if (ms == 2) {
628 PrintStr(
"<line x1=\"");
629 WriteReal(ix-m2, kFALSE);
630 PrintStr(
"\" y1=\"");
631 WriteReal(iy, kFALSE);
632 PrintStr(
"\" x2=\"");
633 WriteReal(ix+m2, kFALSE);
634 PrintStr(
"\" y2=\"");
635 WriteReal(iy, kFALSE);
638 PrintStr(
"<line x1=\"");
639 WriteReal(ix, kFALSE);
640 PrintStr(
"\" y1=\"");
641 WriteReal(iy-m2, kFALSE);
642 PrintStr(
"\" x2=\"");
643 WriteReal(ix, kFALSE);
644 PrintStr(
"\" y2=\"");
645 WriteReal(iy+m2, kFALSE);
648 }
else if (ms == 5) {
649 PrintStr(
"<line x1=\"");
650 WriteReal(ix-m2, kFALSE);
651 PrintStr(
"\" y1=\"");
652 WriteReal(iy-m2, kFALSE);
653 PrintStr(
"\" x2=\"");
654 WriteReal(ix+m2, kFALSE);
655 PrintStr(
"\" y2=\"");
656 WriteReal(iy+m2, kFALSE);
659 PrintStr(
"<line x1=\"");
660 WriteReal(ix-m2, kFALSE);
661 PrintStr(
"\" y1=\"");
662 WriteReal(iy+m2, kFALSE);
663 PrintStr(
"\" x2=\"");
664 WriteReal(ix+m2, kFALSE);
665 PrintStr(
"\" y2=\"");
666 WriteReal(iy-m2, kFALSE);
669 }
else if (ms == 3 || ms == 31) {
670 PrintStr(
"<line x1=\"");
671 WriteReal(ix-m2, kFALSE);
672 PrintStr(
"\" y1=\"");
673 WriteReal(iy, kFALSE);
674 PrintStr(
"\" x2=\"");
675 WriteReal(ix+m2, kFALSE);
676 PrintStr(
"\" y2=\"");
677 WriteReal(iy, kFALSE);
680 PrintStr(
"<line x1=\"");
681 WriteReal(ix, kFALSE);
682 PrintStr(
"\" y1=\"");
683 WriteReal(iy-m2, kFALSE);
684 PrintStr(
"\" x2=\"");
685 WriteReal(ix, kFALSE);
686 PrintStr(
"\" y2=\"");
687 WriteReal(iy+m2, kFALSE);
690 PrintStr(
"<line x1=\"");
691 WriteReal(ix-m2, kFALSE);
692 PrintStr(
"\" y1=\"");
693 WriteReal(iy-m2, kFALSE);
694 PrintStr(
"\" x2=\"");
695 WriteReal(ix+m2, kFALSE);
696 PrintStr(
"\" y2=\"");
697 WriteReal(iy+m2, kFALSE);
700 PrintStr(
"<line x1=\"");
701 WriteReal(ix-m2, kFALSE);
702 PrintStr(
"\" y1=\"");
703 WriteReal(iy+m2, kFALSE);
704 PrintStr(
"\" x2=\"");
705 WriteReal(ix+m2, kFALSE);
706 PrintStr(
"\" y2=\"");
707 WriteReal(iy-m2, kFALSE);
710 }
else if (ms == 24 || ms == 20) {
711 PrintStr(
"<circle cx=\"");
712 WriteReal(ix, kFALSE);
713 PrintStr(
"\" cy=\"");
714 WriteReal(iy, kFALSE);
717 WriteReal(m2, kFALSE);
718 PrintStr(
"\" fill=\"none\"");
721 }
else if (ms == 25 || ms == 21) {
722 PrintStr(
"<rect x=\"");
723 WriteReal(ix-m2, kFALSE);
725 WriteReal(iy-m2, kFALSE);
726 PrintStr(
"\" width=\"");
727 WriteReal(m, kFALSE);
728 PrintStr(
"\" height=\"");
729 WriteReal(m, kFALSE);
730 PrintStr(
"\" fill=\"none\"");
733 }
else if (ms == 26 || ms == 22) {
734 PrintStr(
"<polygon points=\"");
735 WriteReal(ix); PrintStr(
","); WriteReal(iy-m2);
736 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m2);
737 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m2);
740 }
else if (ms == 23 || ms == 32) {
741 PrintStr(
"<polygon points=\"");
742 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m2);
743 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m2);
744 WriteReal(ix); PrintStr(
","); WriteReal(iy+m2);
747 }
else if (ms == 27 || ms == 33) {
748 PrintStr(
"<polygon points=\"");
749 WriteReal(ix); PrintStr(
","); WriteReal(iy-m2);
750 WriteReal(ix+m3); PrintStr(
","); WriteReal(iy);
751 WriteReal(ix); PrintStr(
","); WriteReal(iy+m2);
752 WriteReal(ix-m3); PrintStr(
","); WriteReal(iy);
755 }
else if (ms == 28 || ms == 34) {
756 PrintStr(
"<polygon points=\"");
757 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy-m6);
758 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy-m2);
759 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy-m2);
760 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy-m6);
761 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m6);
762 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m6);
763 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy+m6);
764 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy+m2);
765 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy+m2);
766 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy+m6);
767 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m6);
768 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m6);
770 }
else if (ms == 29 || ms == 30) {
771 PrintStr(
"<polygon points=\"");
772 WriteReal(ix); PrintStr(
","); WriteReal(iy+m2);
773 WriteReal(ix+0.112255*m); PrintStr(
","); WriteReal(iy+0.15451*m);
774 WriteReal(ix+0.47552*m); PrintStr(
","); WriteReal(iy+0.15451*m);
775 WriteReal(ix+0.181635*m); PrintStr(
","); WriteReal(iy-0.05902*m);
776 WriteReal(ix+0.29389*m); PrintStr(
","); WriteReal(iy-0.40451*m);
777 WriteReal(ix); PrintStr(
","); WriteReal(iy-0.19098*m);
778 WriteReal(ix-0.29389*m); PrintStr(
","); WriteReal(iy-0.40451*m);
779 WriteReal(ix-0.181635*m); PrintStr(
","); WriteReal(iy-0.05902*m);
780 WriteReal(ix-0.47552*m); PrintStr(
","); WriteReal(iy+0.15451*m);
781 WriteReal(ix-0.112255*m); PrintStr(
","); WriteReal(iy+0.15451*m);
783 }
else if (ms == 35) {
784 PrintStr(
"<polygon points=\"");
785 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy );
786 WriteReal(ix ); PrintStr(
","); WriteReal(iy-m2);
787 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy );
788 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m2);
789 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy );
790 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy );
791 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m2);
792 WriteReal(ix ); PrintStr(
","); WriteReal(iy-m2);
794 }
else if (ms == 36) {
795 PrintStr(
"<polygon points=\"");
796 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m2);
797 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m2);
798 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m2);
799 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m2);
800 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m2);
801 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m2);
802 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m2);
803 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m2);
805 }
else if (ms == 37 || ms == 39) {
806 PrintStr(
"<polygon points=\"");
807 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
808 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy+m2);
809 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy+m2);
810 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
811 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy-m2);
812 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy);
813 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
814 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy );
815 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy-m2);
816 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
818 }
else if (ms == 38) {
819 PrintStr(
"<polygon points=\"");
820 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy );
821 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m4);
822 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy-m2);
823 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy-m2);
824 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m4);
825 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m4);
826 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy+m2);
827 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy+m2);
828 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m4);
829 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy );
830 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy );
831 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
832 WriteReal(ix ); PrintStr(
","); WriteReal(iy-m2);
833 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m2);
834 WriteReal(ix ); PrintStr(
","); WriteReal(iy);
836 }
else if (ms == 40 || ms == 41) {
837 PrintStr(
"<polygon points=\"");
838 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
839 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy+m2);
840 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m4);
841 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
842 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m4);
843 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy-m2);
844 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
845 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy-m2);
846 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m4);
847 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
848 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m4);
849 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy+m2);
850 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
852 }
else if (ms == 42 || ms == 43) {
853 PrintStr(
"<polygon points=\"");
854 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m2);
855 WriteReal(ix-m8); PrintStr(
","); WriteReal(iy+m8);
856 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy );
857 WriteReal(ix-m8); PrintStr(
","); WriteReal(iy-m8);
858 WriteReal(ix ); PrintStr(
","); WriteReal(iy-m2);
859 WriteReal(ix+m8); PrintStr(
","); WriteReal(iy-m8);
860 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy );
861 WriteReal(ix+m8); PrintStr(
","); WriteReal(iy+m8);
862 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m2);
864 }
else if (ms == 44) {
865 PrintStr(
"<polygon points=\"");
866 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
867 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy+m2);
868 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy+m2);
869 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy-m2);
870 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy-m2);
871 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
872 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m4);
873 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m4);
874 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m4);
875 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m4);
876 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
878 }
else if (ms == 45) {
879 PrintStr(
"<polygon points=\"");
880 WriteReal(ix+m0); PrintStr(
","); WriteReal(iy+m0);
881 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy+m2);
882 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy+m2);
883 WriteReal(ix-m0); PrintStr(
","); WriteReal(iy+m0);
884 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m4);
885 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m4);
886 WriteReal(ix-m0); PrintStr(
","); WriteReal(iy-m0);
887 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy-m2);
888 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy-m2);
889 WriteReal(ix+m0); PrintStr(
","); WriteReal(iy-m0);
890 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m4);
891 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m4);
892 WriteReal(ix+m0); PrintStr(
","); WriteReal(iy+m0);
894 }
else if (ms == 46 || ms == 47) {
895 PrintStr(
"<polygon points=\"");
896 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m4);
897 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy+m2);
898 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m4);
899 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy );
900 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m4);
901 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy-m2);
902 WriteReal(ix ); PrintStr(
","); WriteReal(iy-m4);
903 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy-m2);
904 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m4);
905 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy );
906 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m4);
907 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy+m2);
908 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m4);
910 }
else if (ms == 48) {
911 PrintStr(
"<polygon points=\"");
912 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m4*1.01);
913 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy+m2);
914 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m4);
915 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy );
916 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m4);
917 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy-m2);
918 WriteReal(ix ); PrintStr(
","); WriteReal(iy-m4);
919 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy-m2);
920 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m4);
921 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy );
922 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m4);
923 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy+m2);
924 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m4*0.99);
925 WriteReal(ix+m4*0.99); PrintStr(
","); WriteReal(iy );
926 WriteReal(ix ); PrintStr(
","); WriteReal(iy-m4*0.99);
927 WriteReal(ix-m4*0.99); PrintStr(
","); WriteReal(iy );
928 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m4*0.99);
930 }
else if (ms == 49) {
931 PrintStr(
"<polygon points=\"");
932 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy-m6*1.01);
933 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy-m2);
934 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy-m2);
935 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy-m6);
936 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m6);
937 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m6);
938 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy+m6);
939 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy+m2);
940 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy+m2);
941 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy+m6);
942 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m6);
943 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m6);
944 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy-m6*0.99);
945 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy+m6);
946 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy+m6);
947 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy-m6);
950 PrintStr(
"<line x1=\"");
951 WriteReal(ix-1, kFALSE);
952 PrintStr(
"\" y1=\"");
953 WriteReal(iy, kFALSE);
954 PrintStr(
"\" x2=\"");
955 WriteReal(ix, kFALSE);
956 PrintStr(
"\" y2=\"");
957 WriteReal(iy, kFALSE);
968 void TSVG::DrawPolyMarker(Int_t n, Double_t *xw, Double_t *yw)
970 Int_t ms = abs(fMarkerStyle);
972 if (ms >= 6 && ms <= 19) ms = 20;
973 if (ms == 4) ms = 24;
976 Float_t msize = fMarkerSize;
977 if (fMarkerStyle == 1) msize = 0.01;
978 if (fMarkerStyle == 6) msize = 0.02;
979 if (fMarkerStyle == 7) msize = 0.04;
981 const Int_t kBASEMARKER = 8;
982 Float_t sbase = msize*kBASEMARKER;
983 Float_t s2x = sbase / Float_t(gPad->GetWw() * gPad->GetAbsWNDC());
984 msize = this->UtoSVG(s2x) - this->UtoSVG(0);
996 if ((ms > 19 && ms < 24) || ms == 29 || ms == 33 || ms == 34 ||
997 ms == 39 || ms == 41 || ms == 43 || ms == 45 ||
998 ms == 47 || ms == 48 || ms == 49) {
999 PrintStr(
"<g fill=");
1000 SetColorAlpha(Int_t(fMarkerColor));
1003 PrintStr(
"<g stroke=");
1004 SetColorAlpha(Int_t(fMarkerColor));
1005 PrintStr(
" stroke-width=\"");
1006 WriteReal(fLineWidth, kFALSE);
1007 PrintStr(
"\" fill=\"none\"");
1011 for (Int_t i=0;i<n;i++) {
1017 PrintStr(
"<line x1=\"");
1018 WriteReal(ix-1, kFALSE);
1019 PrintStr(
"\" y1=\"");
1020 WriteReal(iy, kFALSE);
1021 PrintStr(
"\" x2=\"");
1022 WriteReal(ix, kFALSE);
1023 PrintStr(
"\" y2=\"");
1024 WriteReal(iy, kFALSE);
1027 }
else if (ms == 2) {
1028 PrintStr(
"<line x1=\"");
1029 WriteReal(ix-m2, kFALSE);
1030 PrintStr(
"\" y1=\"");
1031 WriteReal(iy, kFALSE);
1032 PrintStr(
"\" x2=\"");
1033 WriteReal(ix+m2, kFALSE);
1034 PrintStr(
"\" y2=\"");
1035 WriteReal(iy, kFALSE);
1038 PrintStr(
"<line x1=\"");
1039 WriteReal(ix, kFALSE);
1040 PrintStr(
"\" y1=\"");
1041 WriteReal(iy-m2, kFALSE);
1042 PrintStr(
"\" x2=\"");
1043 WriteReal(ix, kFALSE);
1044 PrintStr(
"\" y2=\"");
1045 WriteReal(iy+m2, kFALSE);
1048 }
else if (ms == 5) {
1049 PrintStr(
"<line x1=\"");
1050 WriteReal(ix-m2, kFALSE);
1051 PrintStr(
"\" y1=\"");
1052 WriteReal(iy-m2, kFALSE);
1053 PrintStr(
"\" x2=\"");
1054 WriteReal(ix+m2, kFALSE);
1055 PrintStr(
"\" y2=\"");
1056 WriteReal(iy+m2, kFALSE);
1059 PrintStr(
"<line x1=\"");
1060 WriteReal(ix-m2, kFALSE);
1061 PrintStr(
"\" y1=\"");
1062 WriteReal(iy+m2, kFALSE);
1063 PrintStr(
"\" x2=\"");
1064 WriteReal(ix+m2, kFALSE);
1065 PrintStr(
"\" y2=\"");
1066 WriteReal(iy-m2, kFALSE);
1069 }
else if (ms == 3 || ms == 31) {
1070 PrintStr(
"<line x1=\"");
1071 WriteReal(ix-m2, kFALSE);
1072 PrintStr(
"\" y1=\"");
1073 WriteReal(iy, kFALSE);
1074 PrintStr(
"\" x2=\"");
1075 WriteReal(ix+m2, kFALSE);
1076 PrintStr(
"\" y2=\"");
1077 WriteReal(iy, kFALSE);
1080 PrintStr(
"<line x1=\"");
1081 WriteReal(ix, kFALSE);
1082 PrintStr(
"\" y1=\"");
1083 WriteReal(iy-m2, kFALSE);
1084 PrintStr(
"\" x2=\"");
1085 WriteReal(ix, kFALSE);
1086 PrintStr(
"\" y2=\"");
1087 WriteReal(iy+m2, kFALSE);
1090 PrintStr(
"<line x1=\"");
1091 WriteReal(ix-m2, kFALSE);
1092 PrintStr(
"\" y1=\"");
1093 WriteReal(iy-m2, kFALSE);
1094 PrintStr(
"\" x2=\"");
1095 WriteReal(ix+m2, kFALSE);
1096 PrintStr(
"\" y2=\"");
1097 WriteReal(iy+m2, kFALSE);
1100 PrintStr(
"<line x1=\"");
1101 WriteReal(ix-m2, kFALSE);
1102 PrintStr(
"\" y1=\"");
1103 WriteReal(iy+m2, kFALSE);
1104 PrintStr(
"\" x2=\"");
1105 WriteReal(ix+m2, kFALSE);
1106 PrintStr(
"\" y2=\"");
1107 WriteReal(iy-m2, kFALSE);
1110 }
else if (ms == 24 || ms == 20) {
1111 PrintStr(
"<circle cx=\"");
1112 WriteReal(ix, kFALSE);
1113 PrintStr(
"\" cy=\"");
1114 WriteReal(iy, kFALSE);
1115 PrintStr(
"\" r=\"");
1117 WriteReal(m2, kFALSE);
1120 }
else if (ms == 25 || ms == 21) {
1121 PrintStr(
"<rect x=\"");
1122 WriteReal(ix-m2, kFALSE);
1123 PrintStr(
"\" y=\"");
1124 WriteReal(iy-m2, kFALSE);
1125 PrintStr(
"\" width=\"");
1126 WriteReal(m, kFALSE);
1127 PrintStr(
"\" height=\"");
1128 WriteReal(m, kFALSE);
1131 }
else if (ms == 26 || ms == 22) {
1132 PrintStr(
"<polygon points=\"");
1133 WriteReal(ix); PrintStr(
","); WriteReal(iy-m2);
1134 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m2);
1135 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m2);
1138 }
else if (ms == 23 || ms == 32) {
1139 PrintStr(
"<polygon points=\"");
1140 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m2);
1141 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m2);
1142 WriteReal(ix); PrintStr(
","); WriteReal(iy+m2);
1145 }
else if (ms == 27 || ms == 33) {
1146 PrintStr(
"<polygon points=\"");
1147 WriteReal(ix); PrintStr(
","); WriteReal(iy-m2);
1148 WriteReal(ix+m3); PrintStr(
","); WriteReal(iy);
1149 WriteReal(ix); PrintStr(
","); WriteReal(iy+m2);
1150 WriteReal(ix-m3); PrintStr(
","); WriteReal(iy);
1153 }
else if (ms == 28 || ms == 34) {
1154 PrintStr(
"<polygon points=\"");
1155 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy-m6);
1156 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy-m2);
1157 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy-m2);
1158 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy-m6);
1159 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m6);
1160 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m6);
1161 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy+m6);
1162 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy+m2);
1163 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy+m2);
1164 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy+m6);
1165 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m6);
1166 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m6);
1168 }
else if (ms == 29 || ms == 30) {
1169 PrintStr(
"<polygon points=\"");
1170 WriteReal(ix); PrintStr(
","); WriteReal(iy+m2);
1171 WriteReal(ix+0.112255*m); PrintStr(
","); WriteReal(iy+0.15451*m);
1172 WriteReal(ix+0.47552*m); PrintStr(
","); WriteReal(iy+0.15451*m);
1173 WriteReal(ix+0.181635*m); PrintStr(
","); WriteReal(iy-0.05902*m);
1174 WriteReal(ix+0.29389*m); PrintStr(
","); WriteReal(iy-0.40451*m);
1175 WriteReal(ix); PrintStr(
","); WriteReal(iy-0.19098*m);
1176 WriteReal(ix-0.29389*m); PrintStr(
","); WriteReal(iy-0.40451*m);
1177 WriteReal(ix-0.181635*m); PrintStr(
","); WriteReal(iy-0.05902*m);
1178 WriteReal(ix-0.47552*m); PrintStr(
","); WriteReal(iy+0.15451*m);
1179 WriteReal(ix-0.112255*m); PrintStr(
","); WriteReal(iy+0.15451*m);
1181 }
else if (ms == 35) {
1182 PrintStr(
"<polygon points=\"");
1183 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy );
1184 WriteReal(ix ); PrintStr(
","); WriteReal(iy-m2);
1185 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy );
1186 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m2);
1187 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy );
1188 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy );
1189 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m2);
1190 WriteReal(ix ); PrintStr(
","); WriteReal(iy-m2);
1192 }
else if (ms == 36) {
1193 PrintStr(
"<polygon points=\"");
1194 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m2);
1195 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m2);
1196 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m2);
1197 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m2);
1198 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m2);
1199 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m2);
1200 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m2);
1201 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m2);
1203 }
else if (ms == 37 || ms == 39) {
1204 PrintStr(
"<polygon points=\"");
1205 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
1206 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy+m2);
1207 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy+m2);
1208 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
1209 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy-m2);
1210 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy);
1211 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
1212 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy );
1213 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy-m2);
1214 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
1216 }
else if (ms == 38) {
1217 PrintStr(
"<polygon points=\"");
1218 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy );
1219 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m4);
1220 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy-m2);
1221 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy-m2);
1222 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m4);
1223 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m4);
1224 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy+m2);
1225 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy+m2);
1226 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m4);
1227 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy );
1228 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy );
1229 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
1230 WriteReal(ix ); PrintStr(
","); WriteReal(iy-m2);
1231 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m2);
1232 WriteReal(ix ); PrintStr(
","); WriteReal(iy);
1234 }
else if (ms == 40 || ms == 41) {
1235 PrintStr(
"<polygon points=\"");
1236 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
1237 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy+m2);
1238 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m4);
1239 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
1240 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m4);
1241 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy-m2);
1242 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
1243 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy-m2);
1244 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m4);
1245 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
1246 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m4);
1247 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy+m2);
1248 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
1250 }
else if (ms == 42 || ms == 43) {
1251 PrintStr(
"<polygon points=\"");
1252 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m2);
1253 WriteReal(ix-m8); PrintStr(
","); WriteReal(iy+m8);
1254 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy );
1255 WriteReal(ix-m8); PrintStr(
","); WriteReal(iy-m8);
1256 WriteReal(ix ); PrintStr(
","); WriteReal(iy-m2);
1257 WriteReal(ix+m8); PrintStr(
","); WriteReal(iy-m8);
1258 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy );
1259 WriteReal(ix+m8); PrintStr(
","); WriteReal(iy+m8);
1260 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m2);
1262 }
else if (ms == 44) {
1263 PrintStr(
"<polygon points=\"");
1264 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
1265 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy+m2);
1266 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy+m2);
1267 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy-m2);
1268 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy-m2);
1269 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
1270 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m4);
1271 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m4);
1272 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m4);
1273 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m4);
1274 WriteReal(ix ); PrintStr(
","); WriteReal(iy );
1276 }
else if (ms == 45) {
1277 PrintStr(
"<polygon points=\"");
1278 WriteReal(ix+m0); PrintStr(
","); WriteReal(iy+m0);
1279 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy+m2);
1280 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy+m2);
1281 WriteReal(ix-m0); PrintStr(
","); WriteReal(iy+m0);
1282 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m4);
1283 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m4);
1284 WriteReal(ix-m0); PrintStr(
","); WriteReal(iy-m0);
1285 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy-m2);
1286 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy-m2);
1287 WriteReal(ix+m0); PrintStr(
","); WriteReal(iy-m0);
1288 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m4);
1289 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m4);
1290 WriteReal(ix+m0); PrintStr(
","); WriteReal(iy+m0);
1292 }
else if (ms == 46 || ms == 47) {
1293 PrintStr(
"<polygon points=\"");
1294 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m4);
1295 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy+m2);
1296 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m4);
1297 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy );
1298 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m4);
1299 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy-m2);
1300 WriteReal(ix ); PrintStr(
","); WriteReal(iy-m4);
1301 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy-m2);
1302 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m4);
1303 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy );
1304 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m4);
1305 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy+m2);
1306 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m4);
1308 }
else if (ms == 48) {
1309 PrintStr(
"<polygon points=\"");
1310 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m4*1.01);
1311 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy+m2);
1312 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m4);
1313 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy );
1314 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m4);
1315 WriteReal(ix-m4); PrintStr(
","); WriteReal(iy-m2);
1316 WriteReal(ix ); PrintStr(
","); WriteReal(iy-m4);
1317 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy-m2);
1318 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m4);
1319 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy );
1320 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m4);
1321 WriteReal(ix+m4); PrintStr(
","); WriteReal(iy+m2);
1322 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m4*0.99);
1323 WriteReal(ix+m4*0.99); PrintStr(
","); WriteReal(iy );
1324 WriteReal(ix ); PrintStr(
","); WriteReal(iy-m4*0.99);
1325 WriteReal(ix-m4*0.99); PrintStr(
","); WriteReal(iy );
1326 WriteReal(ix ); PrintStr(
","); WriteReal(iy+m4*0.99);
1328 }
else if (ms == 49) {
1329 PrintStr(
"<polygon points=\"");
1330 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy-m6*1.01);
1331 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy-m2);
1332 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy-m2);
1333 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy-m6);
1334 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy-m6);
1335 WriteReal(ix+m2); PrintStr(
","); WriteReal(iy+m6);
1336 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy+m6);
1337 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy+m2);
1338 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy+m2);
1339 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy+m6);
1340 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy+m6);
1341 WriteReal(ix-m2); PrintStr(
","); WriteReal(iy-m6);
1342 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy-m6*0.99);
1343 WriteReal(ix-m6); PrintStr(
","); WriteReal(iy+m6);
1344 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy+m6);
1345 WriteReal(ix+m6); PrintStr(
","); WriteReal(iy-m6);
1348 PrintStr(
"<line x1=\"");
1349 WriteReal(ix-1, kFALSE);
1350 PrintStr(
"\" y1=\"");
1351 WriteReal(iy, kFALSE);
1352 PrintStr(
"\" x2=\"");
1353 WriteReal(ix, kFALSE);
1354 PrintStr(
"\" y2=\"");
1355 WriteReal(iy, kFALSE);
1370 void TSVG::DrawPS(Int_t nn, Double_t *xw, Double_t *yw)
1372 Int_t n, fais, fasi;
1373 Double_t ixd0, iyd0, idx, idy, ixdi, iydi, ix, iy;
1377 if (fLineWidth<=0)
return;
1381 fais = fFillStyle/1000;
1382 fasi = fFillStyle%1000;
1383 if (fais == 3 || fais == 2) {
1384 if (fasi > 100 && fasi <125) {
1387 if (fasi > 0 && fasi < 26) {
1393 Error(
"DrawPS",
"Two points are needed");
1397 ixd0 = XtoSVG(xw[0]);
1398 iyd0 = YtoSVG(yw[0]);
1401 PrintFast(10,
"<path d=\"M");
1402 WriteReal(ixd0, kFALSE);
1404 WriteReal(iyd0, kFALSE);
1407 for (Int_t i=1;i<n;i++) {
1408 ixdi = XtoSVG(xw[i]);
1409 iydi = YtoSVG(yw[i]);
1415 if( idx ) { MovePS(idx,0); idx = 0; }
1416 if( idy ) { MovePS(0,idy); idy = 0; }
1419 if( idy ) { MovePS(0,idy); idy = 0;}
1420 if( !idx ) { idx = ix;}
1421 else if( TMath::Sign(ix,idx) == ix ) idx += ix;
1422 else { MovePS(idx,0); idx = ix;}
1424 if( idx ) { MovePS(idx,0); idx = 0;}
1425 if( !idy) { idy = iy;}
1426 else if( TMath::Sign(iy,idy) == iy) idy += iy;
1427 else { MovePS(0,idy); idy = iy;}
1430 if (idx) MovePS(idx,0);
1431 if (idy) MovePS(0,idy);
1434 if (xw[0] == xw[n-1] && yw[0] == yw[n-1]) PrintFast(1,
"z");
1435 PrintFast(21,
"\" fill=\"none\" stroke=");
1436 SetColorAlpha(fLineColor);
1437 if(fLineWidth > 1.) {
1438 PrintFast(15,
" stroke-width=\"");
1439 WriteReal(fLineWidth, kFALSE);
1442 if (fLineStyle > 1) {
1443 PrintFast(19,
" stroke-dasharray=\"");
1444 TString st = (TString)gStyle->GetLineStyleString(fLineStyle);
1445 TObjArray *tokens = st.Tokenize(
" ");
1446 for (Int_t j = 0; j<tokens->GetEntries(); j++) {
1448 sscanf(((TObjString*)tokens->At(j))->GetName(),
"%d", &it);
1449 if (j>0) PrintFast(1,
",");
1457 PrintFast(8,
"z\" fill=");
1459 PrintFast(14,
"\"none\" stroke=");
1460 SetColorAlpha(fFillColor);
1462 SetColorAlpha(fFillColor);
1473 void TSVG::Initialize()
1476 PrintStr(
"<title>@");
1477 PrintStr(GetName());
1479 PrintStr(
"</title>@");
1482 PrintStr(
"<desc>@");
1483 PrintFast(22,
"Creator: ROOT Version ");
1484 PrintStr(gROOT->GetVersion());
1486 PrintFast(14,
"CreationDate: ");
1488 PrintStr(t.AsString());
1490 Int_t nh = strlen(gStyle->GetHeaderPS());
1492 PrintFast(nh,gStyle->GetHeaderPS());
1494 PrintStr(
"</desc>@");
1497 PrintStr(
"<defs>@");
1498 PrintStr(
"</defs>@");
1508 void TSVG::MovePS(Double_t ix, Double_t iy)
1510 if (ix != 0 && iy != 0) {
1515 }
else if (ix != 0) {
1518 }
else if (iy != 0) {
1529 void TSVG::NewPage()
1533 Double_t ww = gPad->GetWw();
1534 Double_t wh = gPad->GetWh();
1535 fYsize = fXsize*wh/ww;
1542 PrintStr(
"@<?xml version=\"1.0\" standalone=\"no\"?>");
1543 PrintStr(
"@<svg width=\"");
1544 WriteReal(CMtoSVG(fXsize), kFALSE);
1545 PrintStr(
"\" height=\"");
1546 fYsizeSVG = CMtoSVG(fYsize);
1547 WriteReal(fYsizeSVG, kFALSE);
1548 PrintStr(
"\" viewBox=\"0 0");
1549 WriteReal(CMtoSVG(fXsize));
1550 WriteReal(fYsizeSVG);
1551 PrintStr(
"\" xmlns=\"http://www.w3.org/2000/svg\" shape-rendering=\"crispEdges\">");
1554 fBoundingBox = kTRUE;
1561 void TSVG::Range(Float_t xsize, Float_t ysize)
1563 Float_t xps, yps, xncm, yncm, dxwn, dywn, xwkwn, ywkwn, xymax;
1571 if( xsize <= xps && ysize < yps) {
1572 if ( xps > yps ) xymax = xps;
1576 dxwn = ((xps/xymax)-xncm)/2;
1577 dywn = ((yps/xymax)-yncm)/2;
1579 if (xps/yps < 1) xwkwn = xps/yps;
1581 if (yps/xps < 1) ywkwn = yps/xps;
1584 if (xsize < ysize) {
1585 xncm = ywkwn*xsize/ysize;
1587 dxwn = (xwkwn-xncm)/2;
1592 yncm = xwkwn*ysize/xsize;
1593 dywn = (ywkwn-yncm)/2;
1597 yncm = xwkwn*ysize/xsize;
1599 dywn = (ywkwn-yncm)/2;
1603 xncm = ywkwn*xsize/ysize;
1604 dxwn = (xwkwn-xncm)/2;
1614 void TSVG::SetFillColor( Color_t cindex )
1616 fFillColor = cindex;
1617 if (gStyle->GetFillColor() <= 0) cindex = 0;
1623 void TSVG::SetLineColor( Color_t cindex )
1625 fLineColor = cindex;
1636 void TSVG::SetLineStyle(Style_t linestyle)
1638 fLineStyle = linestyle;
1644 void TSVG::SetLineWidth(Width_t linewidth)
1646 fLineWidth = linewidth;
1652 void TSVG::SetMarkerColor( Color_t cindex )
1654 fMarkerColor = cindex;
1660 void TSVG::SetColorAlpha(Int_t color)
1662 if (color < 0) color = 0;
1663 TColor *col = gROOT->GetColor(color);
1665 SetColor(col->GetRed(), col->GetGreen(), col->GetBlue());
1666 Float_t a = col->GetAlpha();
1667 if (a<1.) PrintStr(Form(
" fill-opacity=\"%3.2f\" stroke-opacity=\"%3.2f\"",a,a));
1669 SetColor(1., 1., 1.);
1676 void TSVG::SetColor(Int_t color)
1678 if (color < 0) color = 0;
1679 TColor *col = gROOT->GetColor(color);
1681 SetColor(col->GetRed(), col->GetGreen(), col->GetBlue());
1683 SetColor(1., 1., 1.);
1694 void TSVG::SetColor(Float_t r, Float_t g, Float_t b)
1696 if (r <= 0. && g <= 0. && b <= 0. ) {
1697 PrintFast(7,
"\"black\"");
1698 }
else if (r >= 1. && g >= 1. && b >= 1. ) {
1699 PrintFast(7,
"\"white\"");
1702 snprintf(str,12,
"\"#%2.2x%2.2x%2.2x\"",Int_t(255.*r)
1712 void TSVG::SetTextColor( Color_t cindex )
1714 fTextColor = cindex;
1724 void TSVG::Text(Double_t xx, Double_t yy,
const char *chars)
1726 static const char *fontFamily[] = {
1727 "Times" ,
"Times" ,
"Times",
1728 "Helvetica",
"Helvetica",
"Helvetica" ,
"Helvetica",
1729 "Courier" ,
"Courier" ,
"Courier" ,
"Courier",
1730 "Times" ,
"Times" ,
"ZapfDingbats",
"Times"};
1732 static const char *fontWeight[] = {
1733 "normal",
"bold",
"bold",
1734 "normal",
"normal",
"bold" ,
"bold",
1735 "normal",
"normal",
"bold" ,
"bold",
1736 "normal",
"normal",
"normal",
"normal"};
1738 static const char *fontStyle[] = {
1739 "italic",
"normal" ,
"italic",
1740 "normal",
"oblique",
"normal",
"oblique",
1741 "normal",
"oblique",
"normal",
"oblique",
1742 "normal",
"normal" ,
"normal",
"italic"};
1744 Double_t ix = XtoSVG(xx);
1745 Double_t iy = YtoSVG(yy);
1746 Double_t txalh = fTextAlign/10;
1747 if (txalh <1) txalh = 1;
else if (txalh > 3) txalh = 3;
1748 Double_t txalv = fTextAlign%10;
1749 if (txalv <1) txalv = 1;
else if (txalv > 3) txalv = 3;
1751 Double_t wh = (Double_t)gPad->XtoPixel(gPad->GetX2());
1752 Double_t hh = (Double_t)gPad->YtoPixel(gPad->GetY1());
1753 Float_t fontrap = 1.09;
1756 Int_t font = abs(fTextFont)/10;
1757 if (font > 42 || font < 1) font = 1;
1759 ftsize = fTextSize*fXsize*gPad->GetAbsWNDC();
1761 ftsize = fTextSize*fYsize*gPad->GetAbsHNDC();
1763 Int_t ifont = font-1;
1765 Double_t fontsize = CMtoSVG(ftsize/fontrap);
1766 if( fontsize <= 0)
return;
1768 if (txalv == 3) iy = iy+fontsize;
1769 if (txalv == 2) iy = iy+(fontsize/2);
1771 if (fTextAngle != 0.) {
1773 PrintFast(21,
"<g transform=\"rotate(");
1774 WriteReal(-fTextAngle, kFALSE);
1776 WriteReal(ix, kFALSE);
1778 WriteReal(iy, kFALSE);
1779 PrintFast(3,
")\">");
1783 PrintFast(30,
"<text xml:space=\"preserve\" x=\"");
1784 WriteReal(ix, kFALSE);
1785 PrintFast(5,
"\" y=\"");
1786 WriteReal(iy, kFALSE);
1789 PrintFast(21,
" text-anchor=\"middle\"");
1790 }
else if (txalh == 3) {
1791 PrintFast(18,
" text-anchor=\"end\"");
1793 PrintFast(6,
" fill=");
1794 SetColorAlpha(Int_t(fTextColor));
1795 PrintFast(12,
" font-size=\"");
1796 WriteReal(fontsize, kFALSE);
1797 PrintFast(15,
"\" font-family=\"");
1798 PrintStr(fontFamily[ifont]);
1799 if (strcmp(fontWeight[ifont],
"normal")) {
1800 PrintFast(15,
"\" font-weight=\"");
1801 PrintStr(fontWeight[ifont]);
1803 if (strcmp(fontStyle[ifont],
"normal")) {
1804 PrintFast(14,
"\" font-style=\"");
1805 PrintStr(fontStyle[ifont]);
1809 if (font == 12 || font == 15) {
1810 Int_t ichar = chars[0]+848;
1814 if (ic == 755) ichar = 8804;
1815 if (ic == 759) ichar = 9827;
1816 if (ic == 760) ichar = 9830;
1817 if (ic == 761) ichar = 9829;
1818 if (ic == 762) ichar = 9824;
1819 if (ic == 766) ichar = 8594;
1820 if (ic == 776) ichar = 247;
1821 if (ic == 757) ichar = 8734;
1822 if (ic == 758) ichar = 402;
1823 if (ic == 771) ichar = 8805;
1824 if (ic == 774) ichar = 8706;
1825 if (ic == 775) ichar = 8226;
1826 if (ic == 779) ichar = 8776;
1827 if (ic == 805) ichar = 8719;
1828 if (ic == 821) ichar = 8721;
1829 if (ic == 834) ichar = 8747;
1830 if (ic == 769) ichar = 177;
1831 if (ic == 772) ichar = 215;
1832 if (ic == 768) ichar = 176;
1833 if (ic == 791) ichar = 8745;
1834 if (ic == 793) ichar = 8835;
1835 if (ic == 794) ichar = 8839;
1836 if (ic == 795) ichar = 8836;
1837 if (ic == 796) ichar = 8834;
1838 if (ic == 893) ichar = 8722;
1839 if (ic == 803) ichar = 169;
1840 if (ic == 819) ichar = 169;
1841 if (ic == 804) ichar = 8482;
1842 if (ic == 770) ichar = 34;
1843 if (ic == 823) ichar = 10072;
1844 if (ic == 781) ichar = 10072;
1845 if (ic == 824) ichar = 9117;
1846 if (ic == 822) ichar = 9115;
1847 if (ic == 767) ichar = 8595;
1848 if (ic == 763) ichar = 8596;
1849 if (ic == 764) ichar = 8592;
1850 if (ic == 788) ichar = 8855;
1851 if (ic == 784) ichar = 8501;
1852 if (ic == 777) ichar = 8800;
1853 if (ic == 797) ichar = 8838;
1854 if (ic == 800) ichar = 8736;
1855 if (ic == 812) ichar = 8656;
1856 if (ic == 817) ichar = 60;
1857 if (ic == 833) ichar = 62;
1858 if (ic == 778) ichar = 8803;
1859 if (ic == 809) ichar = 8743;
1860 if (ic == 802) ichar = 9415;
1861 if (ic == 780) ichar = 8230;
1862 if (ic == 801) ichar = 8711;
1863 if (ic == 783) ichar = 8629;
1864 if (ic == 782) ichar = 8213;
1865 if (ic == 799) ichar = 8713;
1866 if (ic == 792) ichar = 8746;
1867 if (ic == 828) ichar = 9127;
1868 if (ic == 765) ichar = 8593;
1869 if (ic == 789) ichar = 8853;
1870 if (ic == 813) ichar = 8657;
1871 if (ic == 773) ichar = 8733;
1872 if (ic == 790) ichar = 8709;
1873 if (ic == 810) ichar = 8744;
1874 if (ic == 756) ichar = 8260;
1875 if (ic == 807) ichar = 8231;
1876 if (ic == 808) ichar = 8989;
1877 if (ic == 814) ichar = 8658;
1878 if (ic == 806) ichar = 8730;
1879 if (ic == 827) ichar = 9123;
1880 if (ic == 829) ichar = 9128;
1881 if (ic == 786) ichar = 8476;
1882 if (ic == 785) ichar = 8465;
1883 if (ic == 787) ichar = 8472;
1886 if (ic == 918) ichar = 934;
1887 if (ic == 919) ichar = 915;
1888 if (ic == 920) ichar = 919;
1889 if (ic == 923) ichar = 922;
1890 if (ic == 924) ichar = 923;
1891 if (ic == 925) ichar = 924;
1892 if (ic == 926) ichar = 925;
1893 if (ic == 929) ichar = 920;
1894 if (ic == 930) ichar = 929;
1895 if (ic == 936) ichar = 926;
1896 if (ic == 915) ichar = 935;
1897 if (ic == 937) ichar = 936;
1898 if (ic == 935) ichar = 937;
1899 if (ic == 938) ichar = 918;
1900 if (ic == 951) ichar = 947;
1901 if (ic == 798) ichar = 949;
1902 if (ic == 970) ichar = 950;
1903 if (ic == 952) ichar = 951;
1904 if (ic == 961) ichar = 952;
1905 if (ic == 955) ichar = 954;
1906 if (ic == 956) ichar = 955;
1907 if (ic == 957) ichar = 956;
1908 if (ic == 958) ichar = 957;
1909 if (ic == 968) ichar = 958;
1910 if (ic == 934) ichar = 962;
1911 if (ic == 962) ichar = 961;
1912 if (ic == 966) ichar = 969;
1913 if (ic == 950) ichar = 966;
1914 if (ic == 947) ichar = 967;
1915 if (ic == 969) ichar = 968;
1916 if (ic == 967) ichar = 969;
1917 if (ic == 954) ichar = 966;
1918 if (ic == 922) ichar = 952;
1919 if (ic == 753) ichar = 965;
1920 PrintStr(Form(
"&#%4.4d;",ichar));
1922 Int_t len=strlen(chars);
1923 for (Int_t i=0; i<len;i++) {
1924 if (chars[i]!=
'\n') {
1925 if (chars[i]==
'<') {
1926 PrintFast(4,
"<");
1927 }
else if (chars[i]==
'>') {
1928 PrintFast(4,
">");
1929 }
else if (chars[i]==
'\305') {
1930 PrintFast(7,
"Å");
1931 }
else if (chars[i]==
'\345') {
1932 PrintFast(6,
"å");
1933 }
else if (chars[i]==
'&') {
1934 PrintFast(5,
"&");
1936 PrintFast(1,&chars[i]);
1942 PrintFast(7,
"</text>");
1944 if (fTextAngle != 0.) {
1946 PrintFast(4,
"</g>");
1953 void TSVG::TextNDC(Double_t u, Double_t v,
const char *chars)
1955 Double_t x = gPad->GetX1() + u*(gPad->GetX2() - gPad->GetX1());
1956 Double_t y = gPad->GetY1() + v*(gPad->GetY2() - gPad->GetY1());
1963 Double_t TSVG::UtoSVG(Double_t u)
1965 Double_t cm = fXsize*(gPad->GetAbsXlowNDC() + u*gPad->GetAbsWNDC());
1966 return 0.5 + 72*cm/2.54;
1972 Double_t TSVG::VtoSVG(Double_t v)
1974 Double_t cm = fYsize*(gPad->GetAbsYlowNDC() + v*gPad->GetAbsHNDC());
1975 return 0.5 + 72*cm/2.54;
1981 Double_t TSVG::XtoSVG(Double_t x)
1983 Double_t u = (x - gPad->GetX1())/(gPad->GetX2() - gPad->GetX1());
1990 Double_t TSVG::YtoSVG(Double_t y)
1992 Double_t v = (y - gPad->GetY1())/(gPad->GetY2() - gPad->GetY1());
1993 return fYsizeSVG-VtoSVG(v);
1999 void TSVG::CellArrayBegin(Int_t, Int_t, Double_t, Double_t, Double_t,
2002 Warning(
"TSVG::CellArrayBegin",
"not yet implemented");
2008 void TSVG::CellArrayFill(Int_t, Int_t, Int_t)
2010 Warning(
"TSVG::CellArrayFill",
"not yet implemented");
2016 void TSVG::CellArrayEnd()
2018 Warning(
"TSVG::CellArrayEnd",
"not yet implemented");
2024 void TSVG::DrawPS(Int_t, Float_t *, Float_t *)
2026 Warning(
"TSVG::DrawPS",
"not yet implemented");