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
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;
}