begin process at 2012 05 27 19:06:08
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > RETOURNER UNE SURFACE SDL

RETOURNER UNE SURFACE SDL


 Information sur la source

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Graphique Classé sous :SDL, retournement, surface, retourner, flip Niveau :Initié Date de création :13/03/2009 Date de mise à jour :13/03/2009 10:53:55 Vu :2 855

Auteur : Tomaka17

Ecrire un message privé
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

 Description

Dans votre logiciel de dessin préféré, vous avez en général les options "retournement vertical" et "retournement horizontal" qui permettent de retourner l'image

Par exemple si l'image c'est ':)' elle deviendra '(:' une fois retournée

Cette source propose de faire pareil en SDL. Je ne mets que le retournement horizontal, car le vertical n'est pas compliqué à faire après.


Source

  • void retournementHorizontal(SDL_Surface* surface) {
  • int y, i;
  • Uint8 *pixel1, *pixel2;
  • if (surface == NULL) return;
  • SDL_LockSurface(surface);
  • // on prend chaque ligne une par une
  • for (int y = 0; y < surface->h; y++) {
  • // pixel1 pointe vers le premier pixel de la ligne
  • pixel1 = (Uint8*)surface->pixels + y * surface->pitch;
  • // pixel2 pointe après le dernier pixel de la ligne
  • pixel2 = pixel1 + surface->w * surface->format->BytesPerPixel;
  • // on fait se rapprocher les pointeurs, et dès qu'ils se touchent (au milieu), c'est fini pour cette ilgne
  • while (pixel1 < pixel2) {
  • pixel2 -= surface->format->BytesPerPixel;
  • // on échange les valeurs *pixel1 et *pixel2 avec une petite boucle
  • for (i = 0; i < surface->format->BytesPerPixel; i++) {
  • Uint8 tmp = *(pixel2 + i);
  • *(pixel2 + i) = *(pixel1 + i);
  • *(pixel1 + i) = tmp;
  • }
  • pixel1 += surface->format->BytesPerPixel;
  • }
  • }
  • SDL_UnlockSurface(surface);
  • }
  • SDL_Surface* copierEtRetourner(SDL_Surface* s) {
  • // la fonction SDL_ConvertSurface permet de dupliquer facilement une surface
  • SDL_Surface* nouv = SDL_ConvertSurface(s, s->format, s->flags);
  • if (nouv != NULL) retournementHorizontal(nouv);
  • return nouv;
  • }
void retournementHorizontal(SDL_Surface* surface) {
	int y, i;
	Uint8 *pixel1, *pixel2;

	if (surface == NULL) return;

	SDL_LockSurface(surface);

	// on prend chaque ligne une par une
	for (int y = 0; y < surface->h; y++) {
		// pixel1 pointe vers le premier pixel de la ligne
		pixel1 = (Uint8*)surface->pixels + y * surface->pitch;
		// pixel2 pointe après le dernier pixel de la ligne
		pixel2 = pixel1 + surface->w * surface->format->BytesPerPixel;

		// on fait se rapprocher les pointeurs, et dès qu'ils se touchent (au milieu), c'est fini pour cette ilgne
		while (pixel1 < pixel2) {
			pixel2 -= surface->format->BytesPerPixel;

			// on échange les valeurs *pixel1 et *pixel2 avec une petite boucle
			for (i = 0; i < surface->format->BytesPerPixel; i++) {
				Uint8 tmp = *(pixel2 + i);
				*(pixel2 + i) = *(pixel1 + i);
				*(pixel1 + i) = tmp;
			}

			pixel1 += surface->format->BytesPerPixel;
		}
	}

	SDL_UnlockSurface(surface);
}

SDL_Surface* copierEtRetourner(SDL_Surface* s) {
	// la fonction SDL_ConvertSurface permet de dupliquer facilement une surface
	SDL_Surface* nouv = SDL_ConvertSurface(s, s->format, s->flags);
	if (nouv != NULL) retournementHorizontal(nouv);
	return nouv;
}


 Conclusion

Le principe de l'algorithme est de prendre chaque ligne une à une.
On créé alors un pointeur au début de la ligne et un à la fin, puis on se fait se rapprocher les pointeurs l'un de l'autre (celui du début avance, celui de la fin recule) tout en inversant à chaque fois les pixels.

La seule difficulté est qu'il ne faut pas copier octet par octet car dans le cas d'une image 16, 24 ou 32 bits cela inverserait les couleurs.
On avance/recule en fait les pointeurs de <surface->format->BytesPerPixel> octets, et pour copier chaque pixel on fait une petite boucle.

Je pense que pour optimiser le code on peut :
- sortir la variable "tmp" de la boucle (<Uint32 tmp = *((Uint32*)pixel2)>) puis utiliser les opérations bit par bit pour assigner sa valeur dans pixel1, mais il faudrait gérer le big/little endian et ça peut devenir compliqué

