// @(#)root/graf:$Id$
// Author: Nicolas 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 "TVirtualPad.h"
#include "TText.h"
#  include <ft2build.h>
#  include FT_FREETYPE_H
#  include FT_GLYPH_H
#include "TTF.h"
#include "TVirtualX.h"
#include "TMath.h"
#include "TPoint.h"
#include "TClass.h"
#include <wchar.h>
#include <cstdlib>

ClassImp(TText)


//______________________________________________________________________________
//
//   TText is the base class for several text objects.
//   See TAttText for a list of text attributes or fonts,
//   and also for a discussion on text speed and font quality.
//
//  By default, the text is drawn in the pad coordinates system.
//  One can draw in NDC coordinates [0,1] if the function SetNDC
//  is called for a TText object.
//


//______________________________________________________________________________
TText::TText(): TNamed(), TAttText(), fWcsTitle(NULL)
{
   // Text default constructor.

   fX = 0.;
   fY = 0.;
}


//______________________________________________________________________________
TText::TText(Double_t x, Double_t y, const char *text) : TNamed("",text), TAttText(), fWcsTitle(NULL)
{
   // Text normal constructor.

   fX = x;
   fY = y;
}


//______________________________________________________________________________
TText::TText(Double_t x, Double_t y, const wchar_t *text) : TAttText()
{
   // Text normal constructor.

   fX = x;
   fY = y;
   fWcsTitle = new std::wstring(text);
   SetName("");
   SetMbTitle(text);
}


//______________________________________________________________________________
TText::~TText()
{
   // Text default destructor.

   if (fWcsTitle != NULL) delete reinterpret_cast<std::wstring *>(fWcsTitle);
}


//______________________________________________________________________________
TText::TText(const TText &text) : TNamed(text), TAttText(text), TAttBBox2D(text)
{
   // Copy constructor.

   fX = 0.;
   fY = 0.;
   ((TText&)text).Copy(*this);
}


//______________________________________________________________________________
void TText::Copy(TObject &obj) const
{
   // Copy this text to text.

   ((TText&)obj).fX = fX;
   ((TText&)obj).fY = fY;
   TNamed::Copy(obj);
   TAttText::Copy(((TText&)obj));
   if (fWcsTitle != NULL) {
      *reinterpret_cast<std::wstring *>(fWcsTitle) =
         *reinterpret_cast<std::wstring *>(((TText&)obj).fWcsTitle);
   } else {
      dynamic_cast<TText &>(obj).fWcsTitle =
         new std::wstring(*reinterpret_cast<std::wstring *>(
         dynamic_cast<TText &>(obj).fWcsTitle));
   }
}


//______________________________________________________________________________
const void *TText::GetWcsTitle(void) const
{
   // Returns the text as UNICODE.

   if (fWcsTitle != NULL) {
      return reinterpret_cast<std::wstring *>(fWcsTitle)->c_str();
   } else {
      return NULL;
   }
}


//______________________________________________________________________________
Int_t TText::DistancetoPrimitive(Int_t px, Int_t py)
{
   // Compute distance from point px,py to a string.
   // The rectangle surrounding this string is evaluated.
   // If the point (px,py) is in the rectangle, the distance is set to zero.

   Int_t ptx, pty;

   TAttText::Modify();  // change text attributes only if necessary

   if (TestBit(kTextNDC)) {
      ptx = gPad->UtoPixel(fX);
      pty = gPad->VtoPixel(fY);
   } else {
      ptx = gPad->XtoAbsPixel(gPad->XtoPad(fX));
      pty = gPad->YtoAbsPixel(gPad->YtoPad(fY));
   }

   // Get the text control box
   Int_t cBoxX[5], cBoxY[5];
   GetControlBox(ptx, pty, -fTextAngle, cBoxX, cBoxY);
   cBoxY[4] = cBoxY[0];
   cBoxX[4] = cBoxX[0];

   // Check if the point (px,py) is inside the text control box
   if (TMath::IsInside(px, py, 5, cBoxX, cBoxY)){
      return 0;
   } else {
      return 9999;
   }
}


