1fd9670
diff -ur root-6.24.02.orig/core/base/src/TApplication.cxx root-6.24.02/core/base/src/TApplication.cxx
1fd9670
--- root-6.24.02.orig/core/base/src/TApplication.cxx	2021-06-28 11:17:14.000000000 +0200
1fd9670
+++ root-6.24.02/core/base/src/TApplication.cxx	2021-08-11 10:49:08.583579248 +0200
1fd9670
@@ -265,18 +265,11 @@
16e38e1
    LoadGraphicsLibs();
16e38e1
 
16e38e1
    // Try to load TrueType font renderer. Only try to load if not in batch
16e38e1
-   // mode and Root.UseTTFonts is true and Root.TTFontPath exists. Abort silently
16e38e1
+   // mode and Root.UseTTFonts is true. Abort silently
16e38e1
    // if libttf or libGX11TTF are not found in $ROOTSYS/lib or $ROOTSYS/ttf/lib.
16e38e1
-   const char *ttpath = gEnv->GetValue("Root.TTFontPath",
16e38e1
-                                       TROOT::GetTTFFontDir());
16e38e1
-   char *ttfont = gSystem->Which(ttpath, "arialbd.ttf", kReadPermission);
16e38e1
-   // Check for use of DFSG - fonts
16e38e1
-   if (!ttfont)
16e38e1
-      ttfont = gSystem->Which(ttpath, "FreeSansBold.ttf", kReadPermission);
16e38e1
-
16e38e1
 #if !defined(R__WIN32)
16e38e1
    if (!gROOT->IsBatch() && !strcmp(gVirtualX->GetName(), "X11") &&
16e38e1
-       ttfont && gEnv->GetValue("Root.UseTTFonts", 1)) {
16e38e1
+       gEnv->GetValue("Root.UseTTFonts", 1)) {
16e38e1
       if (gClassTable->GetDict("TGX11TTF")) {
16e38e1
          // in principle we should not have linked anything against libGX11TTF
16e38e1
          // but with ACLiC this can happen, initialize TGX11TTF by hand
1fd9670
@@ -290,7 +283,6 @@
16e38e1
       }
16e38e1
    }
16e38e1
 #endif
16e38e1
-   delete [] ttfont;
16e38e1
 
16e38e1
    // Create WM dependent application environment
16e38e1
    if (fAppImp)
1fd9670
diff -ur root-6.24.02.orig/graf2d/asimage/CMakeLists.txt root-6.24.02/graf2d/asimage/CMakeLists.txt
1fd9670
--- root-6.24.02.orig/graf2d/asimage/CMakeLists.txt	2021-06-28 11:17:14.000000000 +0200
1fd9670
+++ root-6.24.02/graf2d/asimage/CMakeLists.txt	2021-08-11 10:49:08.583579248 +0200
b2cd752
@@ -30,6 +30,7 @@
aff214e
     ${FREETYPE_LIBRARIES}
aff214e
     ${X11_LIBRARIES}
aff214e
     ZLIB::ZLIB
aff214e
+    fontconfig
aff214e
   DEPENDENCIES
aff214e
     Core
aff214e
     Graf
1fd9670
diff -ur root-6.24.02.orig/graf2d/asimage/src/TASImage.cxx root-6.24.02/graf2d/asimage/src/TASImage.cxx
1fd9670
--- root-6.24.02.orig/graf2d/asimage/src/TASImage.cxx	2021-06-28 11:17:14.000000000 +0200
1fd9670
+++ root-6.24.02/graf2d/asimage/src/TASImage.cxx	2021-08-11 10:49:08.585579253 +0200
1fd9670
@@ -112,6 +112,8 @@
ea3d333
 #   include <draw.h>
ea3d333
 }
ea3d333
 
ea3d333
+#include <fontconfig/fontconfig.h>
ea3d333
+
ea3d333
 // auxiliary functions for general polygon filling
ea3d333
 #include "TASPolyUtils.c"
ea3d333
 
1fd9670
@@ -2595,14 +2597,120 @@
ea3d333
    TString fn = font_name;
ea3d333
    fn.Strip();
ea3d333
 
ea3d333
-   // This is for backward compatibility...
ec7f16e
-   if (fn.Last('/') == 0) fn = fn(1, fn.Length() - 1);
ea3d333
+   const char *basename = gSystem->BaseName(fn);
ea3d333
+
ea3d333
+   char *ttfnt = NULL;
ea3d333
+   int ttindex = 0;
ea3d333
+
ea3d333
+   FcPattern *pat, *match;
ea3d333
+   FcResult result;
ea3d333
+
ea3d333
+   pat = FcPatternCreate ();
ea3d333
+
ea3d333
+   if (strcmp(basename, "timesi.ttf") == 0 ||
ea3d333
+       strcmp(basename, "FreeSerifItalic.otf") == 0) {
ea3d333
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
ea3d333
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
ea3d333
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
ea3d333
+   }
ea3d333
+   else if (strcmp(basename, "timesbd.ttf") == 0 ||
ea3d333
+            strcmp(basename, "FreeSerifBold.otf") == 0) {
ea3d333
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
ea3d333
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
ea3d333
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
ea3d333
+   }
ea3d333
+   else if (strcmp(basename, "timesbi.ttf") == 0 ||
ea3d333
+            strcmp(basename, "FreeSerifBoldItalic.otf") == 0) {
ea3d333
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
ea3d333
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
ea3d333
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
ea3d333
+   }
ea3d333
+   else if (strcmp(basename, "arial.ttf") == 0 ||
ea3d333
+            strcmp(basename, "FreeSans.otf") == 0) {
ea3d333
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
ea3d333
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
ea3d333
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
ea3d333
+   }
ea3d333
+   else if (strcmp(basename, "ariali.ttf") == 0 ||
ea3d333
+            strcmp(basename, "FreeSansOblique.otf") == 0) {
ea3d333
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
ea3d333
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
ea3d333
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
ea3d333
+   }
ea3d333
+   else if (strcmp(basename, "arialbd.ttf") == 0 ||
ea3d333
+            strcmp(basename, "FreeSansBold.otf") == 0) {
ea3d333
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
ea3d333
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
ea3d333
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
ea3d333
+   }
ea3d333
+   else if (strcmp(basename, "arialbi.ttf") == 0 ||
ea3d333
+            strcmp(basename, "FreeSansBoldOblique.otf") == 0) {
ea3d333
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
ea3d333
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
ea3d333
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
ea3d333
+   }
ea3d333
+   else if (strcmp(basename, "cour.ttf") == 0 ||
ea3d333
+            strcmp(basename, "FreeMono.otf") == 0) {
ea3d333
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
ea3d333
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
ea3d333
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
ea3d333
+   }
ea3d333
+   else if (strcmp(basename, "couri.ttf") == 0 ||
ea3d333
+            strcmp(basename, "FreeMonoOblique.otf") == 0) {
ea3d333
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
ea3d333
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
ea3d333
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
ea3d333
+   }
ea3d333
+   else if (strcmp(basename, "courbd.ttf") == 0 ||
ea3d333
+            strcmp(basename, "FreeMonoBold.otf") == 0) {
ea3d333
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
ea3d333
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
ea3d333
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
ea3d333
+   }
ea3d333
+   else if (strcmp(basename, "courbi.ttf") == 0 ||
ea3d333
+            strcmp(basename, "FreeMonoBoldOblique.otf") == 0) {
ea3d333
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
ea3d333
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
ea3d333
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
ea3d333
+   }
ea3d333
+   else if (strcmp(basename, "symbol.ttf") == 0) {
ea3d333
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"symbol");
ea3d333
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
ea3d333
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
ea3d333
+   }
ea3d333
+   else if (strcmp(basename, "times.ttf") == 0 ||
ea3d333
+            strcmp(basename, "FreeSerif.otf") == 0) {
ea3d333
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
ea3d333
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
ea3d333
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
ea3d333
+   }
ea3d333
+   else if (strcmp(basename, "wingding.ttf") == 0) {
ea3d333
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"dingbats");
ea3d333
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
ea3d333
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
ea3d333
+   }
ea3d333
+   else if (strcmp(basename, "BlackChancery.ttf") == 0) {
ea3d333
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"urwchanceryl");
ea3d333
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
ea3d333
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
ea3d333
+   }
ea3d333
+   else {
ea3d333
+      Warning("DrawText", "cannot find a font %s", font_name);
ea3d333
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
ea3d333
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
ea3d333
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
ea3d333
+   }
ea3d333
+
ea3d333
+   FcConfigSubstitute (NULL, pat, FcMatchPattern);
ea3d333
+   FcDefaultSubstitute (pat);
ea3d333
+   match = FcFontMatch (NULL, pat, &result);
ea3d333
+   FcPatternGetString (match, FC_FILE, 0, (FcChar8**)&ttfnt);
ea3d333
+   FcPatternGetInteger (match, FC_INDEX, 0, &ttindex);
ea3d333
 
ea3d333
-   const char *ttpath = gEnv->GetValue("Root.TTFontPath",
ea3d333
-                                       TROOT::GetTTFFontDir());
ea3d333
-   char *tmpstr = gSystem->Which(ttpath, fn, kReadPermission);
ea3d333
-   fn = tmpstr;
ea3d333
-   delete [] tmpstr;
ea3d333
+   fn = ttfnt;
ea3d333
+
ea3d333
+   FcPatternDestroy (match);
ea3d333
+   FcPatternDestroy (pat);
ea3d333
 
ea3d333
    if (fn.EndsWith(".pfa") || fn.EndsWith(".PFA") || fn.EndsWith(".pfb") || fn.EndsWith(".PFB") || fn.EndsWith(".ttf") || fn.EndsWith(".TTF") || fn.EndsWith(".otf") || fn.EndsWith(".OTF")) {
ea3d333
       ttfont = kTRUE;
1fd9670
@@ -2626,14 +2734,11 @@
ea3d333
       return;
ea3d333
    }
ea3d333
 
ea3d333
-   ASFont *font = get_asfont(gFontManager, fn.Data(), 0, size, ASF_GuessWho);
ea3d333
+   ASFont *font = get_asfont(gFontManager, fn.Data(), ttindex, size, ASF_GuessWho);
ea3d333
 
ea3d333
    if (!font) {
ea3d333
-      font = get_asfont(gFontManager, "fixed", 0, size, ASF_GuessWho);
ea3d333
-      if (!font) {
ea3d333
-         Warning("DrawText", "cannot find a font %s", font_name);
ea3d333
-         return;
ea3d333
-      }
ea3d333
+      Warning("DrawText", "cannot find a font %s", font_name);
ea3d333
+      return;
ea3d333
    }
ea3d333
 
ea3d333
    get_text_size(text, font, (ASText3DType)type, &width, &height);
1fd9670
diff -ur root-6.24.02.orig/graf2d/graf/CMakeLists.txt root-6.24.02/graf2d/graf/CMakeLists.txt
1fd9670
--- root-6.24.02.orig/graf2d/graf/CMakeLists.txt	2021-06-28 11:17:14.000000000 +0200
1fd9670
+++ root-6.24.02/graf2d/graf/CMakeLists.txt	2021-08-11 10:49:08.586579256 +0200
b2cd752
@@ -91,6 +91,7 @@
aff214e
     ${FREETYPE_LIBRARIES}
aff214e
     ZLIB::ZLIB
aff214e
     mathtext
aff214e
+    fontconfig
aff214e
   DEPENDENCIES
aff214e
     Hist
aff214e
     Matrix
1fd9670
diff -ur root-6.24.02.orig/graf2d/graf/inc/TTF.h root-6.24.02/graf2d/graf/inc/TTF.h
1fd9670
--- root-6.24.02.orig/graf2d/graf/inc/TTF.h	2021-06-28 11:17:14.000000000 +0200
1fd9670
+++ root-6.24.02/graf2d/graf/inc/TTF.h	2021-08-11 10:49:08.586579256 +0200
7236b9a
@@ -76,9 +76,8 @@
ea3d333
    static FT_BBox        fgCBox;                  ///< string control box
ea3d333
    static FT_CharMap     fgCharMap[kTTMaxFonts];  ///< font character map
ea3d333
    static Int_t          fgCurFontIdx;            ///< current font index
ea3d333
-   static Int_t          fgSymbItaFontIdx;        ///< Symbol italic font index
ea3d333
    static Int_t          fgFontCount;             ///< number of fonts loaded
ea3d333
-   static char          *fgFontName[kTTMaxFonts]; ///< font name
ea3d333
+   static Int_t          fgFontID[kTTMaxFonts];   ///< font ID
ea3d333
    static FT_Face        fgFace[kTTMaxFonts];     ///< font face
ea3d333
    static TTF::TTGlyph   fgGlyphs[kMaxGlyphs];    ///< glyphs
ea3d333
    static Bool_t         fgHinting;               ///< use hinting (true by default)
1fd9670
diff -ur root-6.24.02.orig/graf2d/graf/src/TTF.cxx root-6.24.02/graf2d/graf/src/TTF.cxx
1fd9670
--- root-6.24.02.orig/graf2d/graf/src/TTF.cxx	2021-06-28 11:17:14.000000000 +0200
1fd9670
+++ root-6.24.02/graf2d/graf/src/TTF.cxx	2021-08-11 10:49:08.587579259 +0200
16e38e1
@@ -25,6 +25,8 @@
16e38e1
 #include "TMath.h"
16e38e1
 #include "TError.h"
16e38e1
 
16e38e1
+#include <fontconfig/fontconfig.h>
16e38e1
+
16e38e1
 // to scale fonts to the same size as the old TT version
16e38e1
 const Float_t kScale = 0.93376068;
16e38e1
 
16e38e1
@@ -38,10 +40,9 @@
16e38e1
 Int_t          TTF::fgWidth          = 0;
16e38e1
 Int_t          TTF::fgAscent         = 0;
16e38e1
 Int_t          TTF::fgCurFontIdx     = -1;
16e38e1
-Int_t          TTF::fgSymbItaFontIdx = -1;
16e38e1
 Int_t          TTF::fgFontCount      = 0;
16e38e1
 Int_t          TTF::fgNumGlyphs      = 0;
16e38e1
-char          *TTF::fgFontName[kTTMaxFonts];
16e38e1
+Int_t          TTF::fgFontID[kTTMaxFonts];
1361b0d
 FT_Matrix     *TTF::fgRotMatrix      = nullptr;
16e38e1
 FT_Library     TTF::fgLibrary;
16e38e1
 FT_BBox        TTF::fgCBox;
16e38e1
@@ -72,6 +73,11 @@
16e38e1
       return;
16e38e1
    }
16e38e1
 
16e38e1
+   // Add root's font directory
16e38e1
+   const char *ttpath = gEnv->GetValue("Root.TTFontPath",
16e38e1
+                                       TROOT::GetTTFFontDir());
16e38e1
+   FcConfigAppFontAddDir (NULL, (const FcChar8*)ttpath);
16e38e1
+
16e38e1
    // load default font (arialbd)
16e38e1
    SetTextFont(62);
16e38e1
 }
16e38e1
@@ -84,7 +90,6 @@
16e38e1
    if (!fgInit) return;
16e38e1
 
16e38e1
    for (int i = 0; i < fgFontCount; i++) {
16e38e1
-      delete [] fgFontName[i];
16e38e1
       FT_Done_Face(fgFace[i]);
16e38e1
    }
16e38e1
    if (fgRotMatrix) delete fgRotMatrix;
16e38e1
@@ -109,12 +114,19 @@
16e38e1
          charmap  = fgFace[fgCurFontIdx]->charmaps[i];
16e38e1
          platform = charmap->platform_id;
16e38e1
          encoding = charmap->encoding_id;
16e38e1
-         if ((platform == 3 && encoding == 1) ||
16e38e1
+         if ((platform == 3 && encoding == 1 &&
16e38e1
+              (fgFontID[fgCurFontIdx] != 12 &&
16e38e1
+               fgFontID[fgCurFontIdx] != 14 &&
16e38e1
+               fgFontID[fgCurFontIdx] != 15)) ||
16e38e1
              (platform == 0 && encoding == 0) ||
16e38e1
+             (platform == 7 && encoding == 2 &&
16e38e1
+              (fgFontID[fgCurFontIdx] == 12 ||
16e38e1
+               fgFontID[fgCurFontIdx] == 14 ||
16e38e1
+               fgFontID[fgCurFontIdx] == 15)) ||
16e38e1
              (platform == 1 && encoding == 0 &&
16e38e1
-              !strcmp(fgFontName[fgCurFontIdx], "wingding.ttf")) ||
16e38e1
-             (platform == 1 && encoding == 0 &&
16e38e1
-              !strcmp(fgFontName[fgCurFontIdx], "symbol.ttf")))
16e38e1
+              (fgFontID[fgCurFontIdx] == 12 ||
16e38e1
+               fgFontID[fgCurFontIdx] == 14 ||
16e38e1
+               fgFontID[fgCurFontIdx] == 15)))
16e38e1
          {
16e38e1
             fgCharMap[fgCurFontIdx] = charmap;
16e38e1
             if (FT_Set_Charmap(fgFace[fgCurFontIdx], fgCharMap[fgCurFontIdx]))
1361b0d
@@ -381,27 +393,147 @@
16e38e1
 
16e38e1
    if (!fontname || !fontname[0]) {
16e38e1
       Warning("TTF::SetTextFont",
16e38e1
-              "no font name specified, using default font %s", fgFontName[0]);
16e38e1
+              "no font name specified, using default font");
16e38e1
       fgCurFontIdx = 0;
16e38e1
       return 0;
16e38e1
    }
16e38e1
    const char *basename = gSystem->BaseName(fontname);
16e38e1
 
16e38e1
+   if (strcmp(basename, "timesi.ttf") == 0 ||
16e38e1
+       strcmp(basename, "FreeSerifItalic.otf") == 0) {
16e38e1
+      SetTextFont(12);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "timesbd.ttf") == 0 ||
16e38e1
+            strcmp(basename, "FreeSerifBold.otf") == 0) {
16e38e1
+      SetTextFont(22);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "timesbi.ttf") == 0 ||
16e38e1
+            strcmp(basename, "FreeSerifBoldItalic.otf") == 0) {
16e38e1
+      SetTextFont(32);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "arial.ttf") == 0 ||
16e38e1
+            strcmp(basename, "FreeSans.otf") == 0) {
16e38e1
+      SetTextFont(42);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "ariali.ttf") == 0 ||
16e38e1
+            strcmp(basename, "FreeSansOblique.otf") == 0) {
16e38e1
+      SetTextFont(52);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "arialbd.ttf") == 0 ||
16e38e1
+            strcmp(basename, "FreeSansBold.otf") == 0) {
16e38e1
+      SetTextFont(62);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "arialbi.ttf") == 0 ||
16e38e1
+            strcmp(basename, "FreeSansBoldOblique.otf") == 0) {
16e38e1
+      SetTextFont(72);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "cour.ttf") == 0 ||
16e38e1
+            strcmp(basename, "FreeMono.otf") == 0) {
16e38e1
+      SetTextFont(82);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "couri.ttf") == 0 ||
16e38e1
+            strcmp(basename, "FreeMonoOblique.otf") == 0) {
16e38e1
+      SetTextFont(92);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "courbd.ttf") == 0 ||
16e38e1
+            strcmp(basename, "FreeMonoBold.otf") == 0) {
16e38e1
+      SetTextFont(102);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "courbi.ttf") == 0 ||
16e38e1
+            strcmp(basename, "FreeMonoBoldOblique.otf") == 0) {
16e38e1
+      SetTextFont(112);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "symbol.ttf") == 0) {
16e38e1
+      if (italic)
16e38e1
+         SetTextFont(152);
16e38e1
+      else
16e38e1
+         SetTextFont(122);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "times.ttf") == 0 ||
16e38e1
+            strcmp(basename, "FreeSerif.otf") == 0) {
16e38e1
+      SetTextFont(132);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "wingding.ttf") == 0) {
16e38e1
+      SetTextFont(142);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "STIXGeneral.otf") == 0) {
16e38e1
+      SetTextFont(162);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "STIXGeneralItalic.otf") == 0) {
16e38e1
+      SetTextFont(172);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "STIXGeneralBol.otf") == 0) {
16e38e1
+      SetTextFont(182);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "STIXGeneralBolIta.otf") == 0) {
16e38e1
+      SetTextFont(192);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "STIXSiz1Sym.otf") == 0) {
16e38e1
+      SetTextFont(202);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "STIXSiz1SymBol.otf") == 0) {
16e38e1
+      SetTextFont(212);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "STIXSiz2Sym.otf") == 0) {
16e38e1
+      SetTextFont(222);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "STIXSiz2SymBol.otf") == 0) {
16e38e1
+      SetTextFont(232);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "STIXSiz3Sym.otf") == 0) {
16e38e1
+      SetTextFont(242);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "STIXSiz3SymBol.otf") == 0) {
16e38e1
+      SetTextFont(252);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "STIXSiz4Sym.otf") == 0) {
16e38e1
+      SetTextFont(262);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "STIXSiz4SymBol.otf") == 0) {
16e38e1
+      SetTextFont(272);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "STIXSiz5Sym.otf") == 0) {
16e38e1
+      SetTextFont(282);
16e38e1
+   }
16e38e1
+   else if (strcmp(basename, "DroidSansFallback.ttf") == 0) {
16e38e1
+      SetTextFont(292);
16e38e1
+   }
16e38e1
+   else {
16e38e1
+      Error("TTF::SetTextFont", "font %s not known to ROOT", basename);
16e38e1
+      if (fgFontCount) {
16e38e1
+         Warning("TTF::SetTextFont", "using default font");
16e38e1
+         fgCurFontIdx = 0;    // use font 0 (default font, set in ctor)
16e38e1
+         return 0;
16e38e1
+      } else {
16e38e1
+         return 1;
16e38e1
+      }
16e38e1
+   }
16e38e1
+
16e38e1
+   return 0;
16e38e1
+}
16e38e1
+
16e38e1
+//______________________________________________________________________________
16e38e1
+void TTF::SetTextFont(Font_t fontnumber)
16e38e1
+{
16e38e1
+   int fontid = fontnumber / 10;
16e38e1
+   if (fontid < 0 || fontid > 31) fontid = 0;
16e38e1
+
16e38e1
+   Int_t italic = 0;
16e38e1
+   if (fontid==15) italic = 1;
16e38e1
+
16e38e1
+   if (!fgInit) Init();
16e38e1
+
16e38e1
+   if (fontid == 0) {
16e38e1
+      fgCurFontIdx = 0;  // use font 0 (default font, set in ctor)
16e38e1
+      return;
16e38e1
+   }
16e38e1
+
16e38e1
    // check if font is in cache
16e38e1
    int i;
16e38e1
    for (i = 0; i < fgFontCount; i++) {
16e38e1
-      if (!strcmp(fgFontName[i], basename)) {
16e38e1
-         if (italic) {
16e38e1
-            if (i==fgSymbItaFontIdx) {
16e38e1
-               fgCurFontIdx = i;
16e38e1
-               return 0;
16e38e1
-            }
16e38e1
-         } else {
16e38e1
-            if (i!=fgSymbItaFontIdx) {
16e38e1
-               fgCurFontIdx = i;
16e38e1
-               return 0;
16e38e1
-            }
16e38e1
-         }
16e38e1
+      if (fgFontID[i] == fontid) {
16e38e1
+         fgCurFontIdx = i;
16e38e1
+         return;
16e38e1
       }
16e38e1
    }
16e38e1
 
1361b0d
@@ -409,151 +541,215 @@
16e38e1
    if (fgFontCount >= kTTMaxFonts) {
16e38e1
       Error("TTF::SetTextFont", "too many fonts opened (increase kTTMaxFont = %d)",
16e38e1
             kTTMaxFonts);
16e38e1
-      Warning("TTF::SetTextFont", "using default font %s", fgFontName[0]);
16e38e1
+      Warning("TTF::SetTextFont", "using default font");
16e38e1
       fgCurFontIdx = 0;    // use font 0 (default font, set in ctor)
16e38e1
-      return 0;
16e38e1
+      return;
16e38e1
    }
16e38e1
 
16e38e1
-   // try to load font (font must be in Root.TTFontPath resource)
16e38e1
-   const char *ttpath = gEnv->GetValue("Root.TTFontPath",
16e38e1
-                                       TROOT::GetTTFFontDir());
16e38e1
-   char *ttfont = gSystem->Which(ttpath, fontname, kReadPermission);
16e38e1
+   char *ttfont = NULL;
16e38e1
+   int ttindex = 0;
16e38e1
 
16e38e1
-   if (!ttfont) {
16e38e1
-      Error("TTF::SetTextFont", "font file %s not found in path", fontname);
16e38e1
-      if (fgFontCount) {
16e38e1
-         Warning("TTF::SetTextFont", "using default font %s", fgFontName[0]);
16e38e1
-         fgCurFontIdx = 0;    // use font 0 (default font, set in ctor)
16e38e1
-         return 0;
16e38e1
-      } else {
16e38e1
-         return 1;
16e38e1
-      }
16e38e1
+   FcPattern *pat, *match;
16e38e1
+   FcCharSet *set = NULL;
16e38e1
+   FcResult result;
16e38e1
+
16e38e1
+   pat = FcPatternCreate ();
16e38e1
+
16e38e1
+   switch (fontid) {
16e38e1
+   case 1:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+      break;
16e38e1
+   case 2:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 3:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+      break;
16e38e1
+   case 4:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 5:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+      break;
16e38e1
+   case 6:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 7:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+      break;
16e38e1
+   case 8:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 9:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+      break;
16e38e1
+   case 10:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 11:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+      break;
16e38e1
+   case 12:
16e38e1
+   case 15:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"symbol");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 13:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 14:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"dingbats");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 16:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 17:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+      break;
16e38e1
+   case 18:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 19:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+      break;
16e38e1
+   case 20:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize1");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 21:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize1");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 22:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize2");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 23:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize2");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 24:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize3");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 25:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize3");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 26:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize4");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 27:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize4");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 28:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize5");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 29:
16e38e1
+   case 30:
16e38e1
+   case 31:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"droidsansfallback");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      set = FcCharSetCreate ();
16e38e1
+      FcCharSetAddChar (set, 0x0410); // Cyrillic
16e38e1
+      FcCharSetAddChar (set, 0x4e00); // CJK
16e38e1
+      FcPatternAddCharSet (pat, FC_CHARSET, set);
16e38e1
+      break;
16e38e1
+   default:
16e38e1
+      Error("TTF::SetTextFont", "font %i not known to ROOT", fontid);
16e38e1
+      FcPatternDestroy (pat);
16e38e1
+      Warning("TTF::SetTextFont", "using default font");
16e38e1
+      fgCurFontIdx = 0;    // use font 0 (default font, set in ctor)
16e38e1
+      return;
16e38e1
+      break;
16e38e1
    }
