// @(#)root/graf:$Id$
// Author: Rene Brun   12/12/94

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

#include "Riostream.h"
#include "TROOT.h"
#include "TMath.h"
#include "TVirtualPad.h"
#include "TPolyLine.h"
#include "TClass.h"

ClassImp(TPolyLine)


//______________________________________________________________________________
//
//  a PolyLine is defined by an array on N points in a 2-D space.
//
// One can draw the contour of the polyline or/and its fill area.
// Example:
//{
//   Double_t x[5] = {.2,.7,.6,.25,.2};
//   Double_t y[5] = {.5,.1,.9,.7,.5};
//   TPolyLine *pline = new TPolyLine(5,x,y);
//   pline->SetFillColor(38);
//   pline->SetLineColor(2);
//   pline->SetLineWidth(4);
//   pline->Draw("f");
//   pline->Draw();
//}


//______________________________________________________________________________
TPolyLine::TPolyLine(): TObject()
{
   // PolyLine default constructor.

   fN = 0;
   fX = 0;
   fY = 0;
   fLastPoint = -1;
}


//______________________________________________________________________________
TPolyLine::TPolyLine(Int_t n, Option_t *option)
      :TObject(), TAttLine(), TAttFill()
{
   // PolyLine normal constructor without initialisation.
   // Allocates n points.  The option string is ignored.

   fOption = option;
   fLastPoint = -1;
   if (n <= 0) {
      fN = 0;
      fLastPoint = -1;
      fX = fY = 0;
      return;
   }
   fN = n;
   fX = new Double_t[fN];
   fY = new Double_t[fN];
}


//______________________________________________________________________________
TPolyLine::TPolyLine(Int_t n, Float_t *x, Float_t *y, Option_t *option)
      :TObject(), TAttLine(), TAttFill()
{
   // PolyLine normal constructor (single precision).
   // Makes n points with (x, y) coordinates from x and y.
   // The option string is ignored.

   fOption = option;
   fLastPoint = -1;
   if (n <= 0) {
      fN = 0;
      fLastPoint = -1;
      fX = fY = 0;
      return;
   }
   fN = n;
   fX = new Double_t[fN];
   fY = new Double_t[fN];
   if (!x || !y) return;
   for (Int_t i=0; i<fN;i++) { fX[i] = x[i]; fY[i] = y[i];}
   fLastPoint = fN-1;
}


//______________________________________________________________________________
TPolyLine::TPolyLine(Int_t n, Double_t *x, Double_t *y, Option_t *option)
      :TObject(), TAttLine(), TAttFill()
{
   // PolyLine normal constructor (double precision).
   // Makes n points with (x, y) coordinates from x and y.
   // The option string is ignored.

   fOption = option;
   fLastPoint = -1;
   if (n <= 0) {
      fN = 0;
      fLastPoint = -1;
      fX = fY = 0;
      return;
   }
   fN = n;
   fX = new Double_t[fN];
   fY = new Double_t[fN];
   if (!x || !y) return;
   for (Int_t i=0; i<fN;i++) { fX[i] = x[i]; fY[i] = y[i];}
   fLastPoint = fN-1;
}

//______________________________________________________________________________
TPolyLine& TPolyLine::operator=(const TPolyLine& pl)
{
   //assignment operator
   if(this!=&pl) {
      TObject::operator=(pl);
      TAttLine::operator=(pl);
      TAttFill::operator=(pl);
      fN=pl.fN;
      fLastPoint=pl.fLastPoint;
      fX=pl.fX;
      fY=pl.fY;
      fOption=pl.fOption;
   }
   return *this;
}

//______________________________________________________________________________
TPolyLine::~TPolyLine()
{
   // PolyLine default destructor.

   if (fX) delete [] fX;
   if (fY) delete [] fY;
}


//______________________________________________________________________________
TPolyLine::TPolyLine(const TPolyLine &polyline) : TObject(polyline), TAttLine(polyline), TAttFill(polyline)
{
   // PolyLine copy constructor.

   fN = 0;
   fX = 0;
   fY = 0;
   fLastPoint = -1;
   ((TPolyLine&)polyline).Copy(*this);
}


//______________________________________________________________________________
void TPolyLine::Copy(TObject &obj) const
{
   // Copy this polyline to polyline.

   TObject::Copy(obj);
   TAttLine::Copy(((TPolyLine&)obj));
   TAttFill::Copy(((TPolyLine&)obj));
   ((TPolyLine&)obj).fN = fN;
   if (fN > 0) {
      ((TPolyLine&)obj).fX = new Double_t[fN];
      ((TPolyLine&)obj).fY = new Double_t[fN];
      for (Int_t i=0; i<fN;i++)  {((TPolyLine&)obj).fX[i] = fX[i]; ((TPolyLine&)obj).fY[i] = fY[i];}
   } else {
      ((TPolyLine&)obj).fX = 0;
      ((TPolyLine&)obj).fY = 0;
   }
   ((TPolyLine&)obj).fOption = fOption;
   ((TPolyLine&)obj).fLastPoint = fLastPoint;
}


//______________________________________________________________________________
Int_t TPolyLine::DistancetoPrimitive(Int_t px, Int_t py)
{
   // Returns closest distance in pixels from point (px, py) to a polyline.
   //
   // First looks for distances to the points of the polyline.  Stops search
   // and returns if a vertex of the polyline is found to be closer than 10
   // pixels.  Thus the return value may depend on the ordering of points
   // in the polyline.
   //
   // Then looks for distances to the lines of the polyline.  There is no
   // arbitrary cutoff; any distance may be found.
   //
   // Finally checks whether (px, py) is inside a closed and filled polyline.
   // (Must be EXACTLY closed.  "Filled" means fill color and fill style are
   // both non-zero.) If so, returns zero.
   //
   // Returns 9999 if the polyline has no points.

   const Int_t big = 9999;
   const Int_t kMaxDiff = 10;

   // check if point is near one of the points
   Int_t i, pxp, pyp, d;
   Int_t distance = big;
   if (Size() <= 0) return distance;

   for (i=0;i<Size();i++) {
      pxp = gPad->XtoAbsPixel(gPad->XtoPad(fX[i]));
      pyp = gPad->YtoAbsPixel(gPad->YtoPad(fY[i]));
      d   = TMath::Abs(pxp-px) + TMath::Abs(pyp-py);
      if (d < distance) distance = d;
   }
   if (distance < kMaxDiff) return distance;

   // check if point is near one of the connecting lines
   for (i=0;i<Size()-1;i++) {
      d = DistancetoLine(px, py, gPad->XtoPad(fX[i]), gPad->YtoPad(fY[i]), gPad->XtoPad(fX[i+1]), gPad->YtoPad(fY[i+1]));
      if (d < distance) distance = d;
   }

   // in case of a closed and filled polyline, check if we are inside
   if (fFillColor && fFillStyle && fX[0] == fX[fLastPoint] && fY[0] == fY[fLastPoint]) {
      if (TMath::IsInside(gPad->AbsPixeltoX(px),gPad->AbsPixeltoY(py),fLastPoint+1,fX,fY)) distance = 0;
   }
   return distance;
}


