Beginner has trouble with SDL in foll-screen mode.
I have a small program that makes a time-varying pattern on the
screen. It works fine with SDL_RESIZABLE, but not with SDL_FULLSCREEN.
In full-screen mode everything is sheared off into wavy lines, as if the
screen geometry I'm using is not the actual one.
Now I understand that it may be unable to deliver the desired resolution,
but if so SDL_SetVideoMode should be returning error indication,
right?
Although I don't get an error return, i called SDL_GetError anyway and got
the following message:
Failed loading DPMSDisable: /usr/lib/libX11.so.6: undefined symbol: DPMSDisable
I don't know if that means anything important, because it happens
both with SDL_FULLSCREEN and with SDL_RESIZABLE.
Here's the code. The #if is how I switch between full-screen and
resizable. Am I doing something obviously wrong?
#include <SDL/SDL.h>
#include <stdio.h>
#include <stdlib.h>
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;
}
int main()
{
SDL_Surface *screen;
Uint16 *raw_pixels;
int x, y, t;
printf("At start GetError says: %s\n", SDL_GetError());
if(SDL_Init(SDL_INIT_VIDEO) != 0)
{
printf("unable to initialize SDL: %s\n", SDL_GetError());
return 1;
}
atexit(SDL_Quit);
printf("After SDL_INIT GetError says: %s\n", SDL_GetError());
#if 1
screen = SDL_SetVideoMode(640, 480, 16, SDL_FULLSCREEN);
#else
screen = SDL_SetVideoMode(640, 480, 16, SDL_RESIZABLE);
#endif
printf("after SetVideoMods GetError says: %s\n", SDL_GetError());
if(screen == NULL)
{
printf("unable to set video mode: %s\n", SDL_GetError());
return 1;
}
for(t = 0; t < 20; ++t)
{
SDL_LockSurface(screen);
raw_pixels = (Uint16 *) screen->pixels;
for(x = 0; x < screen->w; x++)
{
for(y = 0; y < screen->h; y++)
{
Uint16 pixel_color;
int offset;
pixel_color = CreateHicolorPixel(screen->format,
(x * t) >> 4,
(x ^ y) + t,
(y * t) >> 4
);
offset = (screen->pitch / 2 * y + x);
raw_pixels[offset] = pixel_color;
}
}
SDL_UnlockSurface(screen);
SDL_UpdateRect(screen, 0, 0, 0, 0);
SDL_Delay(8);
}
SDL_Delay(3000);
printf("success!\n");
return 0;
}
Reply to: