// @(#)root/graf:$Id: TMathText.cxx  $
// Author: Yue Shi Lai  16/10/12

/*************************************************************************
 * 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 "TClass.h"
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H
#include "TTF.h"
#include "TMathText.h"
#include "TMath.h"
#include "TVirtualPad.h"
#include "TVirtualPS.h"
#include "TText.h"

#include "../../../graf2d/mathtext/inc/mathtext.h"
#include "../../../graf2d/mathtext/inc/mathrender.h"

//______________________________________________________________________________
/* Begin_Html
<center><h2>TMathText : to draw TeX Mathematical Formula</h2></center>

TMathText's purpose is to write mathematical equations, exactly as TeX would
do it. The syntax is the same as the TeX's one.
<p>
The following example demonstrate how to use TMathText:
End_Html
Begin_Macro(source)
../../../tutorials/graphics/tmathtext.C
End_Macro
Begin_Html
<p>
The list of all available symbols is given in the following example:
End_Html
Begin_Macro(source)
../../../tutorials/graphics/tmathtext2.C
End_Macro
Begin_Html
<p>
End_Html
*/

const Double_t kPI      = TMath::Pi();

class TMathTextRenderer : public TText, public TAttFill,
                          public mathtext::math_text_renderer_t {
private:
   TMathText *_parent;
   float _font_size;
   float _x0;
   float _y0;
   float _angle_degree;
   float _pad_pixel_transform[6];
   float _pad_scale;
   float _pad_scale_x;
   float _pad_scale_y;
   float _pad_scale_x_relative;
   float _pad_scale_y_relative;
   float _current_font_size[mathtext::math_text_renderer_t::NFAMILY];
   inline size_t root_face_number(
      const unsigned int family, const bool serif = false) const
   {
      static const int precision = 2;

      if (family >= mathtext::math_text_renderer_t::
         FAMILY_REGULAR &&
         family <= mathtext::math_text_renderer_t::
         FAMILY_BOLD_ITALIC) {
         const unsigned int offset = family -
            mathtext::math_text_renderer_t::FAMILY_REGULAR;
         return serif ?
            ((offset == 0 ? 13 : offset) * 10 + precision) :
            ((offset + 4) * 10 + precision);
      } else if (family >= mathtext::math_text_renderer_t::
            FAMILY_STIX_REGULAR) {
         const unsigned int offset = family -
            mathtext::math_text_renderer_t::FAMILY_STIX_REGULAR;
         return (offset + 16) * 10 + precision;
      }

      return precision;
   }
   inline bool is_cyrillic_or_cjk(const wchar_t c) const
   {
      return mathtext::math_text_renderer_t::is_cyrillic(c) ||
         mathtext::math_text_renderer_t::is_cjk(c);
   }
   inline size_t root_cjk_face_number(
      const bool serif = false) const
   {
      return (serif ? 28 : 29) * 10 + 2;
   }
protected:
   inline mathtext::affine_transform_t
   transform_logical_to_pixel(void) const
   {
      return mathtext::affine_transform_t::identity;
   }
   inline mathtext::affine_transform_t
   transform_pixel_to_logical(void) const
   {
      return mathtext::affine_transform_t::identity;
   }
public:
   inline TMathTextRenderer(TMathText *parent)
      : TText(), TAttFill(0, 1001),
        _parent(parent), _font_size(0), _angle_degree(0)
   {
      int i;
      _font_size = 0;
      _x0 = 0;
      _y0 = 0;
      _angle_degree = 0;
      for (i = 0; i<6; i++) _pad_pixel_transform[i] = 0;
      _pad_scale = 0;
      _pad_scale_x = 0;
      _pad_scale_y = 0;
      _pad_scale_x_relative = 0;
      _pad_scale_y_relative = 0;
      for (i = 0; i < mathtext::math_text_renderer_t::NFAMILY; i++) _current_font_size[i] = 0;
   }
   inline float
   font_size(const unsigned int family = FAMILY_PLAIN) const
   {
      return _current_font_size[family];
   }
   inline void
   point(const float /*x*/, const float /*y*/)
   {
   }
   inline void
   set_font_size(const float size, const unsigned int family)
   {
      _current_font_size[family] = size;
   }
   inline void
   set_font_size(const float size)
   {
      _font_size = size;
      std::fill(_current_font_size,
              _current_font_size + NFAMILY, size);
   }
   inline void
   reset_font_size(const unsigned int /*family*/)
   {
   }
   inline void
   set_parameter(const float x, const float y, const float size,
              const float angle_degree)
   {
      _x0 = gPad->XtoAbsPixel(x);
      _y0 = gPad->YtoAbsPixel(y);
      _pad_scale_x =
         gPad->XtoPixel(gPad->GetX2()) -
         gPad->XtoPixel(gPad->GetX1());
      _pad_scale_y =
         gPad->YtoPixel(gPad->GetY1()) -
         gPad->YtoPixel(gPad->GetY2());
      _pad_scale = std::min(_pad_scale_x, _pad_scale_y);

      _angle_degree = angle_degree;

      const float angle_radiant = _angle_degree * (kPI / 180.0);

      // Initialize the affine transform
      _pad_pixel_transform[0] = _pad_scale * cosf(angle_radiant);
      _pad_pixel_transform[1] = -_pad_scale * sinf(angle_radiant);
      _pad_pixel_transform[2] = _x0;
      _pad_pixel_transform[3] = _pad_pixel_transform[1];
      _pad_pixel_transform[4] = -_pad_pixel_transform[0];
      _pad_pixel_transform[5] = _y0;

      set_font_size(size);
      SetTextAngle(_angle_degree);
      SetTextColor(_parent->fTextColor);
   }
   inline void
   transform_pad(double &xt, double &yt,
              const float x, const float y) const
   {
      xt = gPad->AbsPixeltoX(Int_t(
         x * _pad_pixel_transform[0] +
         y * _pad_pixel_transform[1] + _pad_pixel_transform[2]));
      yt = gPad->AbsPixeltoY(Int_t(
         x * _pad_pixel_transform[3] +
         y * _pad_pixel_transform[4] + _pad_pixel_transform[5]));
   }
   inline void
   filled_rectangle(const mathtext::bounding_box_t &bounding_box_0)
   {
      SetFillColor(_parent->fTextColor);
      SetFillStyle(1001);
      TAttFill::Modify();

      double xt[4];
      double yt[4];

      transform_pad(xt[0], yt[0],
                 bounding_box_0.left(),
                 bounding_box_0.bottom());
      transform_pad(xt[1], yt[1],
                 bounding_box_0.right(),
                 bounding_box_0.bottom());
      transform_pad(xt[2], yt[2],
                 bounding_box_0.right(),
                 bounding_box_0.top());
      transform_pad(xt[3], yt[3],
                 bounding_box_0.left(),
                 bounding_box_0.top());
      gPad->PaintFillArea(4, xt, yt);
   }
   inline void
   rectangle(const mathtext::bounding_box_t &/*bounding_box*/)
   {
   }
   inline mathtext::bounding_box_t
   bounding_box(const wchar_t character, float &current_x,
             const unsigned int family)
   {
      const size_t old_font_index = TTF::fgCurFontIdx;
      const bool cyrillic_or_cjk = is_cyrillic_or_cjk(character);

      if (cyrillic_or_cjk) {
         TTF::SetTextFont(root_cjk_face_number());
      } else {
         TTF::SetTextFont(root_face_number(family));
      }
      FT_Load_Glyph(
         TTF::fgFace[TTF::fgCurFontIdx],
         FT_Get_Char_Index(
            TTF::fgFace[TTF::fgCurFontIdx], character),
         FT_LOAD_NO_SCALE);

      const float scale = _current_font_size[family] /
         TTF::fgFace[TTF::fgCurFontIdx]->units_per_EM;
      const FT_Glyph_Metrics metrics =
         TTF::fgFace[TTF::fgCurFontIdx]->glyph->metrics;
      const float lower_left_x = metrics.horiBearingX;
      const float lower_left_y =
         metrics.horiBearingY - metrics.height;
      const float upper_right_x =
         metrics.horiBearingX + metrics.width;
      const float upper_right_y = metrics.horiBearingY;
      const float advance = metrics.horiAdvance;
      const float margin = std::max(0.0F, lower_left_x);
      const float italic_correction =
         upper_right_x <= advance ? 0.0F :
         std::max(0.0F, upper_right_x + margin - advance);
      const mathtext::bounding_box_t ret =
         mathtext::bounding_box_t(
            lower_left_x, lower_left_y,
            upper_right_x, upper_right_y,
            advance, italic_correction) * scale;

      current_x += ret.advance();
      TTF::fgCurFontIdx = old_font_index;

      return ret;
   }
   inline mathtext::bounding_box_t
   bounding_box(const std::wstring string,
             const unsigned int family = FAMILY_PLAIN)
   {
      if (TTF::fgCurFontIdx<0) return mathtext::bounding_box_t(0, 0, 0, 0, 0, 0);
      if (string.empty() || TTF::fgFace[TTF::fgCurFontIdx] == NULL ||
         TTF::fgFace[TTF::fgCurFontIdx]->units_per_EM == 0) {
         return mathtext::bounding_box_t(0, 0, 0, 0, 0, 0);
      }

      std::wstring::const_iterator iterator = string.begin();
      float current_x = 0;
      mathtext::bounding_box_t ret =
         bounding_box(*iterator, current_x, family);

      iterator++;
      for(; iterator != string.end(); iterator++) {
         const mathtext::point_t position =
            mathtext::point_t(current_x, 0);
         const mathtext::bounding_box_t glyph_bounding_box =
            bounding_box(*iterator, current_x, family);
         ret = ret.merge(position + glyph_bounding_box);
      }

      return ret;
   }
   inline void
   text_raw(const float x, const float y,
          const std::wstring string,
          const unsigned int family = FAMILY_PLAIN)
   {
      SetTextFont(root_face_number(family));
      SetTextSize(_current_font_size[family]);
      TAttText::Modify();

      wchar_t buf[2];
      float advance = 0;

      buf[1] = L'\0';
      for(std::wstring::const_iterator iterator = string.begin();
         iterator != string.end(); iterator++) {
         buf[0] = *iterator;
         const bool cyrillic_or_cjk = is_cyrillic_or_cjk(buf[0]);

         if (cyrillic_or_cjk) {
            SetTextFont(root_cjk_face_number());
            TAttText::Modify();
         }

         const mathtext::bounding_box_t b =
            bounding_box(buf, family);
         double xt;
         double yt;

         transform_pad(xt, yt, x + advance, y);
         gPad->PaintText(xt, yt, buf);
         advance += b.advance();
         if (cyrillic_or_cjk) {
            SetTextFont(root_face_number(family));
            TAttText::Modify();
         }
      }
   }
   inline void
   text_with_bounding_box(const float /*x*/, const float /*y*/,
                     const std::wstring /*string*/,
                     const unsigned int /*family = FAMILY_PLAIN*/)
   {
   }
   using mathtext::math_text_renderer_t::bounding_box;
};

ClassImp(TMathText)


//______________________________________________________________________________
TMathText::TMathText(void)
   : TAttFill(0, 1001)
{
   // Default constructor.

   fRenderer = new TMathTextRenderer(this);
}


//______________________________________________________________________________
TMathText::TMathText(Double_t x, Double_t y, const char *text)
   : TText(x, y, text), TAttFill(0, 1001)
{
   // Normal constructor.

   fRenderer = new TMathTextRenderer(this);
}


//______________________________________________________________________________
TMathText::~TMathText(void)
{
   // Destructor.
}


//______________________________________________________________________________
TMathText::TMathText(const TMathText &text)
   : TText(text), TAttFill(text)
{
   // Copy constructor.

   ((TMathText &)text).Copy(*this);
   fRenderer = new TMathTextRenderer(this);
}


//______________________________________________________________________________
TMathText &TMathText::operator=(const TMathText &rhs)
{
   // Assignment operator.

   if (this != &rhs) {
      TText::operator    = (rhs);
      TAttFill::operator = (rhs);
   }
   return *this;
}


//______________________________________________________________________________
void TMathText::Copy(TObject &obj) const
{
   // Copy.

   ((TMathText &)obj).fRenderer = fRenderer;
   TText::Copy(obj);
   TAttFill::Copy((TAttFill &)obj);
}


