Forum: Mikrocontroller und Digitale Elektronik Pixel überspringen (Transparenz) SSD1964, FSMC, STM32F4


von Fabian (Gast)


Lesenswert?

Hallo Forum,
ich habe bisher ein Display mit einem SSD1298 Controller über den FSMC 
eines STM32F4 angesprochen. Wenn ich einer Grafik Text überlagern 
möchte, dann habe ich mittels WriteData den Pixel gesetzt oder 
alternativ per ReadData einen Pixel übersprungen. So war es mir einfach 
Text auf beliebigem Hintergrund darzustellen.

Nun portiere ich derzeit den Code für den SSD1964. Bei diesem Display 
muss ich festlegen, ob ich Daten lesen oder schreiben will. (8080 Bus). 
Weiß der Teufel, warum ich den Chip vorher umschalten muss und nicht 
einfach bei Read / Write auf den Display-Ram zugreifen kann.

Da ich wohl kaum der erste bin, der sich mit dieser Thematik 
beschäftigt, frage ich hier mal, was die gängiste Methode ist, Text auf 
einem beliebigem Hintergrund darzustellen, also wie kann ich Pixel am 
einfachsten / schnellsten überspringen, die nicht gesetzt werden 
sollen?!

Vielen Dank!

von Martin R. (m-joy)


Lesenswert?

Hallo,

ich hatte das mal so gemacht.


// Write pixel to screen
for(stretchX=0; stretchX<stretch; stretchX++){
  #ifdef USE_TRANSPARENT_COLOR
   if (!((GetTransparentColor() == GetColor()) &&
      (GetTransparentColorStatus() == TRANSPARENT_COLOR_ENABLE)))
   #endif
   WriteData(_color);
   else _address++;//wenn Transparenter Pixel erkannt, adresse 
hochzählen...
}

Dabei erhöhe ich meine PMP Speicheradresse, ohne den RAM an der Stelle, 
wo der Transparente Pixel erkannt wurde, zu beschreiben, wenn ein 
Transparenter Pixel erkannt wurde. Ka ob das auch anders geht.
(PMP Adressiert Frame Buffer)

von Fabian (Gast)


Lesenswert?

Vielen Dank!
Ich habe es jetzt ähnlich gelöst:
1
// Char bitmap
2
writeMode = DISABLE;
3
for (w = 0; w < fWidth; w++)
4
{
5
  if ((w & 0x07) == 0) { c = *fBitmap++; }
6
  if (((c & 0x80) == 0) && (text->backColor == COLOR_TRANSPARENT)) { writeMode = DISABLE; }
7
  else
8
  {
9
    if (!writeMode)
10
    {
11
      writeMode = ENABLE;
12
      TftSetAddressBox(tX + w, tY + h, TFT_SIZEX - tX - w, 1);
13
    }
14
15
    if (c & 0x80) TftWriteData(text->foreColor);
16
    else       TftWriteData(text->backColor);
17
  }
18
  c <<= 1;
19
}

Kerngedanke ist, dass ich, sobald ein Transparenter Pixel erkannt wurde, 
diese überspringe und mir mittels "writeMode" merke, dass die Adressbox, 
also der Bereich auf dem Display, welches beschrieben wird, neu 
eingerichtet werden muss.
Dadurch brauche ich nur dann den Bereich noch initiieren, wenn zwischen 
Normalem Pixel und transparentem Pixel gewechselt wird.
Genau so mache ich es nun auch mit Grafiken. Die Performance ist 
eigentlich sehr gut, so dass ich trotzdem noch ein komplettes 800x480 
Bild aufbauen kann, ohne dass eine Verarbeitungszeit zu erkennen ist.

Fabian

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.