16e38e1
 
16e38e1
+   FcConfigSubstitute (NULL, pat, FcMatchPattern);
16e38e1
+   FcDefaultSubstitute (pat);
16e38e1
+   match = FcFontMatch (NULL, pat, &result);
16e38e1
+   char *ttfnt;
16e38e1
+   FcPatternGetString (match, FC_FILE, 0, (FcChar8**)&ttfnt);
16e38e1
+   ttfont = StrDup (ttfnt);
16e38e1
+   FcPatternGetInteger (match, FC_INDEX, 0, &ttindex);
16e38e1
+   FcPatternDestroy (match);
16e38e1
+   FcPatternDestroy (pat);
16e38e1
+   if (set) FcCharSetDestroy (set);
16e38e1
+
16e38e1
    FT_Face  tface = 0;
16e38e1
 
16e38e1
-   if (FT_New_Face(fgLibrary, ttfont, 0, &tface)) {
16e38e1
+   if (FT_New_Face(fgLibrary, ttfont, ttindex, &tface)) {
16e38e1
       Error("TTF::SetTextFont", "error loading font %s", ttfont);
16e38e1
       delete [] ttfont;
16e38e1
       if (tface) FT_Done_Face(tface);
16e38e1
-      if (fgFontCount) {
16e38e1
-         Warning("TTF::SetTextFont", "using default font %s", fgFontName[0]);
16e38e1
-         fgCurFontIdx = 0;
16e38e1
-         return 0;
16e38e1
-      } else {
16e38e1
-         return 1;
16e38e1
-      }
16e38e1
+      Warning("TTF::SetTextFont", "using default font");
16e38e1
+      fgCurFontIdx = 0;
16e38e1
+      return;
16e38e1
    }
16e38e1
 
16e38e1
    delete [] ttfont;
16e38e1
 
16e38e1
-   fgFontName[fgFontCount] = StrDup(basename);
16e38e1
+   fgFontID[fgFontCount]   = fontid;
16e38e1
    fgCurFontIdx            = fgFontCount;
16e38e1
    fgFace[fgCurFontIdx]    = tface;
16e38e1
    fgCharMap[fgCurFontIdx] = 0;
16e38e1
    fgFontCount++;
16e38e1
 
16e38e1
    if (italic) {
16e38e1
-      fgSymbItaFontIdx = fgCurFontIdx;
16e38e1
       FT_Matrix slantMat;
16e38e1
       slantMat.xx = (1 << 16);
16e38e1
       slantMat.xy = ((1 << 16) >> 2);
16e38e1
       slantMat.yx = 0;
16e38e1
       slantMat.yy = (1 << 16);
16e38e1
-      FT_Set_Transform( fgFace[fgSymbItaFontIdx], &slantMat, NULL );
16e38e1
-   }
16e38e1
-
16e38e1
-   return 0;
16e38e1
-}
16e38e1
-
16e38e1
-////////////////////////////////////////////////////////////////////////////////
16e38e1
-/// Set specified font.
16e38e1
-/// List of the currently supported fonts (screen and PostScript)
16e38e1
-///
16e38e1
-/// | Font ID |   X11                     |     TTF          |
16e38e1
-/// |---------|---------------------------|------------------|
16e38e1
-/// |      1  | times-medium-i-normal     | timesi.ttf       |
16e38e1
-/// |      2  | times-bold-r-normal       | timesbd.ttf      |
7236b9a
-/// |      3  | times-bold-i-normal       | timesbi.ttf      |
16e38e1
-/// |      4  | helvetica-medium-r-normal | arial.ttf        |
16e38e1
-/// |      5  | helvetica-medium-o-normal | ariali.ttf       |
16e38e1
-/// |      6  | helvetica-bold-r-normal   | arialbd.ttf      |
16e38e1
-/// |      7  | helvetica-bold-o-normal   | arialbi.ttf      |
16e38e1
-/// |      8  | courier-medium-r-normal   | cour.ttf         |
16e38e1
-/// |      9  | courier-medium-o-normal   | couri.ttf        |
16e38e1
-/// |     10  | courier-bold-r-normal     | courbd.ttf       |
16e38e1
-/// |     11  | courier-bold-o-normal     | courbi.ttf       |
16e38e1
-/// |     12  | symbol-medium-r-normal    | symbol.ttf       |
16e38e1
-/// |     13  | times-medium-r-normal     | times.ttf        |
16e38e1
-/// |     14  |                           | wingding.ttf     |
16e38e1
-/// |     15  | symbol oblique is emulated from symbol.ttf | |
16e38e1
-
16e38e1
-void TTF::SetTextFont(Font_t fontnumber)
16e38e1
-{
16e38e1
-   // Added by cholm for use of DFSG - fonts - based on Kevins fix.
16e38e1
-   // Table of Microsoft and (for non-MSFT operating systems) backup
16e38e1
-   // FreeFont TTF fonts.
16e38e1
-   static const char *fonttable[][2] = {
16e38e1
-     { "Root.TTFont.0", "FreeSansBold.otf" },
16e38e1
-     { "Root.TTFont.1", "FreeSerifItalic.otf" },
16e38e1
-     { "Root.TTFont.2", "FreeSerifBold.otf" },
16e38e1
-     { "Root.TTFont.3", "FreeSerifBoldItalic.otf" },
16e38e1
-     { "Root.TTFont.4", "FreeSans.otf" },
16e38e1
-     { "Root.TTFont.5", "FreeSansOblique.otf" },
16e38e1
-     { "Root.TTFont.6", "FreeSansBold.otf" },
16e38e1
-     { "Root.TTFont.7", "FreeSansBoldOblique.otf" },
16e38e1
-     { "Root.TTFont.8", "FreeMono.otf" },
16e38e1
-     { "Root.TTFont.9", "FreeMonoOblique.otf" },
16e38e1
-     { "Root.TTFont.10", "FreeMonoBold.otf" },
16e38e1
-     { "Root.TTFont.11", "FreeMonoBoldOblique.otf" },
16e38e1
-     { "Root.TTFont.12", "symbol.ttf" },
16e38e1
-     { "Root.TTFont.13", "FreeSerif.otf" },
16e38e1
-     { "Root.TTFont.14", "wingding.ttf" },
16e38e1
-     { "Root.TTFont.15", "symbol.ttf" },
16e38e1
-     { "Root.TTFont.STIXGen", "STIXGeneral.otf" },
16e38e1
-     { "Root.TTFont.STIXGenIt", "STIXGeneralItalic.otf" },
16e38e1
-     { "Root.TTFont.STIXGenBd", "STIXGeneralBol.otf" },
16e38e1
-     { "Root.TTFont.STIXGenBdIt", "STIXGeneralBolIta.otf" },
16e38e1
-     { "Root.TTFont.STIXSiz1Sym", "STIXSiz1Sym.otf" },
16e38e1
-     { "Root.TTFont.STIXSiz1SymBd", "STIXSiz1SymBol.otf" },
16e38e1
-     { "Root.TTFont.STIXSiz2Sym", "STIXSiz2Sym.otf" },
16e38e1
-     { "Root.TTFont.STIXSiz2SymBd", "STIXSiz2SymBol.otf" },
16e38e1
-     { "Root.TTFont.STIXSiz3Sym", "STIXSiz3Sym.otf" },
16e38e1
-     { "Root.TTFont.STIXSiz3SymBd", "STIXSiz3SymBol.otf" },
16e38e1
-     { "Root.TTFont.STIXSiz4Sym", "STIXSiz4Sym.otf" },
16e38e1
-     { "Root.TTFont.STIXSiz4SymBd", "STIXSiz4SymBol.otf" },
16e38e1
-     { "Root.TTFont.STIXSiz5Sym", "STIXSiz5Sym.otf" },
16e38e1
-     { "Root.TTFont.ME", "DroidSansFallback.ttf" },
16e38e1
-     { "Root.TTFont.CJKMing", "DroidSansFallback.ttf" },
16e38e1
-     { "Root.TTFont.CJKGothic", "DroidSansFallback.ttf" }
16e38e1
-   };
16e38e1
-
16e38e1
-   static int fontset = -1;
16e38e1
-   int        thisset = fontset;
16e38e1
-
16e38e1
-   int fontid = fontnumber / 10;
16e38e1
-   if (fontid < 0 || fontid > 31) fontid = 0;
16e38e1
-
16e38e1
-   if (thisset == -1) {
16e38e1
-      // try to load font (font must be in Root.TTFontPath resource)
16e38e1
-      // to see which fontset we have available
16e38e1
-      const char *ttpath = gEnv->GetValue("Root.TTFontPath",
16e38e1
-                                          TROOT::GetTTFFontDir());
16e38e1
-      char *ttfont = gSystem->Which(ttpath, gEnv->GetValue(fonttable[fontid][0], fonttable[fontid][1]), kReadPermission);
16e38e1
-      if (ttfont) {
16e38e1
-         delete [] ttfont;
16e38e1
-         thisset = 0;
16e38e1
-      } else {
16e38e1
-         // try backup free font
16e38e1
-         thisset = 1;
16e38e1
-      }
16e38e1
+      FT_Set_Transform( fgFace[fgCurFontIdx], &slantMat, NULL );
16e38e1
    }
16e38e1
-   Int_t italic = 0;
16e38e1
-   if (fontid==15) italic = 1;
16e38e1
-   int ret = SetTextFont(gEnv->GetValue(fonttable[fontid][thisset], fonttable[fontid][1]), italic);
16e38e1
-   // Do not define font set is we're loading the symbol.ttf - it's
16e38e1
-   // the same in both cases.
16e38e1
-   if (ret == 0 && fontid != 12) fontset = thisset;
16e38e1
 }
