Font Array auslesen?!

Gast #5314099
Hallo,

ich möchte gerne eine Funktion schreiben die mir mein Character aus dem 
Array zieht.

Wie berechne Ich denn nun den Start bzw. Anfang von meinem Zeichen?
1
https://github.com/johnmccombs/arduino-libraries/blob/master/glcd/fonts/Arial14.h

Würde mich über Anregungen freuen.
Gast
Es gibt ja einen Bereich in dem steht wie breit ein Zeichen ist (in 
words - 16 Bit). Du musst also die Beiten aller Zeichen die vor deinem 
gesuchten Zeichen im Array stehen aufsummieren.
Gast
Martin schrieb:
> Es gibt ja einen Bereich in dem steht wie breit ein Zeichen ist
> (in
> words - 16 Bit). Du musst also die Beiten aller Zeichen die vor deinem
> gesuchten Zeichen im Array stehen aufsummieren.

Und woher weiß Ich wie viele ich aufsummieren muss bis mein Zeichen 
kommt?
Gast
>Es gibt ja einen Bereich in dem steht wie breit ein Zeichen ist (in
>words - 16 Bit). Du musst also die Beiten aller Zeichen die vor deinem
>gesuchten Zeichen im Array stehen aufsummieren.
+ die 6Byte für size .. + 96 Bytes für die char widths
Gast
Martin schrieb:
> dummschwaetzer schrieb:
>> + die 6Byte für size .. + 96 Bytes für die char widths

Ah okay überlesen.
Nun wenn ich '0' + 102 rechne komme Ich immer noch nicht an den Anfang 
der Zahl '0' ich muss die breiten von den vorherigen Zahlen noch hinzu 
rechnen oder?
Gast
genau!

Das erste Zeichen in der Tabelle ist das Space  0x20  32. Wobei das 
Space eine Breite von 0 hat. Das nöchste Zeiche (0x21 / 33) ist das '!' 
. Das hat eine Breite von 1 Pixel.

// char widths
0x00, 0x01, 0x03, 0x08, 0x07, 0x0A, 0x08, 0x01, 0x03, 0x03,

// font data
0xFE, 0x14, // 33
0x1E, 0x00, 0x1E, 0x00, 0x00, 0x00, // 34

Beachte, da jedes Zeichen 14 Bit hoch ist benötigt jede Spalte 2 Byte. 
Jetzt musst du nur von 0x20 (32, Space) bis 0x30 (48, '0') zählen und 
die Werte unter "char widths" aufaddieren.
Gast
Und das aufsummieren?
1
int8_t calcFontStart(uint8_t c)
2
{
3
  int8_t start=c-32;
4
  for( ; start <= c ; start++)
5
  start += Arial_14[start+6];
6
  
7
  return start;
8
}
Gast
In dem Array stecken mehr als 256 Byte. Deswegen kommst du mit int8_t 
nicht aus.

Was hällst du von :
1
int16_t calcFontStart(uint8_t c)
2
{
3
  
4
  int16_t byte_nr = 102;
5
  for(uint8_t zeichen = 0 ; zeichen <= c - 32 ; zeichen++)
6
        byte_nr += Arial_14[zeichen + 6] * 2;
7
  
8
  return start;
9
}
Um das Variabel zu halten kannst du auch die 32 durch  Arial_14[4] 
ersetzen usw.
Gast
Benötigt man noch was?
1
font_t calcFontStart(uint8_t c, font_t font)
2
{
3
  uint8_t charNum = 0;
4
  font.width = Arial_14[c+6];
5
  
6
    font.indexNum = 102;
7
    for(; charNum <= c - 32 ; charNum++)
8
  font.indexNum += Arial_14[charNum + 6] * 2;
9
  
10
    return font;
11
}
12

13
int main()
14
{
15
  font_t fontInfo = calcFontStart('0', fontInfo);
16
  
17
  printf("%d",fontInfo.indexNum);
18
    return 0 ;
19
}
Gast
Peter W. schrieb:
> font_t calcFontStart(uint8_t c, font_t font)
> {
>   uint8_t charNum = 0;
>   font.width = Arial_14[c+6];
>
>     font.indexNum = 102;
>     for(; charNum <= c - 32 ; charNum++)
>   font.indexNum += Arial_14[charNum + 6] * 2;
>
>     return font;
> }

Sicher das die Rechnung so richtig ist?
Gast
Hast du irgendwo in der Doku die Beschreibung welches Bit welchem Pixel 
entspricht,
z.B Breite 1:
0xFE, 0x14, // 33
Das sind 16Bit, deine schrift iat aber nur 14Pixel(0x0E, // height) 
hoch.
Gast
dummschwaetzer schrieb:
> Hast du irgendwo in der Doku die Beschreibung welches Bit welchem
> Pixel
> entspricht,
> z.B Breite 1:
> 0xFE, 0x14, // 33
> Das sind 16Bit, deine schrift iat aber nur 14Pixel(0x0E, // height)
> hoch.

Bei meinem Display wird alles "senkrecht" geschrieben.
[C]
0 // Bit 7
0
0
0
0
0
0
0 // Bit 0
{/C]
Das wäre die Erste Zeile vom Display.
Gast
Das ist mein aktueller Code
1
typedef struct
2
{
3
  uint16_t indexNum;
4
  uint8_t  width;
5
}font_t;
6

7
font_t calcFontStart(uint8_t c, font_t font)
8
{
9
  uint8_t charNum = 0;
10
  font.width = Arial_14[(c-' ')+6];
11
  
12
  font.indexNum = 102;
13
  for(; charNum <= c - ' ' ; charNum++)
14
  font.indexNum += (Arial_14[charNum + 6] * 2);
15
  
16
  font.indexNum -= (font.width*2);
17
  
18
  return font;
19
}
20

21
  
22
void test(void)
23
{
24
  char s[]= "TEST";
25
  uint8_t pos = 0;
26
  
27
  for (uint8_t i = 0 ; i < strlen(s) ; i++)
28
  {
29
    uint16_t x=0;
30
    font_t fontInfo = calcFontStart(s[i], fontInfo);
31
    
32
    glcdSetPageColumn(6,pos);
33
    for (x=0;x<fontInfo.width;x++)
34
    glcdSendData(swapBits(Arial_14[fontInfo.indexNum+x]));
35
    
36
    glcdSetPageColumn(5,pos);
37
    for (x=fontInfo.width;x<(fontInfo.width*2);x++)
38
    glcdSendData(swapBits(Arial_14[fontInfo.indexNum+x]));  
39
    
40
    pos+=10;    
41
  }
42
}
Gast
Welche Bits der 16 vorgegebenen sind zu viel?
Beispiel:
!
0xFE, 0x14, // 33
Zeile Interpretation1
 0    X -\
 1    X - \F
 2    X - /
 3    X -/
 4    X -\
 5    X - \E
 6    X - /
 7      -/
 8      -\
 9      - \1
10      - /
11    X -/
12      -\
13    X - \4
14      - /
15      -/

sieht komisch aus für ein Ausrufezeichen.
dummschwaetzer schrieb:
> sieht komisch aus für ein Ausrufezeichen.

Vom zweiten Byte nur 6 bit,
vom ersten kommt bit 0 natürlich nach oben

  7      - byte 0 bit 0
  6    X - byte 0 bit 1
  5    X - byte 0 bit 2
  4    X - byte 0 bit 3
  3    X - byte 0 bit 4
  2    X - byte 0 bit 5
  1    X - byte 0 bit 6
  0    X - byte 0 bit 7
 13    X - byte 1 bit 0
 12      - byte 1 bit 3
 11    X - byte 1 bit 4
 10      - byte 1 bit 5
  9      - byte 1 bit 6
  8      - byte 1 bit 7
Gast
Michael B. schrieb:
> dummschwaetzer schrieb:
>> sieht komisch aus für ein Ausrufezeichen.
>
> Vom zweiten Byte nur 6 bit,
> vom ersten kommt bit 0 natürlich nach oben


Ja gut. Soll das heißen das mein anderes Byte verkehrt rum geschrieben 
wird?
Gast
dummschwaetzer schrieb:
> und da sind seine zwei Leerzeilen in seinem Displaybild.
> vom 2.Byte die ersten beiden Bits nicht auf das Display.

Wieso wird dann solch ein Font erstellt? Das kommt doch sicherlich von 
einem PC Programm? Gibt es andere Displays die nicht senkrecht die Bytes 
auf dem Bildschirm werfen sondern waagerecht?
Man kann je nach Setup viele Displays von oben nach unten, unten nach 
oben, links nach rechts oder rechts nach links beschreiben. Wie man es 
halt gerade braucht. Oder weil man das Display um 90° drehen möchte. 
Oder vielleicht hat man einen Spiegel dazwischen...


Und manch einer weiß das alles nicht und schreibt daher seinen Font 
komisch. Schon alles gesehen.
Gast
Nico W. schrieb:
> Man kann je nach Setup viele Displays von oben nach unten, unten
> nach
> oben, links nach rechts oder rechts nach links beschreiben. Wie man es
> halt gerade braucht. Oder weil man das Display um 90° drehen möchte.
> Oder vielleicht hat man einen Spiegel dazwischen...
>
> Und manch einer weiß das alles nicht und schreibt daher seinen Font
> komisch. Schon alles gesehen.

Na gut. Ich hoffe ja da drauf das es wirklich mit dem unteresBild<<2 ist 
und sich das Problem dadurch lösen lässt. Bin zuversichtlich-
Gast
Korrektur:
Michael B. schrieb:
>   7      - byte 0 bit 0
>   6    X - byte 0 bit 1
>   5    X - byte 0 bit 2
>   4    X - byte 0 bit 3
>   3    X - byte 0 bit 4
>   2    X - byte 0 bit 5
>   1    X - byte 0 bit 6
>   0    X - byte 0 bit 7
>  13    X - byte 1 bit 0
>  12      - byte 1 bit 3
>  11    X - byte 1 bit 4
>  10      - byte 1 bit 5
>   9      - byte 1 bit 6
>   8      - byte 1 bit 7

dummschwaetzer schrieb:
> vom 2.Byte die ersten beiden Bits nicht auf das Display.

vom 2.Byte das zweite und dritte Bit nicht auf das Display.
Gast
Tatsächlich! Das war es. Wieso aber funktioniert das? Hat man den Font 
extra so angelegt? Ist das jetzt wirklich Display spezifisch?

Danke an alle die geholfen haben.
Gast
Was mir jetzt noch aufgefallen ist. Wenn ich einen String ausgeben will 
mit dem Text, wie berechne Ich die Leerzeichen dazwischen? Aktuell 
schreib Ich jedes Zeichen auf das letzte..
Gast
Ah okay.
1
void glcdPutsSpecial(char *str, uint8_t x , uint8_t y)
2
{
3
  uint16_t space = 0;
4
  while (*str)
5
  {
6
    glcdPutcSpecial(*str++,x,space);
7
    space+=(font.width)+1;
8
  }
9
}

So habe Ich es jetzt gelöst.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.