// @(#)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 <stdlib.h>

#include "Riostream.h"
#include "TROOT.h"
#include "TLine.h"
#include "TVirtualPad.h"
#include "TClass.h"
#include "TVirtualX.h"
#include "TMath.h"
#include "TPoint.h"

ClassImp(TLine)


//______________________________________________________________________________
//
// A Graphical line
//


//______________________________________________________________________________
TLine::TLine(): TObject(), TAttLine()
{
   // Line default constructor.

   fX1=0; fY1=0; fX2=0; fY2=0;
}


//______________________________________________________________________________
TLine::TLine(Double_t x1, Double_t y1, Double_t x2, Double_t  y2)
      :TObject(), TAttLine()
{
   // Line normal constructor.

   fX1=x1; fY1=y1; fX2=x2; fY2=y2;
}


//______________________________________________________________________________
TLine::~TLine()
{
   // Line default destructor.
}


//______________________________________________________________________________
TLine::TLine(const TLine &line) : TObject(line), TAttLine(line), TAttBBox2D(line)
{
   // Line copy constructor.

   fX1=0; fY1=0; fX2=0; fY2=0;
   ((TLine&)line).Copy(*this);
}


//______________________________________________________________________________
void TLine::Copy(TObject &obj) const
{
   // Copy this line to line.

   TObject::Copy(obj);
   TAttLine::Copy(((TLine&)obj));
   ((TLine&)obj).fX1 = fX1;
   ((TLine&)obj).fY1 = fY1;
   ((TLine&)obj).fX2 = fX2;
   ((TLine&)obj).fY2 = fY2;
}


//______________________________________________________________________________
Int_t TLine::DistancetoPrimitive(Int_t px, Int_t py)
{
   // Compute distance from point px,py to a line.

   if (!TestBit(kLineNDC)) return DistancetoLine(px,py,gPad->XtoPad(fX1),gPad->YtoPad(fY1),gPad->XtoPad(fX2),gPad->YtoPad(fY2));
   Double_t x1 = gPad->GetX1() + fX1*(gPad->GetX2()-gPad->GetX1());
   Double_t y1 = gPad->GetY1() + fY1*(gPad->GetY2()-gPad->GetY1());
   Double_t x2 = gPad->GetX1() + fX2*(gPad->GetX2()-gPad->GetX1());
   Double_t y2 = gPad->GetY1() + fY2*(gPad->GetY2()-gPad->GetY1());
   return DistancetoLine(px,py,x1,y1,x2,y2);
}


//______________________________________________________________________________
TLine *TLine::DrawLine(Double_t x1, Double_t y1, Double_t x2, Double_t  y2)
{
   // Draw this line with new coordinates.

   TLine *newline = new TLine(x1, y1, x2, y2);
   TAttLine::Copy(*newline);
   newline->SetBit(kCanDelete);
   newline->AppendPad();
   return newline;
}


//______________________________________________________________________________
TLine *TLine::DrawLineNDC(Double_t x1, Double_t y1, Double_t x2, Double_t  y2)
{
   // Draw this line with new coordinates in NDC.

   TLine *newline = DrawLine(x1, y1, x2, y2);
   newline->SetBit(kLineNDC);
   return newline;
}


//______________________________________________________________________________
void TLine::ExecuteEvent(Int_t event, Int_t px, Int_t py)
{
   // Execute action corresponding to one event.
   //  This member function is called when a line 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 kMaxDiff = 20;
   static Int_t d1,d2,px1,px2,py1,py2;
   static Int_t pxold, pyold, px1old, py1old, px2old, py2old;
   static Double_t oldX1, oldY1, oldX2, oldY2;
   static Bool_t p1, p2, pL, ndcsav;
   Double_t dpx,dpy,xp1,yp1;
   Int_t dx, dy;

   Bool_t opaque  = gPad->OpaqueMoving();

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

   switch (event) {

   case kArrowKeyPress:
   case kButton1Down:
      oldX1 = fX1;
      oldY1 = fY1;
      oldX2 = fX2;
      oldY2 = fY2;
      ndcsav = TestBit(kLineNDC);
      if (!opaque) {
         gVirtualX->SetLineColor(-1);
         TAttLine::Modify();  //Change line attributes only if necessary
      }

      // No break !!!

   case kMouseMotion:

      if (TestBit(kLineNDC)) {
         px1 = gPad->UtoPixel(fX1);
         py1 = gPad->VtoPixel(fY1);
         px2 = gPad->UtoPixel(fX2);
         py2 = gPad->VtoPixel(fY2);
      } else {
         px1 = gPad->XtoAbsPixel(gPad->XtoPad(fX1));
         py1 = gPad->YtoAbsPixel(gPad->YtoPad(fY1));
         px2 = gPad->XtoAbsPixel(gPad->XtoPad(fX2));
         py2 = gPad->YtoAbsPixel(gPad->YtoPad(fY2));
      }
      p1 = p2 = pL = kFALSE;

      d1  = abs(px1 - px) + abs(py1-py); //simply take sum of pixels differences
      if (d1 < kMaxDiff) { //*-*================>OK take point number 1
         px1old = px1; py1old = py1;
         p1 = kTRUE;
         gPad->SetCursor(kPointer);
         return;
      }
      d2  = abs(px2 - px) + abs(py2-py); //simply take sum of pixels differences
      if (d2 < kMaxDiff) { //*-*================>OK take point number 2
         px2old = px2; py2old = py2;
         p2 = kTRUE;
         gPad->SetCursor(kPointer);
         return;
      }

      pL = kTRUE;
      pxold = px; pyold = py;
      gPad->SetCursor(kMove);

      break;

   case kArrowKeyRelease:
   case kButton1Motion:

      if (p1) {
         if (!opaque) {
            gVirtualX->DrawLine(px1old, py1old, px2, py2);
            gVirtualX->DrawLine(px, py, px2, py2);
         } else {
            if (ndcsav) this->SetNDC(kFALSE);
            this->SetX1(gPad->AbsPixeltoX(px));
            this->SetY1(gPad->AbsPixeltoY(py));
         }
         px1old = px;
         py1old = py;
      }
      if (p2) {
         if (!opaque) {
            gVirtualX->DrawLine(px1, py1, px2old, py2old);
            gVirtualX->DrawLine(px1, py1, px, py);
         } else {
            if (ndcsav) this->SetNDC(kFALSE);
            this->SetX2(gPad->AbsPixeltoX(px));
            this->SetY2(gPad->AbsPixeltoY(py));
         }
         px2old = px;
         py2old = py;
      }
      if (pL) {
         if (!opaque) gVirtualX->DrawLine(px1, py1, px2, py2);
         dx = px-pxold;  dy = py-pyold;
         px1 += dx; py1 += dy; px2 += dx; py2 += dy;
         if (!opaque) gVirtualX->DrawLine(px1, py1, px2, py2);
         pxold = px;
         pyold = py;
         if (opaque) {
            if (ndcsav) this->SetNDC(kFALSE);
            this->SetX1(gPad->AbsPixeltoX(px1));
            this->SetY1(gPad->AbsPixeltoY(py1));
            this->SetX2(gPad->AbsPixeltoX(px2));
            this->SetY2(gPad->AbsPixeltoY(py2));
         }
      }
      if (opaque) {
         if (p1) {
            //check in which corner the BBox is eddited
            if (fX1>fX2) {
               if (fY1>fY2)
                  gPad->ShowGuidelines(this, event, '2', true);
               else
                  gPad->ShowGuidelines(this, event, '3', true);
            } else {
               if (fY1>fY2)
                  gPad->ShowGuidelines(this, event, '1', true);
               else
                  gPad->ShowGuidelines(this, event, '4', true);
            }
         }
         if (p2) {
            //check in which corner the BBox is eddited
            if (fX1>fX2) {
               if (fY1>fY2)
                  gPad->ShowGuidelines(this, event, '4', true);
               else
                  gPad->ShowGuidelines(this, event, '1', true);
            } else {
               if (fY1>fY2)
                  gPad->ShowGuidelines(this, event, '3', true);
               else
                  gPad->ShowGuidelines(this, event, '2', true);
            }
         }
         if (pL) {
            gPad->ShowGuidelines(this, event, 'i', true);
         }
         gPad->Modified(kTRUE);
         gPad->Update();
      }
      break;

   case kButton1Up:

      if (gROOT->IsEscaped()) {
         gROOT->SetEscape(kFALSE);
         if (opaque) {
            this->SetX1(oldX1);
            this->SetY1(oldY1);
            this->SetX2(oldX2);
            this->SetY2(oldY2);
            gPad->Modified(kTRUE);
            gPad->Update();
         }
         break;
      }
      if (opaque) {
         if (ndcsav) {
            this->SetX1((fX1 - gPad->GetX1())/(gPad->GetX2()-gPad->GetX1()));
            this->SetX2((fX2 - gPad->GetX1())/(gPad->GetX2()-gPad->GetX1()));
            this->SetY1((fY1 - gPad->GetY1())/(gPad->GetY2()-gPad->GetY1()));
            this->SetY2((fY2 - gPad->GetY1())/(gPad->GetY2()-gPad->GetY1()));
            this->SetNDC();
         }
         gPad->ShowGuidelines(this, event);
      } else {
         if (TestBit(kLineNDC)) {
            dpx  = gPad->GetX2() - gPad->GetX1();
            dpy  = gPad->GetY2() - gPad->GetY1();
            xp1  = gPad->GetX1();
            yp1  = gPad->GetY1();
            if (p1) {
               fX1 = (gPad->AbsPixeltoX(px)-xp1)/dpx;
               fY1 = (gPad->AbsPixeltoY(py)-yp1)/dpy;
            }
            if (p2) {
               fX2 = (gPad->AbsPixeltoX(px)-xp1)/dpx;
               fY2 = (gPad->AbsPixeltoY(py)-yp1)/dpy;
            }
            if (pL) {
               fX1 = (gPad->AbsPixeltoX(px1)-xp1)/dpx;
               fY1 = (gPad->AbsPixeltoY(py1)-yp1)/dpy;
               fX2 = (gPad->AbsPixeltoX(px2)-xp1)/dpx;
               fY2 = (gPad->AbsPixeltoY(py2)-yp1)/dpy;
            }
         } else {
            if (p1) {
               fX1 = gPad->PadtoX(gPad->AbsPixeltoX(px));
               fY1 = gPad->PadtoY(gPad->AbsPixeltoY(py));
            }
            if (p2) {
               fX2 = gPad->PadtoX(gPad->AbsPixeltoX(px));
               fY2 = gPad->PadtoY(gPad->AbsPixeltoY(py));
            }
            if (pL) {
               fX1 = gPad->PadtoX(gPad->AbsPixeltoX(px1));
               fY1 = gPad->PadtoY(gPad->AbsPixeltoY(py1));
               fX2 = gPad->PadtoX(gPad->AbsPixeltoX(px2));
               fY2 = gPad->PadtoY(gPad->AbsPixeltoY(py2));
            }
         }
         if (TestBit(kVertical)) {
            if (p1) fX2 = fX1;
            if (p2) fX1 = fX2;
         }
         if (TestBit(kHorizontal)) {
            if (p1) fY2 = fY1;
            if (p2) fY1 = fY2;
         }
         gPad->Modified(kTRUE);
         gPad->Update();
         if (!opaque) gVirtualX->SetLineColor(-1);
      }
      break;

   case kButton1Locate:

      ExecuteEvent(kButton1Down, px, py);
      while (1) {
         px = py = 0;
         event = gVirtualX->RequestLocator(1,1,px,py);

         ExecuteEvent(kButton1Motion, px, py);

         if (event != -1) {                     // button is released
            ExecuteEvent(kButton1Up, px, py);
            return;
         }
      }
   }
}


