C -> Font berechnen -> Formel?

OP #5831428
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"?
OP #5831440
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
  }

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.