16e38e1
 
16e38e1
 ////////////////////////////////////////////////////////////////////////////////
1fd9670
diff -ur root-6.24.02.orig/graf2d/postscript/CMakeLists.txt root-6.24.02/graf2d/postscript/CMakeLists.txt
1fd9670
--- root-6.24.02.orig/graf2d/postscript/CMakeLists.txt	2021-06-28 11:17:14.000000000 +0200
1fd9670
+++ root-6.24.02/graf2d/postscript/CMakeLists.txt	2021-08-11 10:49:08.587579259 +0200
b2cd752
@@ -27,6 +27,7 @@
aff214e
   LIBRARIES
aff214e
     ZLIB::ZLIB
aff214e
     mathtext
aff214e
+    fontconfig
aff214e
   DEPENDENCIES
aff214e
     Graf
aff214e
 )
1fd9670
diff -ur root-6.24.02.orig/graf2d/postscript/src/TPostScript.cxx root-6.24.02/graf2d/postscript/src/TPostScript.cxx
1fd9670
--- root-6.24.02.orig/graf2d/postscript/src/TPostScript.cxx	2021-06-28 11:17:14.000000000 +0200
1fd9670
+++ root-6.24.02/graf2d/postscript/src/TPostScript.cxx	2021-08-11 10:49:08.588579261 +0200
1fd9670
@@ -234,6 +234,7 @@
1fd9670
 #include <cctype>
1fd9670
 #include <cwchar>
1fd9670
 #include <fstream>
16e38e1
+#include <fontconfig/fontconfig.h>
16e38e1
 
1fd9670
 #include "strlcpy.h"
1fd9670
 #include "snprintf.h"
1fd9670
@@ -1585,56 +1586,179 @@
16e38e1
 
16e38e1
 void TPostScript::FontEmbed(void)