//______________________________________________________________________________
TText *TText::DrawText(Double_t x, Double_t y, const char *text)
{
   // Draw this text with new coordinates.

   TText *newtext = new TText(x, y, text);
   TAttText::Copy(*newtext);
   newtext->SetBit(kCanDelete);
   if (TestBit(kTextNDC)) newtext->SetNDC();
   newtext->AppendPad();
   return newtext;
}


//______________________________________________________________________________
TText *TText::DrawText(Double_t x, Double_t y, const wchar_t *text)
{
   // Draw this text with new coordinates.

   TText *newtext = new TText(x, y, text);
   TAttText::Copy(*newtext);
   newtext->SetBit(kCanDelete);
   if (TestBit(kTextNDC)) newtext->SetNDC();
   newtext->AppendPad();
   return newtext;
}


//______________________________________________________________________________
TText *TText::DrawTextNDC(Double_t x, Double_t y, const char *text)
{
   // Draw this text with new coordinates in NDC.

   TText *newtext = DrawText(x, y, text);
   newtext->SetNDC();
   return newtext;
}


//______________________________________________________________________________
TText *TText::DrawTextNDC(Double_t x, Double_t y, const wchar_t *text)
{
   // Draw this text with new coordinates in NDC.

   TText *newtext = DrawText(x, y, text);
   newtext->SetNDC();
   return newtext;
}


