Accueil > > > RETOURNER UNE SURFACE SDL
RETOURNER UNE SURFACE SDL
Information sur la source
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
Commentaires et avis
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à je cherche une fonction capable de lire la couleur d'un pixel dans une SDL_Surface, j'ai cherché dans SDL_video.
problème avec SDL, struct? [ par foxley ]
Bonjour, je suis nouveau ici.J'ai un projet en C à faire pour la fac.Et à vrai dire je suis bloqué a un endroit:"tab[i]->surface->
probleme SDL et POO [ par darmoor ]
voila je suis encore qu'un débutant dans la matiè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 était préférable de loader une image a partir d'un fichier au fur et a mesure du dé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
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|