Outils pour utilisateurs

Outils du site


stu:progc:sdls

Warning: Undefined array key "lang" in /home/signac/doku/lib/plugins/wrap/helper.php on line 94

Warning: Undefined array key "id" in /home/signac/doku/lib/plugins/wrap/helper.php on line 117

Warning: Undefined array key "width" in /home/signac/doku/lib/plugins/wrap/helper.php on line 119

Warning: Undefined array key "dir" in /home/signac/doku/lib/plugins/wrap/helper.php on line 128

Warning: Undefined array key "lang" in /home/signac/doku/lib/plugins/wrap/helper.php on line 94

Warning: Undefined array key "id" in /home/signac/doku/lib/plugins/wrap/helper.php on line 117

Warning: Undefined array key "width" in /home/signac/doku/lib/plugins/wrap/helper.php on line 119

Warning: Undefined array key "dir" in /home/signac/doku/lib/plugins/wrap/helper.php on line 128

Utiliser simplement la SDL 2 en C : SDLS

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.

- Quelques principes et vocabulaire

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.

- Ouvrir une fenêtre

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;
}

- Afficher une image

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);

- Accéder aux pixels

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);
}

- Fonctions de dessin

Les fonctions de dessin sont évoquées dans le document [[stu:progc:sdl|Utiliser la SDL 2 en C]].

stu/progc/sdls.txt · Dernière modification: 2014/03/31 16:45 (modification externe)