//______________________________________________________________________________
void TText::ExecuteEvent(Int_t event, Int_t px, Int_t py)
{
   // Execute action corresponding to one event.
   //
   //  This member function must be implemented to realize the action
   //  corresponding to the mouse click on the object in the window

   static Int_t px1, py1, pxold, pyold, Size, height, width;
   static Bool_t resize,turn;
   Int_t dx, dy;
   const char *text = GetTitle();
   Int_t len = strlen(text);
   Double_t sizetowin = gPad->GetAbsHNDC()*Double_t(gPad->GetWh());
   Double_t fh = (fTextSize*sizetowin);
   Int_t h     = Int_t(fh/2);
   Int_t w     = h*len;
   Short_t halign = fTextAlign/10;
   Short_t valign = fTextAlign - 10*halign;
   Double_t co, si, dtheta, norm;
   static Bool_t right;
   static Double_t theta;
   Int_t ax, ay, bx, by, cx, cy;
   ax = ay = 0;
   Double_t lambda, x2,y2;
   Double_t dpx,dpy,xp1,yp1;
   Int_t cBoxX[4], cBoxY[4], part;
   Double_t div = 0;
   Bool_t opaque  = gPad->OpaqueMoving();

   if (!gPad->IsEditable()) return;
   switch (event) {

   case kArrowKeyPress:
   case kButton1Down:
      // No break !!!

   case kMouseMotion:
      if (TestBit(kTextNDC)) {
         px1 = gPad->UtoPixel(fX);
         py1 = gPad->VtoPixel(fY);
      } else {
         px1 = gPad->XtoAbsPixel(gPad->XtoPad(fX));
         py1 = gPad->YtoAbsPixel(gPad->YtoPad(fY));
      }
      theta  = fTextAngle;
      Size   = 0;
      pxold  = px;
      pyold  = py;
      co     = TMath::Cos(fTextAngle*0.017453293);
      si     = TMath::Sin(fTextAngle*0.017453293);
      resize = kFALSE;
      turn   = kFALSE;
      GetControlBox(px1, py1, -theta, cBoxX, cBoxY);
      div    = ((cBoxX[3]-cBoxX[0])*co-(cBoxY[3]-cBoxY[0])*si);
      if (TMath::Abs(div) > 1e-8) part = (Int_t)(3*((px-cBoxX[0])*co-(py-cBoxY[0])*si)/ div);
      else part = 0;
      switch (part) {
      case 0:
         if (halign == 3) {
            turn  = kTRUE;
            right = kTRUE;
            gPad->SetCursor(kRotate);
         } else {
            resize = kTRUE;
            height = valign;
            width  = halign;
            gPad->SetCursor(kArrowVer);
         }
         break;
      case 1:
         gPad->SetCursor(kMove);
         break;
      case 2:
         if (halign == 3) {
            resize = kTRUE;
            height = valign;
            width  = halign;
            gPad->SetCursor(kArrowVer);
         } else {
            turn  = kTRUE;
            right = kFALSE;
            gPad->SetCursor(kRotate);
         }
      }
      break;

   case kArrowKeyRelease:
   case kButton1Motion:
      if (!opaque) PaintControlBox(px1, py1, -theta);
      if (turn) {
         norm = TMath::Sqrt(Double_t((py-py1)*(py-py1)+(px-px1)*(px-px1)));
         if (norm>0) {
            theta = TMath::ACos((px-px1)/norm);
            dtheta= TMath::ASin((py1-py)/norm);
            if (dtheta<0) theta = -theta;
            theta = theta/TMath::ACos(-1)*180;
            if (theta<0) theta += 360;
            if (right) {theta = theta+180; if (theta>=360) theta -= 360;}
         }
      }
      else if (resize) {

         co = TMath::Cos(fTextAngle*0.017453293);
         si = TMath::Sin(fTextAngle*0.017453293);
         if (width == 1) {
            switch (valign) {
               case 1 : ax = px1; ay = py1; break;
               case 2 : ax = px1+Int_t(si*h/2); ay = py1+Int_t(co*h/2); break;
               case 3 : ax = px1+Int_t(si*h*3/2); ay = py1+Int_t(co*h*3/2); break;
            }
         }
         if (width == 2) {
            switch (valign) {
               case 1 : ax = px1-Int_t(co*w/2); ay = py1+Int_t(si*w/2); break;
               case 2 : ax = px1-Int_t(co*w/2+si*h/2); ay = py1+Int_t(si*w/2+co*h/2); break;
               case 3 : ax = px1-Int_t(co*w/2+si*h*3/2); ay = py1+Int_t(si*w/2+co*h*3/2); break;
            }
         }
         if (width == 3) {
            switch (valign) {
               case 1 : ax = px1-Int_t(co*w); ay = py1+Int_t(si*w); break;
               case 2 : ax = px1-Int_t(co*w+si*h/2); ay = py1+Int_t(si*w+co*h/2); break;
               case 3 : ax = px1-Int_t(co*w+si*h*3/2); ay = py1+Int_t(si*w+co*h*3/2); break;
            }
         }
         if (height == 3) {bx = ax-Int_t(si*h); by = ay-Int_t(co*h);}
         else {bx = ax; by = ay;}
         cx = bx+Int_t(co*w); cy = by-Int_t(si*w);
         lambda = Double_t(((px-bx)*(cx-bx)+(py-by)*(cy-by)))/Double_t(((cx-bx)*(cx-bx)+(cy-by)*(cy-by)));
         x2 = Double_t(px) - lambda*Double_t(cx-bx)-Double_t(bx);
         y2 = Double_t(py) - lambda*Double_t(cy-by)-Double_t(by);
         Size = Int_t(TMath::Sqrt(x2*x2+y2*y2)*2);
         if (Size<4) Size = 4;

         SetTextSize(Size/sizetowin);
         TAttText::Modify();
      }
      else {
         dx = px - pxold;  px1 += dx;
         dy = py - pyold;  py1 += dy;
      }
      if (opaque) {
         this->SetX(gPad->PadtoX(gPad->AbsPixeltoX(px1)));
         this->SetY(gPad->PadtoY(gPad->AbsPixeltoY(py1)));
         if (resize) gPad->ShowGuidelines(this, event, 't', false);
         if ((!resize)&&(!turn)) gPad->ShowGuidelines(this, event, 'i', true);
         gPad->ShowGuidelines(this, event, !resize&!turn);
         this->SetTextAngle(theta);
         gPad->Modified(kTRUE);
         gPad->Update();
      }
      if (!opaque) PaintControlBox(px1, py1, -theta);
      pxold = px;  pyold = py;
      break;

   case kButton1Up:
      if (opaque) {
         gPad->ShowGuidelines(this, event, !resize&!turn);
      } else {
         if (TestBit(kTextNDC)) {
            dpx  = gPad->GetX2() - gPad->GetX1();
            dpy  = gPad->GetY2() - gPad->GetY1();
            xp1  = gPad->GetX1();
            yp1  = gPad->GetY1();
            fX = (gPad->AbsPixeltoX(px1)-xp1)/dpx;
            fY = (gPad->AbsPixeltoY(py1)-yp1)/dpy;
         } else {
            fX = gPad->PadtoX(gPad->AbsPixeltoX(px1));
            fY = gPad->PadtoY(gPad->AbsPixeltoY(py1));
         }
         fTextAngle = theta;
      }
      gPad->Modified(kTRUE);
      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 TText::GetControlBox(Int_t x, Int_t y, Double_t theta,
                          Int_t cBoxX[4], Int_t cBoxY[4])
{
   // Return the text control box. The text position coordinates is (x,y) and
   // the text angle is theta. The control box coordinates are returned in cBoxX
   // and cBoxY.

   Short_t halign = fTextAlign/10;          // horizontal alignment
   Short_t valign = fTextAlign - 10*halign; // vertical alignment
   UInt_t cBoxW, cBoxH;                     // control box width and heigh
   UInt_t Dx = 0, Dy = 0;                   // delta along x and y to align the box

   GetBoundingBox(cBoxW, cBoxH);

   // compute the translations (Dx, Dy) required by the alignments
   switch (halign) {
      case 1 : Dx = 0      ; break;
      case 2 : Dx = cBoxW/2; break;
      case 3 : Dx = cBoxW  ; break;
   }
   switch (valign) {
      case 1 : Dy = 0      ; break;
      case 2 : Dy = cBoxH/2; break;
      case 3 : Dy = cBoxH  ; break;
   }

   // compute the control box coordinates before rotation
   cBoxX[0] = x-Dx;
   cBoxY[0] = y+Dy;
   cBoxX[1] = x-Dx;
   cBoxY[1] = y-cBoxH+Dy;
   cBoxX[2] = x+cBoxW-Dx;
   cBoxY[2] = y-cBoxH+Dy;
   cBoxX[3] = x+cBoxW-Dx;
   cBoxY[3] = y+Dy;

   // rotate the control box if needed
   if (theta) {
      Double_t cosTheta = TMath::Cos(theta*0.017453293);
      Double_t sinTheta = TMath::Sin(theta*0.017453293);
      for (int i=0; i<4 ; i++) {
         Int_t hcBoxX = cBoxX[i];
         Int_t hcBoxY = cBoxY[i];
         cBoxX[i] = (Int_t)((hcBoxX-x)*cosTheta-(hcBoxY-y)*sinTheta+x);
         cBoxY[i] = (Int_t)((hcBoxX-x)*sinTheta+(hcBoxY-y)*cosTheta+y);
      }
   }
}


//______________________________________________________________________________
void TText::GetBoundingBox(UInt_t &w, UInt_t &h, Bool_t angle)
{
   // Return text size in pixels. By default the size returned does not take
   // into account the text angle (angle = kFALSE). If angle is set to kTRUE
   // w and h take the angle into account.

   const char *text = GetTitle();
   if (!text[0]) {
      w = h = 0;
      return;
   }

   if (angle) {
      Int_t cBoxX[4], cBoxY[4];
      Int_t ptx, pty;
      if (TestBit(kTextNDC)) {
         ptx = gPad->UtoPixel(fX);
         pty = gPad->VtoPixel(fY);
      } else {
         ptx = gPad->XtoAbsPixel(gPad->XtoPad(fX));
         pty = gPad->YtoAbsPixel(gPad->YtoPad(fY));
      }
      GetControlBox(ptx, pty, fTextAngle, cBoxX, cBoxY);
      Int_t x1 = cBoxX[0];
      Int_t x2 = cBoxX[0];
      Int_t y1 = cBoxY[0];
      Int_t y2 = cBoxY[0];
      for (Int_t i=1; i<4; i++) {
         if (cBoxX[i] < x1) x1 = cBoxX[i];
         if (cBoxX[i] > x2) x2 = cBoxX[i];
         if (cBoxY[i] < y1) y1 = cBoxY[i];
         if (cBoxY[i] > y2) y2 = cBoxY[i];
      }
      w = x2-x1;
      h = y2-y1;
   } else {
      if ((gVirtualX->HasTTFonts() && TTF::IsInitialized()) || gPad->IsBatch()) {
         TTF::GetTextExtent(w, h, (char*)GetTitle());
      } else {
         const Font_t oldFont = gVirtualX->GetTextFont();
         if (gVirtualX->InheritsFrom("TGCocoa"))
            gVirtualX->SetTextFont(fTextFont);
         gVirtualX->GetTextExtent(w, h, (char*)GetTitle());
         if (gVirtualX->InheritsFrom("TGCocoa"))
            gVirtualX->SetTextFont(oldFont);
      }
   }
}


//______________________________________________________________________________
void TText::GetTextAscentDescent(UInt_t &a, UInt_t &d, const char *text) const
{
   // Return text ascent and descent for string text
   //  in a return total text ascent
   //  in d return text descent

   Double_t     wh = (Double_t)gPad->XtoPixel(gPad->GetX2());
   Double_t     hh = (Double_t)gPad->YtoPixel(gPad->GetY1());
   Double_t tsize;
   if (wh < hh)  tsize = fTextSize*wh;
   else          tsize = fTextSize*hh;

   if (gVirtualX->HasTTFonts() || gPad->IsBatch()) {
      TTF::SetTextFont(fTextFont);
      TTF::SetTextSize(tsize);
      a = TTF::GetBox().yMax;
      d = TMath::Abs(TTF::GetBox().yMin);
   } else {
      const Font_t oldFont = gVirtualX->GetTextFont();
      if (gVirtualX->InheritsFrom("TGCocoa"))
         gVirtualX->SetTextFont(fTextFont);
      gVirtualX->SetTextSize((int)tsize);
      a = gVirtualX->GetFontAscent(text);
      if (!a) {
         UInt_t w;
         gVirtualX->GetTextExtent(w, a, (char*)text);
      }
      d = gVirtualX->GetFontDescent(text);
      if (gVirtualX->InheritsFrom("TGCocoa"))
         gVirtualX->SetTextFont(oldFont);
   }
}


//______________________________________________________________________________
void TText::GetTextAscentDescent(UInt_t &a, UInt_t &d, const wchar_t *text) const
{
   // Return text ascent and descent for string text
   //  in a return total text ascent
   //  in d return text descent

   Double_t     wh = (Double_t)gPad->XtoPixel(gPad->GetX2());
   Double_t     hh = (Double_t)gPad->YtoPixel(gPad->GetY1());
   Double_t tsize;
   if (wh < hh)  tsize = fTextSize*wh;
   else          tsize = fTextSize*hh;

   if (gVirtualX->HasTTFonts() || gPad->IsBatch() || gVirtualX->InheritsFrom("TGCocoa")) {
      TTF::SetTextFont(fTextFont);
      TTF::SetTextSize(tsize);
      a = TTF::GetBox().yMax;
      d = TMath::Abs(TTF::GetBox().yMin);
   } else {
      gVirtualX->SetTextSize((int)tsize);
      a = gVirtualX->GetFontAscent();
      if (!a) {
         UInt_t w;
         gVirtualX->GetTextExtent(w, a, (wchar_t*)text);
      }
      d = gVirtualX->GetFontDescent();
   }
}


//______________________________________________________________________________
void TText::GetTextExtent(UInt_t &w, UInt_t &h, const char *text) const
{
   // Return text extent for string text
   //  in w return total text width
   //  in h return text height

   Double_t     wh = (Double_t)gPad->XtoPixel(gPad->GetX2());
   Double_t     hh = (Double_t)gPad->YtoPixel(gPad->GetY1());
   Double_t tsize;
   if (wh < hh)  tsize = fTextSize*wh;
   else          tsize = fTextSize*hh;

   if (gVirtualX->HasTTFonts() || gPad->IsBatch()) {
      TTF::SetTextFont(fTextFont);
      TTF::SetTextSize(tsize);
      TTF::GetTextExtent(w, h, (char*)text);
   } else {
      const Font_t oldFont = gVirtualX->GetTextFont();
      if (gVirtualX->InheritsFrom("TGCocoa"))
         gVirtualX->SetTextFont(fTextFont);
      gVirtualX->SetTextSize((int)tsize);
      gVirtualX->GetTextExtent(w, h, (char*)text);
      if (gVirtualX->InheritsFrom("TGCocoa"))
         gVirtualX->SetTextFont(oldFont);
   }
}


//______________________________________________________________________________
void TText::GetTextAdvance(UInt_t &a, const char *text, const Bool_t kern) const
{
   // Return text advance for string text
   // if kern is true (default) kerning is taken into account. If it is false
   // the kerning is not taken into account.

   Double_t     wh = (Double_t)gPad->XtoPixel(gPad->GetX2());
   Double_t     hh = (Double_t)gPad->YtoPixel(gPad->GetY1());
   Double_t tsize;
   if (wh < hh)  tsize = fTextSize*wh;
   else          tsize = fTextSize*hh;

   if (gVirtualX->HasTTFonts() || gPad->IsBatch()) {
      Bool_t kernsave = TTF::GetKerning();
      TTF::SetKerning(kern);
      TTF::SetTextFont(fTextFont);
      TTF::SetTextSize(tsize);
      TTF::GetTextAdvance(a, (char*)text);
      TTF::SetKerning(kernsave);
   } else {
      UInt_t h;
      const Font_t oldFont = gVirtualX->GetTextFont();
      //how do I know what to calculate without a font???
      if (gVirtualX->InheritsFrom("TGCocoa"))
         gVirtualX->SetTextFont(fTextFont);
      
      gVirtualX->SetTextSize((int)tsize);
      gVirtualX->GetTextExtent(a, h, (char*)text);
      
      if (gVirtualX->InheritsFrom("TGCocoa"))
         gVirtualX->SetTextFont(oldFont);
   }
}


//______________________________________________________________________________
void TText::GetTextExtent(UInt_t &w, UInt_t &h, const wchar_t *text) const
{
   // Return text extent for string text
   //  in w return total text width
   //  in h return text height

   Double_t     wh = (Double_t)gPad->XtoPixel(gPad->GetX2());
   Double_t     hh = (Double_t)gPad->YtoPixel(gPad->GetY1());
   Double_t tsize;
   if (wh < hh)  tsize = fTextSize*wh;
   else          tsize = fTextSize*hh;

   if (gVirtualX->HasTTFonts() || gPad->IsBatch() || gVirtualX->InheritsFrom("TGCocoa")) {
      TTF::SetTextFont(fTextFont);
      TTF::SetTextSize(tsize);
      TTF::GetTextExtent(w, h, (wchar_t*)text);
   } else {
      gVirtualX->SetTextSize((int)tsize);
      gVirtualX->GetTextExtent(w, h, (wchar_t*)text);
   }
}


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

   TROOT::IndentLevel();
   printf("Text  X=%f Y=%f Text=%s\n",fX,fY,GetTitle());
}


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

   TAttText::Modify();  //Change text attributes only if necessary
   if (TestBit(kTextNDC)) gPad->PaintTextNDC(fX,fY,GetTitle());
   else                   gPad->PaintText(gPad->XtoPad(fX),gPad->YtoPad(fY),GetTitle());
}


