La SDL (Simple DirectMedia Layer) est une bibliothèque multi plates-formes d'affichage 2D et 3D (OpenGL) très rapide (elle g-re ausi les périphériques de type Joystick, CD, et le son).
Ce document est un tutoriel pour utiliser la bibliothèque [[http://www.libsdl.org|SDL]] en version 2 depuis le langage C, au travers d'une surcouche nommé SDLS, développée pour les TPs à l'Ensip.
Pour compiler un programme utilisant la SDL2, il faut penser sous Windows à lier les bibliothèques : mingw32
SDL2main
et SDL2
. L'option de linkage -mwindows
est aussi nécessaire.
Trois objets ont une importance particulière lorsqu'on utilise la SDL : les fenêtres (SDL_Window), les méthodes de rendu (SDL_Renderer), les textures (Textures). Ces dernière jouent un rôle similaire aux surface de la SDL 1.2 (qui exitent encore dans la SDL 2.0 mais qu'il convient de ne plus utiliser si possible).
La SDL 2 permet de gérer plusieurs fenêtres graphiques. Plusieurs objets SDL_Window
peuvent donc coexister. À chaque fenêtre est attachée une méthode de rendu (SDL_Renderer
), qui permet de dessiner directement dans la fenêtres ou d'y plaquer des textures.
Pour utiliser SDLS, téléchargez les fichiers [[files>SDLS.c]] et [[files>SDLS.h]] et joignez les à votre projet.
Le programme suivant utilise la fonction SDLS_init
pour ouvrir la fenêtre et créer un renderer
.
#include<SDL2/SDL.h> #include<stdio.h> #include "SDLS.h" const int WIDTH = 640; const int HEIGHT = 480; int main(int argc, char** argv) { SDL_Window *win = 0; SDL_Renderer *ren = 0; SDLS_init(WIDTH,HEIGHT,&win,&ren); SDL_Delay(4000); SDL_DestroyRenderer(ren); SDL_DestroyWindow(win); SDL_Quit(); return 0; }
La fonction SDLS_affiche_image
permet d'afficher une image dans un renderer
:
// Affiche une BMP avec le coin en haut à gauche du renderer ren, en 0,0 SDLS_affiche_image("arch.bmp",ren,0,0);
Il est possible de récupérer les valeurs des pixels d'une fenêtre dans un bloc mémoire. Inversement, on peut utiliser le contenu d'un bloc mémoire pour afficher dans une fenêtre.
La fonction SDLS_getpixels
place le contenu du renderer
dans un bloc mémoire (qui doit avoir la taille
appropriée) et SDLS_putpixels
fait l'inverse.
Voici une fonction qui utilise getpixels
et ''putpixels'' pour assombrir une image :
#define WIDTH 640 #define HEIGHT 480 void sombre(SDL_Renderer * ren) { Uint32 * pixels; int x,y; int val; int cr,cg,cb; /* Récupération des pixels */ pixels = (Uint32*) malloc(WIDTH*HEIGHT*sizeof(Uint32)); if (!pixels) { fprintf(stderr,"Erreur allocation\n"); return; } SDLS_getpixels(ren,pixels,WIDTH,HEIGHT); /* Traitement */ for (x=0;x<WIDTH;x++) { for(y=0;y<HEIGHT;y++) { val = *(pixels+x+y*WIDTH); cr = ((val)&0xFF0000) >> 16; cg = ((val)&0xFF00) >> 8; cb = ((val)&0xFF); cr >>= 1 ; cg >>= 1 ; cb >>= 1 ; *(pixels + x+y*WIDTH) = (((cr<<8)+cg)<<8)+cb; } } /* Affichage des pixels */ SDLS_putpixels(ren,pixels,WIDTH,HEIGHT); free(pixels); }
Les fonctions de dessin sont évoquées dans le document [[stu:progc:sdl|Utiliser la SDL 2 en C]].