Frage zur Optimierung Display Text mit Font

Gast #2513787
Lesenswert?

Hallo

Ich bin gerade dabei mir ein Code zu schreiben um text auf ein Display 
zu schreiben.
Es handelt sich um externe fonts die mittels Fontgeneratór erstellt 
wurden.

Soweit geht alles bis auf die Performance.

Kann man da noch was Optimieren??
Angehängte Dateien:
#2514412
Lesenswert?

Hier
1
        for( i = 0; i < 8; i++ )
2
        {
3
          if (c&(128>>i))
4
          {
5
            GLCD_SetPixel( x1+i, y+j, 1, layer );
6
          }
7
          else
8
          {
9
            GLCD_SetPixel( x1+i, y+j, 0, layer );
10
          }
11
        }

steckt noch einiges Potential. Schieben um eine variable Anzahl an 
Stellen ist immer eine schlechte Idee auf einem AVR.
Anstatt mit einer variablen Maske abzufragen, fragst du immer dasselbe 
Bit ab und schiebst dufür das Byte in c sukzessive um 1 Stelle weiter.

1
       if(font==1) c = pgm_read_byte( &data_table[ offset + o + byteOffset ] );
2
     if(font==2) c = pgm_read_byte( &data_table1[ offset + o + byteOffset ] );
3
     if(font==3) c = pgm_read_byte( &data_table2[ offset + o + byteOffset ] );

schreib dir halt erst mal eine Funktion, die 1 Zeichen ausgeben kann, 
wobei du die Startadresse im Flash (ergo den Font) dieser Funktion 
mitgibst. Dann brauchst du nicht bei jedem Zeichen eine 
Fallunterscheidung machen, welcher Font zu benutzen ist. Die 
Fontstartadresse stellst du dann 1 mal pro String fest und gibst alle 
Zeichen mit dieser Fontstartadresse aus.

Ausserdem ist so eine Funktion, die 1 Zeichen ausgeben kann, sowieso 
immer eine gute Idee.
Gast #2515829
Lesenswert?

Hallo

Es geht um ein 320x240 mit Epson S1D13700.


Hier ist die SET PIXEL Funktion
oid GLCD_SetPixel(unsigned int x,unsigned int y, int color,int layer)
{
unsigned char tmp = 0;
unsigned int address;
if(layer==1)address=SED1335_GRAPHICSTART1 + (40 * y) + (x/8);
if(layer==2)address=SED1335_GRAPHICSTART2 + (40 * y) + (x/8);
if(layer==3)address=SED1335_GRAPHICSTART3 + (40 * y) + (x/8);

GLCD_SetCursorAddress(address);

GLCD_WriteCommand(SED1335_MREAD);
tmp = GLCD_ReadData();

if(color)
  tmp |= (1 << (SED1335_FX - (x % 8)));
else
  tmp &= ~(1 << (SED1335_FX - (x % 8)));

GLCD_SetCursorAddress(address);
GLCD_WriteCommand(SED1335_MWRITE);
GLCD_WriteData(tmp);
}

Danke

Gruß

Paul
#2515846
Lesenswert?

Paul schrieb:

>
> Hier ist die SET PIXEL Funktion

Und für bestimmte Werte für x kann man das bei der Textasugabe so 
optimieren, so dass nicht jedes Pixel einzeln gemalt werden muss, 
sondern nach Möglichkeit bis zu 8 in einem Rutsch.
(wenn ich das richtig sehe, sind immer 8 in x-Richtung nebeneinander
liegende Pixel zu einem Byte zusammengefasst)

Und wenn es nicht diese bestimmten x-Werte sind, dann kann man die 
auszugebenden Bytes immer noch in Teile aufteilen, so dass dann trotzdem 
wieder möglichst viele Pixel in einem Byte in einem Aufwasch geschrieben 
werden können.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren