Il Sistema e la Memoria Video in SDL

In uno scorso articolo su SDL abbiamo introdotto le librerie ed abbiamo visto in pratica come compilare gli eseguibili e come inizializzare l’ambiente grafico con i vari sottosistemi. In questo articolo tratteremo del sistema video e come accedere alla memoria di quest’ultimo, il tutto per il momento in maniera teorica, in un prossimo post vedremo anche di mettere in pratica quanto detto ora.
La prima cosa da fare, dopo l’inizializzazione della libreria ed aver detto di voler utilizzare lo schermo, è impostare la modalità video mediante la funzione SDL_SetVideoMode() che presenta nei primi due argomenti i valori della risoluzione da impostare, un terzo parametro indicante la profondità del colore ed infine una serie di flag sommabili in OR indicanti varie modalità di creazione della finestra.

  • SDL_SWSURFACE – valore di default indicante lo schema con il doppio buffer.
  • SDL_DOUBLEBUF – crea due superfici nella memoria video scambiabili tra loro con la funzione SDL_Flip().
  • SDL_FULLSCREEN – la libreria tenterà di andare in modalità schermo intero.

Se non è possibile impostare la finestra come desiderato, la funzione restituirà un valore NULL, altrimenti verrà restituito un puntatore ad una struttura SDL_Surface, usata per mantenere informazioni sulla superficie. Come potete notare il modo di lavorare di SDL rispecchia quello di DirectX o OpenGL.
Per far disegnare nello schermo quello che è presente nel framebuffer occorre richiamare la funzione SDL_UpdateRect() che ha come argomenti: il puntatore a SDL_Surface ottenuto in precedenza e quattro coordinate che descrivono il rettangolo da aggiornare, in caso di quattro zeri viene aggiornato l’intero schermo. In pratica è possibile lavorare in RAM e creare l’immagine e poi aggiornare lo schermo dopo aver terminato, il classico modo di lavorare con il Double Buffer. Come abbiamo visto nei flag della modalità video iniziale, è possibile anche lavorare con due buffer scambiabili, in modo che mentre uno è visibile, l’altro è nascosto, quindi effettuare il Page Flipping con la funzione SDL_Flip() che accetta il puntatore a SDL_Surface. Se il flipping è possibile verrà atteso il retrace dello schermo e quindi scambiati i framebuffer, altrimenti verrà copiato il buffer in RAM nella memoria video attraverso la funzione SDL_UpdateRect() richiamata direttamente da SDL_Flip().
SDL gestisce una profondità di colore a 8, 12, 15, 16, 24 e 32 bit, se qualcuno di questi non fosse disponibile SDL la emulerà. Per impostare la tavolozza desiderata si usa la funzione SDL_SetColors() che vuole come primo parametro SDL_Surface e poi un array di tipo SDL_Color contenente i colori, prima di passare l’array alla funzione quest’ultimo deve essere riempito. Per leggere i valori della tavolozza si usa il membro format della struttura SDL_Surface che ha un membro palette di tipo SDL_Palette contenenti i valori impostati. Per disegnare direttamente in una superficie si usa il membro pixels  ( di tipo void* ) della struttura SDL_Surface, ma prima di accedervi occorre fare in modo che il puntatore pixels sia valido e per fare questo occorre bloccare la superficie con SDL_LockSurface() e dopo aver scritto occorre sbloccarla con SDL_UnlockSurface(). Da dire che per motivi di efficienza, una riga orizzontale dell’immagine può contenere più byte del necessario, inseriti a fine riga, operazione chiamata di padding. Nei calcoli riferiti all’accesso ad un determinato pixel va usato il campo pitch della solita struttura SDL_Surface che indica la lunghezza effettiva in byte di una riga e non il campo w che indica invece la lunghezza in pixel. Altre funzioni importanti e che si usano frequentemente sono: SDL_FillRect() per cancellare lo schermo con un determinato colore e SDL_Delay() per mettere in pausa l’applicazione per un tempo specificato.
Nel prossimo articolo dedicato a SDL ci occuperemo di mettere in pratica su ambiente Linux ( più precisamente su una Ubuntu 10.04 ) quello che abbiamo spiegato solo teoricamente qui. Vedremo come disegnare su una superficie e poi mostrarla a schermo. Mi auguro che molti di voi continuino a seguire questi articoli sull’affasciante mondo della grafica con SDL su Linux.

Share
Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.

Published by
Giampaolo Rossi
Tags: SDL

Recent Posts

Un Abbonamento per Tutti i Software

Sono arrivato alla convinzione che un abbonamento per tutti i miei software gestionali sia il…

1 anno ago

Software di Magazzino Gratuito

MerciGest è un software per la gestione del magazzino completamente gratuito. Continua a leggere→

1 anno ago

Mettere il PC in Lock Screen

In ufficio può capitare di doversi allontanare dal proprio posto di lavoro, ecco che allora…

3 anni ago

Fare il reset togliendo la corrente

In questo articolo vedremo quando è più o meno utile togliere la corrente ad un…

3 anni ago

Prossimi Aggiornamenti Software

Dopo la pausa invernale dovuta al lavoro che devo fare per sostentarmi, eccomi di nuovo…

3 anni ago

Come Eliminare i Files in Windows

Vediamo come eliminare i files direttamente da Windows senza utilizzare il cestino. Continua a leggere→

4 anni ago