// @(#)root/gl:$Id$
// Author: Alja Mrak-Tadel 2008

/*************************************************************************
 * Copyright (C) 1995-2007, 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 "RConfigure.h"
#include "TGLFontManager.h"


#include "TVirtualX.h"
#include "TMath.h"
#include "TSystem.h"
#include "TEnv.h"
#include "TObjString.h"
#include "TGLUtil.h"
#include "TGLIncludes.h"

// Direct inclussion of FTGL headers is deprecated in ftgl-2.1.3 while
// ftgl-2.1.2 shipped with ROOT requires manual inclusion.
#ifndef BUILTIN_FTGL
# include <FTGL/ftgl.h>
#else
# include "FTFont.h"
# include "FTGLExtrdFont.h"
# include "FTGLOutlineFont.h"
# include "FTGLPolygonFont.h"
# include "FTGLTextureFont.h"
# include "FTGLPixmapFont.h"
# include "FTGLBitmapFont.h"
#endif


//______________________________________________________________________________
// TGLFont
//
// A wrapper class for FTFont.
// Holds pointer to FTFont object and its description: face size, font file
// and class ID. It  wraps Render and BBox functions.
//

ClassImp(TGLFont);

//______________________________________________________________________________
TGLFont::TGLFont():
   fFont(0), fManager(0), fDepth(0),
   fSize(0), fFile(0), fMode(kUndef),
   fTrashCount(0)
{
   // Constructor.
}

//______________________________________________________________________________
TGLFont::TGLFont(Int_t size, Int_t font, EMode mode, FTFont* f, TGLFontManager* mng):
   fFont(f), fManager(mng), fDepth(0),
   fSize(size), fFile(font), fMode(mode),
   fTrashCount(0)
{
   // Constructor.
}

//______________________________________________________________________________
TGLFont::TGLFont(const TGLFont &o):
   fFont(0), fManager(0), fDepth(0), fTrashCount(0)
{
   // Assignment operator.
   fFont = (FTFont*)o.GetFont();

   fSize  = o.fSize;
   fFile  = o.fFile;
   fMode  = o.fMode;

   fTrashCount = o.fTrashCount;
}

//______________________________________________________________________________
TGLFont::~TGLFont()
{
   //Destructor

   if (fManager) fManager->ReleaseFont(*this);
}

//______________________________________________________________________________
void TGLFont::CopyAttributes(const TGLFont &o)
{
   // Assignment operator.
   SetFont(o.fFont);
   SetManager(o.fManager);

   SetDepth(o.fDepth);

   fSize  = o.fSize;
   fFile  = o.fFile;
   fMode  = o.fMode;

   fTrashCount = o.fTrashCount;
}


/******************************************************************************/

//______________________________________________________________________________
Float_t TGLFont::GetAscent() const
{
   // Get font's ascent.

   return fFont->Ascender();
}

//______________________________________________________________________________
Float_t TGLFont::GetDescent() const
{
   // Get font's descent. The returned value is positive.

   return -fFont->Descender();
}

//______________________________________________________________________________
Float_t TGLFont::GetLineHeight() const
{
   // Get font's line-height.

   return fFont->LineHeight();
}

//______________________________________________________________________________
void TGLFont::MeasureBaseLineParams(Float_t& ascent, Float_t& descent, Float_t& line_height,
                                    const char* txt) const
{
   // Measure font's base-line parameters from the passed text.
   // Note that the measured parameters are not the same as the ones
   // returned by get-functions - those were set by the font designer.

   Float_t dum, lly, ury;
   const_cast<FTFont*>(fFont)->BBox(txt, dum, lly, dum, dum, ury, dum);
   ascent      =  ury;
   descent     = -lly;
   line_height =  ury - lly;
}

//______________________________________________________________________________
void TGLFont::BBox(const char* txt,
                   Float_t& llx, Float_t& lly, Float_t& llz,
                   Float_t& urx, Float_t& ury, Float_t& urz) const
{
   // Get bounding box.

   // FTGL is not const correct.
   const_cast<FTFont*>(fFont)->BBox(txt, llx, lly, llz, urx, ury, urz);
}

//______________________________________________________________________________
void TGLFont::BBox(const wchar_t* txt,
                   Float_t& llx, Float_t& lly, Float_t& llz,
                   Float_t& urx, Float_t& ury, Float_t& urz) const
{
   // Get bounding box.

   // FTGL is not const correct.
   const_cast<FTFont*>(fFont)->BBox(txt, llx, lly, llz, urx, ury, urz);
}