//______________________________________________________________________________
void TMathText::
Render(const Double_t x, const Double_t y, const Double_t size,
      const Double_t angle, const Char_t *t, const Int_t /*length*/)
{
   // Render the text.

   const mathtext::math_text_t math_text(t);
   TMathTextRenderer *renderer = (TMathTextRenderer *)fRenderer;

   renderer->set_parameter(x, y, size, angle);
   renderer->text(0, 0, math_text);
}


//______________________________________________________________________________
void TMathText::
GetSize(Double_t &x0, Double_t &y0, Double_t &x1, Double_t &y1,
      const Double_t size, const Double_t angle, const Char_t *t,
      const Int_t /*length*/)
{
   // Get the text bounding box.

   const mathtext::math_text_t math_text(t);
   TMathTextRenderer *renderer = (TMathTextRenderer *)fRenderer;

   renderer->set_parameter(0, 0, size, angle);

   const mathtext::bounding_box_t bounding_box =
      renderer->bounding_box(math_text);
   double x[4];
   double y[4];

   renderer->transform_pad(
      x[0], y[0], bounding_box.left(), bounding_box.bottom());
   renderer->transform_pad(
      x[1], y[1], bounding_box.right(), bounding_box.bottom());
   renderer->transform_pad(
      x[2], y[2], bounding_box.right(), bounding_box.top());
   renderer->transform_pad(
      x[3], y[3], bounding_box.left(), bounding_box.top());

   x0 = std::min(std::min(x[0], x[1]), std::min(x[2], x[3]));
   y0 = std::min(std::min(y[0], y[1]), std::min(y[2], y[3]));
   x1 = std::max(std::max(x[0], x[1]), std::max(x[2], x[3]));
   y1 = std::max(std::max(y[0], y[1]), std::max(y[2], y[3]));
}