//______________________________________________________________________________
void TText::PaintControlBox(Int_t x, Int_t y, Double_t theta)
{
   // Paint the text control box. (x,y) are the coordinates where the control
   // box should be painted and theta is the angle of the box.

   Int_t cBoxX[4], cBoxY[4];
   Short_t halign = fTextAlign/10;               // horizontal alignment
   Short_t valign = fTextAlign - 10*halign;      // vertical alignment

   GetControlBox(x, y, theta, cBoxX, cBoxY);
   // Draw the text control box outline
   gVirtualX->SetLineStyle((Style_t)1);
   gVirtualX->SetLineWidth(1);
   gVirtualX->SetLineColor(1);
   gVirtualX->DrawLine(cBoxX[0], cBoxY[0], cBoxX[1], cBoxY[1]);
   gVirtualX->DrawLine(cBoxX[1], cBoxY[1], cBoxX[2], cBoxY[2]);
   gVirtualX->DrawLine(cBoxX[2], cBoxY[2], cBoxX[3], cBoxY[3]);
   gVirtualX->DrawLine(cBoxX[3], cBoxY[3], cBoxX[0], cBoxY[0]);

   // Draw a symbol at the text starting point
   TPoint p;
   Int_t ix = 0, iy = 0;
   switch (halign) {
      case 1 :
         switch (valign) {
            case 1 : ix = 0 ; iy = 0 ; break;
            case 2 : ix = 0 ; iy = 1 ; break;
            case 3 : ix = 1 ; iy = 1 ; break;
         }
      break;
      case 2 :
         switch (valign) {
            case 1 : ix = 0 ; iy = 3 ; break;
            case 2 : ix = 0 ; iy = 2 ; break;
            case 3 : ix = 1 ; iy = 2 ; break;
         }
      break;
      case 3 :
         switch (valign) {
            case 1 : ix = 3 ; iy = 3 ; break;
            case 2 : ix = 2 ; iy = 3 ; break;
            case 3 : ix = 2 ; iy = 2 ; break;
         }
      break;
   }
   p.fX = (cBoxX[ix]+cBoxX[iy])/2;
   p.fY = (cBoxY[ix]+cBoxY[iy])/2;
   gVirtualX->SetMarkerColor(1);
   gVirtualX->SetMarkerStyle(24);
   gVirtualX->SetMarkerSize(0.7);
   gVirtualX->DrawPolyMarker(1, &p);
}