//______________________________________________________________________________
void TPolyLine::Draw(Option_t *option)
{
   // Draw this polyline with its current attributes.

   AppendPad(option);
}


//______________________________________________________________________________
void TPolyLine::DrawPolyLine(Int_t n, Double_t *x, Double_t *y, Option_t *option)
{
// Draw this polyline with new coordinates.

   TPolyLine *newpolyline = new TPolyLine(n,x,y);
   TAttLine::Copy(*newpolyline);
   TAttFill::Copy(*newpolyline);
   newpolyline->fOption = fOption;
   newpolyline->SetBit(kCanDelete);
   newpolyline->AppendPad(option);
}


//______________________________________________________________________________
void TPolyLine::ExecuteEvent(Int_t event, Int_t px, Int_t py)
{
   // Execute action corresponding to one event.
   //
   //  This member function is called when a polyline is clicked with the locator
   //
   //  If Left button clicked on one of the line end points, this point
   //     follows the cursor until button is released.
   //
   //  if Middle button clicked, the line is moved parallel to itself
   //     until the button is released.

   if (!gPad) return;

   Int_t i, d;
   Double_t xmin, xmax, ymin, ymax, dx, dy, dxr, dyr;
   const Int_t kMaxDiff = 10;
   static Bool_t middle;
   static Int_t ipoint, pxp, pyp;
   static Int_t px1,px2,py1,py2;
   static Int_t pxold, pyold, px1old, py1old, px2old, py2old;
   static Int_t dpx, dpy;
   static Int_t *x=0, *y=0;
   Bool_t opaque  = gPad->OpaqueMoving();

   if (!gPad->IsEditable()) return;

   Int_t np = Size();

   switch (event) {

   case kButton1Down:
      gVirtualX->SetLineColor(-1);
      TAttLine::Modify();  //Change line attributes only if necessary
      px1 = gPad->XtoAbsPixel(gPad->GetX1());
      py1 = gPad->YtoAbsPixel(gPad->GetY1());
      px2 = gPad->XtoAbsPixel(gPad->GetX2());
      py2 = gPad->YtoAbsPixel(gPad->GetY2());
      ipoint = -1;


      if (x || y) break;
      x = new Int_t[np+1];
      y = new Int_t[np+1];
      for (i=0;i<np;i++) {
         pxp = gPad->XtoAbsPixel(gPad->XtoPad(fX[i]));
         pyp = gPad->YtoAbsPixel(gPad->YtoPad(fY[i]));
         if (!opaque) {
            gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4,  pyp-4);
            gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4,  pyp+4);
            gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4,  pyp+4);
            gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4,  pyp-4);
         }
         x[i] = pxp;
         y[i] = pyp;
         d   = TMath::Abs(pxp-px) + TMath::Abs(pyp-py);
         if (d < kMaxDiff) ipoint =i;
      }
      dpx = 0;
      dpy = 0;
      pxold = px;
      pyold = py;
      if (ipoint < 0) return;
      if (ipoint == 0) {
         px1old = 0;
         py1old = 0;
         px2old = gPad->XtoAbsPixel(fX[1]);
         py2old = gPad->YtoAbsPixel(fY[1]);
      } else if (ipoint == fN-1) {
         px1old = gPad->XtoAbsPixel(gPad->XtoPad(fX[fN-2]));
         py1old = gPad->YtoAbsPixel(gPad->YtoPad(fY[fN-2]));
         px2old = 0;
         py2old = 0;
      } else {
         px1old = gPad->XtoAbsPixel(gPad->XtoPad(fX[ipoint-1]));
         py1old = gPad->YtoAbsPixel(gPad->YtoPad(fY[ipoint-1]));
         px2old = gPad->XtoAbsPixel(gPad->XtoPad(fX[ipoint+1]));
         py2old = gPad->YtoAbsPixel(gPad->YtoPad(fY[ipoint+1]));
      }
      pxold = gPad->XtoAbsPixel(gPad->XtoPad(fX[ipoint]));
      pyold = gPad->YtoAbsPixel(gPad->YtoPad(fY[ipoint]));

      break;


   case kMouseMotion:

      middle = kTRUE;
      for (i=0;i<np;i++) {
         pxp = gPad->XtoAbsPixel(gPad->XtoPad(fX[i]));
         pyp = gPad->YtoAbsPixel(gPad->YtoPad(fY[i]));
         d   = TMath::Abs(pxp-px) + TMath::Abs(pyp-py);
         if (d < kMaxDiff) middle = kFALSE;
      }


   // check if point is close to an axis
      if (middle) gPad->SetCursor(kMove);
      else gPad->SetCursor(kHand);
      break;

   case kButton1Motion:
      if (!opaque) {
         if (middle) {
            for(i=0;i<np-1;i++) {
               gVirtualX->DrawLine(x[i]+dpx, y[i]+dpy, x[i+1]+dpx, y[i+1]+dpy);
               pxp = x[i]+dpx;
               pyp = y[i]+dpy;
               gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4,  pyp-4);
               gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4,  pyp+4);
               gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4,  pyp+4);
               gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4,  pyp-4);
            }
            pxp = x[np-1]+dpx;
            pyp = y[np-1]+dpy;
            gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4,  pyp-4);
            gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4,  pyp+4);
            gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4,  pyp+4);
            gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4,  pyp-4);
            dpx += px - pxold;
            dpy += py - pyold;
            pxold = px;
            pyold = py;
            for(i=0;i<np-1;i++) {
               gVirtualX->DrawLine(x[i]+dpx, y[i]+dpy, x[i+1]+dpx, y[i+1]+dpy);
               pxp = x[i]+dpx;
               pyp = y[i]+dpy;
               gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4,  pyp-4);
               gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4,  pyp+4);
               gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4,  pyp+4);
               gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4,  pyp-4);
            }
            pxp = x[np-1]+dpx;
            pyp = y[np-1]+dpy;
            gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4,  pyp-4);
            gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4,  pyp+4);
            gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4,  pyp+4);
            gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4,  pyp-4);
         } else {
            if (px1old) gVirtualX->DrawLine(px1old, py1old, pxold,  pyold);
            if (px2old) gVirtualX->DrawLine(pxold,  pyold,  px2old, py2old);
            gVirtualX->DrawLine(pxold-4, pyold-4, pxold+4,  pyold-4);
            gVirtualX->DrawLine(pxold+4, pyold-4, pxold+4,  pyold+4);
            gVirtualX->DrawLine(pxold+4, pyold+4, pxold-4,  pyold+4);
            gVirtualX->DrawLine(pxold-4, pyold+4, pxold-4,  pyold-4);
            pxold = px;
            pxold = TMath::Max(pxold, px1);
            pxold = TMath::Min(pxold, px2);
            pyold = py;
            pyold = TMath::Max(pyold, py2);
            pyold = TMath::Min(pyold, py1);
            if (px1old) gVirtualX->DrawLine(px1old, py1old, pxold,  pyold);
            if (px2old) gVirtualX->DrawLine(pxold,  pyold,  px2old, py2old);
            gVirtualX->DrawLine(pxold-4, pyold-4, pxold+4,  pyold-4);
            gVirtualX->DrawLine(pxold+4, pyold-4, pxold+4,  pyold+4);
            gVirtualX->DrawLine(pxold+4, pyold+4, pxold-4,  pyold+4);
            gVirtualX->DrawLine(pxold-4, pyold+4, pxold-4,  pyold-4);
         }
      } else {
         if (middle) {
            for(i=0;i<np-1;i++) {
               pxp = x[i]+dpx;
               pyp = y[i]+dpy;
            }
            pxp = x[np-1]+dpx;
            pyp = y[np-1]+dpy;
            dpx += px - pxold;
            dpy += py - pyold;
            pxold = px;
            pyold = py;
         } else {
            pxold = px;
            pxold = TMath::Max(pxold, px1);
            pxold = TMath::Min(pxold, px2);
            pyold = py;
            pyold = TMath::Max(pyold, py2);
            pyold = TMath::Min(pyold, py1);
         }
         if (x && y) {
            if (middle) {
               for(i=0;i<np;i++) {
                  fX[i] = gPad->PadtoX(gPad->AbsPixeltoX(x[i]+dpx));
                  fY[i] = gPad->PadtoY(gPad->AbsPixeltoY(y[i]+dpy));
               }
            } else {
               fX[ipoint] = gPad->PadtoX(gPad->AbsPixeltoX(pxold));
               fY[ipoint] = gPad->PadtoY(gPad->AbsPixeltoY(pyold));
            }
         }
         gPad->Modified(kTRUE);
      }
      break;

   case kButton1Up:

   // Compute x,y range
      xmin = gPad->GetUxmin();
      xmax = gPad->GetUxmax();
      ymin = gPad->GetUymin();
      ymax = gPad->GetUymax();
      dx   = xmax-xmin;
      dy   = ymax-ymin;
      dxr  = dx/(1 - gPad->GetLeftMargin() - gPad->GetRightMargin());
      dyr  = dy/(1 - gPad->GetBottomMargin() - gPad->GetTopMargin());

   // Range() could change the size of the pad pixmap and therefore should
   // be called before the other paint routines
         gPad->Range(xmin - dxr*gPad->GetLeftMargin(),
                     ymin - dyr*gPad->GetBottomMargin(),
                     xmax + dxr*gPad->GetRightMargin(),
                     ymax + dyr*gPad->GetTopMargin());
         gPad->RangeAxis(xmin, ymin, xmax, ymax);

      if (x && y) {
         if (middle) {
            for(i=0;i<np;i++) {
               fX[i] = gPad->PadtoX(gPad->AbsPixeltoX(x[i]+dpx));
               fY[i] = gPad->PadtoY(gPad->AbsPixeltoY(y[i]+dpy));
            }
         } else {
            fX[ipoint] = gPad->PadtoX(gPad->AbsPixeltoX(pxold));
            fY[ipoint] = gPad->PadtoY(gPad->AbsPixeltoY(pyold));
         }
         delete [] x; x = 0;
         delete [] y; y = 0;
      }
      gPad->Modified(kTRUE);
      gVirtualX->SetLineColor(-1);
   }
}


