Pixelhöhe von Fonts unstimmig?

Hallo,

ich geb grad auf ein RGB-Display (800x480) einen Text aus.
Benutzt wird die Lovyan-lib und die Schriftart ist "FreeSans12pt7b". Also eine mit 12 Pixel Zeichenhöhe.
Wenn ich mir aber den Text unter dem Mikroskop ansehe, dann besteht so ein Zeichen aus weit mehr Pixel in der Höhe.
Jetzt stell ich mir die Frage: Warum?
Angehängt die Nahaufnahme, bearbeitet mit Trennlinien zwischen den Pixeln. Sollte °C ausgegeben werden. Aber bei dem 7Bit-Zeichensatz gibt es das Sonderzeichen nicht. (Aber das ist eine andere Geschichte)

Es handelt sich bei "pt" aus dem Dateinamen nicht um die Angabe einer Höhe in Pixeln - "Point" ist eine andere Einheit.

In Deinem Font-File stehen für den Buchstaben 'C' die Daten:

  {   638,  15,  18,  17,    1,  -17 },   // 0x43 'C'

Mit der Strukturdefinition GFXglyph kann man sehen, dass das Pixelmuster in dem Fall 18 Pixel hoch ist (dritter Wert).

Boahh...
pixel <-> point
... wie doof von mir ^^

Hab mich jetzt mal etwas mit der Font-lib beschäftigt.
Wenn es schon kein °-Zeichen gibt, dann frag ich mich welches Zeichen er dann dafür darstellt. (Also dieses Rechteck). Das finde ich ehrlich gesagt nicht in dem Font. Geht ja auch 4 Pixel weiter nach unten als das C.
Und weiß jemand, ob es für Arduino 8bit-Fonts gibt? Oder muss ich mir die selber basteln. :cold_face:

Danke!

Wen in der Schriftart kein ° Zeichen gibt dann zeichne ganz einfach ein kreis vor dem C

Ja, ist ne Möglichkeit, aber ich brauch das ca. 10 mal auf dem Display, und alles mit relativ berechneten Positionen des Strings.
Also hab ich mich etwas mit dem Aufbau solch einer Fonts-Datei befasst und das °-Symbol in der Datei ergänzt.
Leider hab ich es nicht geschafft eine Custom-Kopie der Fonts.c zu erstellen, und die abseits der originalen abzulegen, sondern musste das Original abändern. Lauf halt jetzt Gefahr, dass ich die bei einem lib-Update überschreibe

Edit. Auch geschafft. Bin die ganze Zeit am blöden Namespace gescheitert...

Die Unterlängen wie beim "g" zählen nicht mit.

Spannend wird es beim "Ö", das es in Amiland nicht gibt, mit der Platzierung der Pünktchen.

Ja, nein.

Je nach Anwendung könnte auch ein Unifont in der Codierung UTF-8 für Dich interessant sein. Damit lassen sich, allerdings für Arduinos nur theoretisch, alle auf dieser Welt benutzten Zeichen darstellen. Logischerweise brauchen solche Fontdefinitionen viel Platz.

Im Zusammenspiel von ESP32, wegen des Speichers, und OLEDs nutze ich gerne U8g2_Arduino: Arduino Monochrome Graphics Library. Er hat sparsame Fonts nur mit Zahlen und Doppelpunkt z. B. für Uhren, bis hin zu UTF-8 für asiatische Zeichen. Ich finde seine Bibliotheken sehr praxisnah und in der Regel gut beschrieben. Die notwendige Komplexität braucht allerdings auch etwas Mühe für die Einarbeitung.

Bei Fragen bitte fragen, urlaubsbedingt kann die Antwort allerdings etwas auf sich warten lassen :camping:

Es gibt ja auch Online Font-Converter die genau das Adafruit-GFX-Format ausspucken.
Wäre ja genau das was ich brauche. Aber die machen auch alle nur 7-Bit-Fonts.
Und da ist halt bei 0x7F Schluß.
Versteh nur ned, wieso man da nicht auch noch die anderen 128 Zeichen mit aufnimmt. Oder gibts da einen bestimmten Grund. Außer dass die lib dann doppelt so lang ist. Was bei einem ESP32 und Ablage im Flash nicht das große Problem sein sollte.

Die GFX ist universell für alle MCU und soll einigermaßen auf UNO R3 passen, so ist das meistens bei Adafruit, so wie weiß gibt's eignen Schrift Konverter für Ada GFX

Welche weiteren 128 Zeichen willst denn aufnehmen?
Und nach welcher der 1234 (?) verschiedenen Codepages willst du sie anordnen?
Und dann die Überfrage: wie willst du das im Sourcecode notieren, wenn du ein derartiges Sonderzeichen ausgeben willst?

Spoiler: wenn du so was in Arduino c++ schreibst:

display.print("Östlich");

Dann bekommt das Display 8 (!) Byte

0xC3 0x96
0x73
0x74
0x6C
0x69
0x63
0x68

Wie soll das display mit 0xC3 0x96 umgehen?
Es ist also nicht allein damit getan "die weiterne 128 Zeichen" aufzunehmen.

Hier ein wenig zu Codepages generell:

und hier zu UTF-8

In meiner Character LCD Library habe ich mich tiefer mit den Zeichensätzen beschäftigt, das war definitiv sehr lehrreich...

https://werner.rothschopf.net/microcontroller/202012_arduino_liquid_crystal_language_en.htm

auf der deutschen Seite reiße ich kurz an, wie das umgesetzt wurde:

https://werner.rothschopf.net/202003_arduino_liquid_crystal_umlaute.htm

OK.
weiß ja jetzt ned, wie andere das dann umsetzen. Werd ja nicht der einzige sein, der mal ein Sonderzeichen braucht.
Ich für meinen Teil bin mit meiner pragmatischen Lösung zufrieden.

  • den Font als custom kopieren
  • das letzte Zeichen (0x7F) zu ° modifizieren.
  • und es dann so zu "schreiben" ->
    tft.drawString((String(Temp.T1, 1) + " \x7F" + "C").c_str().....