ROOT logo
// @(#)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.             *
 *************************************************************************/

#ifndef ROOT_TGLFontManager
#define ROOT_TGLFontManager

#include "TObjArray.h"
#include <list>
#include <vector>
#include <map>

class FTFont;
class TGLFontManager;

class TGLFont
{
public:
   enum EMode
   {
      kUndef = -1,
      kBitmap, kPixmap,
      kTexture, kOutline, kPolygon, kExtrude
   }; // Font-types of FTGL.

   enum ETextAlignH_e { kLeft, kRight, kCenterH };
   enum ETextAlignV_e   { kBottom, kTop, kCenterV };

private:
   TGLFont& operator=(const TGLFont& o); // Not implemented.

   FTFont          *fFont;     // FTGL font.
   TGLFontManager  *fManager;  // Font manager.

   Float_t          fDepth;  // depth of extruded fonts, enforced at render time.

   template<class Char>
   void RenderHelper(const Char *txt, Double_t x, Double_t y, Double_t angle, Double_t /*mgn*/) const;

protected:
   Int_t            fSize;   // free-type face size
   Int_t            fFile;   // free-type file name
   EMode            fMode;   // free-type FTGL class id

   mutable Int_t    fTrashCount;
public:
   TGLFont();
   TGLFont(Int_t size, Int_t font, EMode mode, FTFont *f=0, TGLFontManager *mng=0);
   TGLFont(const TGLFont& o);            // Not implemented.
   virtual ~TGLFont();

   void CopyAttributes(const TGLFont &o);

   Int_t GetSize() const { return fSize;}
   Int_t GetFile() const { return fFile;}
   EMode GetMode() const { return fMode;}

   Int_t GetTrashCount()        const { return fTrashCount;   }
   void  SetTrashCount(Int_t c) const { fTrashCount = c;      }
   Int_t IncTrashCount()        const { return ++fTrashCount; }

   void  SetFont(FTFont *f) { fFont =f;}
   const FTFont* GetFont() const { return fFont; }
   void  SetManager(TGLFontManager *mng)    { fManager = mng;  }
   const TGLFontManager* GetManager() const { return fManager; }

   Float_t GetDepth()    const { return fDepth; }
   void    SetDepth(Float_t d) { fDepth = d;    }

   // FTGL wrapper functions
   Float_t GetAscent() const;
   Float_t GetDescent() const;
   Float_t GetLineHeight() const;
   void    MeasureBaseLineParams(Float_t& ascent, Float_t& descent, Float_t& line_height,
                                 const char* txt="Xj") const;

   void  BBox(const char* txt,
              Float_t& llx, Float_t& lly, Float_t& llz,
              Float_t& urx, Float_t& ury, Float_t& urz) const;
   void  BBox(const wchar_t* txt,
              Float_t& llx, Float_t& lly, Float_t& llz,
              Float_t& urx, Float_t& ury, Float_t& urz) const;

   void  Render(const char* txt, Double_t x, Double_t y, Double_t angle, Double_t mgn) const;
   void  Render(const wchar_t* txt, Double_t x, Double_t y, Double_t angle, Double_t mgn) const;
   void  Render(const TString &txt) const;
   void  Render(const TString &txt, Float_t x, Float_t y, Float_t z, ETextAlignH_e alignH, ETextAlignV_e alignV) const;

   // helper gl draw functions
   virtual void PreRender(Bool_t autoLight=kTRUE, Bool_t lightOn=kFALSE) const;
   virtual void PostRender() const;

   Bool_t operator< (const TGLFont& o) const
   {
      if (fSize == o.fSize)
      {
         if(fFile == o.fFile)
         {
            return fMode < o.fMode;
         }
         return fFile < o.fFile;
      }
      return fSize < o.fSize;
   }

   ClassDef(TGLFont, 0); // A wrapper class for FTFont.
};

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

class TGLFontManager
{
public:
   typedef std::vector<Int_t> FontSizeVec_t;

private:
   TGLFontManager(const TGLFontManager&);            // Not implemented
   TGLFontManager& operator=(const TGLFontManager&); // Not implemented

protected:
   typedef std::map<TGLFont, Int_t>           FontMap_t;
   typedef std::map<TGLFont, Int_t>::iterator FontMap_i;

   typedef std::list<const TGLFont*>                  FontList_t;
   typedef std::list<const TGLFont*>::iterator        FontList_i;
   typedef std::list<const TGLFont*>::const_iterator  FontList_ci;

   FontMap_t            fFontMap;        // map of created fonts
   FontList_t           fFontTrash;      // fonts to purge

   static TObjArray     fgFontFileArray;      // map font-id to ttf-font-file
   // Default fonts - for gl/eve, "extended" - for gl-pad
   static Int_t         fgExtendedFontStart;
   
   static FontSizeVec_t fgFontSizeArray;      // map of valid font-size
   static Bool_t        fgStaticInitDone;     // global initialization flag
   static void          InitStatics();

public:
   TGLFontManager() : fFontMap(), fFontTrash() {}
   virtual ~TGLFontManager();

   void   RegisterFont(Int_t size, Int_t file, TGLFont::EMode mode, TGLFont& out);
   void   RegisterFont(Int_t size, const char* name, TGLFont::EMode mode, TGLFont& out);
   void   ReleaseFont(TGLFont& font);

   static TObjArray*        GetFontFileArray();
   static FontSizeVec_t*    GetFontSizeArray();

   static Int_t             GetExtendedFontStartIndex();
   static Int_t             GetFontSize(Int_t ds);
   static Int_t             GetFontSize(Int_t ds, Int_t min, Int_t max);
   static const char*       GetFontNameFromId(Int_t);

