Hallo,
danke, der erste Teil ist mir jetzt klar.
*(Uint32 *)pixaddr = pixel;
"Nimm den aktuellen Wert von pixaddr, tu so als sei es ein Zeiger auf Uint, und weise dem Uint, auf den es dann zeigen würde, den Wert von pixel zu."
Ist mir im Grunde genommen auch klar, aber dennoch weiß ich nicht ganz, was es im Code eigentlich bewirkt, wenn die dazugehörende Funktion, die ein Pixel am Bildschirm zeichnet, folgendermaßen aussieht:
void setpixel(SDL_Surface *surface, int x, int y, Uint8 R, Uint8 G, Uint8 B) {
int bbp = surface->format->BytesPerPixel;
Uint32 pixel = SDL_MapRGB(surface->format, R, G, B);
//pixaddr ist die Adresse zum Pixel, das wir setzen wollen
Uint8 *pixaddr = (Uint8 *)surface->pixels + y *surface->pitch + x * bbp;
switch(bbp) {
case 1:
*pixaddr = pixel;
break;
case 2:
*(Uint16 *)pixaddr = pixel;
break;
case 3: // langsamer 24-Bit-Modus, selten verwendet
if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
pixaddr[0] = (pixel >> 16) & 0xff;
pixaddr[1] = (pixel >> 8) & 0xff;
pixaddr[2] = pixel & 0xff;
} else {
pixaddr[2] = pixel & 0xff;
pixaddr[1] = (pixel >> 8) & 0xff;
pixaddr[0] = (pixel >> 16) & 0xff;
}
break;
case 4:
*(Uint32 *)pixaddr = pixel;
break;
}
}
Desweiteren glaube ich sogar, dass die Verzweigung case 3 fehlerhaft ist. Es wird zwischen big endian, und offensichtlich little endian unterschieden, aber dennoch wird den Indizes 2 x dasselbe zugewiesen. Müsste die else-Verzweigung nicht so aussehen?
pixaddr[0] = pixel & 0xff;
pixaddr[1] = (pixel >> 8) & 0xff;
pixaddr[2] = (pixel >> 16) & 0xff;
Markus.
--
http://www.apostrophitis.at
Wenn ich ein toller Programmierer währe, könnte ich vieleicht sogar Packete nach einem gewissen Standart kompelieren...
Vieleicht progge ich aber auch eine tolle Gallerie, die dann hoffentlich funzt.
http://www.apostrophitis.at
Wenn ich ein toller Programmierer währe, könnte ich vieleicht sogar Packete nach einem gewissen Standart kompelieren...
Vieleicht progge ich aber auch eine tolle Gallerie, die dann hoffentlich funzt.