
Zuerst der Code:
Code: Alles auswählen
#include <SDL/SDL.h>
#include <stdio.h>
#include <stdlib.h>
Uint16 CreateHicolorPixel (SDL_PixelFormat *fmt, Uint8 red, Uint8 green, Uint8 blue);
int main ()
{
SDL_Surface *screen;
Uint16 *raw_pixels;
int x, y;
if (SDL_Init (SDL_INIT_VIDEO) != 0)
{
printf ("Unable to initialize SDL: %s\n", SDL_GetError ());
return 1;
}
screen = SDL_SetVideoMode (256, 256, 16, 0);
if (screen == NULL)
{
printf ("Unable to set video mode: %s\n", SDL_GetError ());
return 1;
}
SDL_LockSurface (screen);
raw_pixels = (Uint16 *) screen -> pixels;
for (x = 0; x < 256; x++)
{
for (y = 0; y < 256; y++)
{
Uint16 pixel_color;
int offset;
pixel_color = CreateHicolorPixel (screen -> format, x, 0, y);
offset = (screen -> pitch /2 * y + x);
raw_pixels [offset] = pixel_color;
}
}
SDL_UnlockSurface (screen);
SDL_UpdateRect (screen, 0, 0, 0, 0);
SDL_Delay (3000);
return 0;
}
Uint16 CreateHicolorPixel (SDL_PixelFormat *fmt, Uint8 red, Uint8 green, Uint8 blue)
{
Uint16 value;
value = ((red >> fmt -> Rloss) << fmt -> Rshift) +
((green >> fmt -> Gloss) << fmt -> Gshift) +
((blue >> fmt -> Bloss) << fmt -> Bshift);
return value;
}
Code: Alles auswählen
SDL_Surface *screen;
Uint16 *raw_pixels;
int x, y;
Die ifs sind klar. Dann das Surface sperren um es bearbeiten zu können.
Code: Alles auswählen
raw_pixels = (Uint16 *) screen -> pixels;

Jedenfalls werden die Pixel-Informationen von screen gecastet und raw_pixels zeigt dann auf diese Informationen.
Code: Alles auswählen
for (x = 0; x < 256; x++)
{
for (y = 0; y < 256; y++)
{
Uint16 pixel_color;
int offset;
pixel_color = CreateHicolorPixel (screen -> format, x, 0, y);
offset = (screen -> pitch /2 * y + x);
raw_pixels [offset] = pixel_color;
}
}
Jedenfalls werden danach die Format-Informationen von screen, x und y Koordinaten an die Funktion übergeben. Die Werte stehen wahrscheinlich für die Farben. Grün bleibt 0 (auch am Ergebnis ersichtlich.).
offset ist wahrscheinlich die Nummer des Pixels und dieses Pixel bekommt dann die Farbe. Den Rest von main versteh ich auch.
Aber dann die Funktion...
Code: Alles auswählen
Uint16 CreateHicolorPixel (SDL_PixelFormat *fmt, Uint8 red, Uint8 green, Uint8 blue)
{
Uint16 value;
value = ((red >> fmt -> Rloss) << fmt -> Rshift) +
((green >> fmt -> Gloss) << fmt -> Gshift) +
((blue >> fmt -> Bloss) << fmt -> Bshift);
return value;
}
Und dann wird value zurückgegeben. Das ist dann die Farbe des Pixels in main mit dem Index offset.
Wenn ich irgendwas falsch verstanden habe, bitte korrigieren

Vollständigkeitshalber hier der Downloadlink zu einem Archiv mit allen Beispielcodes vom Buch:
http://nostarch.com/plg.htm
source listings ist das Archiv mit den Codes. Dann auf SDL und listing4-2.c.
PS: Die Betreff ist absichtlich in der Mehrzahl formuliert, da dies sicher nicht die letzte Frage ist

EDIT: Hier sieht man den ungefähren Code mit Kommentaren und dem Ergebnis.