#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
};
enum ETextAlignH_e { kLeft, kRight, kCenterH };
enum ETextAlignV_e { kBottom, kTop, kCenterV };
private:
TGLFont& operator=(const TGLFont& o);
FTFont *fFont;
TGLFontManager *fManager;
Float_t fDepth;
template<class Char>
void RenderHelper(const Char *txt, Double_t x, Double_t y, Double_t angle, Double_t ) const;
protected:
Int_t fSize;
Int_t fFile;
EMode fMode;
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);
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; }
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;
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);
};
class TGLFontManager
{
public:
typedef std::vector<Int_t> FontSizeVec_t;
private:
TGLFontManager(const TGLFontManager&);
TGLFontManager& operator=(const TGLFontManager&);
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;
FontList_t fFontTrash;
static TObjArray fgFontFileArray;
static Int_t fgExtendedFontStart;
static FontSizeVec_t fgFontSizeArray;
static Bool_t fgStaticInitDone;
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);
};
#endif