//______________________________________________________________________________
void TLine::ls(Option_t *) const
{
   // List this line with its attributes.

   TROOT::IndentLevel();
   printf("%s  X1=%f Y1=%f X2=%f Y2=%f\n",IsA()->GetName(),fX1,fY1,fX2,fY2);
}


//______________________________________________________________________________
void TLine::Paint(Option_t *)
{
   // Paint this line with its current attributes.

   if (TestBit(kLineNDC)) PaintLineNDC(fX1,fY1,fX2,fY2);
   else                   PaintLine(gPad->XtoPad(fX1),gPad->YtoPad(fY1),gPad->XtoPad(fX2),gPad->YtoPad(fY2));
}


//______________________________________________________________________________
void TLine::PaintLine(Double_t x1, Double_t y1, Double_t x2, Double_t y2)
{
   // Draw this line with new coordinates.

   TAttLine::Modify();  //Change line attributes only if necessary
   gPad->PaintLine(x1,y1,x2,y2);
}


//______________________________________________________________________________
void TLine::PaintLineNDC(Double_t u1, Double_t v1, Double_t u2, Double_t v2)
{
   // Draw this line with new coordinates in NDC.

   TAttLine::Modify();  //Change line attributes only if necessary
   gPad->PaintLineNDC(u1,v1,u2,v2);
}


//______________________________________________________________________________
void TLine::Print(Option_t *) const
{
   // Dump this line with its attributes.

   printf("%s  X1=%f Y1=%f X2=%f Y2=%f",IsA()->GetName(),fX1,fY1,fX2,fY2);
   if (GetLineColor() != 1) printf(" Color=%d",GetLineColor());
   if (GetLineStyle() != 1) printf(" Style=%d",GetLineStyle());
   if (GetLineWidth() != 1) printf(" Width=%d",GetLineWidth());
   printf("\n");
}


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

   if (gROOT->ClassSaved(TLine::Class())) {
      out<<"   ";
   } else {
      out<<"   TLine *";
   }
   out<<"line = new TLine("<<fX1<<","<<fY1<<","<<fX2<<","<<fY2
      <<");"<<std::endl;

   SaveLineAttributes(out,"line",1,1,1);

   out<<"   line->Draw();"<<std::endl;
}


//______________________________________________________________________________
Bool_t TLine::IsHorizontal()
{
   // Check whether this line is to be drawn horizontally.

   return TestBit(kHorizontal);
}


//______________________________________________________________________________
Bool_t TLine::IsVertical()
{
   // Check whether this line is to be drawn vertically.

   return TestBit(kVertical);
}


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

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


//______________________________________________________________________________
void TLine::SetHorizontal(Bool_t set /*= kTRUE*/)
{
   // Force the line to be drawn horizontally.
   // Makes fY2 equal to fY1. The line length is kept.
   // TArrow and TGaxis also get this function by inheritance.

   SetBit(kHorizontal, set);
   if (set) {
      SetVertical(kFALSE);
      Int_t px1 = gPad->XtoAbsPixel(fX1);
      Int_t px2 = gPad->XtoAbsPixel(fX2);
      Int_t py1 = gPad->YtoAbsPixel(fY1);
      Int_t py2 = gPad->YtoAbsPixel(fY2);
      Int_t l   = Int_t(TMath::Sqrt((px2-px1)*(px2-px1)+(py2-py1)*(py2-py1)));
      if (fX2 >= fX1) fX2 = gPad->AbsPixeltoX(px1+l);
      else            fX2 = gPad->AbsPixeltoX(px1-l);
      fY2 = fY1;
   }
}


//______________________________________________________________________________
void TLine::SetVertical(Bool_t set /*= kTRUE*/)
{
   // Force the line to be drawn vertically.
   // Makes fX2 equal to fX1. The line length is kept.
   // TArrow and TGaxis also get this function by inheritance.

   SetBit(kVertical, set);
   if (set) {
      SetHorizontal(kFALSE);
      Int_t px1 = gPad->XtoAbsPixel(fX1);
      Int_t px2 = gPad->XtoAbsPixel(fX2);
      Int_t py1 = gPad->YtoAbsPixel(fY1);
      Int_t py2 = gPad->YtoAbsPixel(fY2);
      Int_t l   = Int_t(TMath::Sqrt((px2-px1)*(px2-px1)+(py2-py1)*(py2-py1)));
      if (fY2 >= fY1) fY2 = gPad->AbsPixeltoY(py1-l);
      else            fY2 = gPad->AbsPixeltoY(py1+l);
      fX2 = fX1;
   }
}


//______________________________________________________________________________
void TLine::Streamer(TBuffer &R__b)
{
   // Stream an object of class TLine.

   if (R__b.IsReading()) {
      UInt_t R__s, R__c;
      Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
      if (R__v > 1) {
         R__b.ReadClassBuffer(TLine::Class(), this, R__v, R__s, R__c);
         return;
      }
      //====process old versions before automatic schema evolution
      TObject::Streamer(R__b);
      TAttLine::Streamer(R__b);
      Float_t x1,y1,x2,y2;
      R__b >> x1; fX1 = x1;
      R__b >> y1; fY1 = y1;
      R__b >> x2; fX2 = x2;
      R__b >> y2; fY2 = y2;
      //====end of old versions

   } else {
      R__b.WriteClassBuffer(TLine::Class(),this);
   }
}

//______________________________________________________________________________
Rectangle_t TLine::GetBBox()
{
   // Return the bounding Box of the Line

   Rectangle_t BBox;
   Int_t px1, py1, px2, py2;
   px1 = gPad->XtoPixel(fX1);
   px2 = gPad->XtoPixel(fX2);
   py1 = gPad->YtoPixel(fY1);
   py2 = gPad->YtoPixel(fY2);

   Int_t tmp;
   if (px1>px2) { tmp = px1; px1 = px2; px2 = tmp;}
   if (py1>py2) { tmp = py1; py1 = py2; py2 = tmp;}

   BBox.fX = px1;
   BBox.fY = py1;
   BBox.fWidth = px2-px1;
   BBox.fHeight = py2-py1;

   return (BBox);
}