//______________________________________________________________________________
void TMathText::
GetAlignPoint(Double_t &x0, Double_t &y0,
           const Double_t size, const Double_t angle,
           const Char_t *t, const Int_t /*length*/,
           const Short_t align)
{
   // Alignment.

   const mathtext::math_text_t math_text(t);
   TMathTextRenderer *renderer = (TMathTextRenderer *)fRenderer;

   renderer->set_parameter(0, 0, size, angle);

   const mathtext::bounding_box_t bounding_box =
      renderer->bounding_box(math_text);
   float x = 0;
   float y = 0;

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

   switch(halign) {
      case 0:   x = bounding_box.left();              break;
      case 1:   x = 0;                                break;
      case 2:   x = bounding_box.horizontal_center(); break;
      case 3:   x = bounding_box.right();             break;
   }
   switch(valign) {
      case 0:   y = bounding_box.bottom();            break;
      case 1:   y = 0;                                break;
      case 2:   y = bounding_box.vertical_center();   break;
      case 3:   y = bounding_box.top();               break;
   }
   renderer->transform_pad(x0, y0, x, y);
}


//______________________________________________________________________________
void TMathText::GetBoundingBox(UInt_t &w, UInt_t &h, Bool_t /*angle*/)
{
   // Get the text width and height.

   const TString newText = GetTitle();
   const Int_t length = newText.Length();
   const Char_t *text = newText.Data();
   const Double_t size = GetTextSize();

   Double_t x0;
   Double_t y0;
   Double_t x1;
   Double_t y1;

   GetSize(x0, y0, x1, y1, size, 0, text, length);
   w = (UInt_t)(TMath::Abs(gPad->XtoAbsPixel(x1) - gPad->XtoAbsPixel(x0)));
   h = (UInt_t)(TMath::Abs(gPad->YtoAbsPixel(y0) - gPad->YtoAbsPixel(y1)));
}


//______________________________________________________________________________
Double_t TMathText::GetXsize(void)
{
   // Get X size.

   const TString newText = GetTitle();
   const Int_t length    = newText.Length();
   const Char_t *text    = newText.Data();
   const Double_t size   = GetTextSize();
   const Double_t angle  = GetTextAngle();

   Double_t x0;
   Double_t y0;
   Double_t x1;
   Double_t y1;

   GetSize(x0, y0, x1, y1, size, angle, text, length);

   return TMath::Abs(x1 - x0);
}


//______________________________________________________________________________
Double_t TMathText::GetYsize(void)
{
   // Get Y size.

   const TString newText = GetTitle();
   const Int_t length    = newText.Length();
   const Char_t *text    = newText.Data();
   const Double_t size   = GetTextSize();
   const Double_t angle  = GetTextAngle();

   Double_t x0;
   Double_t y0;
   Double_t x1;
   Double_t y1;

   GetSize(x0, y0, x1, y1, size, angle, text, length);

   return TMath::Abs(y0 - y1);
}


//______________________________________________________________________________
TMathText *TMathText::DrawMathText(Double_t x, Double_t y, const char *text)
{
   // Make a copy of this object with the new parameters
   // and copy object attributes.

   TMathText *newtext = new TMathText(x, y, text);
   TAttText::Copy(*newtext);

   newtext->SetBit(kCanDelete);
   if (TestBit(kTextNDC)) newtext->SetNDC();
   newtext->AppendPad();

   return newtext;
}


//______________________________________________________________________________
void TMathText::Paint(Option_t *)
{
   // Paint text.

   Double_t xsave = fX;
   Double_t ysave = fY;

   if (TestBit(kTextNDC)) {
      fX = gPad->GetX1() + xsave * (gPad->GetX2() - gPad->GetX1());
      fY = gPad->GetY1() + ysave * (gPad->GetY2() - gPad->GetY1());
      PaintMathText(fX, fY, GetTextAngle(), GetTextSize(), GetTitle());
   } else {
      PaintMathText(gPad->XtoPad(fX), gPad->YtoPad(fY),
                 GetTextAngle(), GetTextSize(), GetTitle());
   }
   fX = xsave;
   fY = ysave;
}


//______________________________________________________________________________
void TMathText::PaintMathText(Double_t x, Double_t y, Double_t angle,
                              Double_t size, const Char_t *text1)
{
   // Paint text (used by Paint()).

   Double_t saveSize = size;
   Int_t saveFont    = fTextFont;
   Short_t saveAlign = fTextAlign;

   TAttText::Modify();

   // Do not use Latex if font is low precision.
   if (fTextFont % 10 < 2) {
      if (gVirtualX) {
         gVirtualX->SetTextAngle(angle);
      }
      if (gVirtualPS) {
         gVirtualPS->SetTextAngle(angle);
      }
      gPad->PaintText(x, y, text1);
      return;
   }

   if (fTextFont % 10 > 2) {
      UInt_t w = TMath::Abs(gPad->XtoAbsPixel(gPad->GetX2()) -
                       gPad->XtoAbsPixel(gPad->GetX1()));
      UInt_t h = TMath::Abs(gPad->YtoAbsPixel(gPad->GetY2()) -
                       gPad->YtoAbsPixel(gPad->GetY1()));
      size = size / std::min(w, h);
      SetTextFont(10 * (saveFont / 10) + 2);
   }

   TString newText = text1;

   if (newText.Length() == 0) return;

   // Compatibility with TLatex and Latex
   newText.ReplaceAll("\\omicron","o");
   newText.ReplaceAll("\\Alpha","A");
   newText.ReplaceAll("\\Beta","B");
   newText.ReplaceAll("\\Epsilon","E");
   newText.ReplaceAll("\\Zeta","Z");
   newText.ReplaceAll("\\Eta","H");
   newText.ReplaceAll("\\Iota","I");
   newText.ReplaceAll("\\Kappa","K");
   newText.ReplaceAll("\\Mu","M");
   newText.ReplaceAll("\\Nu","N");
   newText.ReplaceAll("\\Omicron","O");
   newText.ReplaceAll("\\Rho","P");
   newText.ReplaceAll("\\Tau","T");
   newText.ReplaceAll("\\Chi","X");
   newText.ReplaceAll("\\varomega","\\varpi");
   newText.ReplaceAll("\\mbox","\\hbox");
   if (newText.Contains("\\frac")) {
      Int_t len,i1,i2;
      TString str;
      while (newText.Contains("\\frac")) {
         len = newText.Length();
         i1  = newText.Index("\\frac");
         str = newText(i1,len).Data();
         i2  = str.Index("}{");
         newText.Replace(i1+i2,2," \\over ");
         newText.Remove(i1,5);
      }
   }

   const Int_t length = newText.Length();
   const Char_t *text = newText.Data();
   Double_t x0;
   Double_t y0;
   GetAlignPoint(x0, y0, size, angle, text, length, fTextAlign);

   Render(x - x0, y - y0, size, angle, text, length);

   SetTextSize(saveSize);
   SetTextFont(saveFont);
   SetTextAlign(saveAlign);
}


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

   const char quote = '"';

   if (gROOT->ClassSaved(TMathText::Class())) {
      out << "   ";
   } else {
      out << "   TMathText *";
   }

   TString s = GetTitle();

   s.ReplaceAll("\\","\\\\");
   s.ReplaceAll("\"","\\\"");
   out << "mathtex = new TMathText("<< fX << "," << fY << ","
      << quote << s.Data() << quote << ");" << std::endl;
   if (TestBit(kTextNDC)) {
      out << "mathtex->SetNDC();" << std::endl;
   }

   SaveTextAttributes(out, "mathtex", 11, 0, 1, 42, 0.05);
   SaveFillAttributes(out, "mathtex", 0, 1001);

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