16e38e1
 {
16e38e1
-   static const char *fonttable[32][2] = {
16e38e1
-      { "Root.TTFont.0", "FreeSansBold.otf" },
16e38e1
-      { "Root.TTFont.1", "FreeSerifItalic.otf" },
16e38e1
-      { "Root.TTFont.2", "FreeSerifBold.otf" },
16e38e1
-      { "Root.TTFont.3", "FreeSerifBoldItalic.otf" },
16e38e1
-      { "Root.TTFont.4", "FreeSans.otf" },
16e38e1
-      { "Root.TTFont.5", "FreeSansOblique.otf" },
16e38e1
-      { "Root.TTFont.6", "FreeSansBold.otf" },
16e38e1
-      { "Root.TTFont.7", "FreeSansBoldOblique.otf" },
16e38e1
-      { "Root.TTFont.8", "FreeMono.otf" },
16e38e1
-      { "Root.TTFont.9", "FreeMonoOblique.otf" },
16e38e1
-      { "Root.TTFont.10", "FreeMonoBold.otf" },
16e38e1
-      { "Root.TTFont.11", "FreeMonoBoldOblique.otf" },
16e38e1
-      { "Root.TTFont.12", "symbol.ttf" },
16e38e1
-      { "Root.TTFont.13", "FreeSerif.otf" },
16e38e1
-      { "Root.TTFont.14", "wingding.ttf" },
16e38e1
-      { "Root.TTFont.15", "symbol.ttf" },
16e38e1
-      { "Root.TTFont.STIXGen", "STIXGeneral.otf" },
16e38e1
-      { "Root.TTFont.STIXGenIt", "STIXGeneralItalic.otf" },
16e38e1
-      { "Root.TTFont.STIXGenBd", "STIXGeneralBol.otf" },
16e38e1
-      { "Root.TTFont.STIXGenBdIt", "STIXGeneralBolIta.otf" },
16e38e1
-      { "Root.TTFont.STIXSiz1Sym", "STIXSiz1Sym.otf" },
16e38e1
-      { "Root.TTFont.STIXSiz1SymBd", "STIXSiz1SymBol.otf" },
16e38e1
-      { "Root.TTFont.STIXSiz2Sym", "STIXSiz2Sym.otf" },
16e38e1
-      { "Root.TTFont.STIXSiz2SymBd", "STIXSiz2SymBol.otf" },
16e38e1
-      { "Root.TTFont.STIXSiz3Sym", "STIXSiz3Sym.otf" },
16e38e1
-      { "Root.TTFont.STIXSiz3SymBd", "STIXSiz3SymBol.otf" },
16e38e1
-      { "Root.TTFont.STIXSiz4Sym", "STIXSiz4Sym.otf" },
16e38e1
-      { "Root.TTFont.STIXSiz4SymBd", "STIXSiz4SymBol.otf" },
16e38e1
-      { "Root.TTFont.STIXSiz5Sym", "STIXSiz5Sym.otf" },
16e38e1
-      { "Root.TTFont.ME", "DroidSansFallback.ttf" },
16e38e1
-      { "Root.TTFont.CJKMing", "DroidSansFallback.ttf" },
16e38e1
-      { "Root.TTFont.CJKCothic", "DroidSansFallback.ttf" }
16e38e1
-   };
16e38e1
-
16e38e1
    PrintStr("%%IncludeResource: ProcSet (FontSetInit)@");
16e38e1
 
16e38e1
-   // try to load font (font must be in Root.TTFontPath resource)
16e38e1
-   const char *ttpath = gEnv->GetValue("Root.TTFontPath",
16e38e1
-                                       TROOT::GetTTFFontDir());
16e38e1
-
16e38e1
    for (Int_t fontid = 1; fontid < 30; fontid++) {
16e38e1
       if (fontid != 15 && MustEmbed[fontid-1]) {
16e38e1
-         const char *filename = gEnv->GetValue(
16e38e1
-                                               fonttable[fontid][0], fonttable[fontid][1]);
16e38e1
-         char *ttfont = gSystem->Which(ttpath, filename, kReadPermission);
16e38e1
+
16e38e1
+         char *ttfont = NULL;
16e38e1
+
16e38e1
+         FcPattern *pat, *match;
16e38e1
+         FcCharSet *set = NULL;
16e38e1
+         FcResult result;
16e38e1
+
16e38e1
+         pat = FcPatternCreate ();
16e38e1
+
16e38e1
+         switch (fontid) {
16e38e1
+         case 1:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+            break;
16e38e1
+         case 2:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 3:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+            break;
16e38e1
+         case 4:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 5:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+            break;
16e38e1
+         case 6:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 7:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+            break;
16e38e1
+         case 8:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 9:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+            break;
16e38e1
+         case 10:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 11:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+            break;
16e38e1
+         case 12:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"symbol");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 13:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 14:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"dingbats");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 16:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 17:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+            break;
16e38e1
+         case 18:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 19:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+            break;
16e38e1
+         case 20:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize1");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 21:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize1");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 22:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize2");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 23:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize2");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 24:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize3");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 25:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize3");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 26:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize4");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 27:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize4");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 28:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize5");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            break;
16e38e1
+         case 29:
16e38e1
+            FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"droidsansfallback");
16e38e1
+            FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+            FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+            set = FcCharSetCreate ();
16e38e1
+            FcCharSetAddChar (set, 0x0410); // Cyrillic
16e38e1
+            FcCharSetAddChar (set, 0x4e00); // CJK
16e38e1
+            FcPatternAddCharSet (pat, FC_CHARSET, set);
16e38e1
+            break;
16e38e1
+         }
16e38e1
+
16e38e1
+         FcConfigSubstitute (NULL, pat, FcMatchPattern);
16e38e1
+         FcDefaultSubstitute (pat);
16e38e1
+         match = FcFontMatch (NULL, pat, &result);
16e38e1
+         char *ttfnt;
16e38e1
+         FcPatternGetString (match, FC_FILE, 0, (FcChar8**)&ttfnt);
16e38e1
+         ttfont = StrDup(ttfnt);
16e38e1
+         FcPatternDestroy (match);
16e38e1
+         FcPatternDestroy (pat);
16e38e1
+         if (set) FcCharSetDestroy (set);
16e38e1
+
16e38e1
          if (!ttfont) {
16e38e1
-            Error("TPostScript::FontEmbed",
16e38e1
-                  "font %d (filename `%s') not found in path",
16e38e1
-                  fontid, filename);
16e38e1
+            Error("TPostScript::FontEmbed", "font %d not found in path",
16e38e1
+                  fontid);
16e38e1
          } else {
16e38e1
             if (FontEmbedType2(ttfont)) {
16e38e1
                // nothing
1fd9670
@@ -1643,9 +1767,8 @@
16e38e1
             } else if(FontEmbedType42(ttfont)) {
16e38e1
                // nothing
16e38e1
             } else {
16e38e1
-               Error("TPostScript::FontEmbed",
16e38e1
-                     "failed to embed font %d (filename `%s')",
16e38e1
-                     fontid, filename);
16e38e1
+               Error("TPostScript::FontEmbed", "failed to embed font %d)",
16e38e1
+                     fontid);
16e38e1
             }
16e38e1
             delete [] ttfont;
16e38e1
          }
1fd9670
@@ -2837,10 +2960,10 @@
16e38e1
       { "Root.PSFont.9", "/FreeMonoOblique" },
16e38e1
       { "Root.PSFont.10", "/FreeMonoBold" },
16e38e1
       { "Root.PSFont.11", "/FreeMonoBoldOblique" },
16e38e1
-      { "Root.PSFont.12", "/SymbolMT" },
16e38e1
+      { "Root.PSFont.12", "/StandardSymbolsL" },
16e38e1
       { "Root.PSFont.13", "/FreeSerif" },
16e38e1
-      { "Root.PSFont.14", "/Wingdings-Regular" },
16e38e1
-      { "Root.PSFont.15", "/SymbolMT" },
16e38e1
+      { "Root.PSFont.14", "/Dingbats" },
16e38e1
+      { "Root.PSFont.15", "/StandardSymbolsL" },
16e38e1
       { "Root.PSFont.STIXGen", "/STIXGeneral" },
16e38e1
       { "Root.PSFont.STIXGenIt", "/STIXGeneral-Italic" },
