Moyen approprié de redimensionner une surface SDL sans écrêter?
Question
Quelle est la bonne façon de redimensionner une surface SDL? J'ai trouvé une explication en ligne, mais il a fallu redessiner la surface, pixel par pixel. Il semble qu'il devrait y avoir un moyen de le faire de manière native via SDL plutôt que de redessiner l'image de cette façon. Je n'ai trouvé aucun élément dans la documentation SDL couvrant ce sujet. Je peux redimensionner les surfaces sans aucun problème en modifiant la largeur et la hauteur des surfaces, mais la surface obtenue est tronquée.
La solution
SDL ne prend pas en charge le blitting mis à l’échelle. Selon la documentation de SDL_BlitSurface :
Remarque: le blitter SDL n’a pas (encore) avoir la capacité de mettre à l'échelle le surfaces blanchies haut ou bas comme il est le cas avec d'autres plus sophistiqués mécanismes de blitting. Vous devez comprendre quelque chose pour vous-même si vous souhaitez redimensionner les images (par exemple, utilisez SDL_gfx).
Vous pouvez trouver SDL_gfx ici . Écrire votre propre fonction de blitting n'est pas si mal que ça, ça pourrait être une expérience d'apprentissage amusante et utile (même si vous réinventiez la roue). Utiliser OpenGL est également une option, car des tâches telles que la mise à l'échelle et la rotation peuvent être effectuées en un seul appel de fonction.
Autres conseils
Je sais que cette réponse est bien trop tardive pour aider la personne qui l'a posée, mais j'ai décidé de l'écrire pour aider toute personne qui trébuche sur cette question. Dans SDL 2.0 Vous pouvez utiliser la fonction SDL_BlitScaled ()
pour redimensionner une surface en un SDL_Rect
ciblé. Il existe un tutoriel sur LazyFoo qui décrit cela, ou consultez cette documentation .
Par souci d'exhaustivité et parce que la question ne spécifie pas la version SDL, la mise à l'échelle est possible dans SDL2 à l'aide de la méthode API SDL_RenderCopyEx
. Aucune bibliothèque supplémentaire en plus de la bibliothèque SDL2 de base n'est nécessaire.
int SDL_RenderCopyEx(SDL_Renderer* renderer,
SDL_Texture* texture,
const SDL_Rect* srcrect,
const SDL_Rect* dstrect,
const double angle,
const SDL_Point* center,
const SDL_RendererFlip flip)
En définissant la taille de dstrect
, vous pouvez redimensionner la texture en un nombre entier de pixels. Il est également possible de faire pivoter et retourner la texture en même temps.
Techniquement, il ne s’agit pas de redimensionner une surface, mais plutôt d’une texture. La procédure doit être tout aussi pertinente, car les surfaces sont presque toujours converties en textures avant le rendu dans les applications SDL2.
Référence: https://wiki.libsdl.org/SDL_RenderCopyEx
Créez vos textures comme d'habitude:
surface = IMG_Load(filePath);
texture = SDL_CreateTextureFromSurface(renderer, surface);
Et lorsqu'il est temps de le rendre, appelez SDL_RenderCopyEx
au lieu de SDL_RenderCopy