Avatar billede _et Praktikant
24. juni 2008 - 11:52 Der er 3 kommentarer og
1 løsning

Hjælp til Pointer magi

Jeg ønsker ved et simpelt kald som her:
paintPixel(_X, _Y, _DATA)
at male den aktuelle pixel i memory med _DATA

Jeg er ikke skap til pointer magi og kan ikke få det til at virke helt dynamisk.
Hvis det er noget du kan klare så er fakta her:

Jeg har en framebuffer af variabel størrelse (_WIDTH og _HIGHT)
Jeg har 32 bit pr adresse i framebuffer
Jeg har en variabel farvedybte(1,2,4,8,16 og 24bit) pr px på framebuffer (_BPP)
Pixels er placeret fortløbende i memory med 32px pr memory adresse ved 1 BBP og ned til 1px ved 24bit(placeret på bit 0-23)

Jeg vil gerne se noget virklig trylleri i håb om at lære nogle trix.

Mvh.
Teddy
Avatar billede kenneth_gorking Nybegynder
27. juni 2008 - 02:43 #1
Fra 8 til 24 bit er det nemt nok:

void paintPixel(unsigned _X, unsigned _Y, unsigned _DATA)
{
    switch(_BPP)
    {
    case 8:  static_cast<unsigned char *>(framebuffer)[_X + _Y * _WIDTH] = _DATA; break;
    case 16: static_cast<unsigned short *>(framebuffer)[_X + _Y * _WIDTH] = _DATA; break;
    case 24: static_cast<unsigned int *>(framebuffer)[_X + _Y * _WIDTH] = _DATA & 0x00FFFFFF; break;
    }
}

Hvad vil du med 1, 2, og 4 bit opløsningnerne? De vil sikkert være langsommere, ikke bare på grund af de ekstra beregninger (en division og en modulus per pixel), men også fordi værdier der allerede findes i framebufferen skal nulstilles inden nye værdier kan skrives. Hvis du ikke gjorde det, ville følgende:

paintPixel_1bit(0,0, 1);
paintPixel_1bit(0,0, 0);

stadigvæk have en værdi af 1 på position 0,0. Det er dog nemt nok at lave:

void paintPixel_1bit(unsigned _X, unsigned _Y, unsigned char _DATA)
{
    unsigned pos = _X + _Y * _WIDTH;
    unsigned index = pos / 32;
    unsigned offset = pos % 32;

    if( (_DATA & 1) == 0 )    framebuffer[index] &= ~(1 << offset)
    else            framebuffer[index] |= 1 << offset;
}
Avatar billede _et Praktikant
30. juni 2008 - 09:18 #2
Mange tak. Det ser fint ud. Jeg kigger lige på det i ugen og giver point
Avatar billede _et Praktikant
08. juli 2008 - 11:22 #3
Det virker - Svar please.
Avatar billede kenneth_gorking Nybegynder
10. juli 2008 - 03:11 #4
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester