IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

SDL votre avis sur mon bout de code : copie_img()


Sujet :

SDL

  1. #1
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut SDL votre avis sur mon bout de code : copie_img()
    Bonjour, j'ai fais une petite fonction qui copie un bout d'une image dans une nouvelle. et j'aimerais avoir votre avis sur la réalisation (est-ce optimisé, peut-on faire mieux ?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // copie une partie de l'image <imgsrc> dans une nouvelle image de taille (newwidth;newheight).
    SDL_Surface* copie_img(SDL_Surface * imgsrc, const Uint16 newwidth, const Uint16 newheight, const Uint16 posx, const Uint16 posy)
    {
        SDL_Surface *tmp_tile=SDL_CreateRGBSurface(SDL_HWSURFACE, newwidth, newheight, 32, 0, 0, 0, 0);
        SDL_Surface *img= NULL;
        SDL_SetColorKey(tmp_tile, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB( screen->format, 0, 0, 0) );
        img = SDL_DisplayFormat( tmp_tile );
        if( img != NULL )
        {
            SDL_FreeSurface( tmp_tile );
        }
        else
        {
            img=tmp_tile; 
        }
        SDL_Rect clip;
        clip.x=posx; clip.y=posy; clip.w=newwidth; clip.h=newheight;
        apply_surface(0,0,imgsrc,img,&clip);
        return img;
    }
    voilà, vos remaques, vos avis.

    PS : au fait, la classique fonction apply_surface() est comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL )
    {
        SDL_Rect offset;
     
        offset.x = x;
        offset.y = y;
     
        SDL_BlitSurface( source, clip, destination, &offset );
    }

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    La fonction semble correcte, juste quelques broutilles



    Sur la dernière ligne tu n'as pas besoin d'appeler apply_surface, tu peux directement faire un SDL_BlitSurface:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_BlitSurface(imgsource, &clip, img, NULL);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        SDL_Surface *tmp_tile=SDL_CreateRGBSurface(SDL_HWSURFACE, newwidth, newheight, 32, 0, 0, 0, 0);
    Après ça, tu as besoin de vérifier que tmp_tile != NULL, sinon pour les prochaines fonctions tu auras très probablement une segfault (si tmp_tile == NULL).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        SDL_Rect clip;
        clip.x=posx; clip.y=posy; clip.w=newwidth; clip.h=newheight;
    Ca peut être simplifé en:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        SDL_Rect clip = {posx, posy, newwidth, newheight};
    Concernant l'optimisation, peut-être qu'en connaissant le bpp de l'écran (en faisant par exemple SDL_GetVideoSurface()->format->BitsPerPixel), on peut éviter d'appeler SDL_DisplayFormat.

    Enfin, il 'faudrait' gérer les erreurs comme celle de SDL_BlitSurface, mais ce n'est pas obligatoire en premier lieu.

  3. #3
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par coyotte507 Voir le message
    Concernant l'optimisation, peut-être qu'en connaissant le bpp de l'écran (en faisant par exemple SDL_GetVideoSurface()->format->BitsPerPixel), on peut éviter d'appeler SDL_DisplayFormat.
    Ha c'est interessant, tu peux expliquer ?

    J'avoue que j'utilise a tout les coups SDL_DisplayFormat sur chaques nouvelles image (que ca soit chargé depuis un fichier, copiée ou créée) sans trop savoir ce quelle fait finalement, j'ai lu que ca l'optimise, donc je fais bêtement
    Dans quel cas le bpp peut influer sur l'utilisation de cette fonction ?

    Merci.

  4. #4
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Citation Envoyé par hpfx Voir le message
    Ha c'est interessant, tu peux expliquer ?

    J'avoue que j'utilise a tout les coups SDL_DisplayFormat sur chaques nouvelles image (que ca soit chargé depuis un fichier, copiée ou créée) sans trop savoir ce quelle fait finalement, j'ai lu que ca l'optimise, donc je fais bêtement
    Dans quel cas le bpp peut influer sur l'utilisation de cette fonction ?

    Merci.
    Je pensais que ça n'affectait que le bpp et les flags de la surface, pour les mettre pareil que la surface d'affichage, mais en fait ça change aussi d'autres paramètres ...

    Donc pas la peine d'y toucher

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/02/2012, 16h00
  2. Votre avis sur mon code
    Par Schopenhauer dans le forum Fortran
    Réponses: 4
    Dernier message: 04/05/2011, 15h12
  3. [XL-2003] Votre avis sur mon code en VBA ?
    Par [ZiP] dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/03/2010, 13h56
  4. Réponses: 3
    Dernier message: 02/02/2009, 19h13
  5. [FFT] Votre avis sur mon code
    Par deubelte dans le forum C++
    Réponses: 1
    Dernier message: 10/02/2007, 20h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo