Pixel Negierung

Gast #4286538
Lesenswert?
• ▲
▼
Hallo,

ich hatte vor kurzen schon einmal hier geschrieben.

Display Controller ist der folgende:

UC1698

Glaube aber es ist ein semantisches Problem. Habe jetzt folgende 
Funktionen erfolgreich realisiert:
1
unsigned char shadow_RAM[3840];
2

3

4
void put_pixel(unsigned char zeile, unsigned char spalte) // 1,0
5
{
6
    unsigned char zahl = fmod(spalte,8);
7
    unsigned int hilf = spalte/8;
8

9
    shadow_RAM[hilf + zeile * 240/8] |= bitMask[zahl];
10

11
}
12

13

14
void delete_pixel(unsigned char zeile, unsigned char spalte) // 1,0
15
{
16
    unsigned char zahl = fmod(spalte,8);
17
    unsigned int hilf = spalte/8;
18

19
    shadow_RAM[hilf + zeile * 240/8] &= ~(bitMask[zahl]);
20

21

22
}
23

24
void clear_window(unsigned start_zeile, unsigned start_spalte, unsigned end_zeile, unsigned end_spalte)
25
{
26
    unsigned int i,k;
27
    for(k = start_zeile; k < end_zeile; k++)
28
    {
29
        for(i = start_spalte; i < end_spalte; i++)
30
        {
31
            delete_pixel(k,i);
32
        }
33
    }
34
}

Funktioniert wunderbar. Ich würde jetzt gerne eine Funktion schreiben, 
die den derzeitigen Pixel überprüft und diesen dann negiert:
1
void negiere_pixel(unsigned char zeile, unsigned char spalte) // 1,0
2
{
3
    unsigned char zahl = fmod(spalte,8);
4
    unsigned int hilf = spalte/8;
5

6
    if(shadow_RAM[hilf + zeile * 240/8] & (1 << zahl))
7
        delete_pixel(zeile, spalte);
8
    else
9
        put_pixel(zeile, spalte);
10

11
}
12

13
void negiere_window(unsigned start_zeile, unsigned start_spalte, unsigned end_zeile, unsigned end_spalte)
14
{
15
    unsigned int i,k;
16
    for(k = start_zeile; k < end_zeile; k++)
17
    {
18
        for(i = start_spalte; i < end_spalte; i++)
19
        {
20
            negiere_pixel(k,i);
21
        }
22
    }
23
}

In der negiere_pixel Funktion frage ich das jeweilige Bit ab. Wenn es 
gesetzt ist wird es gelöscht, ansonsten gehe ich davon aus, dass es 
nicht gesetzt ist und setze es.

Was ich jetzt beobachte, wenn ich ein ganzes Fenster negiere, dass immer 
nur die ersten 4 Bits negiert werden und die darauffolgenden nicht.

Sieht jemand wo sich der Fehlerteufel eingeschlichen hat?

Danke
Gast #4286563
Lesenswert?
• ▲
▼
Luther B. schrieb:
> Schon mal XOR (^) probiert?void neg_pixel(unsigned char zeile,
> unsigned char spalte) // 1,0
> {
>     unsigned char zahl = spalte % 8;
>     unsigned int hilf = spalte / 8;
>
>     shadow_RAM[hilf + zeile * 240/8] ^= bitMask[zahl];
> }

Ich bin wieder mal dumm.

Wesentlich eleganter und funktioniert tadellos.
Danke.

Verstehe trotzdem nicht 100% warum das vorherige Bsp (auch wenn es sehr 
unschön ist) nicht funzt.
Gast #4287098
Lesenswert?
• ▲
▼
Pixel schrieb:
> UC1698..

Nein, das Problem hat mit dem konkreten Controllertyp nix zu tun.

Du solltest lieber nicht mit void Funktionen wie PutPixel oder 
DeletePixel arbeiten. Schreibe lieber sowas wie
PIXELTYPE Pixel ( int X, int Y, PIXELTYPE Farbe)
und laß diese Funktion einfach den vorherigen Zustand des Pixels 
zurückliefern. Das ist universeller und läßt sich ohne wirkliche 
Strukturänderungen auch auf Displays unterschiedlicher Farbauflösungen 
verwenden. Nee.. nicht die konkrete Funktion, sondern die Headerdatei, 
die die treiberinternen Dinge vom allgemeinen Programm abschirmt.

Guck die mal den angefügten Code an, speziell dort CgPixel_at (...
Dieses Stück Code ist für das Pollinsche Display
"https://www.pollin.de/shop/dt/MTYwOTc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Displays/LCD_Grafikmodul_VG_G120751_1WRNNA.html";
gedacht. Die Details, wo in welchem Byte denn nun das konkrete Pixel zu 
finden ist, mußt du anhand deines konkreten Displays selber festlegen 
und den Code entsprechend anpassen.

W.S.
Angehängte Dateien:

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.