//______________________________________________________________________________
void TText::PaintText(Double_t x, Double_t y, const char *text)
{
   // Draw this text with new coordinates.

   TAttText::Modify();  //Change text attributes only if necessary
   gPad->PaintText(x,y,text);
}


//______________________________________________________________________________
void TText::PaintText(Double_t x, Double_t y, const wchar_t *text)
{
   // Draw this text with new coordinates.

   TAttText::Modify();  //Change text attributes only if necessary
   gPad->PaintText(x,y,text);
}


//______________________________________________________________________________
void TText::PaintTextNDC(Double_t u, Double_t v, const char *text)
{
   // Draw this text with new coordinates in NDC.

   TAttText::Modify();  //Change text attributes only if necessary
   gPad->PaintTextNDC(u,v,text);
}


//______________________________________________________________________________
void TText::PaintTextNDC(Double_t u, Double_t v, const wchar_t *text)
{
   // Draw this text with new coordinates in NDC.

   TAttText::Modify();  //Change text attributes only if necessary
   gPad->PaintTextNDC(u,v,text);
}


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

   printf("Text  X=%f Y=%f Text=%s Font=%d Size=%f",fX,fY,GetTitle(),GetTextFont(),GetTextSize());
   if (GetTextColor() != 1 ) printf(" Color=%d",GetTextColor());
   if (GetTextAlign() != 10) printf(" Align=%d",GetTextAlign());
   if (GetTextAngle() != 0 ) printf(" Angle=%f",GetTextAngle());
   printf("\n");
}


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

   char quote = '"';
   if (gROOT->ClassSaved(TText::Class())) {
       out<<"   ";
   } else {
       out<<"   TText *";
   }
   TString s = GetTitle();
   s.ReplaceAll("\"","\\\"");
   out<<"text = new TText("<<fX<<","<<fY<<","<<quote<<s.Data()<<quote<<");"<<std::endl;
   if (TestBit(kTextNDC)) out<<"   text->SetNDC();"<<std::endl;

   SaveTextAttributes(out,"text",11,0,1,62,0.05);

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


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

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