16e38e1
       { "Root.PSFont.STIXGenBd", "/STIXGeneral-Bold" },
1fd9670
diff -ur root-6.24.02.orig/graf3d/gl/CMakeLists.txt root-6.24.02/graf3d/gl/CMakeLists.txt
1fd9670
--- root-6.24.02.orig/graf3d/gl/CMakeLists.txt	2021-06-28 11:17:14.000000000 +0200
1fd9670
+++ root-6.24.02/graf3d/gl/CMakeLists.txt	2021-08-11 10:49:08.589579264 +0200
b2cd752
@@ -208,6 +208,7 @@
aff214e
     ${GL2PS_LIBRARIES}
aff214e
     ${X11_LIBRARIES}
b2cd752
     RGlew
aff214e
+    fontconfig
aff214e
   DEPENDENCIES
aff214e
     Hist
aff214e
     Gui
1fd9670
diff -ur root-6.24.02.orig/graf3d/gl/src/TGLFontManager.cxx root-6.24.02/graf3d/gl/src/TGLFontManager.cxx
1fd9670
--- root-6.24.02.orig/graf3d/gl/src/TGLFontManager.cxx	2021-06-28 11:17:14.000000000 +0200
1fd9670
+++ root-6.24.02/graf3d/gl/src/TGLFontManager.cxx	2021-08-11 10:49:08.589579264 +0200
1fd9670
@@ -36,6 +36,7 @@
16e38e1
 # include "FTGLBitmapFont.h"
16e38e1
 #endif
16e38e1
 
16e38e1
+#include <fontconfig/fontconfig.h>
16e38e1
 