//______________________________________________________________________________
void TPolyLine::ls(Option_t *) const
{
   // List this polyline with its attributes.
   // The option string is ignored.

   TROOT::IndentLevel();
   printf("TPolyLine  N=%d\n",fN);
}


//______________________________________________________________________________
Int_t TPolyLine::Merge(TCollection *li)
{
   // Merge polylines in the collection in this polyline

   if (!li) return 0;
   TIter next(li);

   //first loop to count the number of entries
   TPolyLine *pl;
   Int_t npoints = 0;
   while ((pl = (TPolyLine*)next())) {
      if (!pl->InheritsFrom(TPolyLine::Class())) {
         Error("Add","Attempt to add object of class: %s to a %s",pl->ClassName(),this->ClassName());
         return -1;
      }
      npoints += pl->Size();
   }

   //extend this polyline to hold npoints
   if (npoints > 1) SetPoint(npoints-1,0,0);

   //merge all polylines
   next.Reset();
   while ((pl = (TPolyLine*)next())) {
      Int_t np = pl->Size();
      Double_t *x = pl->GetX();
      Double_t *y = pl->GetY();
      for (Int_t i=0;i<np;i++) {
         SetPoint(i,x[i],y[i]);
      }
   }

   return npoints;
}


//______________________________________________________________________________
void TPolyLine::Paint(Option_t *option)
{
   // Paint this polyline with its current attributes.

   if (TestBit(kPolyLineNDC)) {
      if (strlen(option) > 0) PaintPolyLineNDC(fLastPoint+1, fX, fY, option);
      else                    PaintPolyLineNDC(fLastPoint+1, fX, fY, fOption.Data());
   } else {
      if (strlen(option) > 0) PaintPolyLine(fLastPoint+1, fX, fY, option);
      else                    PaintPolyLine(fLastPoint+1, fX, fY, fOption.Data());
   }
}


//______________________________________________________________________________
void TPolyLine::PaintPolyLine(Int_t n, Double_t *x, Double_t *y, Option_t *option)
{
   // Draw this polyline with new coordinates.
   //
   //  If option = 'f' or 'F' the fill area is drawn.
   //  The default is to draw the lines only.

   if (n <= 0) return;
   TAttLine::Modify();  //Change line attributes only if necessary
   TAttFill::Modify();  //Change fill area attributes only if necessary
   Double_t *xx = x;
   Double_t *yy = y;
   if (gPad->GetLogx()) {
      xx = new Double_t[n];
      for (Int_t ix=0;ix<n;ix++) xx[ix] = gPad->XtoPad(x[ix]);
   }
   if (gPad->GetLogy()) {
      yy = new Double_t[n];
      for (Int_t iy=0;iy<n;iy++) yy[iy] = gPad->YtoPad(y[iy]);
   }
   if (*option == 'f' || *option == 'F') gPad->PaintFillArea(n,xx,yy,option);
   else                                  gPad->PaintPolyLine(n,xx,yy,option);
   if (x != xx) delete [] xx;
   if (y != yy) delete [] yy;
}