   void   ClearFontTrash();

   ClassDef(TGLFontManager, 0); // A FreeType GL font manager.
};

#endif

 TGLFontManager.h:1
 TGLFontManager.h:2
 TGLFontManager.h:3
 TGLFontManager.h:4
 TGLFontManager.h:5
 TGLFontManager.h:6
 TGLFontManager.h:7
 TGLFontManager.h:8
 TGLFontManager.h:9
 TGLFontManager.h:10
 TGLFontManager.h:11
 TGLFontManager.h:12
 TGLFontManager.h:13
 TGLFontManager.h:14
 TGLFontManager.h:15
 TGLFontManager.h:16
 TGLFontManager.h:17
 TGLFontManager.h:18
 TGLFontManager.h:19
 TGLFontManager.h:20
 TGLFontManager.h:21
 TGLFontManager.h:22
 TGLFontManager.h:23
 TGLFontManager.h:24
 TGLFontManager.h:25
 TGLFontManager.h:26
 TGLFontManager.h:27
 TGLFontManager.h:28
 TGLFontManager.h:29
 TGLFontManager.h:30
 TGLFontManager.h:31
 TGLFontManager.h:32
 TGLFontManager.h:33
 TGLFontManager.h:34
 TGLFontManager.h:35
 TGLFontManager.h:36
 TGLFontManager.h:37
 TGLFontManager.h:38
 TGLFontManager.h:39
 TGLFontManager.h:40
 TGLFontManager.h:41
 TGLFontManager.h:42
 TGLFontManager.h:43
 TGLFontManager.h:44
 TGLFontManager.h:45
 TGLFontManager.h:46
 TGLFontManager.h:47
 TGLFontManager.h:48
 TGLFontManager.h:49
 TGLFontManager.h:50
 TGLFontManager.h:51
 TGLFontManager.h:52
 TGLFontManager.h:53
 TGLFontManager.h:54
 TGLFontManager.h:55
 TGLFontManager.h:56
 TGLFontManager.h:57
 TGLFontManager.h:58
 TGLFontManager.h:59
 TGLFontManager.h:60
 TGLFontManager.h:61
 TGLFontManager.h:62
 TGLFontManager.h:63
 TGLFontManager.h:64
 TGLFontManager.h:65
 TGLFontManager.h:66
 TGLFontManager.h:67
 TGLFontManager.h:68
 TGLFontManager.h:69
 TGLFontManager.h:70
 TGLFontManager.h:71
 TGLFontManager.h:72
 TGLFontManager.h:73
 TGLFontManager.h:74
 TGLFontManager.h:75
 TGLFontManager.h:76
 TGLFontManager.h:77
 TGLFontManager.h:78
 TGLFontManager.h:79
 TGLFontManager.h:80
 TGLFontManager.h:81
 TGLFontManager.h:82
 TGLFontManager.h:83
 TGLFontManager.h:84
 TGLFontManager.h:85
 TGLFontManager.h:86
 TGLFontManager.h:87
 TGLFontManager.h:88
 TGLFontManager.h:89
 TGLFontManager.h:90
 TGLFontManager.h:91
 TGLFontManager.h:92
 TGLFontManager.h:93
 TGLFontManager.h:94
 TGLFontManager.h:95
 TGLFontManager.h:96
 TGLFontManager.h:97
 TGLFontManager.h:98
 TGLFontManager.h:99
 TGLFontManager.h:100
 TGLFontManager.h:101
 TGLFontManager.h:102
 TGLFontManager.h:103
 TGLFontManager.h:104
 TGLFontManager.h:105
 TGLFontManager.h:106
 TGLFontManager.h:107
 TGLFontManager.h:108
 TGLFontManager.h:109
 TGLFontManager.h:110
 TGLFontManager.h:111
 TGLFontManager.h:112
 TGLFontManager.h:113
 TGLFontManager.h:114
 TGLFontManager.h:115
 TGLFontManager.h:116
 TGLFontManager.h:117
 TGLFontManager.h:118
 TGLFontManager.h:119
 TGLFontManager.h:120
 TGLFontManager.h:121
 TGLFontManager.h:122
 TGLFontManager.h:123
 TGLFontManager.h:124
 TGLFontManager.h:125
 TGLFontManager.h:126
 TGLFontManager.h:127
 TGLFontManager.h:128
 TGLFontManager.h:129
 TGLFontManager.h:130
 TGLFontManager.h:131
 TGLFontManager.h:132
 TGLFontManager.h:133
 TGLFontManager.h:134
 TGLFontManager.h:135
 TGLFontManager.h:136
 TGLFontManager.h:137
 TGLFontManager.h:138
 TGLFontManager.h:139
 TGLFontManager.h:140
 TGLFontManager.h:141
 TGLFontManager.h:142
 TGLFontManager.h:143
 TGLFontManager.h:144
 TGLFontManager.h:145
 TGLFontManager.h:146
 TGLFontManager.h:147
 TGLFontManager.h:148
 TGLFontManager.h:149
 TGLFontManager.h:150
 TGLFontManager.h:151
 TGLFontManager.h:152
 TGLFontManager.h:153
 TGLFontManager.h:154
 TGLFontManager.h:155
 TGLFontManager.h:156
 TGLFontManager.h:157
 TGLFontManager.h:158
 TGLFontManager.h:159
 TGLFontManager.h:160
 TGLFontManager.h:161
 TGLFontManager.h:162
 TGLFontManager.h:163
 TGLFontManager.h:164
 TGLFontManager.h:165
 TGLFontManager.h:166
 TGLFontManager.h:167
 TGLFontManager.h:168
 TGLFontManager.h:169