//______________________________________________________________________________
template<class Char>
void TGLFont::RenderHelper(const Char *txt, Double_t x, Double_t y, Double_t angle, Double_t /*mgn*/) const
{
   //mgn is simply ignored, because ROOT's TVirtualX TGX11 are complete mess with
   //painting attributes.
   glPushMatrix();
   //glLoadIdentity();

   // FTGL is not const correct.
   Float_t llx = 0.f, lly = 0.f, llz = 0.f, urx = 0.f, ury = 0.f, urz = 0.f;
   BBox(txt, llx, lly, llz, urx, ury, urz);

   /*
    V\H   | left | center | right
   _______________________________
   bottom |  7   |   8    |   9
   _______________________________
   center |  4   |   5    |   6
   _______________________________
    top   |  1   |   2    |   3
   */
   const Double_t dx = urx - llx, dy = ury - lly;
   Double_t xc = 0., yc = 0.;
   const UInt_t align = gVirtualX->GetTextAlign();

   //Here's the nice X11 bullshido: you call gVirtualX->SetTextAlign(11),
   //later gVirtualX->GetTextAling() will give you 7. Brilliant!
   //But with Cocoa you'll have 11. As it should be, of course.

   if (gVirtualX->InheritsFrom("TGCocoa")) {
      const UInt_t hAlign = UInt_t(align / 10);
      switch (hAlign) {
      case 1:
         xc = 0.5 * dx;
         break;
      case 2:
         break;
      case 3:
         xc = -0.5 * dy;
         break;
      }

      const UInt_t vAlign = UInt_t(align % 10);
      switch (vAlign) {
      case 1:
         yc = 0.5 * dy;
         break;
      case 2:
         break;
      case 3:
         yc = -0.5 * dy;
         break;
      }
   } else {
      switch (align) {
      case 7:
         xc += 0.5 * dx;
         yc += 0.5 * dy;
         break;
      case 8:
         yc += 0.5 * dy;
         break;
      case 9:
         xc -= 0.5 * dx;
         yc += 0.5 * dy;
         break;
      case 4:
         xc += 0.5 * dx;
         break;
      case 5:
         break;
      case 6:
         xc = -0.5 * dx;
         break;
      case 1:
         xc += 0.5 * dx;
         yc -= 0.5 * dy;
         break;
      case 2:
         yc -= 0.5 * dy;
         break;
      case 3:
         xc -= 0.5 * dx;
         yc -= 0.5 * dy;
         break;
      }
   }

   glTranslated(x, y, 0.);
   glRotated(angle, 0., 0., 1.);
   glTranslated(xc, yc, 0.);
   glTranslated(-0.5 * dx, -0.5 * dy, 0.);
   //glScaled(mgn, mgn, 1.);

   const_cast<FTFont*>(fFont)->Render(txt);

   glPopMatrix();
}

//______________________________________________________________________________
void TGLFont::Render(const wchar_t* txt, Double_t x, Double_t y, Double_t angle, Double_t mgn) const
{
   RenderHelper(txt, x, y, angle, mgn);
}

//______________________________________________________________________________
void TGLFont::Render(const char* txt, Double_t x, Double_t y, Double_t angle, Double_t mgn) const
{
   RenderHelper(txt, x, y, angle, mgn);
}

//______________________________________________________________________________
void TGLFont::Render(const TString &txt) const
{
   // Render text.

   Bool_t scaleDepth = (fMode == kExtrude && fDepth != 1.0f);

   if (scaleDepth) {
      glPushMatrix();
      // !!! 0.2*fSize is hard-coded in TGLFontManager::GetFont(), too.
      glTranslatef(0.0f, 0.0f, 0.5f*fDepth * 0.2f*fSize);
      glScalef(1.0f, 1.0f, fDepth);
   }

   // FTGL is not const correct.
   const_cast<FTFont*>(fFont)->Render(txt);

   if (scaleDepth) {
      glPopMatrix();
   }
}

//______________________________________________________________________________
void  TGLFont:: Render(const TString &txt, Float_t x, Float_t y, Float_t z,
             ETextAlignH_e alignH, ETextAlignV_e alignV) const
{
   // Render text with given alignmentrepl and at given position.

   glPushMatrix();

   glTranslatef(x, y, z);

   x=0, y=0;
   Float_t llx, lly, llz, urx, ury, urz;
   BBox(txt, llx, lly, llz, urx, ury, urz);

   switch (alignH)
   {
      case TGLFont::kRight:
         x = -urx;
         break;

      case  TGLFont::kCenterH:
         x = -urx*0.5;
         break;
      default:
         break;
   };

   switch (alignV)
   {
      case TGLFont::kBottom:
         y = -ury;
         break;
      case  TGLFont::kCenterV:
         y = -ury*0.5;
         break;
      default:
         break;
   };

   if (fMode == TGLFont::kPixmap || fMode ==  TGLFont::kBitmap)
   {
      glRasterPos2i(0, 0);
      glBitmap(0, 0, 0, 0, x, y, 0);
   }
   else
   {
      glTranslatef(x, y, 0);
   }
   Render(txt);
   glPopMatrix();
}

