18 # include <ft2build.h>
19 # include FT_FREETYPE_H
28 #include <fontconfig/fontconfig.h>
72 Error(
"TTF::Init",
"error initializing FreeType");
79 FcConfigAppFontAddDir (
NULL, (
const FcChar8*)ttpath);
110 if (!
fgFace[fgCurFontIdx])
return 0;
112 for (i = 0; i <
n; i++) {
113 if (!
fgFace[fgCurFontIdx])
continue;
115 platform = charmap->platform_id;
116 encoding = charmap->encoding_id;
117 if ((platform == 3 && encoding == 1 &&
121 (platform == 0 && encoding == 0) ||
122 (platform == 7 && encoding == 2 &&
126 (platform == 1 && encoding == 0 &&
133 Error(
"TTF::CharToUnicode",
"error in FT_Set_CharMap");
134 return FT_Get_Char_Index(
fgFace[fgCurFontIdx], (FT_ULong)code);
138 return FT_Get_Char_Index(
fgFace[fgCurFontIdx], (FT_ULong)code);
198 FT_UInt prev_index = 0;
203 load_flags = FT_LOAD_DEFAULT;
204 if (!
fgHinting) load_flags |= FT_LOAD_NO_HINTING;
216 fgHinting ? ft_kerning_default : ft_kerning_unfitted,
220 prev_index = glyph->
fIndex;
234 if (FT_Get_Glyph (
fgFace[fgCurFontIdx]->glyph, &glyph->
fImage))
237 glyph->
fPos = origin;
248 FT_Glyph_Get_CBox(glyph->
fImage, ft_glyph_bbox_pixels, &bbox);
261 const unsigned char *p = (
const unsigned char*)
string;
287 FT_UInt load_flags = FT_LOAD_DEFAULT;
288 if (!
fgHinting) load_flags |= FT_LOAD_NO_HINTING;
299 const wchar_t *p = string;
325 FT_UInt load_flags = FT_LOAD_DEFAULT;
326 if (!
fgHinting) load_flags |= FT_LOAD_NO_HINTING;
354 #if defined(FREETYPE_PATCH) && \
355 (FREETYPE_MAJOR == 2) && (FREETYPE_MINOR == 1) && (FREETYPE_PATCH == 2)
391 if (!fontname || !fontname[0]) {
393 "no font name specified, using default font");
399 if (strcmp(basename,
"timesi.ttf") == 0 ||
400 strcmp(basename,
"FreeSerifItalic.otf") == 0) {
403 else if (strcmp(basename,
"timesbd.ttf") == 0 ||
404 strcmp(basename,
"FreeSerifBold.otf") == 0) {
407 else if (strcmp(basename,
"timesbi.ttf") == 0 ||
408 strcmp(basename,
"FreeSerifBoldItalic.otf") == 0) {
411 else if (strcmp(basename,
"arial.ttf") == 0 ||
412 strcmp(basename,
"FreeSans.otf") == 0) {
415 else if (strcmp(basename,
"ariali.ttf") == 0 ||
416 strcmp(basename,
"FreeSansOblique.otf") == 0) {
419 else if (strcmp(basename,
"arialbd.ttf") == 0 ||
420 strcmp(basename,
"FreeSansBold.otf") == 0) {
423 else if (strcmp(basename,
"arialbi.ttf") == 0 ||
424 strcmp(basename,
"FreeSansBoldOblique.otf") == 0) {
427 else if (strcmp(basename,
"cour.ttf") == 0 ||
428 strcmp(basename,
"FreeMono.otf") == 0) {
431 else if (strcmp(basename,
"couri.ttf") == 0 ||
432 strcmp(basename,
"FreeMonoOblique.otf") == 0) {
435 else if (strcmp(basename,
"courbd.ttf") == 0 ||
436 strcmp(basename,
"FreeMonoBold.otf") == 0) {
439 else if (strcmp(basename,
"courbi.ttf") == 0 ||
440 strcmp(basename,
"FreeMonoBoldOblique.otf") == 0) {
443 else if (strcmp(basename,
"symbol.ttf") == 0) {
449 else if (strcmp(basename,
"times.ttf") == 0 ||
450 strcmp(basename,
"FreeSerif.otf") == 0) {
453 else if (strcmp(basename,
"wingding.ttf") == 0) {
456 else if (strcmp(basename,
"STIXGeneral.otf") == 0) {
459 else if (strcmp(basename,
"STIXGeneralItalic.otf") == 0) {
462 else if (strcmp(basename,
"STIXGeneralBol.otf") == 0) {
465 else if (strcmp(basename,
"STIXGeneralBolIta.otf") == 0) {
468 else if (strcmp(basename,
"STIXSiz1Sym.otf") == 0) {
471 else if (strcmp(basename,
"STIXSiz1SymBol.otf") == 0) {
474 else if (strcmp(basename,
"STIXSiz2Sym.otf") == 0) {
477 else if (strcmp(basename,
"STIXSiz2SymBol.otf") == 0) {
480 else if (strcmp(basename,
"STIXSiz3Sym.otf") == 0) {
483 else if (strcmp(basename,
"STIXSiz3SymBol.otf") == 0) {
486 else if (strcmp(basename,
"STIXSiz4Sym.otf") == 0) {
489 else if (strcmp(basename,
"STIXSiz4SymBol.otf") == 0) {
492 else if (strcmp(basename,
"STIXSiz5Sym.otf") == 0) {
495 else if (strcmp(basename,
"DroidSansFallback.ttf") == 0) {
499 Error(
"TTF::SetTextFont",
"font %s not known to ROOT", basename);
501 Warning(
"TTF::SetTextFont",
"using default font");
515 int fontid = fontnumber / 10;
516 if (fontid < 0 || fontid > 31) fontid = 0;
519 if (fontid==15) italic = 1;
539 Error(
"TTF::SetTextFont",
"too many fonts opened (increase kTTMaxFont = %d)",
541 Warning(
"TTF::SetTextFont",
"using default font");
549 FcPattern *pat, *match;
550 FcCharSet *set =
NULL;
553 pat = FcPatternCreate ();
557 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freeserif");
558 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
559 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
562 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freeserif");
563 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
564 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
567 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freeserif");
568 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
569 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
572 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freesans");
573 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
574 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
577 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freesans");
578 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
579 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
582 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freesans");
583 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
584 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
587 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freesans");
588 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
589 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
592 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freemono");
593 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
594 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
597 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freemono");
598 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
599 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
602 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freemono");
603 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
604 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
607 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freemono");
608 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
609 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
613 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"symbol");
614 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
615 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
618 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"freeserif");
619 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
620 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
623 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"dingbats");
624 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
625 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
628 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixgeneral");
629 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
630 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
633 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixgeneral");
634 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
635 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
638 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixgeneral");
639 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
640 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
643 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixgeneral");
644 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
645 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
648 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize1");
649 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
650 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
653 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize1");
654 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
655 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
658 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize2");
659 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
660 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
663 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize2");
664 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
665 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
668 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize3");
669 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
670 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
673 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize3");
674 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
675 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
678 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize4");
679 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
680 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
683 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize4");
684 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
685 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
688 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"stixsize5");
689 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
690 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
695 FcPatternAddString (pat, FC_FAMILY, (
const FcChar8*)
"droidsansfallback");
696 FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
697 FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
698 set = FcCharSetCreate ();
699 FcCharSetAddChar (set, 0x0410);
700 FcCharSetAddChar (set, 0x4e00);
701 FcPatternAddCharSet (pat, FC_CHARSET, set);
704 Error(
"TTF::SetTextFont",
"font %i not known to ROOT", fontid);
705 FcPatternDestroy (pat);
706 Warning(
"TTF::SetTextFont",
"using default font");
712 FcConfigSubstitute (
NULL, pat, FcMatchPattern);
713 FcDefaultSubstitute (pat);
714 match = FcFontMatch (
NULL, pat, &result);
716 FcPatternGetString (match, FC_FILE, 0, (FcChar8**)&ttfnt);
718 FcPatternGetInteger (match, FC_INDEX, 0, &ttindex);
719 FcPatternDestroy (match);
720 FcPatternDestroy (pat);
721 if (set) FcCharSetDestroy (set);
725 if (FT_New_Face(
fgLibrary, ttfont, ttindex, &tface)) {
726 Error(
"TTF::SetTextFont",
"error loading font %s", ttfont);
728 if (tface) FT_Done_Face(tface);
729 Warning(
"TTF::SetTextFont",
"using default font");
744 slantMat.xx = (1 << 16);
745 slantMat.xy = ((1 << 16) >> 2);
747 slantMat.yy = (1 << 16);
758 if (textsize < 0)
return;
761 Error(
"TTF::SetTextSize",
"current font index out of bounds");
768 Error(
"TTF::SetTextSize",
"error in FT_Set_Char_Size");
775 FT_Library_Version(
fgLibrary, &major, &minor, &patch);
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
static void Init()
Initialise the TrueType fonts interface.
static const TString & GetTTFFontDir()
Get the fonts directory in the installation. Static utility function.
FT_Vector fPos
position of glyph origin
static FT_Matrix * fgRotMatrix
rotation matrix
static Int_t fgFontCount
number of fonts loaded
static Bool_t IsInitialized()
FT_Glyph fImage
glyph image
static void Cleanup()
Cleanup. Is called by the gCleanupTTF destructor.
Interface to the freetype 2 library.
static void Version(Int_t &major, Int_t &minor, Int_t &patch)
UInt_t fIndex
glyph index in face
static FT_CharMap fgCharMap[kTTMaxFonts]
font character map
static Int_t fgAscent
string ascent, used to compute Y alignment
static TTF::TTGlyph fgGlyphs[kMaxGlyphs]
glyphs
static void LayoutGlyphs()
Compute the glyphs positions, fgAscent and fgWidth (needed for alignment).
static Bool_t GetHinting()
static void SetTextFont(Font_t fontnumber)
static void GetTextExtent(UInt_t &w, UInt_t &h, char *text)
Get width (w) and height (h) when text is horizontal.
static void PrepareString(const char *string)
Put the characters in "string" in the "glyphs" array.
static FT_BBox fgCBox
string control box
static void GetTextAdvance(UInt_t &a, char *text)
Get advance (a) when text is horizontal.
static TTGlyph * GetGlyphs()
void Error(const char *location, const char *msgfmt,...)
static Int_t fgTBlankW
trailing blanks width
static void SetSmoothing(Bool_t state)
Set smoothing (anti-aliasing) flag.
static Int_t fgCurFontIdx
current font index
static FT_Library fgLibrary
FreeType font library.
R__EXTERN TSystem * gSystem
virtual Int_t GetValue(const char *name, Int_t dflt)
Returns the integer value for a resource.
static Bool_t GetKerning()
static Int_t fgFontID[kTTMaxFonts]
font ID
static Bool_t fgKerning
use kerning (true by default)
static Bool_t fgInit
true if the Init has been called
static FT_Matrix * GetRotMatrix()
TTF helper class containing glyphs description.
static void SetHinting(Bool_t state)
Set hinting flag.
void Warning(const char *location, const char *msgfmt,...)
static void SetKerning(Bool_t state)
Set kerning flag.
char * StrDup(const char *str)
Duplicate the string str.
static Bool_t fgHinting
use hinting (true by default)
static Bool_t fgSmoothing
use anti-aliasing (true when >8 planes, false otherwise)
static void SetRotationMatrix(Float_t angle)
Set the rotation matrix used to rotate the font outlines.
Short_t Max(Short_t a, Short_t b)
static FT_Face fgFace[kTTMaxFonts]
font face
static Int_t fgNumGlyphs
number of glyphs in the string
static void SetTextSize(Float_t textsize)
Set current text size.
static Short_t CharToUnicode(UInt_t code)
Map char to unicode. Returns 0 in case no mapping exists.
static Int_t GetNumGlyphs()
static Int_t fgWidth
string width, used to compute X alignment
static const FT_BBox & GetBox()
static Bool_t GetSmoothing()