Forum: Projekte & Code Einfaches einbinden mehrerer Fonts


von Michael D. (etzen_michi)


Angehängte Dateien:

Lesenswert?

Daher, dass ich gerne nehrere Fonts in meinen Projekten verwende und 
aber nicht alles per Hand eintragen wollte habe ich mir ein paar 
Gedanken gemacht, wie ich durch ein einfaches
1
#include "Font.h"
 meinen jeweiligen Font neben allen anderen zur Verfügung stellen kann.

Die Idee: Jeder Font trägt sich selber, beim einfügen in das Projekt, in 
eine Liste ein von wo aus dieser dann über eine Variable zum Durchzählen 
der vorhandenen Font abgerufen werden kann.

Ich stelle diese Idee hier Online sodass jemand mit einem ähnlichen 
Problem diese Lösung für sich selber verwenden kann und auch Personen 
mit besseren / anderen Ideen hier darüber diskutieren und ggf. sogar die 
vorhergehensweise verbessern können.

Ihr dürft diesen Code gerne in euren Projekten verwenden, denkt aber 
bitte bei einer Veröffentlichung daran zumindest auf diesen Thread hier 
aufmerksam zu machen.

Eine Komerzielle Nutzung, ohne mich zu fragen, würde ich nicht wollen ;)


Die Datei zur Erstellung der Daten habe ich angehängt.

Einbinden:
1
#define MULTIPLE_FONT 1         // Enable multiple font  
2
#define MULTIPLE_FONT_MAX 5     // Allow up to 5 different font
3
#include "Font_Arial_8px_H.h"   // Font 0
4
#include "Font_Arial_16px_H.h"  // Font 1
5
#include "Font_Arial_24px_H.h"  // Font 2
6
#include "Font_Arial_40px_H.h"  // Font 3
7
#include "Font_Arial_80px_H.h"  // Font 4

Verwenden:
1
uint8_t HeightBits = (returnStruct(Font, Char).Height+7)/8;    // Get Height of character in bytes
2
uint8_t WidthBytes = returnStruct(Font, Char).Width;       // Get width of character in bits
3
uint8_t *ptr = FONT_DATA_BEGIN[Font] + returnStruct(Font, Char).Offset; // Set pointer to data

Die Zeilen, welche die Eintragung erledigen lest ihr am besten am Ende 
der angehängten .h hinter den beiden Arrays.

Zum Erstellen der Font Daten habe ich das Programm "The Dot Factory" 
verwendet.

: Bearbeitet durch User
von M. K. (sylaina)


Lesenswert?

Die Idee finde ich interessant ;)

: Bearbeitet durch User
von W.S. (Gast)


Lesenswert?

Michael D. schrieb:
> Die Idee: Jeder Font trägt sich selber, beim einfügen in das Projekt, in
> eine Liste ein von wo aus dieser dann über eine Variable zum Durchzählen
> der vorhandenen Font abgerufen werden kann.

Wozu willst du den Umweg über das Abzählen machen?

An den Stellen, wo du tatsächliche Textausgaben machst, mußt du ja 
ohnehin einen bestimmten Font angeben - egal, ob du nun dort 5 (für den 
5. Font in deiner Liste) oder "Helvetica12Bold" einträgst.
Also beispielsweise
1
 ZeichneText(x,y,"Hallo",dunkelblau,Helvetica12Bold);

Also kannst du dir das Numerieren deiner Fonts eigentlich ersparen. Das 
würde eine Menge #ifdef's in deinen Font-Dateien überflüssig machen.

Und nochwas: Dein Font-beispiel ist nicht monolithisch, d.h. es ist eine 
ganze Headerdatei mit vielen verschiedenen Einträgen und mit Code.

Wie hast du dir es denn vorgestellt, daß jemand mehrere derartige .h 
Dateien in seine C-Quelle einbindet? Damit das Ganze irgendwie 
funktioniert, müßten ja all diese Codestücke in deiner .h auch 
ausgeführt werden.

Und zur Systematik: .h Dateien sind eigentlich nicht gedacht, um dort 
Code unterzubringen, sondern um mehreren anderen Quellen kundzutun, 
was in der zugehörigen .c drin ist.

W.S.

von Michael D. (etzen_michi)


Lesenswert?

W.S. schrieb:
> Wozu willst du den Umweg über das Abzählen machen?

Weil das meine Idee dazu war, wie das machbar sein könnte.
Was ich bei dieser Variante sehr schön finde ist das unbproblematische 
Austauschen eines Font an jeder Stelle im Programm wenn ich mich spät in 
der Entwicklung plötzlich für eine andere Schriftart entscheide.

W.S. schrieb:
> Und nochwas: Dein Font-beispiel ist nicht monolithisch, d.h. es ist eine
> ganze Headerdatei mit vielen verschiedenen Einträgen und mit Code.

Stimme ich zu. Es hat mit einer .h Angefangen in welcher lediglich das 
Array und ein paar Defines waren, was meiner Information ja in eine .h 
reingehört.
Die Funktion für eine einfachere Rückgabe der Werte könnte ich in eine 
extra .c verlegen. Die Funktionen zur Manipulation von Variablen 
außerhalb einer Funktion wäre schlecht woanders ein zu binden, da man 
dann für jede Schriftart zwei Dateien braucht.
>> Wäre es richtiger, die .h da dieses nun Code enthält einfach als .c ein zu 
binden?

W.S. schrieb:
> Wie hast du dir es denn vorgestellt, daß jemand mehrere derartige .h
> Dateien in seine C-Quelle einbindet? Damit das Ganze irgendwie
> funktioniert, müßten ja all diese Codestücke in deiner .h auch
> ausgeführt werden.

Ich denke bei diesen .h Datei lediglich an Schriftarten und weniger an 
Funktionen zum Zeichnen dieser. Wie jederman seine Funktion hierzu 
schreiben möchte ist einem selbst überlassen.
Ich habe für ein besseres Verständis meines Gedankenganges ein kurzes 
Beispiel beschrieben wie ich mir die Daten aus diesen Arrays beschaffe.

Beitrag #6030338 wurde von einem Moderator gelöscht.
von W.S. (Gast)


Lesenswert?

Michael D. schrieb:
> Was ich bei dieser Variante sehr schön finde ist das unbproblematische
> Austauschen eines Font an jeder Stelle im Programm wenn ich mich spät in
> der Entwicklung plötzlich für eine andere Schriftart entscheide.

Naja, sowas zieht ja so einiges nach sich: zumindest mußt du dann 
schauen, ob mit einer anderen Schriftart das Display noch gut aussieht, 
ob Texte plötzlich über den rechten Rand gehen und so weiter - in der 
Folge gibt's dann Nacharbeit an allen Ecken. Ich kenne das aus eigener 
Erfahrung: Das ist so ziemlich dasselbe wie das Implementieren von 
verschiedenen Sprachen - nach meiner Erfahrung sind da französisch und 
türkisch die schlimmsten: wo es bei englisch ganz kurz geht, bei deutsch 
auch noch so lala, braucht man bei denen jeweils ellenlange Texte.

Aber wie du das Auseinanderhalten und richtiges Einbinden von Code in 
einer bzw. mehreren .h hinkriegen willst, ist mir noch immer 
schleierhaft. Eine .h wird ja zumeist in mehreren .c inkludiert, 
obendrein würden da ja auch noch die .h all der anderen Fonts mit 
inkludiert werden müssen. Da hast du dann mehrere Codestücke zu 
handhaben - bloß wie?

W.S.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.