//______________________________________________________________________________
void TGLFont::PreRender(Bool_t autoLight, Bool_t lightOn) const
{
   // Set-up GL state before FTFont rendering.

   switch (fMode)
   {
      case kBitmap:
      case kPixmap:
         glPushAttrib(GL_CURRENT_BIT | GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT);
         glEnable(GL_ALPHA_TEST);
         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
         glAlphaFunc(GL_GEQUAL, 0.0625);
         break;
      case kTexture:
         glPushAttrib(GL_POLYGON_BIT | GL_ENABLE_BIT);
         glEnable(GL_TEXTURE_2D);
         glDisable(GL_CULL_FACE);
         glEnable(GL_ALPHA_TEST);
         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
         glAlphaFunc(GL_GEQUAL, 0.0625);
         break;
      case kOutline:
      case kPolygon:
      case kExtrude:
         glPushAttrib(GL_POLYGON_BIT | GL_ENABLE_BIT);
         glEnable(GL_NORMALIZE);
         glDisable(GL_CULL_FACE);
         break;
      default:
         Warning("TGLFont::PreRender", "Font mode undefined.");
         glPushAttrib(GL_LIGHTING_BIT);
         break;
   }

   if ((autoLight && fMode > TGLFont::kOutline) || (!autoLight && lightOn))
      glEnable(GL_LIGHTING);
   else
      glDisable(GL_LIGHTING);
}

//______________________________________________________________________________
void TGLFont::PostRender() const
{
   // Reset GL state after FTFont rendering.

   glPopAttrib();
}


//______________________________________________________________________________
//
// A FreeType GL font manager.
//
// Each GL rendering context has an instance of FTGLManager.
// This enables FTGL fonts to be shared same way as textures and display lists.

ClassImp(TGLFontManager);

TObjArray   TGLFontManager::fgFontFileArray;
Int_t TGLFontManager::fgExtendedFontStart;
TGLFontManager::FontSizeVec_t TGLFontManager::fgFontSizeArray;
Bool_t  TGLFontManager::fgStaticInitDone = kFALSE;

//______________________________________________________________________________
TGLFontManager::~TGLFontManager()
{
   // Destructor.

   FontMap_i it = fFontMap.begin();
   while (it != fFontMap.end()) {
      delete it->first.GetFont();
      it++;
   }
   fFontMap.clear();
}

//______________________________________________________________________________
void TGLFontManager::RegisterFont(Int_t sizeIn, Int_t fileID, TGLFont::EMode mode, TGLFont &out)
{
   // Provide font with given size, file and FTGL class.

   if (fgStaticInitDone == kFALSE) InitStatics();

   Int_t  size = GetFontSize(sizeIn);
   if (mode == out.GetMode() && fileID == out.GetFile() && size == out.GetSize())
      return;

   FontMap_i it = fFontMap.find(TGLFont(size, fileID, mode));
   if (it == fFontMap.end())
   {
      TString ttpath, file;
# ifdef TTFFONTDIR
      ttpath = gEnv->GetValue("Root.TTGLFontPath", TTFFONTDIR );
# else
      ttpath = gEnv->GetValue("Root.TTGLFontPath", "$(ROOTSYS)/fonts");
# endif
      {
         //For extenede we have both ttf and otf.
         char *fp = gSystem->Which(ttpath, fileID < fgExtendedFontStart ?
                                   ((TObjString*)fgFontFileArray[fileID])->String() + ".ttf" :
                                   ((TObjString*)fgFontFileArray[fileID])->String());
         file = fp;
         delete [] fp;
      }

      FTFont* ftfont = 0;
      switch (mode)
      {
         case TGLFont::kBitmap:
            ftfont = new FTGLBitmapFont(file);
            break;
         case TGLFont::kPixmap:
            ftfont = new FTGLPixmapFont(file);
            break;
         case TGLFont::kOutline:
            ftfont = new FTGLOutlineFont(file);
            break;
         case TGLFont::kPolygon:
            ftfont = new FTGLPolygonFont(file);
            break;
         case TGLFont::kExtrude:
            ftfont = new FTGLExtrdFont(file);
            ftfont->Depth(0.2*size);
            break;
         case TGLFont::kTexture:
            ftfont = new FTGLTextureFont(file);
            break;
         default:
            Error("TGLFontManager::RegisterFont", "invalid FTGL type");
            return;
            break;
      }
      ftfont->FaceSize(size);
      const TGLFont &mf = fFontMap.insert(std::make_pair(TGLFont(size, fileID, mode, ftfont, 0), 1)).first->first;
      out.CopyAttributes(mf);
   }
   else
   {
      if (it->first.GetTrashCount() > 0) {
         fFontTrash.remove(&(it->first));
         it->first.SetTrashCount(0);
      }
      ++(it->second);
      out.CopyAttributes(it->first);
   }
   out.SetManager(this);
}

