[SDL] It seems SDL exchanges R & B channels

Alex Chen alex.chenhl at gmail.com
Tue Feb 26 00:03:13 PST 2008


Dear all,

In the test code, I wanna show a red window but it turn out to be blue.  
What's wrong?

#include <stdlib.h>
#if defined(_MSC_VER)
#include "SDL.h"
#else
#include "SDL/SDL.h"
#endif

SDL_Surface *screen;

void render()
{
     // Lock surface if needed
     if (SDL_LockSurface(screen) < 0)
         return;

     // Ask SDL for the time in milliseconds
     int tick = SDL_GetTicks();

     // Declare a couple of variables
     int i, j, b, yofs, ofs;
     unsigned char *pc;
     unsigned long *pl;

     // Draw to screen
     Uint32 color = SDL_MapRGB(screen->format, 255, 0, 0);
     printf("color:0x%08x\n", color);

     yofs = 0;
     for (i = 0; i < 480; i++)
     {
         ofs = yofs;
         for (j = 0; j < 640; j++)
         {
             ((unsigned int*)screen->pixels)[ofs++] = color;
         }
         yofs += screen->pitch / 4;
     }

     // Unlock if needed
     if (SDL_MUSTLOCK(screen))
         SDL_UnlockSurface(screen);

     // Tell SDL to update the whole screen
     SDL_UpdateRect(screen, 0, 0, 640, 480);
}

// Entry point
int main(int argc, char *argv[])
{
     // Initialize SDL's subsystems - in this case, only video.
     if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
     {
         fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
         exit(1);
     }

     // Register SDL_Quit to be called at exit; makes sure things are
     // cleaned up when we quit.
     atexit(SDL_Quit);

     // Attempt to create a 640x480 window with 32bit pixels.
     screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);

     // If we fail, return error.
     if ( screen == NULL )
     {
         fprintf(stderr, "Unable to set 640x480 video: %s\n",  
SDL_GetError());
         exit(1);
     }

     // Main loop: loop forever.
     while (1)
     {
         // Render stuff
         render();

         // Poll for events, and handle the ones we care about.
         SDL_Event event;
         while (SDL_PollEvent(&event))
         {
             switch (event.type)
             {
             case SDL_KEYDOWN:
                 break;
             case SDL_KEYUP:
                 // If escape is pressed, return (and thus, quit)
                 if (event.key.keysym.sym == SDLK_ESCAPE)
                     return 0;
                 break;
             case SDL_QUIT:
                 return(0);
             }
         }
     }
     return 0;
}


I compile and run the program on i686 GNU/linux Red Hat Enterprise Linux  
ES release 4, the installed SDL version is SDL-1.2.7-8, the GUI  
environment is VNC+icewm.


-- 
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: test.c
Type: application/octet-stream
Size: 2253 bytes
Desc: not available
URL: <http://lists.libsdl.org/pipermail/sdl-libsdl.org/attachments/20080226/caf7505c/attachment-0007.obj>


More information about the SDL mailing list