Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TGLFontManager.h
Go to the documentation of this file.
1 // @(#)root/gl:$Id$
2 // Author: Alja Mrak-Tadel 2008
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOT_TGLFontManager
13 #define ROOT_TGLFontManager
14 
15 #include "TObjArray.h"
16 #include <list>
17 #include <vector>
18 #include <map>
19 
20 class FTFont;
21 class TGLFontManager;
22 
23 class TGLFont
24 {
25 public:
26  enum EMode
27  {
28  kUndef = -1,
29  kBitmap, kPixmap,
30  kTexture, kOutline, kPolygon, kExtrude
31  }; // Font-types of FTGL.
32 
33  enum ETextAlignH_e { kLeft, kRight, kCenterH };
34  enum ETextAlignV_e { kBottom, kTop, kCenterV };
35 
36 private:
37  TGLFont& operator=(const TGLFont& o); // Not implemented.
38 
39  FTFont *fFont; // FTGL font.
40  TGLFontManager *fManager; // Font manager.
41 
42  Float_t fDepth; // depth of extruded fonts, enforced at render time.
43 
44  template<class Char>
45  void RenderHelper(const Char *txt, Double_t x, Double_t y, Double_t angle, Double_t /*mgn*/) const;
46 
47 protected:
48  Int_t fSize; // free-type face size
49  Int_t fFile; // free-type file name
50  EMode fMode; // free-type FTGL class id
51 
52  mutable Int_t fTrashCount;
53 public:
54  TGLFont();
55  TGLFont(Int_t size, Int_t font, EMode mode, FTFont *f=0, TGLFontManager *mng=0);
56  TGLFont(const TGLFont& o); // Not implemented.
57  virtual ~TGLFont();
58 
59  void CopyAttributes(const TGLFont &o);
60 
61  Int_t GetSize() const { return fSize;}
62  Int_t GetFile() const { return fFile;}
63  EMode GetMode() const { return fMode;}
64 
65  Int_t GetTrashCount() const { return fTrashCount; }
66  void SetTrashCount(Int_t c) const { fTrashCount = c; }
67  Int_t IncTrashCount() const { return ++fTrashCount; }
68 
69  void SetFont(FTFont *f) { fFont =f;}
70  const FTFont* GetFont() const { return fFont; }
71  void SetManager(TGLFontManager *mng) { fManager = mng; }
72  const TGLFontManager* GetManager() const { return fManager; }
73 
74  Float_t GetDepth() const { return fDepth; }
75  void SetDepth(Float_t d) { fDepth = d; }
76 
77  // FTGL wrapper functions
78  Float_t GetAscent() const;
79  Float_t GetDescent() const;
80  Float_t GetLineHeight() const;
81  void MeasureBaseLineParams(Float_t& ascent, Float_t& descent, Float_t& line_height,
82  const char* txt="Xj") const;
83 
84  void BBox(const char* txt,
85  Float_t& llx, Float_t& lly, Float_t& llz,
86  Float_t& urx, Float_t& ury, Float_t& urz) const;
87  void BBox(const wchar_t* txt,
88  Float_t& llx, Float_t& lly, Float_t& llz,
89  Float_t& urx, Float_t& ury, Float_t& urz) const;
90 
91  void Render(const char* txt, Double_t x, Double_t y, Double_t angle, Double_t mgn) const;
92  void Render(const wchar_t* txt, Double_t x, Double_t y, Double_t angle, Double_t mgn) const;
93  void Render(const TString &txt) const;
94  void Render(const TString &txt, Float_t x, Float_t y, Float_t z, ETextAlignH_e alignH, ETextAlignV_e alignV) const;
95 
96  // helper gl draw functions
97  virtual void PreRender(Bool_t autoLight=kTRUE, Bool_t lightOn=kFALSE) const;
98  virtual void PostRender() const;
99 
100  Bool_t operator< (const TGLFont& o) const
101  {
102  if (fSize == o.fSize)
103  {
104  if(fFile == o.fFile)
105  {
106  return fMode < o.fMode;
107  }
108  return fFile < o.fFile;
109  }
110  return fSize < o.fSize;
111  }
112 
113  ClassDef(TGLFont, 0); // A wrapper class for FTFont.
114 };
115 
116 /******************************************************************************/
117 /******************************************************************************/
118 
119 class TGLFontManager
120 {
121 public:
122  typedef std::vector<Int_t> FontSizeVec_t;
123 
124 private:
125  TGLFontManager(const TGLFontManager&); // Not implemented
126  TGLFontManager& operator=(const TGLFontManager&); // Not implemented
127 
128 protected:
129  typedef std::map<TGLFont, Int_t> FontMap_t;
130  typedef std::map<TGLFont, Int_t>::iterator FontMap_i;
131 
132  typedef std::list<const TGLFont*> FontList_t;
133  typedef std::list<const TGLFont*>::iterator FontList_i;
134  typedef std::list<const TGLFont*>::const_iterator FontList_ci;
135 
136  FontMap_t fFontMap; // map of created fonts
137  FontList_t fFontTrash; // fonts to purge
138 
139  static TObjArray fgFontFileArray; // map font-id to ttf-font-file
140  // Default fonts - for gl/eve, "extended" - for gl-pad
141  static Int_t fgExtendedFontStart;
142 
143  static FontSizeVec_t fgFontSizeArray; // map of valid font-size
144  static Bool_t fgStaticInitDone; // global initialization flag
145  static void InitStatics();
146 
147 public:
148  TGLFontManager() : fFontMap(), fFontTrash() {}
149  virtual ~TGLFontManager();
150 
151  void RegisterFont(Int_t size, Int_t file, TGLFont::EMode mode, TGLFont& out);
152  void RegisterFont(Int_t size, const char* name, TGLFont::EMode mode, TGLFont& out);
153  void ReleaseFont(TGLFont& font);
154 
155  static TObjArray* GetFontFileArray();
156  static FontSizeVec_t* GetFontSizeArray();
157 
158  static Int_t GetExtendedFontStartIndex();
159  static Int_t GetFontSize(Int_t ds);
160  static Int_t GetFontSize(Int_t ds, Int_t min, Int_t max);
161  static const char* GetFontNameFromId(Int_t);
162 
163  void ClearFontTrash();
164 
165  ClassDef(TGLFontManager, 0); // A FreeType GL font manager.
166 };
167 
168 #endif
169