//______________________________________________________________________________
void TGLFontManager::RegisterFont(Int_t size, const char* name, TGLFont::EMode mode, TGLFont &out)
{
   // Get mapping from ttf id to font names. Table taken from TTF.cxx.

   TObjArray* farr = GetFontFileArray();
   TIter next(farr);
   TObjString* os;
   Int_t cnt = 0;
   while ((os = (TObjString*) next()) != 0)
   {
      if (os->String() == name)
         break;
      cnt++;
   }

   if (cnt < farr->GetEntries())
      RegisterFont(size, cnt, mode, out);
   else
      Error("TGLFontManager::RegisterFont", "unknown font name %s", name);
}

//______________________________________________________________________________
void TGLFontManager::ReleaseFont(TGLFont& font)
{
   // Release font with given attributes. Returns false if font has
   // not been found in the managers font set.

   FontMap_i it = fFontMap.find(font);

   if (it != fFontMap.end())
   {
      --(it->second);
      if (it->second == 0)
      {
         assert(it->first.GetTrashCount() == 0);
         it->first.IncTrashCount();
         fFontTrash.push_back(&it->first);
      }
   }
}

//______________________________________________________________________________
TObjArray* TGLFontManager::GetFontFileArray()
{
   // Get id to file name map.

   if (fgStaticInitDone == kFALSE) InitStatics();
   return &fgFontFileArray;
}

//______________________________________________________________________________
TGLFontManager::FontSizeVec_t* TGLFontManager::GetFontSizeArray()
{
   // Get valid font size vector.

   if (fgStaticInitDone == kFALSE) InitStatics();
   return &fgFontSizeArray;
}

//______________________________________________________________________________
Int_t TGLFontManager::GetExtendedFontStartIndex()
{
   if (fgStaticInitDone == kFALSE) InitStatics();

   assert(fgExtendedFontStart > 0 && "GetExtendedFontStartIndex, invalid index");

   return fgExtendedFontStart;
}

//______________________________________________________________________________
Int_t TGLFontManager::GetFontSize(Int_t ds)
{
   // Get availabe font size.

   if (fgStaticInitDone == kFALSE) InitStatics();

   Int_t idx = TMath::BinarySearch(fgFontSizeArray.size(), &fgFontSizeArray[0],
                                   TMath::CeilNint(ds));

   if (idx < 0) idx = 0;
   return fgFontSizeArray[idx];
}

//______________________________________________________________________________
Int_t TGLFontManager::GetFontSize(Int_t ds, Int_t min, Int_t max)
{
   // Get availabe font size.

   if (ds < min) ds = min;
   if (ds > max) ds = max;
   return GetFontSize(ds);
}

//______________________________________________________________________________
const char* TGLFontManager::GetFontNameFromId(Int_t id)
{
   // Get font name from TAttAxis font id.
   if (fgStaticInitDone == kFALSE) InitStatics();

   Int_t fontIndex = id / 10;

   if (fontIndex > fgFontFileArray.GetEntries() || !fontIndex)
      fontIndex = 5;//arialbd
   else
      fontIndex -= 1;

   TObjString* os = (TObjString*)fgFontFileArray[fontIndex];
   return os->String().Data();
}