16e38e1
 /** \class TGLFont
16e38e1
 \ingroup opengl
1fd9670
@@ -419,7 +420,7 @@
16e38e1
 ClassImp(TGLFontManager);
16e38e1
 
16e38e1
 TObjArray   TGLFontManager::fgFontFileArray;
16e38e1
-Int_t TGLFontManager::fgExtendedFontStart;
16e38e1
+Int_t TGLFontManager::fgExtendedFontStart = 0;
16e38e1
 TGLFontManager::FontSizeVec_t TGLFontManager::fgFontSizeArray;
16e38e1
 Bool_t  TGLFontManager::fgStaticInitDone = kFALSE;
16e38e1
 
1fd9670
@@ -450,17 +451,175 @@
16e38e1
    FontMap_i it = fFontMap.find(TGLFont(size, fileID, mode));
16e38e1
    if (it == fFontMap.end())
16e38e1
    {
16e38e1
-      TString ttpath, file;
16e38e1
-      ttpath = gEnv->GetValue("Root.TTGLFontPath", TROOT::GetTTFFontDir());
16e38e1
-      {
16e38e1
-         //For extenede we have both ttf and otf.
16e38e1
-         char *fp = gSystem->Which(ttpath, fileID < fgExtendedFontStart ?
16e38e1
-                                   ((TObjString*)fgFontFileArray[fileID])->String() + ".ttf" :
16e38e1
-                                   ((TObjString*)fgFontFileArray[fileID])->String());
16e38e1
-         file = fp;
16e38e1
-         delete [] fp;
16e38e1
+      char *file = NULL;
16e38e1
+      int ttindex = 0;
16e38e1
+
16e38e1
+      FcPattern *pat, *match;
16e38e1
+      FcCharSet *set = NULL;
16e38e1
+      FcResult result;
16e38e1
+
16e38e1
+      pat = FcPatternCreate ();
16e38e1
+
16e38e1
+      switch (fileID) {
16e38e1
+      case 0:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+         break;
16e38e1
+      case 1:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 2:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+         break;
16e38e1
+      case 3:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 4:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+         break;
16e38e1
+      case 5:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 6:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+         break;
16e38e1
+      case 7:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 8:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+         break;
16e38e1
+      case 9:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 10:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+         break;
16e38e1
+      case 11:
16e38e1
+      case 14:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"symbol");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 12:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 13:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"dingbats");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 15:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 16:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+         break;
16e38e1
+      case 17:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 18:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixgeneral");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+         break;
16e38e1
+      case 19:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize1");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 20:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize1");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 21:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize2");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 22:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize2");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 23:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize3");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 24:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize3");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 25:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize4");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 26:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize4");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 27:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"stixsize5");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         break;
16e38e1
+      case 28:
16e38e1
+      case 29:
16e38e1
+      case 30:
16e38e1
+         FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"droidsansfallback");
16e38e1
+         FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+         FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+         set = FcCharSetCreate ();
16e38e1
+         FcCharSetAddChar (set, 0x0410); // Cyrillic
16e38e1
+         FcCharSetAddChar (set, 0x4e00); // CJK
16e38e1
+         FcPatternAddCharSet (pat, FC_CHARSET, set);
16e38e1
       }
16e38e1
 
16e38e1
+      FcConfigSubstitute (NULL, pat, FcMatchPattern);
16e38e1
+      FcDefaultSubstitute (pat);
16e38e1
+      match = FcFontMatch (NULL, pat, &result);
16e38e1
+      char *ttfnt;
16e38e1
+      FcPatternGetString (match, FC_FILE, 0, (FcChar8**)&ttfnt);
16e38e1
+      file = StrDup (ttfnt);
16e38e1
+      FcPatternGetInteger (match, FC_INDEX, 0, &ttindex);
16e38e1
+      FcPatternDestroy (match);
16e38e1
+      FcPatternDestroy (pat);
16e38e1
+      if (set) FcCharSetDestroy (set);
16e38e1
+
16e38e1
       FTFont* ftfont = 0;
16e38e1
       switch (mode)
16e38e1
       {
1fd9670
@@ -484,10 +643,14 @@
16e38e1
             ftfont = new FTGLTextureFont(file);
16e38e1
             break;
16e38e1
          default:
16e38e1
+            delete [] file;
16e38e1
             Error("TGLFontManager::RegisterFont", "invalid FTGL type");
16e38e1
             return;
16e38e1
             break;
16e38e1
       }
16e38e1
+
16e38e1
+      delete [] file;
16e38e1
+
16e38e1
       ftfont->FaceSize(size);
16e38e1
       const TGLFont &mf = fFontMap.insert(std::make_pair(TGLFont(size, fileID, mode, ftfont, 0), 1)).first->first;
16e38e1
       out.CopyAttributes(mf);
1fd9670
@@ -570,8 +733,6 @@
16e38e1
 {
16e38e1
    if (fgStaticInitDone == kFALSE) InitStatics();
16e38e1
 
16e38e1
-   assert(fgExtendedFontStart > 0 && "GetExtendedFontStartIndex, invalid index");
16e38e1
-
16e38e1
    return fgExtendedFontStart;
16e38e1
 }
16e38e1
 
1fd9670
@@ -641,28 +802,6 @@
16e38e1
    fgFontFileArray.Add(new TObjString("wingding")); // 140
16e38e1
    fgFontFileArray.Add(new TObjString("symbol"));   // 150
16e38e1
 
16e38e1
-   fgExtendedFontStart = fgFontFileArray.GetEntries();
16e38e1
-   //"Extended" fonts for gl-pad.
16e38e1
-   //fgPadFontStart + ...
16e38e1
-   fgFontFileArray.Add(new TObjString("FreeSerifItalic.otf"));      //  10 (160)
16e38e1
-   fgFontFileArray.Add(new TObjString("FreeSerifBold.otf"));        //  20 (170)
16e38e1
-   fgFontFileArray.Add(new TObjString("FreeSerifBoldItalic.otf"));  //  30
16e38e1
-
16e38e1
-   fgFontFileArray.Add(new TObjString("FreeSans.otf"));             //  40
16e38e1
-   fgFontFileArray.Add(new TObjString("FreeSansOblique.otf"));      //  50
16e38e1
-   fgFontFileArray.Add(new TObjString("FreeSansBold.otf"));         //  60
16e38e1
-   fgFontFileArray.Add(new TObjString("FreeSansBoldOblique.otf"));  //  70
16e38e1
-
16e38e1
-   fgFontFileArray.Add(new TObjString("FreeMono.otf"));             //  80
16e38e1
-   fgFontFileArray.Add(new TObjString("FreeMonoOblique.otf"));      //  90
16e38e1
-   fgFontFileArray.Add(new TObjString("FreeMonoBold.otf"));         // 100
16e38e1
-   fgFontFileArray.Add(new TObjString("FreeMonoBoldOblique.otf"));  // 110
16e38e1
-
16e38e1
-   fgFontFileArray.Add(new TObjString("symbol.ttf"));               // 120
16e38e1
-   fgFontFileArray.Add(new TObjString("FreeSerif.otf"));            // 130
16e38e1
-   fgFontFileArray.Add(new TObjString("wingding.ttf"));             // 140
16e38e1
-   fgFontFileArray.Add(new TObjString("symbol.ttf"));               // 150
16e38e1
-
16e38e1
    fgFontFileArray.Add(new TObjString("STIXGeneral.otf"));          // 200
16e38e1
    fgFontFileArray.Add(new TObjString("STIXGeneralItalic.otf"));    // 210
16e38e1
    fgFontFileArray.Add(new TObjString("STIXGeneralBol.otf"));       // 220
1fd9670
diff -ur root-6.24.02.orig/graf3d/gl/src/TGLText.cxx root-6.24.02/graf3d/gl/src/TGLText.cxx
1fd9670
--- root-6.24.02.orig/graf3d/gl/src/TGLText.cxx	2021-06-28 11:17:14.000000000 +0200
1fd9670
+++ root-6.24.02/graf3d/gl/src/TGLText.cxx	2021-08-11 10:49:08.590579267 +0200
1fd9670
@@ -32,6 +32,8 @@
16e38e1
 # include "FTGLBitmapFont.h"
16e38e1
 #endif
16e38e1
 
16e38e1
+#include <fontconfig/fontconfig.h>
16e38e1
+
16e38e1
 #define FTGL_BITMAP  0
16e38e1
 #define FTGL_PIXMAP  1
16e38e1
 #define FTGL_OUTLINE 2
1fd9670
@@ -176,27 +178,92 @@
16e38e1
 {
16e38e1
    int fontid = fontnumber / 10;
16e38e1
 
16e38e1
-   const char *fontname=0;
16e38e1
-   if (fontid == 0)  fontname = "arialbd.ttf";
16e38e1
-   if (fontid == 1)  fontname = "timesi.ttf";
16e38e1
-   if (fontid == 2)  fontname = "timesbd.ttf";
16e38e1
-   if (fontid == 3)  fontname = "timesbi.ttf";
16e38e1
-   if (fontid == 4)  fontname = "arial.ttf";
16e38e1
-   if (fontid == 5)  fontname = "ariali.ttf";
16e38e1
-   if (fontid == 6)  fontname = "arialbd.ttf";
16e38e1
-   if (fontid == 7)  fontname = "arialbi.ttf";
16e38e1
-   if (fontid == 8)  fontname = "cour.ttf";
16e38e1
-   if (fontid == 9)  fontname = "couri.ttf";
16e38e1
-   if (fontid == 10) fontname = "courbd.ttf";
16e38e1
-   if (fontid == 11) fontname = "courbi.ttf";
16e38e1
-   if (fontid == 12) fontname = "symbol.ttf";
16e38e1
-   if (fontid == 13) fontname = "times.ttf";
16e38e1
-   if (fontid == 14) fontname = "wingding.ttf";
16e38e1
-
16e38e1
-   // try to load font (font must be in Root.TTFontPath resource)
16e38e1
-   const char *ttpath = gEnv->GetValue("Root.TTFontPath",
16e38e1
-                                       TROOT::GetTTFFontDir());
16e38e1
-   char *ttfont = gSystem->Which(ttpath, fontname, kReadPermission);
16e38e1
+   FcPattern *pat, *match;
16e38e1
+   FcResult result;
16e38e1
+   char *ttfont;
16e38e1
+   int ttindex;
16e38e1
+
16e38e1
+   pat = FcPatternCreate ();
16e38e1
+
16e38e1
+   switch (fontid) {
16e38e1
+   case 1:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+      break;
16e38e1
+   case 2:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 3:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+      break;
16e38e1
+   case 4:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 5:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+      break;
16e38e1
+   case 0:
16e38e1
+   case 6:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 7:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+      break;
16e38e1
+   case 8:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 9:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+      break;
16e38e1
+   case 10:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 11:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
16e38e1
+      break;
16e38e1
+   case 12:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"symbol");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 13:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   case 14:
16e38e1
+      FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"dingbats");
16e38e1
+      FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
16e38e1
+      FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
16e38e1
+      break;
16e38e1
+   }
16e38e1
+
16e38e1
+   FcConfigSubstitute (NULL, pat, FcMatchPattern);
16e38e1
+   FcDefaultSubstitute (pat);
16e38e1
+   match = FcFontMatch (NULL, pat, &result);
16e38e1
+   FcPatternGetString (match, FC_FILE, 0, (FcChar8**)&ttfont);
16e38e1
+   FcPatternGetInteger (match, FC_INDEX, 0, &ttindex);
16e38e1
 
16e38e1
    if (fGLTextFont) delete fGLTextFont;
16e38e1
 
1fd9670
@@ -204,7 +271,9 @@
16e38e1
 
16e38e1
    fGLTextFont = new FTGLPolygonFont(ttfont);
16e38e1
 
16e38e1
+   FcPatternDestroy (match);
16e38e1
+   FcPatternDestroy (pat);
16e38e1
+
16e38e1
    if (!fGLTextFont->FaceSize(1))
16e38e1
       Error("SetGLTextFont","Cannot set FTGL::FaceSize");
16e38e1
-   delete [] ttfont;
16e38e1
 }
1fd9670
diff -ur root-6.24.02.orig/gui/gui/src/TGApplication.cxx root-6.24.02/gui/gui/src/TGApplication.cxx
1fd9670
--- root-6.24.02.orig/gui/gui/src/TGApplication.cxx	2021-06-28 11:17:14.000000000 +0200
1fd9670
+++ root-6.24.02/gui/gui/src/TGApplication.cxx	2021-08-11 10:49:08.590579267 +0200
b2cd752
@@ -80,20 +80,12 @@
16e38e1
    gROOT->SetBatch(kFALSE);
16e38e1
 
16e38e1
    if (strcmp(appClassName, "proofserv")) {
16e38e1
-      const char *ttpath = gEnv->GetValue("Root.TTFontPath",
16e38e1
-                                          TROOT::GetTTFFontDir());
16e38e1
-      char *ttfont = gSystem->Which(ttpath, "arialbd.ttf", kReadPermission);
16e38e1
-      // Added by cholm for use of DFSG - fonts - based on fix by Kevin
16e38e1
-      if (!ttfont)
16e38e1
-         ttfont = gSystem->Which(ttpath, "FreeSansBold.ttf", kReadPermission);
16e38e1
-      if (ttfont && gEnv->GetValue("Root.UseTTFonts", 1)) {
16e38e1
+      if (gEnv->GetValue("Root.UseTTFonts", 1)) {
16e38e1
          TPluginHandler *h;
16e38e1
          if ((h = gROOT->GetPluginManager()->FindHandler("TVirtualX", "x11ttf")))
16e38e1
             if (h->LoadPlugin() == -1)
16e38e1
                Info("TGApplication", "no TTF support");
16e38e1
       }
16e38e1
-
16e38e1
-      delete [] ttfont;
16e38e1
    }
16e38e1
 
16e38e1
    // Create the canvas colors early so they are allocated before