verschiedene Schriftgrößen auf einer Höhe ausrichten?

  • Test mit Ascender:

    Code
    Aug 07 15:01:10 [vdr] [8848] GetFontAscender font: VDRPT Sans:Regular height: 42 asc: 38 desc: -12
    Aug 07 15:01:10 [vdr] [8848] GetFontAscender calculated ascender: 2432 (38)
    Aug 07 15:01:10 [vdr] [8848] GetFontAscender font: VDRPT Sans:Regular height: 16 asc: 14 desc: -4
    Aug 07 15:01:10 [vdr] [8848] GetFontAscender calculated ascender: 896 (14)
    Aug 07 15:01:10 [vdr] [8848] fontHeight: 50 fontAscender: 2432 (38) fontSecsHeight: 18 fontSecsAscender: 896 (14) topSecs: 24

    bei 40% passt genau!
    [Blockierte Grafik: http://i.imgur.com/gp3oRLE.png]
    Und 70% auch:

    Code
    Aug 07 15:02:12 [vdr] [8848] GetFontAscender font: VDRPT Sans:Regular height: 42 asc: 38 desc: -12
    Aug 07 15:02:12 [vdr] [8848] GetFontAscender calculated ascender: 2432 (38)
    Aug 07 15:02:12 [vdr] [8848] GetFontAscender font: VDRPT Sans:Regular height: 29 asc: 26 desc: -8
    Aug 07 15:02:12 [vdr] [8848] GetFontAscender calculated ascender: 1664 (26)
    Aug 07 15:02:12 [vdr] [8848] fontHeight: 50 fontAscender: 2432 (38) fontSecsHeight: 34 fontSecsAscender: 1664 (26) topSecs: 12


    [Blockierte Grafik: http://i.imgur.com/uApyFCM.png]


    Baserender macht:

    Code
    Ascender = face->size->metrics.ascender; // Im 64er Format

    und displayreplay:

    Manchmal steckt der Fehler im Detail... Aber weitere Tests sollten noch gemacht werden


    Die aktuellen Dateien:
    verschiedene Schriftgrößen auf einer Höhe ausrichten?

  • passt genau!


    Juhuu! :)


    Wie sieht es denn aus, wenn GetFontAscender schon den durch 64 geteilten Wert zurückgibt? Dann muss der Aufrufer nicht daran denken, das Ergebnis noch zu teilen. Könnte evtl. einen Pixel Versatz ergeben, aber das wäre es evtl. wert.


    Lars.

  • Das dürfte keinen Unterschied machen, weil im Log sieht man, dass alle Wert vielfache von 64 sind. Anscheinend rechnet die Funktion intern mit den 64er Werden. Was auch erklärt, warum CharHeight mit 64 Multipliziert wird.

  • Ich könnte mir vorstellen, dass Klaus sich für "mal 64" entschieden hat, um Rundungsproblemen aus dem Weg zu gehen. Aber das ist nur geraten. :)


    Lars.

  • Ich glaube das liegt an Freetype und den internen Strukturen. http://j.mp/1slnDzN


    Ich habe die Dateien angepast. 40%:

    Code
    Aug 07 15:40:05 [vdr] [15839] GetFontAscender font: VDRPT Sans:Regular height: 42 asc: 38 desc: -12
    Aug 07 15:40:05 [vdr] [15839] GetFontAscender calculated ascender: 38
    Aug 07 15:40:05 [vdr] [15839] GetFontAscender font: VDRPT Sans:Regular height: 16 asc: 14 desc: -4
    Aug 07 15:40:05 [vdr] [15839] GetFontAscender calculated ascender: 14
    Aug 07 15:40:05 [vdr] [15839] fontHeight: 50 fontAscender: 38 fontSecsHeight: 14 fontSecsAscender: 24 topSecs: 8
  • Nun also mein Endstand . Es scheint zu funktionieren. Nur das Debugoutput war noch ein wenig durcheinander

  • :tup


    Ich bedanke mich für die Gelegenheit, mich ein wenig mit FreeType auseinander setzen zu dürfen. Irgendwann werde ich das brauchen. :)


    Lars.

  • Hi,


    da ihr da jetzt ja voll durchblickt mal ne geringfügig andere Frage...welchen Wert muss ich nehmen, um eine Schrift korrekt vertikal zentriert in einer Box zu platzieren? cFont::Height() passt da bei einer Sans Schriftart nicht so wirklich. Da wäre ich für Tipps dankbar.


    Ciao Louis

  • Der vdr nimmt cFont::Height(), siehe http://projects.vdr-developer.…t/vdr.git/tree/osd.c#n599:


    Aber wenn das nicht schön ist, musst du die Bounding-Box nehmen (face->bbox, siehe http://www.freetype.org/freety…-basic_types.html#FT_BBox).
    Und wenn das auch noch nicht reicht (aka nicht schön genug ist), dann über alle Buchstaben iterieren, zu jedem die Bounding-Box bestimmen und dann die höchste für die Ausrichtung nehmen (so die Theorie).


    Lars.

  • Ich werde das jetzt mal ins git übernehmen und noch ein wenig testen aber das hört sich ja alles gut an. Letztendlich hätte ich das auch selbst sehen müssen das ich die falsche Höhe übergebe, aber naja dafür ist das Forum ja da :)


    louis: schau dir mal aus dem ersten Post das Bild mit den Font metricen an. Ich schätze du müsstest von cFont::Height() das internal leading (cFont::Height() - Ascender) und den Descender abziehen und dann das ganze durch 2 teilen. Dann müsstest du ja die genaue Mitte vom Font haben.


    Grüße
    Martin

  • Vielen Dank besonders an mini73, der das mit der Fontgröße gesehen hat. Ich wäre mangels Kenntnissen nie da drauf gekommen. Um so schlimmer, da die Idee mit den kleinen Sekunden auf meinem Mist gewachsen ist ;)

  • Lars & Martin: danke für die Antworten, damit sollte das klappen. Bei Sans Schriftarten scheint das "internal leading" recht groß zu sein, deshalb hängt der Text ab und an irgendwie zu weit unten.


    Ciao Louis

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!