Modified screen capture routine

Thanks to Andreas Umbach and Pete Shinners about the
Screenshot routine written by Ray Kelm. It works
very well, I’m very happy.

I had to make a small modification to pass the screen
as an argument, so here’s my version of Screenshot:

int Screenshot(SDL_Surface *screen, char *filename)
{
SDL_Surface *temp;
unsigned char *pixels;
int i;

    if (!(screen->flags & SDL_OPENGL)) {
            SDL_SaveBMP(temp, filename);
            return 0;
    }
            
    temp = SDL_CreateRGBSurface(SDL_SWSURFACE, 
                                screen->w, screen->h, 24,

#if SDL_BYTEORDER == SDL_LIL_ENDIAN
0x000000FF, 0x0000FF00, 0x00FF0000, 0
#else
0x00FF0000, 0x0000FF00, 0x000000FF, 0
#endif
);
if (temp == NULL) return -1;

    pixels = malloc(3 * screen->w * screen->h);
    if (pixels == NULL) {
            SDL_FreeSurface(temp);
            return -1;
    }

    glReadPixels(0, 0, screen->w, screen->h, 
                 GL_RGB, GL_UNSIGNED_BYTE, pixels);

    for (i=0; i<screen->h; i++)
            memcpy(((char *) temp->pixels) + temp->pitch * i, 
                   pixels + 3*screen->w * (screen->h-i-1), 
                   screen->w*3);
    free(pixels);

    SDL_SaveBMP(temp, filename);
    SDL_FreeSurface(temp);
    return 0;

}

Thanks again
Marc

I had to make a small modification to pass the screen
as an argument, so here’s my version of Screenshot:

This has a bug:

int Screenshot(SDL_Surface *screen, char *filename)
{
SDL_Surface *temp;
unsigned char *pixels;
int i;

    if (!(screen->flags & SDL_OPENGL)) {
            SDL_SaveBMP(temp, filename);
            return 0;
    }

This should be:

            SDL_SaveBMP(screen, filename);

I’ll be adding this code to the FAQ.

Thanks guys! :slight_smile:

-Sam Lantinga, Lead Programmer, Loki Entertainment Software