1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #include <SDL/SDL.h>
#include <iostream>
using namespace std;
SDL_Surface *affichage;
void exit_error(const char *desc)
{
cout << "Error -- " << desc << SDL_GetError() << endl;
exit(1);
}
void attendre_touche()
{
SDL_Event event;
while(SDL_WaitEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
return;
case SDL_KEYDOWN:
return;
default:
break;
}
}
}
void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
int bpp = surface->format->BytesPerPixel;
// Here p is the address to the pixel we want to set
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
switch(bpp) {
case 1:
*p = pixel;
break;
case 2:
*(Uint16 *)p = pixel;
break;
case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
p[0] = (pixel >> 16) & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = pixel & 0xff;
} else {
p[0] = pixel & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = (pixel >> 16) & 0xff;
}
break;
case 4:
*(Uint32 *)p = pixel;
break;
}
}
int main(int argc, char **argv)
{
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
exit_error("SDL_Init: ");
}
atexit(SDL_Quit);
affichage = SDL_SetVideoMode(400, 400, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
if (affichage == NULL) {
exit_error("SDL_SetVideoMode");
}
SDL_Surface *x = SDL_CreateRGBSurface(affichage->flags, 400, 400, affichage->format->BitsPerPixel, 0, 0, 0,0);
if (SDL_MUSTLOCK(x)) SDL_LockSurface(x); //nécessaire sinon crash dans certain cas
putpixel(x, 15,15 , SDL_MapRGB(x->format, 255,255,255));
putpixel(x, 15,16 , SDL_MapRGB(x->format, 255,255,255));
putpixel(x, 16,15 , SDL_MapRGB(x->format, 255,255,255));
putpixel(x, 16,16 , SDL_MapRGB(x->format, 255,255,255));
if (SDL_MUSTLOCK(x)) SDL_UnlockSurface(x);
SDL_BlitSurface(x, NULL, affichage, NULL);
SDL_Flip(affichage);
attendre_touche();
SDL_Quit();
return 0;
} |
Partager