Pfad zur ttf-Datei einer Schriftart heraus finden
-
Ich möchte in meinem OpenGL Programm (C++) eine Schriftart mit freetype laden. Dazu brauch ich natürlich eine ttf-Datei. Wie kann ich unter Linux (mit fontconfig?) die auf dem System vorhandenen Schriftarten durchsuchen?
Z.B. "Arial" -> "/usr/share/fonts/truetype/msttcorefonts/arial.ttf"
-
Ich sehe folgendes Problem: Wenn du dein Programm auf einem X-Server anzeigen lässt, der auf einem anderen Rechner läuft und auf dem Rechner, wo dein Programm läuft kein X-Server installiert ist, gibt es keinen Pfad zu einer Schriftart, weil sie ja nichtmal auf dem Rechner existiert, auf dem das Programm gestartet ist.
Die einzige saubere Möglichkeit, die ich sehe, ist dass du den Benutzer eingeben lässt, wo sich die Schrift-Dateien befinden und dann aus den Schriftdateien die Namen ausliest und dir die zugehörige Datei merkst. Wenn du nur eine Schriftart brauchst, dann solltest du sie einfach deinem Programm beipacken.
Ich weis nicht, ob es noch eine andere Möglichkeit gibt.
Hier ist noch ein Link, der beschreibt wie TrueType Schriftarten in X11 behandelt werden: http://keithp.com/~keithp/talks/xtc2001/paper/
Nachtrag:
Soweit ich weis, rendert Pango die Schriftarten auf der Client-Seite. Du könntest mal gucken, wie die das Problem gelöst haben.
-
ProgChild schrieb:
Ich sehe folgendes Problem: Wenn du dein Programm auf einem X-Server anzeigen lässt, der auf einem anderen Rechner läuft und auf dem Rechner, wo dein Programm läuft kein X-Server installiert ist, gibt es keinen Pfad zu einer Schriftart, weil sie ja nichtmal auf dem Rechner existiert, auf dem das Programm gestartet ist.
Wenn ein Rechner keinen XServer hat, dann kann er ja auch nicht mein Programm sehen, oder?
Die einzige saubere Möglichkeit, die ich sehe, ist dass du den Benutzer eingeben lässt, wo sich die Schrift-Dateien befinden und dann aus den Schriftdateien die Namen ausliest und dir die zugehörige Datei merkst.
Naja, das find ich eher nicht so sauber, so machen das Programme wie OpenOffice ja auch nicht.
Hier ist noch ein Link, der beschreibt wie TrueType Schriftarten in X11 behandelt werden: http://keithp.com/~keithp/talks/xtc2001/paper/
Danke für den Link. Ich hab mir das mal angeguckt und ich denke Fontconfig ist das was ich suche. Hab noch kein gutes Tutorial gefunden aber ich schlage mich gerade durch die Manual.
Nachtrag:
Soweit ich weis, rendert Pango die Schriftarten auf der Client-Seite. Du könntest mal gucken, wie die das Problem gelöst haben.Hm.. die Library ist so groß, glaub kaum dass ich da was finde.
-
joomoo schrieb:
Wenn ein Rechner keinen XServer hat, dann kann er ja auch nicht mein Programm sehen, oder?
Was meinst du mit "sehen"? Das Programm kann doch auf Rechner A gestartet werden und auf Rechner B angezeigt werden. Dafür brauchst du auf Rechner A nur die Xlib und keinen Server. Und soweit ich weis, liegen die Schriftarten dann auf Rechner B. Daraus folger ich, dass es schwierig sein könnte, an die Schriftarten zu kommen...
joomoo schrieb:
Naja, das find ich eher nicht so sauber, so machen das Programme wie OpenOffice ja auch nicht.
Wie macht es OpenOffice denn? Könnte mir vorstellen, dass OpenOffice einfach nur dem X-Server sagt, dass der bitte mit Schriftart soundso an stelle x, y schreiben soll.
Wenn du nicht die Spline-Daten brauchst, sondern nur die Schrift 2D zeichnen willst, könnte das vielleicht auch mit XFT machen.
-
ProgChild schrieb:
joomoo schrieb:
Naja, das find ich eher nicht so sauber, so machen das Programme wie OpenOffice ja auch nicht.
Wie macht es OpenOffice denn? Könnte mir vorstellen, dass OpenOffice einfach nur dem X-Server sagt, dass der bitte mit Schriftart soundso an stelle x, y schreiben soll.
Wenn du nicht die Spline-Daten brauchst, sondern nur die Schrift 2D zeichnen willst, könnte das vielleicht auch mit XFT machen.
Eine Schriftdatei zu zeichnen funktioniert bei meinem Programm ja schon mit freetype, aber der Pfad zu den ttf-Dateien ist ja bei vielen Distros unterschiedlich.
Was sind Spline-Daten?
-
joomoo schrieb:
Was sind Spline-Daten?
Naja... Die TTF-Dateien enthalten Kurven, die beschrieben werden, durch Punkte, Steigungen und Krümmungen. Jetzt musst du die Punkte irgendwie verbinden. Und da du das nicht mit geraden machen willst, interpolierst du die Punkte mit einem Spline (im Fall von TTF mit einem quadratische B-Spline). D.h. du legst zwischen den beiden Punkten ein Polynom (das ist halt schön geschwungen) und sorgst dann dafür, dass an den beiden Verbindungspunkten zum nächsten Polynom, das Ding die richtige Steigung und Krümmung hat.
-
joomoo schrieb:
Eine Schriftdatei zu zeichnen funktioniert bei meinem Programm ja schon mit freetype, aber der Pfad zu den ttf-Dateien ist ja bei vielen Distros unterschiedlich.
Ich hab jetzt mal strace auf OpenOffice drauf los gelassen. Es scheint so, als würde OpenOffice keine einzige TTF-Datei öffen. Das heißt, es wird das ganze wahrscheinlich an den X-Server delegieren.
Käme es denn in Frage, die Schriftart einfach mit dem Programm auszuliefern?
-
Käme es denn in Frage, die Schriftart einfach mit dem Programm auszuliefern?
Eigentlich schon, aber das ganze brauche ich auch für eine kleine Library und das wär schon ganz gut wenn da keine Schrift dabei ist und die vom System genommen wird.
Ich werde mir mal in den nächsten Tagen fontconfig genauer angucken, die Funktion FcFontMatch scheint das zu sein was ich suche: http://fontconfig.org/fontconfig-devel/r2842.html
-
Hi joomoo,
dein Signaturlink ist nicht mehr.
-
GNU-Fan schrieb:
Hi joomoo,
dein Signaturlink ist nicht mehr.
Danke für den Hinweis. Die Seite ist gerade im Umbau. Ich ändere mal schnell meine Signatur.
-
So ich hab's tatsächlich mit fontconfig geschafft. Hier der Code:
#include <fontconfig/fontconfig.h> #include <iostream> int main() { std::string fontname; std::cout << "Fontname: " << std::flush; std::cin >> fontname; const double size = 12; FcFontSet* fontSet = FcFontSetCreate(); FcPattern* pattern = FcPatternBuild(NULL, FC_FAMILY, FcTypeString, fontname.c_str(), FC_SIZE, FcTypeDouble, size, NULL); FcConfigSubstitute(NULL,pattern, FcMatchPattern); FcDefaultSubstitute(pattern); FcResult result; FcPattern* match = FcFontMatch(NULL, pattern, &result); FcPatternDestroy(pattern); if(!match) { FcFontSetDestroy(fontSet); std::cout << "Fehler!" << std::endl; return 1; } FcFontSetAdd(fontSet, match); if(fontSet->nfont == 0) { std::cout << "Fehler!" << std::endl; return 1; } FcChar8* filename = NULL; FcPatternGetString(fontSet->fonts[0], FC_FILE, 0, &filename); std::cout << filename << std::endl; }
Folgender Source Code hat mir geholfen: http://www.google.com/codesearch?hl=de&q=FcFontMatch+show:oRcxtJ2CP00:OxCd6apcaSk:U29QyegFImw&sa=N&cd=1&ct=rc&cs_p=http://prdownloads.sourceforge.net/xine/xine-lib-1.1.3.tar.gz&cs_f=xine-lib-1.1.3/src/xine-engine/osd.c