//______________________________________________________________________________
void TPolyLine::PaintPolyLineNDC(Int_t n, Double_t *x, Double_t *y, Option_t *option)
{
   // Draw this polyline with new coordinates in NDC.

   TAttLine::Modify();  //Change line attributes only if necessary
   TAttFill::Modify();  //Change fill area attributes only if necessary
   gPad->PaintPolyLineNDC(n,x,y,option);
}


//______________________________________________________________________________
void TPolyLine::Print(Option_t *) const
{
   // Dump this polyline with its attributes.
   // The option string is ignored.

   printf("PolyLine  N=%d\n",fN);
}


//______________________________________________________________________________
void TPolyLine::SavePrimitive(std::ostream &out, Option_t *option /*= ""*/)
{
   // Save primitive as a C++ statement(s) on output stream out

   char quote = '"';
   out<<"   "<<std::endl;
   if (gROOT->ClassSaved(TPolyLine::Class())) {
      out<<"   ";
   } else {
      out<<"   Double_t *dum = 0;"<<std::endl;
      out<<"   TPolyLine *";
   }
   out<<"pline = new TPolyLine("<<fN<<",dum,dum,"<<quote<<fOption<<quote<<");"<<std::endl;

   SaveFillAttributes(out,"pline",0,1001);
   SaveLineAttributes(out,"pline",1,1,1);

   for (Int_t i=0;i<Size();i++) {
      out<<"   pline->SetPoint("<<i<<","<<fX[i]<<","<<fY[i]<<");"<<std::endl;
   }
   out<<"   pline->Draw("
      <<quote<<option<<quote<<");"<<std::endl;
}


//______________________________________________________________________________
void TPolyLine::SetNDC(Bool_t isNDC)
{
   // Set NDC mode on if isNDC = kTRUE, off otherwise

   ResetBit(kPolyLineNDC);
   if (isNDC) SetBit(kPolyLineNDC);
}


//______________________________________________________________________________
Int_t TPolyLine::SetNextPoint(Double_t x, Double_t y)
{
   // Set point following LastPoint to x, y.
   // Returns index of the point (new last point).

   fLastPoint++;
   SetPoint(fLastPoint, x, y);
   return fLastPoint;
}


//______________________________________________________________________________
void TPolyLine::SetPoint(Int_t n, Double_t x, Double_t y)
{
   // Set point number n to (x, y)
   // If n is greater than the current size, the arrays are automatically
   // extended.

   if (n < 0) return;
   if (!fX || !fY || n >= fN) {
      // re-allocate the object
      Int_t newN = TMath::Max(2*fN,n+1);
      Double_t *savex = new Double_t [newN];
      Double_t *savey = new Double_t [newN];
      if (fX && fN){
         memcpy(savex,fX,fN*sizeof(Double_t));
         memset(&savex[fN],0,(newN-fN)*sizeof(Double_t));
         delete [] fX;
      }
      if (fY && fN){
         memcpy(savey,fY,fN*sizeof(Double_t));
         memset(&savey[fN],0,(newN-fN)*sizeof(Double_t));
         delete [] fY;
      }
      fX = savex;
      fY = savey;
      fN = newN;
   }
   fX[n] = x;
   fY[n] = y;
   fLastPoint = TMath::Max(fLastPoint,n);
}


//______________________________________________________________________________
void TPolyLine::SetPolyLine(Int_t n)
{
   // Resize this polyline to size n.
   // If n <= 0 the current arrays of points are deleted.
   // If n is greater than the current size, the new points are set to (0, 0)

   if (n <= 0) {
      fN = 0;
      fLastPoint = -1;
      delete [] fX;
      delete [] fY;
      fX = fY = 0;
      return;
   }
   if (n < fN) {
      fN = n;
      fLastPoint = n - 1;
   } else {
      SetPoint(n-1,0,0);
   }
}


//______________________________________________________________________________
void TPolyLine::SetPolyLine(Int_t n, Float_t *x, Float_t *y, Option_t *option)
{
   // Set new values for this polyline (single precision).
   //
   // If n <= 0 the current arrays of points are deleted.

   if (n <= 0) {
      fN = 0;
      fLastPoint = -1;
      delete [] fX;
      delete [] fY;
      fX = fY = 0;
      return;
   }
   fN =n;
   if (fX) delete [] fX;
   if (fY) delete [] fY;
   fX = new Double_t[fN];
   fY = new Double_t[fN];
   for (Int_t i=0; i<fN;i++) {
      if (x) fX[i] = (Double_t)x[i];
      if (y) fY[i] = (Double_t)y[i];
   }
   fOption = option;
   fLastPoint = fN-1;
}


//______________________________________________________________________________
void TPolyLine::SetPolyLine(Int_t n, Double_t *x, Double_t *y, Option_t *option)
{
   // Set new values for this polyline (double precision).
   //
   // If n <= 0 the current arrays of points are deleted.

   if (n <= 0) {
      fN = 0;
      fLastPoint = -1;
      delete [] fX;
      delete [] fY;
      fX = fY = 0;
      return;
   }
   fN =n;
   if (fX) delete [] fX;
   if (fY) delete [] fY;
   fX = new Double_t[fN];
   fY = new Double_t[fN];
   for (Int_t i=0; i<fN;i++) {
      if (x) fX[i] = x[i];
      if (y) fY[i] = y[i];
   }
   fOption = option;
   fLastPoint = fN-1;
}


