ROOT  6.06/09
Reference Guide
TGLFontManager.cxx
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 #include "Riostream.h"
13 #include "RConfigure.h"
14 #include "TGLFontManager.h"
15 
16 
17 #include "TVirtualX.h"
18 #include "TMath.h"
19 #include "TSystem.h"
20 #include "TEnv.h"
21 #include "TObjString.h"
22 #include "TGLUtil.h"
23 #include "TGLIncludes.h"
24 
25 // Direct inclusion of FTGL headers is deprecated in ftgl-2.1.3 while
26 // ftgl-2.1.2 shipped with ROOT requires manual inclusion.
27 #ifndef BUILTIN_FTGL
28 # include <FTGL/ftgl.h>
29 #else
30 # include "FTFont.h"
31 # include "FTGLExtrdFont.h"
32 # include "FTGLOutlineFont.h"
33 # include "FTGLPolygonFont.h"
34 # include "FTGLTextureFont.h"
35 # include "FTGLPixmapFont.h"
36 # include "FTGLBitmapFont.h"
37 #endif
38 
39 
40 /** \class TGLFont
41 \ingroup opengl
42 A wrapper class for FTFont.
43 Holds pointer to FTFont object and its description: face size, font file
44 and class ID. It wraps Render and BBox functions.
45 */
46 
48 
49 ////////////////////////////////////////////////////////////////////////////////
50 /// Constructor.
51 
53  fFont(0), fManager(0), fDepth(0),
54  fSize(0), fFile(0), fMode(kUndef),
55  fTrashCount(0)
56 {
57 }
58 
59 ////////////////////////////////////////////////////////////////////////////////
60 /// Constructor.
61 
62 TGLFont::TGLFont(Int_t size, Int_t font, EMode mode, FTFont* f, TGLFontManager* mng):
63  fFont(f), fManager(mng), fDepth(0),
64  fSize(size), fFile(font), fMode(mode),
65  fTrashCount(0)
66 {
67 }
68 
69 ////////////////////////////////////////////////////////////////////////////////
70 /// Assignment operator.
71 
73  fFont(0), fManager(0), fDepth(0), fTrashCount(0)
74 {
75  fFont = (FTFont*)o.GetFont();
76 
77  fSize = o.fSize;
78  fFile = o.fFile;
79  fMode = o.fMode;
80 
82 }
83 
84 ////////////////////////////////////////////////////////////////////////////////
85 ///Destructor
86 
88 {
89  if (fManager) fManager->ReleaseFont(*this);
90 }
91 
92 ////////////////////////////////////////////////////////////////////////////////
93 /// Assignment operator.
94 
96 {
97  SetFont(o.fFont);
99 
100  SetDepth(o.fDepth);
101 
102  fSize = o.fSize;
103  fFile = o.fFile;
104  fMode = o.fMode;
105 
107 }
108 
109 
110 /******************************************************************************/
111 
112 ////////////////////////////////////////////////////////////////////////////////
113 /// Get font's ascent.
114 
116 {
117  return fFont->Ascender();
118 }
119 
120 ////////////////////////////////////////////////////////////////////////////////
121 /// Get font's descent. The returned value is positive.
122 
124 {
125  return -fFont->Descender();
126 }
127 
128 ////////////////////////////////////////////////////////////////////////////////
129 /// Get font's line-height.
130 
132 {
133  return fFont->LineHeight();
134 }
135 
136 ////////////////////////////////////////////////////////////////////////////////
137 /// Measure font's base-line parameters from the passed text.
138 /// Note that the measured parameters are not the same as the ones
139 /// returned by get-functions - those were set by the font designer.
140 
141 void TGLFont::MeasureBaseLineParams(Float_t& ascent, Float_t& descent, Float_t& line_height,
142  const char* txt) const
143 {
144  Float_t dum, lly, ury;
145  const_cast<FTFont*>(fFont)->BBox(txt, dum, lly, dum, dum, ury, dum);
146  ascent = ury;
147  descent = -lly;
148  line_height = ury - lly;
149 }
150 
151 ////////////////////////////////////////////////////////////////////////////////
152 /// Get bounding box.
153 
154 void TGLFont::BBox(const char* txt,
155  Float_t& llx, Float_t& lly, Float_t& llz,
156  Float_t& urx, Float_t& ury, Float_t& urz) const
157 {
158  // FTGL is not const correct.
159  const_cast<FTFont*>(fFont)->BBox(txt, llx, lly, llz, urx, ury, urz);
160 }
161 
162 ////////////////////////////////////////////////////////////////////////////////
163 /// Get bounding box.
164 
165 void TGLFont::BBox(const wchar_t* txt,
166  Float_t& llx, Float_t& lly, Float_t& llz,
167  Float_t& urx, Float_t& ury, Float_t& urz) const
168 {
169  // FTGL is not const correct.
170  const_cast<FTFont*>(fFont)->BBox(txt, llx, lly, llz, urx, ury, urz);
171 }
172 
173 ////////////////////////////////////////////////////////////////////////////////
174 ///mgn is simply ignored, because ROOT's TVirtualX TGX11 are complete mess with
175 ///painting attributes.
176 
177 template<class Char>
178 void TGLFont::RenderHelper(const Char *txt, Double_t x, Double_t y, Double_t angle, Double_t /*mgn*/) const
179 {
180  glPushMatrix();
181  //glLoadIdentity();
182 
183  // FTGL is not const correct.
184  Float_t llx = 0.f, lly = 0.f, llz = 0.f, urx = 0.f, ury = 0.f, urz = 0.f;
185  BBox(txt, llx, lly, llz, urx, ury, urz);
186 
187  /*
188  V\H | left | center | right
189  _______________________________
190  bottom | 7 | 8 | 9
191  _______________________________
192  center | 4 | 5 | 6
193  _______________________________
194  top | 1 | 2 | 3
195  */
196  const Double_t dx = urx - llx, dy = ury - lly;
197  Double_t xc = 0., yc = 0.;
198  const UInt_t align = gVirtualX->GetTextAlign();
199 
200  //Here's the nice X11 bullshido: you call gVirtualX->SetTextAlign(11),
201  //later gVirtualX->GetTextAling() will give you 7. Brilliant!
202  //But with Cocoa you'll have 11. As it should be, of course.
203 
204  if (gVirtualX->InheritsFrom("TGCocoa")) {
205  const UInt_t hAlign = UInt_t(align / 10);
206  switch (hAlign) {
207  case 1:
208  xc = 0.5 * dx;
209  break;
210  case 2:
211  break;
212  case 3:
213  xc = -0.5 * dy;
214  break;
215  }
216 
217  const UInt_t vAlign = UInt_t(align % 10);
218  switch (vAlign) {
219  case 1:
220  yc = 0.5 * dy;
221  break;
222  case 2:
223  break;
224  case 3:
225  yc = -0.5 * dy;
226  break;
227  }
228  } else {
229  switch (align) {
230  case 7:
231  xc += 0.5 * dx;
232  yc += 0.5 * dy;
233  break;
234  case 8:
235  yc += 0.5 * dy;
236  break;
237  case 9:
238  xc -= 0.5 * dx;
239  yc += 0.5 * dy;
240  break;
241  case 4:
242  xc += 0.5 * dx;
243  break;
244  case 5:
245  break;
246  case 6:
247  xc = -0.5 * dx;
248  break;
249  case 1:
250  xc += 0.5 * dx;
251  yc -= 0.5 * dy;
252  break;
253  case 2:
254  yc -= 0.5 * dy;
255  break;
256  case 3:
257  xc -= 0.5 * dx;
258  yc -= 0.5 * dy;
259  break;
260  }
261  }
262 
263  glTranslated(x, y, 0.);
264  glRotated(angle, 0., 0., 1.);
265  glTranslated(xc, yc, 0.);
266  glTranslated(-0.5 * dx, -0.5 * dy, 0.);
267  //glScaled(mgn, mgn, 1.);
268 
269  const_cast<FTFont*>(fFont)->Render(txt);
270 
271  glPopMatrix();
272 }
273 
274 ////////////////////////////////////////////////////////////////////////////////
275 
276 void TGLFont::Render(const wchar_t* txt, Double_t x, Double_t y, Double_t angle, Double_t mgn) const
277 {
278  RenderHelper(txt, x, y, angle, mgn);
279 }
280 
281 ////////////////////////////////////////////////////////////////////////////////
282 
283 void TGLFont::Render(const char* txt, Double_t x, Double_t y, Double_t angle, Double_t mgn) const
284 {
285  RenderHelper(txt, x, y, angle, mgn);
286 }
287 
288 ////////////////////////////////////////////////////////////////////////////////
289 /// Render text.
290 
291 void TGLFont::Render(const TString &txt) const
292 {
293  Bool_t scaleDepth = (fMode == kExtrude && fDepth != 1.0f);
294 
295  if (scaleDepth) {
296  glPushMatrix();
297  // !!! 0.2*fSize is hard-coded in TGLFontManager::GetFont(), too.
298  glTranslatef(0.0f, 0.0f, 0.5f*fDepth * 0.2f*fSize);
299  glScalef(1.0f, 1.0f, fDepth);
300  }
301 
302  // FTGL is not const correct.
303  const_cast<FTFont*>(fFont)->Render(txt);
304 
305  if (scaleDepth) {
306  glPopMatrix();
307  }
308 }
309 
310 ////////////////////////////////////////////////////////////////////////////////
311 /// Render text with given alignmentrepl and at given position.
312 
314  ETextAlignH_e alignH, ETextAlignV_e alignV) const
315 {
316  glPushMatrix();
317 
318  glTranslatef(x, y, z);
319 
320  x=0, y=0;
321  Float_t llx, lly, llz, urx, ury, urz;
322  BBox(txt, llx, lly, llz, urx, ury, urz);
323 
324  switch (alignH)
325  {
326  case TGLFont::kRight:
327  x = -urx;
328  break;
329 
330  case TGLFont::kCenterH:
331  x = -urx*0.5;
332  break;
333  default:
334  break;
335  };
336 
337  switch (alignV)
338  {
339  case TGLFont::kBottom:
340  y = -ury;
341  break;
342  case TGLFont::kCenterV:
343  y = -ury*0.5;
344  break;
345  default:
346  break;
347  };
348 
350  {
351  glRasterPos2i(0, 0);
352  glBitmap(0, 0, 0, 0, x, y, 0);
353  }
354  else
355  {
356  glTranslatef(x, y, 0);
357  }
358  Render(txt);
359  glPopMatrix();
360 }
361 
362 ////////////////////////////////////////////////////////////////////////////////
363 /// Set-up GL state before FTFont rendering.
364 
365 void TGLFont::PreRender(Bool_t autoLight, Bool_t lightOn) const
366 {
367  switch (fMode)
368  {
369  case kBitmap:
370  case kPixmap:
371  glPushAttrib(GL_CURRENT_BIT | GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT);
372  glEnable(GL_ALPHA_TEST);
373  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
374  glAlphaFunc(GL_GEQUAL, 0.0625);
375  break;
376  case kTexture:
377  glPushAttrib(GL_POLYGON_BIT | GL_ENABLE_BIT);
378  glEnable(GL_TEXTURE_2D);
379  glDisable(GL_CULL_FACE);
380  glEnable(GL_ALPHA_TEST);
381  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
382  glAlphaFunc(GL_GEQUAL, 0.0625);
383  break;
384  case kOutline:
385  case kPolygon:
386  case kExtrude:
387  glPushAttrib(GL_POLYGON_BIT | GL_ENABLE_BIT);
388  glEnable(GL_NORMALIZE);
389  glDisable(GL_CULL_FACE);
390  break;
391  default:
392  Warning("TGLFont::PreRender", "Font mode undefined.");
393  glPushAttrib(GL_LIGHTING_BIT);
394  break;
395  }
396 
397  if ((autoLight && fMode > TGLFont::kOutline) || (!autoLight && lightOn))
398  glEnable(GL_LIGHTING);
399  else
400  glDisable(GL_LIGHTING);
401 }
402 
403 ////////////////////////////////////////////////////////////////////////////////
404 /// Reset GL state after FTFont rendering.
405 
407 {
408  glPopAttrib();
409 }
410 
411 /** \class TGLFontManager
412 \ingroup opengl
413 A FreeType GL font manager.
414 
415 Each GL rendering context has an instance of FTGLManager.
416 This enables FTGL fonts to be shared same way as textures and display lists.
417 */
418 
420 
425 
426 ////////////////////////////////////////////////////////////////////////////////
427 /// Destructor.
428 
430 {
431  FontMap_i it = fFontMap.begin();
432  while (it != fFontMap.end()) {
433  delete it->first.GetFont();
434  it++;
435  }
436  fFontMap.clear();
437 }
438 
439 ////////////////////////////////////////////////////////////////////////////////
440 /// Provide font with given size, file and FTGL class.
441 
443 {
445 
446  Int_t size = GetFontSize(sizeIn);
447  if (mode == out.GetMode() && fileID == out.GetFile() && size == out.GetSize())
448  return;
449 
450  FontMap_i it = fFontMap.find(TGLFont(size, fileID, mode));
451  if (it == fFontMap.end())
452  {
453  TString ttpath, file;
454 # ifdef TTFFONTDIR
455  ttpath = gEnv->GetValue("Root.TTGLFontPath", TTFFONTDIR );
456 # else
457  ttpath = gEnv->GetValue("Root.TTGLFontPath", "$(ROOTSYS)/fonts");
458 # endif
459  {
460  //For extenede we have both ttf and otf.
461  char *fp = gSystem->Which(ttpath, fileID < fgExtendedFontStart ?
462  ((TObjString*)fgFontFileArray[fileID])->String() + ".ttf" :
463  ((TObjString*)fgFontFileArray[fileID])->String());
464  file = fp;
465  delete [] fp;
466  }
467 
468  FTFont* ftfont = 0;
469  switch (mode)
470  {
471  case TGLFont::kBitmap:
472  ftfont = new FTGLBitmapFont(file);
473  break;
474  case TGLFont::kPixmap:
475  ftfont = new FTGLPixmapFont(file);
476  break;
477  case TGLFont::kOutline:
478  ftfont = new FTGLOutlineFont(file);
479  break;
480  case TGLFont::kPolygon:
481  ftfont = new FTGLPolygonFont(file);
482  break;
483  case TGLFont::kExtrude:
484  ftfont = new FTGLExtrdFont(file);
485  ftfont->Depth(0.2*size);
486  break;
487  case TGLFont::kTexture:
488  ftfont = new FTGLTextureFont(file);
489  break;
490  default:
491  Error("TGLFontManager::RegisterFont", "invalid FTGL type");
492  return;
493  break;
494  }
495  ftfont->FaceSize(size);
496  const TGLFont &mf = fFontMap.insert(std::make_pair(TGLFont(size, fileID, mode, ftfont, 0), 1)).first->first;
497  out.CopyAttributes(mf);
498  }
499  else
500  {
501  if (it->first.GetTrashCount() > 0) {
502  fFontTrash.remove(&(it->first));
503  it->first.SetTrashCount(0);
504  }
505  ++(it->second);
506  out.CopyAttributes(it->first);
507  }
508  out.SetManager(this);
509 }
510 
511 ////////////////////////////////////////////////////////////////////////////////
512 /// Get mapping from ttf id to font names. Table taken from TTF.cxx.
513 
515 {
516  TObjArray* farr = GetFontFileArray();
517  TIter next(farr);
518  TObjString* os;
519  Int_t cnt = 0;
520  while ((os = (TObjString*) next()) != 0)
521  {
522  if (os->String() == name)
523  break;
524  cnt++;
525  }
526 
527  if (cnt < farr->GetEntries())
528  RegisterFont(size, cnt, mode, out);
529  else
530  Error("TGLFontManager::RegisterFont", "unknown font name %s", name);
531 }
532 
533 ////////////////////////////////////////////////////////////////////////////////
534 /// Release font with given attributes. Returns false if font has
535 /// not been found in the managers font set.
536 
538 {
539  FontMap_i it = fFontMap.find(font);
540 
541  if (it != fFontMap.end())
542  {
543  --(it->second);
544  if (it->second == 0)
545  {
546  assert(it->first.GetTrashCount() == 0);
547  it->first.IncTrashCount();
548  fFontTrash.push_back(&it->first);
549  }
550  }
551 }
552 
553 ////////////////////////////////////////////////////////////////////////////////
554 /// Get id to file name map.
555 
557 {
559  return &fgFontFileArray;
560 }
561 
562 ////////////////////////////////////////////////////////////////////////////////
563 /// Get valid font size vector.
564 
566 {
568  return &fgFontSizeArray;
569 }
570 
571 ////////////////////////////////////////////////////////////////////////////////
572 
574 {
576 
577  assert(fgExtendedFontStart > 0 && "GetExtendedFontStartIndex, invalid index");
578 
579  return fgExtendedFontStart;
580 }
581 
582 ////////////////////////////////////////////////////////////////////////////////
583 /// Get availabe font size.
584 
586 {
588 
590  TMath::CeilNint(ds));
591 
592  if (idx < 0) idx = 0;
593  return fgFontSizeArray[idx];
594 }
595 
596 ////////////////////////////////////////////////////////////////////////////////
597 /// Get availabe font size.
598 
600 {
601  if (ds < min) ds = min;
602  if (ds > max) ds = max;
603  return GetFontSize(ds);
604 }
605 
606 ////////////////////////////////////////////////////////////////////////////////
607 /// Get font name from TAttAxis font id.
608 
610 {
612 
613  Int_t fontIndex = id / 10;
614 
615  if (fontIndex > fgFontFileArray.GetEntries() || !fontIndex)
616  fontIndex = 5;//arialbd
617  else
618  fontIndex -= 1;
619 
620  TObjString* os = (TObjString*)fgFontFileArray[fontIndex];
621  return os->String().Data();
622 }
623 
624 ////////////////////////////////////////////////////////////////////////////////
625 /// Create a list of available font files and allowed font sizes.
626 
628 {
629  fgFontFileArray.Add(new TObjString("timesi")); // 10
630  fgFontFileArray.Add(new TObjString("timesbd")); // 20
631  fgFontFileArray.Add(new TObjString("timesbi")); // 30
632 
633  fgFontFileArray.Add(new TObjString("arial")); // 40
634  fgFontFileArray.Add(new TObjString("ariali")); // 50
635  fgFontFileArray.Add(new TObjString("arialbd")); // 60
636  fgFontFileArray.Add(new TObjString("arialbi")); // 70
637 
638  fgFontFileArray.Add(new TObjString("cour")); // 80
639  fgFontFileArray.Add(new TObjString("couri")); // 90
640  fgFontFileArray.Add(new TObjString("courbd")); // 100
641  fgFontFileArray.Add(new TObjString("courbi")); // 110
642 
643  fgFontFileArray.Add(new TObjString("symbol")); // 120
644  fgFontFileArray.Add(new TObjString("times")); // 130
645  fgFontFileArray.Add(new TObjString("wingding")); // 140
646  fgFontFileArray.Add(new TObjString("symbol")); // 150
647 
649  //"Extended" fonts for gl-pad.
650  //fgPadFontStart + ...
651  fgFontFileArray.Add(new TObjString("FreeSerifItalic.otf")); // 10 (160)
652  fgFontFileArray.Add(new TObjString("FreeSerifBold.otf")); // 20 (170)
653  fgFontFileArray.Add(new TObjString("FreeSerifBoldItalic.otf")); // 30
654 
655  fgFontFileArray.Add(new TObjString("FreeSans.otf")); // 40
656  fgFontFileArray.Add(new TObjString("FreeSansOblique.otf")); // 50
657  fgFontFileArray.Add(new TObjString("FreeSansBold.otf")); // 60
658  fgFontFileArray.Add(new TObjString("FreeSansBoldOblique.otf")); // 70
659 
660  fgFontFileArray.Add(new TObjString("FreeMono.otf")); // 80
661  fgFontFileArray.Add(new TObjString("FreeMonoOblique.otf")); // 90
662  fgFontFileArray.Add(new TObjString("FreeMonoBold.otf")); // 100
663  fgFontFileArray.Add(new TObjString("FreeMonoBoldOblique.otf")); // 110
664 
665  fgFontFileArray.Add(new TObjString("symbol.ttf")); // 120
666  fgFontFileArray.Add(new TObjString("FreeSerif.otf")); // 130
667  fgFontFileArray.Add(new TObjString("wingding.ttf")); // 140
668  fgFontFileArray.Add(new TObjString("symbol.ttf")); // 150
669 
670  fgFontFileArray.Add(new TObjString("STIXGeneral.otf")); // 200
671  fgFontFileArray.Add(new TObjString("STIXGeneralItalic.otf")); // 210
672  fgFontFileArray.Add(new TObjString("STIXGeneralBol.otf")); // 220
673  fgFontFileArray.Add(new TObjString("STIXGeneralBolIta.otf")); // 230
674 
675  fgFontFileArray.Add(new TObjString("STIXSiz1Sym.otf")); // 240
676  fgFontFileArray.Add(new TObjString("STIXSiz1SymBol.otf")); // 250
677  fgFontFileArray.Add(new TObjString("STIXSiz2Sym.otf")); // 260
678  fgFontFileArray.Add(new TObjString("STIXSiz2SymBol.otf")); // 270
679 
680  fgFontFileArray.Add(new TObjString("STIXSiz3Sym.otf")); // 280
681  fgFontFileArray.Add(new TObjString("STIXSiz3SymBol.otf")); // 290
682  fgFontFileArray.Add(new TObjString("STIXSiz4Sym.otf")); // 300
683  fgFontFileArray.Add(new TObjString("STIXSiz4SymBol.otf")); // 310
684 
685  fgFontFileArray.Add(new TObjString("STIXSiz5Sym.otf")); // 320
686  fgFontFileArray.Add(new TObjString("DroidSansFallback.ttf")); // 330
687  fgFontFileArray.Add(new TObjString("DroidSansFallback.ttf")); // 340
688  fgFontFileArray.Add(new TObjString("DroidSansFallback.ttf")); // 350
689 
690  for (Int_t i = 10; i <= 20; i+=2)
691  fgFontSizeArray.push_back(i);
692  for (Int_t i = 24; i <= 64; i+=4)
693  fgFontSizeArray.push_back(i);
694  for (Int_t i = 72; i <= 128; i+=8)
695  fgFontSizeArray.push_back(i);
696 
698 }
699 
700 ////////////////////////////////////////////////////////////////////////////////
701 /// Delete FTFFont objects registered for destruction.
702 
704 {
705  FontList_i it = fFontTrash.begin();
706  while (it != fFontTrash.end())
707  {
708  if ((*it)->IncTrashCount() > 10000)
709  {
710  FontMap_i mi = fFontMap.find(**it);
711  assert(mi != fFontMap.end());
712  fFontMap.erase(mi);
713  delete (*it)->GetFont();
714 
715  FontList_i li = it++;
716  fFontTrash.erase(li);
717  }
718  else
719  {
720  ++it;
721  }
722  }
723 }
An array of TObjects.
Definition: TObjArray.h:39
static Vc_ALWAYS_INLINE int_v min(const int_v &x, const int_v &y)
Definition: vector.h:433
Int_t GetSize() const
ClassImp(TSeqCollection) Int_t TSeqCollection TIter next(this)
Return index of object in collection.
static const char * GetFontNameFromId(Int_t)
Get font name from TAttAxis font id.
Collectable string class.
Definition: TObjString.h:32
float Float_t
Definition: RtypesCore.h:53
Int_t fSize
#define assert(cond)
Definition: unittest.h:542
FTFont * fFont
FontList_t fFontTrash
void ReleaseFont(TGLFont &font)
Release font with given attributes.
Basic string class.
Definition: TString.h:137
int Int_t
Definition: RtypesCore.h:41
bool Bool_t
Definition: RtypesCore.h:59
const Bool_t kFALSE
Definition: Rtypes.h:92
const char * Char
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
Definition: TSystem.cxx:1511
void CopyAttributes(const TGLFont &o)
Assignment operator.
static void InitStatics()
Create a list of available font files and allowed font sizes.
const char * String
Definition: TXMLSetup.cxx:94
const char * Data() const
Definition: TString.h:349
void RegisterFont(Int_t size, Int_t file, TGLFont::EMode mode, TGLFont &out)
Provide font with given size, file and FTGL class.
void 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.
Double_t x[n]
Definition: legend1.C:17
void Render(const char *txt, Double_t x, Double_t y, Double_t angle, Double_t mgn) const
static TObjArray fgFontFileArray
std::vector< Int_t > FontSizeVec_t
static Int_t GetFontSize(Int_t ds)
Get availabe font size.
Float_t GetLineHeight() const
Get font's line-height.
std::list< const TGLFont * >::iterator FontList_i
Int_t fTrashCount
void Error(const char *location, const char *msgfmt,...)
char * out
Definition: TBase64.cxx:29
EMode GetMode() const
R__EXTERN TSystem * gSystem
Definition: TSystem.h:549
virtual Int_t GetValue(const char *name, Int_t dflt)
Returns the integer value for a resource.
Definition: TEnv.cxx:494
Float_t GetAscent() const
Get font's ascent.
ClassImp(TGLFont)
void MeasureBaseLineParams(Float_t &ascent, Float_t &descent, Float_t &line_height, const char *txt="Xj") const
Measure font's base-line parameters from the passed text.
unsigned int UInt_t
Definition: RtypesCore.h:42
virtual void PostRender() const
Reset GL state after FTFont rendering.
Float_t fDepth
static Int_t fgExtendedFontStart
Float_t GetDescent() const
Get font's descent. The returned value is positive.
const FTFont * GetFont() const
void Warning(const char *location, const char *msgfmt,...)
TString & String()
Definition: TObjString.h:52
Int_t fFile
#define gVirtualX
Definition: TVirtualX.h:362
std::map< TGLFont, Int_t >::iterator FontMap_i
double f(double x)
double Double_t
Definition: RtypesCore.h:55
void SetManager(TGLFontManager *mng)
R__EXTERN TEnv * gEnv
Definition: TEnv.h:174
Double_t y[n]
Definition: legend1.C:17
Int_t GetFile() const
Int_t GetEntries() const
Return the number of objects in array (i.e.
Definition: TObjArray.cxx:493
TGLFontManager * fManager
static Bool_t fgStaticInitDone
static Vc_ALWAYS_INLINE int_v max(const int_v &x, const int_v &y)
Definition: vector.h:440
#define name(a, b)
Definition: linkTestLib0.cpp:5
void SetFont(FTFont *f)
virtual ~TGLFontManager()
Destructor.
FontMap_t fFontMap
EMode fMode
A FreeType GL font manager.
void RenderHelper(const Char *txt, Double_t x, Double_t y, Double_t angle, Double_t) const
mgn is simply ignored, because ROOT's TVirtualX TGX11 are complete mess with painting attributes...
TGLFont()
Constructor.
virtual void PreRender(Bool_t autoLight=kTRUE, Bool_t lightOn=kFALSE) const
Set-up GL state before FTFont rendering.
static FontSizeVec_t * GetFontSizeArray()
Get valid font size vector.
static FontSizeVec_t fgFontSizeArray
void Add(TObject *obj)
Definition: TObjArray.h:75
static TObjArray * GetFontFileArray()
Get id to file name map.
A wrapper class for FTFont.
static Int_t GetExtendedFontStartIndex()
const Bool_t kTRUE
Definition: Rtypes.h:91
void ClearFontTrash()
Delete FTFFont objects registered for destruction.
void SetDepth(Float_t d)
virtual ~TGLFont()
Destructor.
Int_t CeilNint(Double_t x)
Definition: TMath.h:470
Long64_t BinarySearch(Long64_t n, const T *array, T value)
Definition: TMath.h:944
const char * cnt
Definition: TXMLSetup.cxx:75