//______________________________________________________________________________
TPoint TLine::GetBBoxCenter()
{
   // Return the center of the BoundingBox as TPoint in pixels

   TPoint p;
   p.SetX(gPad->XtoPixel(TMath::Min(fX1,fX2)+0.5*(TMath::Max(fX1, fX2)-TMath::Min(fX1, fX2))));
   p.SetY(gPad->YtoPixel(TMath::Min(fY1,fY2)+0.5*(TMath::Max(fY1, fY2)-TMath::Min(fY1, fY2))));
   return(p);
}

//______________________________________________________________________________
void TLine::SetBBoxCenter(const TPoint &p)
{
   // Set center of the BoundingBox

   Double_t w = TMath::Max(fX1, fX2)-TMath::Min(fX1, fX2);
   Double_t h = TMath::Max(fY1, fY2)-TMath::Min(fY1, fY2);
   if (fX2>fX1) {
      this->SetX1(gPad->PixeltoX(p.GetX())-0.5*w);
      this->SetX2(gPad->PixeltoX(p.GetX())+0.5*w);
   }
   else {
      this->SetX2(gPad->PixeltoX(p.GetX())-0.5*w);
      this->SetX1(gPad->PixeltoX(p.GetX())+0.5*w);
   }
   if (fY2>fY1) {
      this->SetY1(gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0))-0.5*h);
      this->SetY2(gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0))+0.5*h);
   }
   else {
      this->SetY2(gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0))-0.5*h);
      this->SetY1(gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0))+0.5*h);
   }
}

//______________________________________________________________________________
void TLine::SetBBoxCenterX(const Int_t x)
{
   // Set X coordinate of the center of the BoundingBox

   Double_t w = TMath::Max(fX1, fX2)-TMath::Min(fX1, fX2);
   if (fX2>fX1) {
      this->SetX1(gPad->PixeltoX(x)-0.5*w);
      this->SetX2(gPad->PixeltoX(x)+0.5*w);
   }
   else {
      this->SetX2(gPad->PixeltoX(x)-0.5*w);
      this->SetX1(gPad->PixeltoX(x)+0.5*w);
   }
}

//______________________________________________________________________________
void TLine::SetBBoxCenterY(const Int_t y)
{
   // Set Y coordinate of the center of the BoundingBox

   Double_t h = TMath::Max(fY1, fY2)-TMath::Min(fY1, fY2);
   if (fY2>fY1) {
      this->SetY1(gPad->PixeltoY(y-gPad->VtoPixel(0))-0.5*h);
      this->SetY2(gPad->PixeltoY(y-gPad->VtoPixel(0))+0.5*h);
   }
   else {
      this->SetY2(gPad->PixeltoY(y-gPad->VtoPixel(0))-0.5*h);
      this->SetY1(gPad->PixeltoY(y-gPad->VtoPixel(0))+0.5*h);
   }
}

//______________________________________________________________________________
void TLine::SetBBoxX1(const Int_t x)
{
   // Set lefthandside of BoundingBox to a value
   // (resize in x direction on left)

   if (fX2>fX1)
      this->SetX1(gPad->PixeltoX(x));
   else
      this->SetX2(gPad->PixeltoX(x));
}

//______________________________________________________________________________
void TLine::SetBBoxX2(const Int_t x)
{
   // Set righthandside of BoundingBox to a value
   // (resize in x direction on right)

   if (fX2>fX1)
      this->SetX2(gPad->PixeltoX(x));
   else
      this->SetX1(gPad->PixeltoX(x));
}

//_______________________________________________________________________________
void TLine::SetBBoxY1(const Int_t y)
{
   // Set top of BoundingBox to a value (resize in y direction on top)

   if (fY2>fY1)
      this->SetY2(gPad->PixeltoY(y - gPad->VtoPixel(0)));
   else
      this->SetY1(gPad->PixeltoY(y - gPad->VtoPixel(0)));
}

//_______________________________________________________________________________
void TLine::SetBBoxY2(const Int_t y)
{
   // Set bottom of BoundingBox to a value
   // (resize in y direction on bottom)

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