Hi,
ich möchte in meinem Skin flatPlus gerne verschiedene Schriftgrößen auf einer Höhe ausrichten, und komme nicht ganz weiter. Vielleicht hat ja jemand einen Rat für mich
Hier ist das passende Ticket http://projects.vdr-developer.org/issues/1884
Im genauen geht es darum die Sekunden der Aufnahme kleiner darzustellen also im Format:
HH:MM:SS
Hier mal eine Übersicht übe die Font Metric
[Blockierte Grafik: http://i.imgur.com/yZxVRd0.png]
HH:MM wird mit Top = 0 und z.B. Schriftgröße 50 gezeichnet.
Wenn die Sekunden nun eine Schriftgröße von z.B. 20 hat, ist die Frage mit welchem Top muss ich die Sekunden zeichnen damit sie auf gleicher Grundlinie ausgerichtet sind?
Wen man sich die Font Metric anschaut habe ich mir so gedacht, ich muss einfach vom Ascender vom Font für HH:MM den Ascender vom Font für die Sekunden abziehen und das ergibt den Top?
Aber entweder funktioniert das nicht so einfach oder ich habe noch einen Fehler den Ascender zu bestimmen.
Ich habe mir für den Ascender einfach ein bisschen Quellcode aus dem VDR geklaut
Der sieht ungefähr so aus:
int cFlatBaseRender::GetFontAscender(const char *Name, int CharHeight, int CharWidth) {
FT_Library library;
FT_Face face;
cString fontFileName = cFont::GetFontFileName(Name);
int Ascender = CharHeight;
int error = FT_Init_FreeType(&library);
if (!error) {
error = FT_New_Face(library, fontFileName, 0, &face);
if (!error) {
if (face->num_fixed_sizes && face->available_sizes) { // fixed font
// TODO what exactly does all this mean?
Ascender = face->available_sizes->height;
} else {
error = FT_Set_Char_Size(face, CharWidth * 64, CharHeight * 64, 0, 0);
if (!error) {
//dsyslog("base: %d asc: %d desc: %d", baseHeight, face->size->metrics.ascender, face->size->metrics.descender + 63);
Ascender = (face->size->metrics.ascender) / 64;
//dsyslog("base: %d", baseHeight);
}
else
esyslog("ERROR: FreeType: error %d during FT_Set_Char_Size (font = %s)\n", error, *fontFileName);
}
}
else
esyslog("ERROR: FreeType: load error %d (font = %s)", error, *fontFileName);
}
else
esyslog("ERROR: FreeType: initialization error %d (font = %s)", error, *fontFileName);
FT_Done_Face(face);
FT_Done_FreeType(library);
return Ascender;
}
Alles anzeigen
Ich muss gestehen ich kenn mich 0 mit freetype aus und habe das so ziemlig 1:1 übernommen.
Top für Sekunden berechne ich dann wie folgt:
int fontAscender = GetFontAscender(Setup.FontOsd, fontHeight);
int fontSecsAscender = GetFontAscender(Setup.FontOsd, fontSecs->Height());
int topSecs = fontAscender - fontSecsAscender;
Aber wie gesagt irgendwie stimmen die Werte nicht oder die Berechnung ist falsch.
Vielleicht kennt sich ja jemand besser mit freetype aus als ich und kann mir helfen
Grüße
Martin