- utiliser les templates en C++ pour avoir des pointeurs dont le type correspond au format de chaque pixel mais à ce moment l'appel de fonction serait moins générique, il faudrait quelque chose du genre "retourner<Uint16>(surface)" pour une surface 16 bits par exemple


Le retournement vertical est facile à faire avec "pixel2 = pixel1 + surface->h * surface->format->pitch" et en avançant/reculant les pointeurs de "surface->format->pitch" à chaque fois



 Historique

13 mars 2009 10:48:38 :
Ajout de quelques commentaires
13 mars 2009 10:53:55 :
C'est la meilleur, les commentaires que j'ai ajoutés se sont pas mis

 Sources de la même categorie

Source avec Zip Source avec une capture PLANNING D'EQUIPE par grephit
Source avec Zip APPLICATION DE DESSIN DE QUELQUES FIGURES par laguchori
Source avec Zip Source avec une capture HDR EXPOSURE FUSION par mecrosoft
Source avec Zip Source avec une capture IRC CLIENT MULTISERVEUR EN MFC (TXIRC) par TeniX
Source avec Zip ENTETE DU FICHIER BMP (BIPMAP) par k.Lutchi

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture JEUX SERPENT par antho974
Source avec Zip Source avec une capture PENDU EN SDL par Damsou91
CASSE BRIQUE SDL MODIFICATION par Vardosh
Source avec Zip Source avec une capture BOMBERMAN 4 PLAYERS LAN (C & SDL) par c1702
PONG 1.0 EN C AVEC LA BIBLIOTHÈQUE SDL par qaz1289

Commentaires et avis

Commentaire de JPR74 le 16/03/2009 10:45:42

Bonjour,

   Quel plaisir de trouver un programme dont les explications et les commentaires sont écrits en français correct !
   Je le signale car cela est assez rare et mérite un commentaire.
   Les explications, claires et bien placées, aident à comprendre le fonctionnement du programme et permettront son extension.
   Cordialement,
                 JPR      

Commentaire de lui88 le 17/03/2009 18:10:07 8/10

oui excellent programme , je suis d'accord avec toi JPR74 celà et assez rare pour sa que je mets une bonne note ;) .
bonne continuation ;)

Commentaire de shorzy le 05/09/2009 13:39:34

sous Qt, il suffit de changer la Matrice
: 1 Ligne de Code

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

SDL: afficher un BMP [ par yugiohjcj ] Bonjour,c'est mon deuxième message sur ce forum pour un problème avec SDL.Cette fois, je n'arrive pas à afficher une image BMP.Voici la source:void Sh [SDL] Rotation de sprite [ par kojiro2 ] Coucou tout le monde, je veux faire tourner un sprite sur lui meme c'est a dire que ce sprite tourne entre 0° et 360°.Le pb c'est que j'utilise une co [SDL] Obtenir la couleur d'un pixel dans une SDL_Surface [ par Rouliann ] Bonjour tout le monde!Voil&#224; je cherche une fonction capable de lire la couleur d'un pixel dans une SDL_Surface, j'ai cherch&#233; dans SDL_video. problème avec SDL, struct? [ par foxley ] Bonjour, je suis nouveau ici.J'ai un projet en C &#224; faire pour la fac.Et &#224; vrai dire je suis bloqu&#233; a un endroit:"tab[i]-&gt;surface-&gt probleme SDL et POO [ par darmoor ] voila je suis encore qu'un d&#233;butant dans la mati&#232;re avec la POO et j'apprend a utiliser SDL j'ai fait un essai en affichant un image et ave SDL est deformation de surface [ par wil51 ] Bonjour,Je suis actuellement sur le devellopemeny d'un jeu en 2D en SDL style GTA en vue de dessusTous est en 2D sauf les batiments qui sont 3D.Actuel SDL et Surface [ par Kangourou_Nomade ] Je voulais savoir si, en SDL, il &#233;tait pr&#233;f&#233;rable de loader une image a partir d'un fichier au fur et a mesure du d&#233;roulement du j SDL_Surface to HWND [ par unionx ] Bonjour j'ai un question qui m'interesse beaucoup est  je veux avoir un aide si il est possible , merci avance .bonne voila mon question* - je v [C] Surface SDL dans Fenetre Win32 [ par Naelhem ] Bonjour à tous,J'ai fait un programme qui utilise que la SDL, mais je dois maintenant manipuler des Repertoire on m'a conseillé d'utiliser l'APi Win32 question SDL [ par psycho ] Bonjour tlm. Je cherche a créer une image avec plusieurs niveaux de transparences en utilisant des methodes de type setPixel (recuperer sur le site d


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,655 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales