Forum: Mikrocontroller und Digitale Elektronik C -> Font berechnen -> Formel?


von Jan H. (janiiix3)


Lesenswert?

Ich versuche gerade mein Font was sich in einem Array langweilt und 
darauf wartet bearbeitet zu werden in meinen virtuellen "DisplayRam" zu 
verlagern.

Das Font ist "horizontal" angeordnet.
Zu jedem Font gibt es einen "Header". Der sieht wie folgt aus..
1
    0x1E, 0x6C, // size
2
    0x0A, // width
3
    0x0E, // height
4
    0x20, // first char
5
    0x60, // char count
6
  
7
  0x68,
8
  0x00,
9
    
10
    // char widths
11
    0x00, 0x01, 0x03, 0x08, 0x07, 0x0A, 0x08, 0x01, 0x03, 0x03, 
12
    0x05, 0x07, 0x01, 0x04, 0x01, 0x04, 0x06, 0x03, 0x06, 0x06, 
13
    0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x01, 0x01, 0x06, 0x06, 
14
    0x06, 0x06, 0x0D, 0x09, 0x07, 0x08, 0x08, 0x07, 0x07, 0x09, 
15
    0x07, 0x01, 0x05, 0x08, 0x07, 0x09, 0x07, 0x09, 0x07, 0x09, 
16
    0x08, 0x07, 0x07, 0x07, 0x09, 0x0D, 0x08, 0x09, 0x08, 0x02, 
17
    0x04, 0x02, 0x05, 0x08, 0x02, 0x06, 0x06, 0x05, 0x06, 0x06, 
18
    0x04, 0x06, 0x06, 0x01, 0x02, 0x06, 0x01, 0x09, 0x06, 0x06, 
19
    0x06, 0x06, 0x04, 0x05, 0x04, 0x06, 0x07, 0x09, 0x06, 0x07, 
20
    0x06, 0x03, 0x01, 0x03, 0x07, 0x07,

Da das Display aktuell die Daten auch "horizontal" verarbeitet und ich 
mit meiner Funktion ( noch nicht fertig..! ) erstmal nur die einzelnen 
Bits ( Pixel ) setzen möchte, habe ich einige Fragen..
1
void   Ssd1306DrawPixel( int16_t x , int16_t y )
2
{
3
  if ( ( y >= SSD1306_LCD_WIDTH ) || ( y < 0 ) || ( x >= SSD1306_LCD_HEIGHT ) || ( x < 0 ) )
4
  {
5
    return;    
6
  }
7
  
8
  DisplayRam[ y + ( x / 8 ) * SSD1306_LCD_WIDTH ] |=  ( 1 << ( x & 7 ) );
9
}

Wenn mein Font jetzt höher als "8 Pixel" ist, sagen wir einfach mal "14 
Pixel" hoch, wie berechnet man am besten die benötigten "Pages"?

Für dieses Font würde man jetzt zwei "Reihen" benötigen, die erste Reihe 
sind dann meine "8 Pixel", dann bleiben jetzt für die zweite Page nur 
noch 2 Pixel übrig, sollten diese Pixel am "LSB" stehen, müsste ich 
diese doch dann "6x" nach rechts schieben.. Denke ich falsch? Geht es 
einfacher?

Wie bekomme ich am schnellsten jetzt diese einzelnen Pixel in mein 
"DisplayRam"?

von Jan H. (janiiix3)


Lesenswert?

Das habe ich bisher..
1
  /*
2
  *  Test Byte in Pixel zerlegen & in den "DisplayRam" laden:
3
  *  Test Zeichen = 11110000 , 00001100 , 00000010 , ‭00011100‬ , ‭01100000‬ , ‭10000000‬
4
  *
5
  *     [0..127]
6
  *  [0]1000001------------------------------
7
  *  [1]1000110------------------------------
8
  *  [2]1000110------------------------------
9
  *  [3]1001000------------------------------
10
  *  [4]0101000------------------------------
11
  *  [5]0101000------------------------------
12
  *  [6]0010000------------------------------
13
  *  [7]0000000------------------------------
14
  */
15
  for ( uint8_t ActualPage = 0 ; ActualPage < Pages ; ActualPage++ )
16
  {
17
    for ( uint8_t CharWidth = 0 ; CharWidth < font.width ; CharWidth++ )
18
    {
19
      for ( uint8_t BitPosition = 0 ; BitPosition < 8 ; BitPosition++) // Byte auf gesetzte Bits überprüfen..
20
      {
21
        if ( font.fontPtr[font.indexNum+CharWidth] & 1<<BitPosition )
22
        {
23
          Ssd1306DrawPixel( x + BitPosition * ActualPage , y + CharWidth );
24
        }else
25
        {
26
          Ssd1306ClearPixel( x + BitPosition * ActualPage , y + CharWidth );
27
        }
28
      }
29
    }
30
  }

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.