13 #include "RConfigure.h" 29 # include <FTGL/ftgl.h> 32 # include "FTGLExtrdFont.h" 33 # include "FTGLOutlineFont.h" 34 # include "FTGLPolygonFont.h" 35 # include "FTGLTextureFont.h" 36 # include "FTGLPixmapFont.h" 37 # include "FTGLBitmapFont.h" 40 #include <fontconfig/fontconfig.h> 55 fFont(0), fManager(0), fDepth(0),
56 fSize(0), fFile(0), fMode(
kUndef),
119 return fFont->Ascender();
127 return -
fFont->Descender();
135 return fFont->LineHeight();
144 const char* txt)
const 147 const_cast<FTFont*
>(
fFont)->
BBox(txt, dum, lly, dum, dum, ury, dum);
150 line_height = ury - lly;
161 const_cast<FTFont*
>(
fFont)->
BBox(txt, llx, lly, llz, urx, ury, urz);
172 const_cast<FTFont*
>(
fFont)->
BBox(txt, llx, lly, llz, urx, ury, urz);
186 Float_t llx = 0.f, lly = 0.f, llz = 0.f, urx = 0.f, ury = 0.f, urz = 0.f;
187 BBox(txt, llx, lly, llz, urx, ury, urz);
198 const Double_t dx = urx - llx, dy = ury - lly;
206 if (
gVirtualX->InheritsFrom(
"TGCocoa")) {
265 glTranslated(x, y, 0.);
266 glRotated(angle, 0., 0., 1.);
267 glTranslated(xc, yc, 0.);
268 glTranslated(-0.5 * dx, -0.5 * dy, 0.);
320 glTranslatef(x, y, z);
323 Float_t llx, lly, llz, urx, ury, urz;
324 BBox(txt, llx, lly, llz, urx, ury, urz);
354 glBitmap(0, 0, 0, 0, x, y, 0);
358 glTranslatef(x, y, 0);
373 glPushAttrib(GL_CURRENT_BIT | GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT);
374 glEnable(GL_ALPHA_TEST);
375 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
376 glAlphaFunc(GL_GEQUAL, 0.0625);
379 glPushAttrib(GL_POLYGON_BIT | GL_ENABLE_BIT);
380 glEnable(GL_TEXTURE_2D);
381 glDisable(GL_CULL_FACE);
382 glEnable(GL_ALPHA_TEST);
383 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
384 glAlphaFunc(GL_GEQUAL, 0.0625);
389 glPushAttrib(GL_POLYGON_BIT | GL_ENABLE_BIT);
390 glEnable(GL_NORMALIZE);
391 glDisable(GL_CULL_FACE);
394 Warning(
"TGLFont::PreRender",
"Font mode undefined.");
395 glPushAttrib(GL_LIGHTING_BIT);
400 glEnable(GL_LIGHTING);
402 glDisable(GL_LIGHTING);
434 while (it != fFontMap.end()) {
435 delete it->first.GetFont();
446 if (fgStaticInitDone ==
kFALSE) InitStatics();
448 Int_t size = GetFontSize(sizeIn);
453 if (it == fFontMap.end())
458 FcPattern *pat, *match;
459 FcCharSet *
set =
NULL;
462 pat = FcPatternCreate ();
466 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freeserif");
467 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
468 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
471 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freeserif");
472 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
473 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
476 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freeserif");
477 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
478 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
481 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freesans");
482 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
483 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
486 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freesans");
487 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
488 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
491 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freesans");
492 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
493 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
496 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freesans");
497 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
498 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
501 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freemono");
502 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
503 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
506 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freemono");
507 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
508 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
511 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freemono");
512 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
513 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
516 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freemono");
517 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
518 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
522 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"symbol");
523 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
524 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
527 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freeserif");
528 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
529 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
532 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"dingbats");
533 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
534 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
537 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixgeneral");
538 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
539 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
542 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixgeneral");
543 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
544 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
547 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixgeneral");
548 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
549 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
552 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixgeneral");
553 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
554 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
557 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize1");
558 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
559 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
562 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize1");
563 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
564 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
567 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize2");
568 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
569 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
572 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize2");
573 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
574 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
577 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize3");
578 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
579 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
582 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize3");
583 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
584 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
587 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize4");
588 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
589 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
592 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize4");
593 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
594 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
597 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize5");
598 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
599 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
604 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"droidsansfallback");
605 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
606 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
607 set = FcCharSetCreate ();
608 FcCharSetAddChar (
set, 0x0410);
609 FcCharSetAddChar (
set, 0x4e00);
610 FcPatternAddCharSet (pat, FC_CHARSET,
set);
613 FcConfigSubstitute (
NULL, pat, FcMatchPattern);
614 FcDefaultSubstitute (pat);
615 match = FcFontMatch (
NULL, pat, &result);
617 FcPatternGetString (match, FC_FILE, 0, (FcChar8**)&ttfnt);
619 FcPatternGetInteger (match, FC_INDEX, 0, &ttindex);
620 FcPatternDestroy (match);
621 FcPatternDestroy (pat);
622 if (
set) FcCharSetDestroy (
set);
628 ftfont =
new FTGLBitmapFont(file);
631 ftfont =
new FTGLPixmapFont(file);
634 ftfont =
new FTGLOutlineFont(file);
637 ftfont =
new FTGLPolygonFont(file);
640 ftfont =
new FTGLExtrdFont(file);
641 ftfont->Depth(0.2*size);
644 ftfont =
new FTGLTextureFont(file);
648 Error(
"TGLFontManager::RegisterFont",
"invalid FTGL type");
655 ftfont->FaceSize(size);
656 const TGLFont &mf = fFontMap.insert(std::make_pair(
TGLFont(size, fileID, mode, ftfont, 0), 1)).first->first;
661 if (it->first.GetTrashCount() > 0) {
662 fFontTrash.remove(&(it->first));
663 it->first.SetTrashCount(0);
687 if (cnt < farr->GetEntries())
688 RegisterFont(size, cnt, mode, out);
690 Error(
"TGLFontManager::RegisterFont",
"unknown font name %s", name);
701 if (it != fFontMap.end())
706 assert(it->first.GetTrashCount() == 0);
707 it->first.IncTrashCount();
708 fFontTrash.push_back(&it->first);
718 if (fgStaticInitDone ==
kFALSE) InitStatics();
719 return &fgFontFileArray;
727 if (fgStaticInitDone ==
kFALSE) InitStatics();
728 return &fgFontSizeArray;
735 if (fgStaticInitDone ==
kFALSE) InitStatics();
737 return fgExtendedFontStart;
745 if (fgStaticInitDone ==
kFALSE) InitStatics();
750 if (idx < 0) idx = 0;
751 return fgFontSizeArray[idx];
759 if (ds < min) ds = min;
760 if (ds > max) ds = max;
761 return GetFontSize(ds);
769 if (fgStaticInitDone ==
kFALSE) InitStatics();
771 Int_t fontIndex =
id / 10;
773 if (fontIndex > fgFontFileArray.GetEntries() || !fontIndex)
787 fgFontFileArray.Add(
new TObjString(
"timesi"));
788 fgFontFileArray.Add(
new TObjString(
"timesbd"));
789 fgFontFileArray.Add(
new TObjString(
"timesbi"));
792 fgFontFileArray.Add(
new TObjString(
"ariali"));
793 fgFontFileArray.Add(
new TObjString(
"arialbd"));
794 fgFontFileArray.Add(
new TObjString(
"arialbi"));
798 fgFontFileArray.Add(
new TObjString(
"courbd"));
799 fgFontFileArray.Add(
new TObjString(
"courbi"));
801 fgFontFileArray.Add(
new TObjString(
"symbol"));
803 fgFontFileArray.Add(
new TObjString(
"wingding"));
804 fgFontFileArray.Add(
new TObjString(
"symbol"));
806 fgFontFileArray.Add(
new TObjString(
"STIXGeneral.otf"));
807 fgFontFileArray.Add(
new TObjString(
"STIXGeneralItalic.otf"));
808 fgFontFileArray.Add(
new TObjString(
"STIXGeneralBol.otf"));
809 fgFontFileArray.Add(
new TObjString(
"STIXGeneralBolIta.otf"));
811 fgFontFileArray.Add(
new TObjString(
"STIXSiz1Sym.otf"));
812 fgFontFileArray.Add(
new TObjString(
"STIXSiz1SymBol.otf"));
813 fgFontFileArray.Add(
new TObjString(
"STIXSiz2Sym.otf"));
814 fgFontFileArray.Add(
new TObjString(
"STIXSiz2SymBol.otf"));
816 fgFontFileArray.Add(
new TObjString(
"STIXSiz3Sym.otf"));
817 fgFontFileArray.Add(
new TObjString(
"STIXSiz3SymBol.otf"));
818 fgFontFileArray.Add(
new TObjString(
"STIXSiz4Sym.otf"));
819 fgFontFileArray.Add(
new TObjString(
"STIXSiz4SymBol.otf"));
821 fgFontFileArray.Add(
new TObjString(
"STIXSiz5Sym.otf"));
822 fgFontFileArray.Add(
new TObjString(
"DroidSansFallback.ttf"));
823 fgFontFileArray.Add(
new TObjString(
"DroidSansFallback.ttf"));
824 fgFontFileArray.Add(
new TObjString(
"DroidSansFallback.ttf"));
826 for (
Int_t i = 10; i <= 20; i+=2)
827 fgFontSizeArray.push_back(i);
828 for (
Int_t i = 24; i <= 64; i+=4)
829 fgFontSizeArray.push_back(i);
830 for (
Int_t i = 72; i <= 128; i+=8)
831 fgFontSizeArray.push_back(i);
833 fgStaticInitDone =
kTRUE;
842 while (it != fFontTrash.end())
844 if ((*it)->IncTrashCount() > 10000)
847 assert(mi != fFontMap.end());
849 delete (*it)->GetFont();
852 fFontTrash.erase(li);
static const char * GetFontNameFromId(Int_t)
Get font name from TAttAxis font id.
Collectable string class.
void ReleaseFont(TGLFont &font)
Release font with given attributes.
void CopyAttributes(const TGLFont &o)
Assignment operator.
static void InitStatics()
Create a list of available font files and allowed font sizes.
const char * Data() const
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.
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
void Error(const char *location, const char *msgfmt,...)
Float_t GetAscent() const
Get font's ascent.
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.
virtual void PostRender() const
Reset GL state after FTFont rendering.
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,...)
char * StrDup(const char *str)
Duplicate the string str.
std::map< TGLFont, Int_t >::iterator FontMap_i
void SetManager(TGLFontManager *mng)
TGLFontManager * fManager
static Bool_t fgStaticInitDone
virtual ~TGLFontManager()
Destructor.
you should not use this method at all Int_t Int_t z
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...
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
static TObjArray * GetFontFileArray()
Get id to file name map.
A wrapper class for FTFont.
static Int_t GetExtendedFontStartIndex()
void ClearFontTrash()
Delete FTFFont objects registered for destruction.
virtual ~TGLFont()
Destructor.
Int_t CeilNint(Double_t x)
Long64_t BinarySearch(Long64_t n, const T *array, T value)