//______________________________________________________________________________
void TText::SetMbTitle(const wchar_t *title)
{
   // Change (i.e. set) the title of the TNamed.

   char *mb_title = new char[MB_CUR_MAX * wcslen(title) + 1]();
   char *p = mb_title;
   size_t length = wcslen(title);
   for (size_t i = 0; i < length; i++) {
      const int n = wctomb(p, title[i]);
      if (n >= 0) p += n;
   }
   fTitle = mb_title;
   delete [] mb_title;
   if (gPad && TestBit(kMustCleanup)) gPad->Modified();
}


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

   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(TText::Class(), this, R__v, R__s, R__c);
         return;
      }
      //====process old versions before automatic schema evolution
      TNamed::Streamer(R__b);
      TAttText::Streamer(R__b);
      Float_t x,y;
      R__b >> x; fX = x;
      R__b >> y; fY = y;
      //====end of old versions

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

//______________________________________________________________________________
Rectangle_t TText::GetBBox()
{
   // Return the "bounding Box" of the Box

   UInt_t w, h;
   Int_t Dx, Dy;
   Dx = Dy = 0;
   GetBoundingBox(w, h, false);

   Short_t halign = fTextAlign/10;
   Short_t valign = fTextAlign - 10*halign;

   switch (halign) {
      case 1 : Dx = 0      ; break;
      case 2 : Dx = w/2   ; break;
      case 3 : Dx = w     ; break;
   }
   switch (valign) {
      case 1 : Dy = h     ; break;
      case 2 : Dy = h/2   ; break;
      case 3 : Dy = 0      ; break;
   }

   Rectangle_t BBox;
   BBox.fX = gPad->XtoPixel(fX)-Dx;
   BBox.fY = gPad->YtoPixel(fY)-Dy;
   BBox.fWidth  = w;
   BBox.fHeight = h;
   return (BBox);
}

//______________________________________________________________________________
TPoint TText::GetBBoxCenter()
{
   // Return the point given by Alignment as 'center'

   TPoint p;
   p.SetX(gPad->XtoPixel(fX));
   p.SetY(gPad->YtoPixel(fY));
   return(p);
}

//______________________________________________________________________________
void TText::SetBBoxCenter(const TPoint &p)
{
   // Set the point given by Alignment as 'center'

   this->SetX(gPad->PixeltoX(p.GetX()));
   this->SetY(gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0)));
}

//______________________________________________________________________________
void TText::SetBBoxCenterX(const Int_t x)
{
   // Set X coordinate of the point given by Alignment as 'center'

   this->SetX(gPad->PixeltoX(x));
}

//______________________________________________________________________________
void TText::SetBBoxCenterY(const Int_t y)
{
   // Set Y coordinate of the point given by Alignment as 'center'

   this->SetY(gPad->PixeltoY(y - gPad->VtoPixel(0)));
}

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

   //NOT IMPLEMENTED
}

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

   //NOT IMPLEMENTED
}

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

   //NOT IMPLEMENTED
}

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

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