//______________________________________________________________________________
void TGLFontManager::InitStatics()
{
   // Create a list of available font files and allowed font sizes.
   fgFontFileArray.Add(new TObjString("timesi"));   //  10
   fgFontFileArray.Add(new TObjString("timesbd"));  //  20
   fgFontFileArray.Add(new TObjString("timesbi"));  //  30

   fgFontFileArray.Add(new TObjString("arial"));    //  40
   fgFontFileArray.Add(new TObjString("ariali"));   //  50
   fgFontFileArray.Add(new TObjString("arialbd"));  //  60
   fgFontFileArray.Add(new TObjString("arialbi"));  //  70

   fgFontFileArray.Add(new TObjString("cour"));     //  80
   fgFontFileArray.Add(new TObjString("couri"));    //  90
   fgFontFileArray.Add(new TObjString("courbd"));   // 100
   fgFontFileArray.Add(new TObjString("courbi"));   // 110

   fgFontFileArray.Add(new TObjString("symbol"));   // 120
   fgFontFileArray.Add(new TObjString("times"));    // 130
   fgFontFileArray.Add(new TObjString("wingding")); // 140
   fgFontFileArray.Add(new TObjString("symbol"));   // 150

   fgExtendedFontStart = fgFontFileArray.GetEntries();
   //"Extended" fonts for gl-pad.
   //fgPadFontStart + ...
   fgFontFileArray.Add(new TObjString("FreeSerifItalic.otf"));      //  10 (160)
   fgFontFileArray.Add(new TObjString("FreeSerifBold.otf"));        //  20 (170)
   fgFontFileArray.Add(new TObjString("FreeSerifBoldItalic.otf"));  //  30

   fgFontFileArray.Add(new TObjString("FreeSans.otf"));             //  40
   fgFontFileArray.Add(new TObjString("FreeSansOblique.otf"));      //  50
   fgFontFileArray.Add(new TObjString("FreeSansBold.otf"));         //  60
   fgFontFileArray.Add(new TObjString("FreeSansBoldOblique.otf"));  //  70

   fgFontFileArray.Add(new TObjString("FreeMono.otf"));             //  80
   fgFontFileArray.Add(new TObjString("FreeMonoOblique.otf"));      //  90
   fgFontFileArray.Add(new TObjString("FreeMonoBold.otf"));         // 100
   fgFontFileArray.Add(new TObjString("FreeMonoBoldOblique.otf"));  // 110

   fgFontFileArray.Add(new TObjString("symbol.ttf"));               // 120
   fgFontFileArray.Add(new TObjString("FreeSerif.otf"));            // 130
   fgFontFileArray.Add(new TObjString("wingding.ttf"));             // 140
   fgFontFileArray.Add(new TObjString("symbol.ttf"));               // 150

   fgFontFileArray.Add(new TObjString("STIXGeneral.otf"));          // 200
   fgFontFileArray.Add(new TObjString("STIXGeneralItalic.otf"));    // 210
   fgFontFileArray.Add(new TObjString("STIXGeneralBol.otf"));       // 220
   fgFontFileArray.Add(new TObjString("STIXGeneralBolIta.otf"));    // 230

   fgFontFileArray.Add(new TObjString("STIXSiz1Sym.otf"));          // 240
   fgFontFileArray.Add(new TObjString("STIXSiz1SymBol.otf"));       // 250
   fgFontFileArray.Add(new TObjString("STIXSiz2Sym.otf"));          // 260
   fgFontFileArray.Add(new TObjString("STIXSiz2SymBol.otf"));       // 270

   fgFontFileArray.Add(new TObjString("STIXSiz3Sym.otf"));          // 280
   fgFontFileArray.Add(new TObjString("STIXSiz3SymBol.otf"));       // 290
   fgFontFileArray.Add(new TObjString("STIXSiz4Sym.otf"));          // 300
   fgFontFileArray.Add(new TObjString("STIXSiz4SymBol.otf"));       // 310

   fgFontFileArray.Add(new TObjString("STIXSiz5Sym.otf"));          // 320
   fgFontFileArray.Add(new TObjString("DroidSansFallback.ttf"));    // 330
   fgFontFileArray.Add(new TObjString("DroidSansFallback.ttf"));    // 340
   fgFontFileArray.Add(new TObjString("DroidSansFallback.ttf"));    // 350

   for (Int_t i = 10; i <= 20; i+=2)
      fgFontSizeArray.push_back(i);
   for (Int_t i = 24; i <= 64; i+=4)
      fgFontSizeArray.push_back(i);
   for (Int_t i = 72; i <= 128; i+=8)
      fgFontSizeArray.push_back(i);

   fgStaticInitDone = kTRUE;
}

//______________________________________________________________________________
void TGLFontManager::ClearFontTrash()
{
   // Delete FTFFont objects registered for destruction.

   FontList_i it = fFontTrash.begin();
   while (it != fFontTrash.end())
   {
      if ((*it)->IncTrashCount() > 10000)
      {
         FontMap_i mi = fFontMap.find(**it);
         assert(mi != fFontMap.end());
         fFontMap.erase(mi);
         delete (*it)->GetFont();

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