//_______________________________________________________________________
void TPolyLine::Streamer(TBuffer &b)
{
   // Stream a class object.

   if (b.IsReading()) {
      UInt_t R__s, R__c;
      Version_t R__v = b.ReadVersion(&R__s, &R__c);
      if (R__v > 1) {
         b.ReadClassBuffer(TPolyLine::Class(), this, R__v, R__s, R__c);
         return;
      }
      //====process old versions before automatic schema evolution
      TObject::Streamer(b);
      TAttLine::Streamer(b);
      TAttFill::Streamer(b);
      b >> fN;
      fX = new Double_t[fN];
      fY = new Double_t[fN];
      Float_t *x = new Float_t[fN];
      Float_t *y = new Float_t[fN];
      b.ReadFastArray(x,fN);
      b.ReadFastArray(y,fN);
      for (Int_t i=0;i<fN;i++) {
         fX[i] = x[i];
         fY[i] = y[i];
      }
      fOption.Streamer(b);
      b.CheckByteCount(R__s, R__c, TPolyLine::IsA());
      //====end of old versions

   } else {
      b.WriteClassBuffer(TPolyLine::Class(),this);
   }
}
 TPolyLine.cxx:1
 TPolyLine.cxx:2
 TPolyLine.cxx:3
 TPolyLine.cxx:4
 TPolyLine.cxx:5
 TPolyLine.cxx:6
 TPolyLine.cxx:7
 TPolyLine.cxx:8
 TPolyLine.cxx:9
 TPolyLine.cxx:10
 TPolyLine.cxx:11
 TPolyLine.cxx:12
 TPolyLine.cxx:13
 TPolyLine.cxx:14
 TPolyLine.cxx:15
 TPolyLine.cxx:16
 TPolyLine.cxx:17
 TPolyLine.cxx:18
 TPolyLine.cxx:19
 TPolyLine.cxx:20
 TPolyLine.cxx:21
 TPolyLine.cxx:22
 TPolyLine.cxx:23
 TPolyLine.cxx:24
 TPolyLine.cxx:25
 TPolyLine.cxx:26
 TPolyLine.cxx:27
 TPolyLine.cxx:28
 TPolyLine.cxx:29
 TPolyLine.cxx:30
 TPolyLine.cxx:31
 TPolyLine.cxx:32
 TPolyLine.cxx:33
 TPolyLine.cxx:34
 TPolyLine.cxx:35
 TPolyLine.cxx:36
 TPolyLine.cxx:37
 TPolyLine.cxx:38
 TPolyLine.cxx:39
 TPolyLine.cxx:40
 TPolyLine.cxx:41
 TPolyLine.cxx:42
 TPolyLine.cxx:43
 TPolyLine.cxx:44
 TPolyLine.cxx:45
 TPolyLine.cxx:46
 TPolyLine.cxx:47
 TPolyLine.cxx:48
 TPolyLine.cxx:49
 TPolyLine.cxx:50
 TPolyLine.cxx:51
 TPolyLine.cxx:52
 TPolyLine.cxx:53
 TPolyLine.cxx:54
 TPolyLine.cxx:55
 TPolyLine.cxx:56
 TPolyLine.cxx:57
 TPolyLine.cxx:58
 TPolyLine.cxx:59
 TPolyLine.cxx:60
 TPolyLine.cxx:61
 TPolyLine.cxx:62
 TPolyLine.cxx:63
 TPolyLine.cxx:64
 TPolyLine.cxx:65
 TPolyLine.cxx:66
 TPolyLine.cxx:67
 TPolyLine.cxx:68
 TPolyLine.cxx:69
 TPolyLine.cxx:70
 TPolyLine.cxx:71
 TPolyLine.cxx:72
 TPolyLine.cxx:73
 TPolyLine.cxx:74
 TPolyLine.cxx:75
 TPolyLine.cxx:76
 TPolyLine.cxx:77
 TPolyLine.cxx:78
 TPolyLine.cxx:79
 TPolyLine.cxx:80
 TPolyLine.cxx:81
 TPolyLine.cxx:82
 TPolyLine.cxx:83
 TPolyLine.cxx:84
 TPolyLine.cxx:85
 TPolyLine.cxx:86
 TPolyLine.cxx:87
 TPolyLine.cxx:88
 TPolyLine.cxx:89
 TPolyLine.cxx:90
 TPolyLine.cxx:91
 TPolyLine.cxx:92
 TPolyLine.cxx:93
 TPolyLine.cxx:94
 TPolyLine.cxx:95
 TPolyLine.cxx:96
 TPolyLine.cxx:97
 TPolyLine.cxx:98
 TPolyLine.cxx:99
 TPolyLine.cxx:100
 TPolyLine.cxx:101
 TPolyLine.cxx:102
 TPolyLine.cxx:103
 TPolyLine.cxx:104
 TPolyLine.cxx:105
 TPolyLine.cxx:106
 TPolyLine.cxx:107
 TPolyLine.cxx:108
 TPolyLine.cxx:109
 TPolyLine.cxx:110
 TPolyLine.cxx:111
 TPolyLine.cxx:112
 TPolyLine.cxx:113
 TPolyLine.cxx:114
 TPolyLine.cxx:115
 TPolyLine.cxx:116
 TPolyLine.cxx:117
 TPolyLine.cxx:118
 TPolyLine.cxx:119
 TPolyLine.cxx:120
 TPolyLine.cxx:121
 TPolyLine.cxx:122
 TPolyLine.cxx:123
 TPolyLine.cxx:124
 TPolyLine.cxx:125
 TPolyLine.cxx:126
 TPolyLine.cxx:127
 TPolyLine.cxx:128
 TPolyLine.cxx:129
 TPolyLine.cxx:130
 TPolyLine.cxx:131
 TPolyLine.cxx:132
 TPolyLine.cxx:133
 TPolyLine.cxx:134
 TPolyLine.cxx:135
 TPolyLine.cxx:136
 TPolyLine.cxx:137
 TPolyLine.cxx:138
 TPolyLine.cxx:139
 TPolyLine.cxx:140
 TPolyLine.cxx:141
 TPolyLine.cxx:142
 TPolyLine.cxx:143
 TPolyLine.cxx:144
 TPolyLine.cxx:145
 TPolyLine.cxx:146
 TPolyLine.cxx:147
 TPolyLine.cxx:148
 TPolyLine.cxx:149
 TPolyLine.cxx:150
 TPolyLine.cxx:151
 TPolyLine.cxx:152
 TPolyLine.cxx:153
 TPolyLine.cxx:154
 TPolyLine.cxx:155
 TPolyLine.cxx:156
 TPolyLine.cxx:157
 TPolyLine.cxx:158
 TPolyLine.cxx:159
 TPolyLine.cxx:160
 TPolyLine.cxx:161
 TPolyLine.cxx:162
 TPolyLine.cxx:163
 TPolyLine.cxx:164
 TPolyLine.cxx:165
 TPolyLine.cxx:166
 TPolyLine.cxx:167
 TPolyLine.cxx:168
 TPolyLine.cxx:169
 TPolyLine.cxx:170
 TPolyLine.cxx:171
 TPolyLine.cxx:172
 TPolyLine.cxx:173
 TPolyLine.cxx:174
 TPolyLine.cxx:175
 TPolyLine.cxx:176
 TPolyLine.cxx:177
 TPolyLine.cxx:178
 TPolyLine.cxx:179
 TPolyLine.cxx:180
 TPolyLine.cxx:181
 TPolyLine.cxx:182
 TPolyLine.cxx:183
 TPolyLine.cxx:184
 TPolyLine.cxx:185
 TPolyLine.cxx:186
 TPolyLine.cxx:187
 TPolyLine.cxx:188
 TPolyLine.cxx:189
 TPolyLine.cxx:190
 TPolyLine.cxx:191
 TPolyLine.cxx:192
 TPolyLine.cxx:193
 TPolyLine.cxx:194
 TPolyLine.cxx:195
 TPolyLine.cxx:196
 TPolyLine.cxx:197
 TPolyLine.cxx:198
 TPolyLine.cxx:199
 TPolyLine.cxx:200
 TPolyLine.cxx:201
 TPolyLine.cxx:202
 TPolyLine.cxx:203
 TPolyLine.cxx:204
 TPolyLine.cxx:205
 TPolyLine.cxx:206
 TPolyLine.cxx:207
 TPolyLine.cxx:208
 TPolyLine.cxx:209
 TPolyLine.cxx:210
 TPolyLine.cxx:211
 TPolyLine.cxx:212
 TPolyLine.cxx:213
 TPolyLine.cxx:214
 TPolyLine.cxx:215
 TPolyLine.cxx:216
 TPolyLine.cxx:217
 TPolyLine.cxx:218
 TPolyLine.cxx:219
 TPolyLine.cxx:220
 TPolyLine.cxx:221
 TPolyLine.cxx:222
 TPolyLine.cxx:223
 TPolyLine.cxx:224
 TPolyLine.cxx:225
 TPolyLine.cxx:226
 TPolyLine.cxx:227
 TPolyLine.cxx:228
 TPolyLine.cxx:229
 TPolyLine.cxx:230
 TPolyLine.cxx:231
 TPolyLine.cxx:232
 TPolyLine.cxx:233
 TPolyLine.cxx:234
 TPolyLine.cxx:235
 TPolyLine.cxx:236
 TPolyLine.cxx:237
 TPolyLine.cxx:238
 TPolyLine.cxx:239
 TPolyLine.cxx:240
 TPolyLine.cxx:241
 TPolyLine.cxx:242
 TPolyLine.cxx:243
 TPolyLine.cxx:244
 TPolyLine.cxx:245
 TPolyLine.cxx:246
 TPolyLine.cxx:247
 TPolyLine.cxx:248
 TPolyLine.cxx:249
 TPolyLine.cxx:250
 TPolyLine.cxx:251
 TPolyLine.cxx:252
 TPolyLine.cxx:253
 TPolyLine.cxx:254
 TPolyLine.cxx:255
 TPolyLine.cxx:256
 TPolyLine.cxx:257
 TPolyLine.cxx:258
 TPolyLine.cxx:259
 TPolyLine.cxx:260
 TPolyLine.cxx:261
 TPolyLine.cxx:262
 TPolyLine.cxx:263
 TPolyLine.cxx:264
 TPolyLine.cxx:265
 TPolyLine.cxx:266
 TPolyLine.cxx:267
 TPolyLine.cxx:268
 TPolyLine.cxx:269
 TPolyLine.cxx:270
 TPolyLine.cxx:271
 TPolyLine.cxx:272
 TPolyLine.cxx:273
 TPolyLine.cxx:274
 TPolyLine.cxx:275
 TPolyLine.cxx:276
 TPolyLine.cxx:277
 TPolyLine.cxx:278
 TPolyLine.cxx:279
 TPolyLine.cxx:280
 TPolyLine.cxx:281
 TPolyLine.cxx:282
 TPolyLine.cxx:283
 TPolyLine.cxx:284
 TPolyLine.cxx:285
 TPolyLine.cxx:286
 TPolyLine.cxx:287
 TPolyLine.cxx:288
 TPolyLine.cxx:289
 TPolyLine.cxx:290
 TPolyLine.cxx:291
 TPolyLine.cxx:292
 TPolyLine.cxx:293
 TPolyLine.cxx:294
 TPolyLine.cxx:295
 TPolyLine.cxx:296
 TPolyLine.cxx:297
 TPolyLine.cxx:298
 TPolyLine.cxx:299
 TPolyLine.cxx:300
 TPolyLine.cxx:301
 TPolyLine.cxx:302
 TPolyLine.cxx:303
 TPolyLine.cxx:304
 TPolyLine.cxx:305
 TPolyLine.cxx:306
 TPolyLine.cxx:307
 TPolyLine.cxx:308
 TPolyLine.cxx:309
 TPolyLine.cxx:310
 TPolyLine.cxx:311
 TPolyLine.cxx:312
 TPolyLine.cxx:313
 TPolyLine.cxx:314
 TPolyLine.cxx:315
 TPolyLine.cxx:316
 TPolyLine.cxx:317
 TPolyLine.cxx:318
 TPolyLine.cxx:319
 TPolyLine.cxx:320
 TPolyLine.cxx:321
 TPolyLine.cxx:322
 TPolyLine.cxx:323
 TPolyLine.cxx:324
 TPolyLine.cxx:325
 TPolyLine.cxx:326
 TPolyLine.cxx:327
 TPolyLine.cxx:328
 TPolyLine.cxx:329
 TPolyLine.cxx:330
 TPolyLine.cxx:331
 TPolyLine.cxx:332
 TPolyLine.cxx:333
 TPolyLine.cxx:334
 TPolyLine.cxx:335
 TPolyLine.cxx:336
 TPolyLine.cxx:337
 TPolyLine.cxx:338
 TPolyLine.cxx:339
 TPolyLine.cxx:340
 TPolyLine.cxx:341
 TPolyLine.cxx:342
 TPolyLine.cxx:343
 TPolyLine.cxx:344
 TPolyLine.cxx:345
 TPolyLine.cxx:346
 TPolyLine.cxx:347
 TPolyLine.cxx:348
 TPolyLine.cxx:349
 TPolyLine.cxx:350
 TPolyLine.cxx:351
 TPolyLine.cxx:352
 TPolyLine.cxx:353
 TPolyLine.cxx:354
 TPolyLine.cxx:355
 TPolyLine.cxx:356
 TPolyLine.cxx:357
 TPolyLine.cxx:358
 TPolyLine.cxx:359
 TPolyLine.cxx:360
 TPolyLine.cxx:361
 TPolyLine.cxx:362
 TPolyLine.cxx:363
 TPolyLine.cxx:364
 TPolyLine.cxx:365
 TPolyLine.cxx:366
 TPolyLine.cxx:367
 TPolyLine.cxx:368
 TPolyLine.cxx:369
 TPolyLine.cxx:370
 TPolyLine.cxx:371
 TPolyLine.cxx:372
 TPolyLine.cxx:373
 TPolyLine.cxx:374
 TPolyLine.cxx:375
 TPolyLine.cxx:376
 TPolyLine.cxx:377
 TPolyLine.cxx:378
 TPolyLine.cxx:379
 TPolyLine.cxx:380
 TPolyLine.cxx:381
 TPolyLine.cxx:382
 TPolyLine.cxx:383
 TPolyLine.cxx:384
 TPolyLine.cxx:385
 TPolyLine.cxx:386
 TPolyLine.cxx:387
 TPolyLine.cxx:388
 TPolyLine.cxx:389
 TPolyLine.cxx:390
 TPolyLine.cxx:391
 TPolyLine.cxx:392
 TPolyLine.cxx:393
 TPolyLine.cxx:394
 TPolyLine.cxx:395
 TPolyLine.cxx:396
 TPolyLine.cxx:397
 TPolyLine.cxx:398
 TPolyLine.cxx:399
 TPolyLine.cxx:400
 TPolyLine.cxx:401
 TPolyLine.cxx:402
 TPolyLine.cxx:403
 TPolyLine.cxx:404
 TPolyLine.cxx:405
 TPolyLine.cxx:406
 TPolyLine.cxx:407
 TPolyLine.cxx:408
 TPolyLine.cxx:409
 TPolyLine.cxx:410
 TPolyLine.cxx:411
 TPolyLine.cxx:412
 TPolyLine.cxx:413
 TPolyLine.cxx:414
 TPolyLine.cxx:415
 TPolyLine.cxx:416
 TPolyLine.cxx:417
 TPolyLine.cxx:418
 TPolyLine.cxx:419
 TPolyLine.cxx:420
 TPolyLine.cxx:421
 TPolyLine.cxx:422
 TPolyLine.cxx:423
 TPolyLine.cxx:424
 TPolyLine.cxx:425
 TPolyLine.cxx:426
 TPolyLine.cxx:427
 TPolyLine.cxx:428
 TPolyLine.cxx:429
 TPolyLine.cxx:430
 TPolyLine.cxx:431
 TPolyLine.cxx:432
 TPolyLine.cxx:433
 TPolyLine.cxx:434
 TPolyLine.cxx:435
 TPolyLine.cxx:436
 TPolyLine.cxx:437
 TPolyLine.cxx:438
 TPolyLine.cxx:439
 TPolyLine.cxx:440
 TPolyLine.cxx:441
 TPolyLine.cxx:442
 TPolyLine.cxx:443
 TPolyLine.cxx:444
 TPolyLine.cxx:445
 TPolyLine.cxx:446
 TPolyLine.cxx:447
 TPolyLine.cxx:448
 TPolyLine.cxx:449
 TPolyLine.cxx:450
 TPolyLine.cxx:451
 TPolyLine.cxx:452
 TPolyLine.cxx:453
 TPolyLine.cxx:454
 TPolyLine.cxx:455
 TPolyLine.cxx:456
 TPolyLine.cxx:457
 TPolyLine.cxx:458
 TPolyLine.cxx:459
 TPolyLine.cxx:460
 TPolyLine.cxx:461
 TPolyLine.cxx:462
 TPolyLine.cxx:463
 TPolyLine.cxx:464
 TPolyLine.cxx:465
 TPolyLine.cxx:466
 TPolyLine.cxx:467
 TPolyLine.cxx:468
 TPolyLine.cxx:469
 TPolyLine.cxx:470
 TPolyLine.cxx:471
 TPolyLine.cxx:472
 TPolyLine.cxx:473
 TPolyLine.cxx:474
 TPolyLine.cxx:475
 TPolyLine.cxx:476
 TPolyLine.cxx:477
 TPolyLine.cxx:478
 TPolyLine.cxx:479
 TPolyLine.cxx:480
 TPolyLine.cxx:481
 TPolyLine.cxx:482
 TPolyLine.cxx:483
 TPolyLine.cxx:484
 TPolyLine.cxx:485
 TPolyLine.cxx:486
 TPolyLine.cxx:487
 TPolyLine.cxx:488
 TPolyLine.cxx:489
 TPolyLine.cxx:490
 TPolyLine.cxx:491
 TPolyLine.cxx:492
 TPolyLine.cxx:493
 TPolyLine.cxx:494
 TPolyLine.cxx:495
 TPolyLine.cxx:496
 TPolyLine.cxx:497
 TPolyLine.cxx:498
 TPolyLine.cxx:499
 TPolyLine.cxx:500
 TPolyLine.cxx:501
 TPolyLine.cxx:502
 TPolyLine.cxx:503
 TPolyLine.cxx:504
 TPolyLine.cxx:505
 TPolyLine.cxx:506
 TPolyLine.cxx:507
 TPolyLine.cxx:508
 TPolyLine.cxx:509
 TPolyLine.cxx:510
 TPolyLine.cxx:511
 TPolyLine.cxx:512
 TPolyLine.cxx:513
 TPolyLine.cxx:514
 TPolyLine.cxx:515
 TPolyLine.cxx:516
 TPolyLine.cxx:517
 TPolyLine.cxx:518
 TPolyLine.cxx:519
 TPolyLine.cxx:520
 TPolyLine.cxx:521
 TPolyLine.cxx:522
 TPolyLine.cxx:523
 TPolyLine.cxx:524
 TPolyLine.cxx:525
 TPolyLine.cxx:526
 TPolyLine.cxx:527
 TPolyLine.cxx:528
 TPolyLine.cxx:529
 TPolyLine.cxx:530
 TPolyLine.cxx:531
 TPolyLine.cxx:532
 TPolyLine.cxx:533
 TPolyLine.cxx:534
 TPolyLine.cxx:535
 TPolyLine.cxx:536
 TPolyLine.cxx:537
 TPolyLine.cxx:538
 TPolyLine.cxx:539
 TPolyLine.cxx:540
 TPolyLine.cxx:541
 TPolyLine.cxx:542
 TPolyLine.cxx:543
 TPolyLine.cxx:544
 TPolyLine.cxx:545
 TPolyLine.cxx:546
 TPolyLine.cxx:547
 TPolyLine.cxx:548
 TPolyLine.cxx:549
 TPolyLine.cxx:550
 TPolyLine.cxx:551
 TPolyLine.cxx:552
 TPolyLine.cxx:553
 TPolyLine.cxx:554
 TPolyLine.cxx:555
 TPolyLine.cxx:556
 TPolyLine.cxx:557
 TPolyLine.cxx:558
 TPolyLine.cxx:559
 TPolyLine.cxx:560
 TPolyLine.cxx:561
 TPolyLine.cxx:562
 TPolyLine.cxx:563
 TPolyLine.cxx:564
 TPolyLine.cxx:565
 TPolyLine.cxx:566
 TPolyLine.cxx:567
 TPolyLine.cxx:568
 TPolyLine.cxx:569
 TPolyLine.cxx:570
 TPolyLine.cxx:571
 TPolyLine.cxx:572
 TPolyLine.cxx:573
 TPolyLine.cxx:574
 TPolyLine.cxx:575
 TPolyLine.cxx:576
 TPolyLine.cxx:577
 TPolyLine.cxx:578
 TPolyLine.cxx:579
 TPolyLine.cxx:580
 TPolyLine.cxx:581
 TPolyLine.cxx:582
 TPolyLine.cxx:583
 TPolyLine.cxx:584
 TPolyLine.cxx:585
 TPolyLine.cxx:586
 TPolyLine.cxx:587
 TPolyLine.cxx:588
 TPolyLine.cxx:589
 TPolyLine.cxx:590
 TPolyLine.cxx:591
 TPolyLine.cxx:592
 TPolyLine.cxx:593
 TPolyLine.cxx:594
 TPolyLine.cxx:595
 TPolyLine.cxx:596
 TPolyLine.cxx:597
 TPolyLine.cxx:598
 TPolyLine.cxx:599
 TPolyLine.cxx:600
 TPolyLine.cxx:601
 TPolyLine.cxx:602
 TPolyLine.cxx:603
 TPolyLine.cxx:604
 TPolyLine.cxx:605
 TPolyLine.cxx:606
 TPolyLine.cxx:607
 TPolyLine.cxx:608
 TPolyLine.cxx:609
 TPolyLine.cxx:610
 TPolyLine.cxx:611
 TPolyLine.cxx:612
 TPolyLine.cxx:613
 TPolyLine.cxx:614
 TPolyLine.cxx:615
 TPolyLine.cxx:616
 TPolyLine.cxx:617
 TPolyLine.cxx:618
 TPolyLine.cxx:619
 TPolyLine.cxx:620
 TPolyLine.cxx:621
 TPolyLine.cxx:622
 TPolyLine.cxx:623
 TPolyLine.cxx:624
 TPolyLine.cxx:625
 TPolyLine.cxx:626
 TPolyLine.cxx:627
 TPolyLine.cxx:628
 TPolyLine.cxx:629
 TPolyLine.cxx:630
 TPolyLine.cxx:631
 TPolyLine.cxx:632
 TPolyLine.cxx:633
 TPolyLine.cxx:634
 TPolyLine.cxx:635
 TPolyLine.cxx:636
 TPolyLine.cxx:637
 TPolyLine.cxx:638
 TPolyLine.cxx:639
 TPolyLine.cxx:640
 TPolyLine.cxx:641
 TPolyLine.cxx:642
 TPolyLine.cxx:643
 TPolyLine.cxx:644
 TPolyLine.cxx:645
 TPolyLine.cxx:646
 TPolyLine.cxx:647
 TPolyLine.cxx:648
 TPolyLine.cxx:649
 TPolyLine.cxx:650
 TPolyLine.cxx:651
 TPolyLine.cxx:652
 TPolyLine.cxx:653
 TPolyLine.cxx:654
 TPolyLine.cxx:655
 TPolyLine.cxx:656
 TPolyLine.cxx:657
 TPolyLine.cxx:658
 TPolyLine.cxx:659
 TPolyLine.cxx:660
 TPolyLine.cxx:661
 TPolyLine.cxx:662
 TPolyLine.cxx:663
 TPolyLine.cxx:664
 TPolyLine.cxx:665
 TPolyLine.cxx:666
 TPolyLine.cxx:667
 TPolyLine.cxx:668
 TPolyLine.cxx:669
 TPolyLine.cxx:670
 TPolyLine.cxx:671
 TPolyLine.cxx:672
 TPolyLine.cxx:673
 TPolyLine.cxx:674
 TPolyLine.cxx:675
 TPolyLine.cxx:676
 TPolyLine.cxx:677
 TPolyLine.cxx:678
 TPolyLine.cxx:679
 TPolyLine.cxx:680
 TPolyLine.cxx:681
 TPolyLine.cxx:682
 TPolyLine.cxx:683
 TPolyLine.cxx:684
 TPolyLine.cxx:685
 TPolyLine.cxx:686
 TPolyLine.cxx:687
 TPolyLine.cxx:688
 TPolyLine.cxx:689
 TPolyLine.cxx:690
 TPolyLine.cxx:691
 TPolyLine.cxx:692
 TPolyLine.cxx:693
 TPolyLine.cxx:694
 TPolyLine.cxx:695
 TPolyLine.cxx:696
 TPolyLine.cxx:697
 TPolyLine.cxx:698
 TPolyLine.cxx:699
 TPolyLine.cxx:700
 TPolyLine.cxx:701
 TPolyLine.cxx:702
 TPolyLine.cxx:703
 TPolyLine.cxx:704
 TPolyLine.cxx:705
 TPolyLine.cxx:706
 TPolyLine.cxx:707
 TPolyLine.cxx:708
 TPolyLine.cxx:709
 TPolyLine.cxx:710
 TPolyLine.cxx:711
 TPolyLine.cxx:712
 TPolyLine.cxx:713
 TPolyLine.cxx:714
 TPolyLine.cxx:715
 TPolyLine.cxx:716
 TPolyLine.cxx:717
 TPolyLine.cxx:718
 TPolyLine.cxx:719
 TPolyLine.cxx:720
 TPolyLine.cxx:721
 TPolyLine.cxx:722
 TPolyLine.cxx:723
 TPolyLine.cxx:724
 TPolyLine.cxx:725
 TPolyLine.cxx:726
 TPolyLine.cxx:727
 TPolyLine.cxx:728
 TPolyLine.cxx:729
 TPolyLine.cxx:730
 TPolyLine.cxx:731
 TPolyLine.cxx:732
 TPolyLine.cxx:733
 TPolyLine.cxx:734
 TPolyLine.cxx:735
 TPolyLine.cxx:736
 TPolyLine.cxx:737
 TPolyLine.cxx:738
 TPolyLine.cxx:739
 TPolyLine.cxx:740
 TPolyLine.cxx:741
 TPolyLine.cxx:742
 TPolyLine.cxx:743
 TPolyLine.cxx:744
 TPolyLine.cxx:745
 TPolyLine.cxx:746
 TPolyLine.cxx:747
 TPolyLine.cxx:748
 TPolyLine.cxx:749
 TPolyLine.cxx:750
 TPolyLine.cxx:751
 TPolyLine.cxx:752
 TPolyLine.cxx:753
 TPolyLine.cxx:754
 TPolyLine.cxx:755
 TPolyLine.cxx:756
 TPolyLine.cxx:757
 TPolyLine.cxx:758
 TPolyLine.cxx:759
 TPolyLine.cxx:760
 TPolyLine.cxx:761
 TPolyLine.cxx:762
 TPolyLine.cxx:763
 TPolyLine.cxx:764
 TPolyLine.cxx:765
 TPolyLine.cxx:766
 TPolyLine.cxx:767
 TPolyLine.cxx:768
 TPolyLine.cxx:769
 TPolyLine.cxx:770
 TPolyLine.cxx:771
 TPolyLine.cxx:772
 TPolyLine.cxx:773
 TPolyLine.cxx:774
 TPolyLine.cxx:775
 TPolyLine.cxx:776
 TPolyLine.cxx:777
 TPolyLine.cxx:778
 TPolyLine.cxx:779
 TPolyLine.cxx:780
 TPolyLine.cxx:781
 TPolyLine.cxx:782
 TPolyLine.cxx:783
 TPolyLine.cxx:784
 TPolyLine.cxx:785
 TPolyLine.cxx:786
 TPolyLine.cxx:787
 TPolyLine.cxx:788
 TPolyLine.cxx:789
 TPolyLine.cxx:790
 TPolyLine.cxx:791
 TPolyLine.cxx:792
 TPolyLine.cxx:793
 TPolyLine.cxx:794
 TPolyLine.cxx:795
 TPolyLine.cxx:796
 TPolyLine.cxx:797
 TPolyLine.cxx:798