¿Forma correcta de escalar una superficie SDL sin recortar?
Pregunta
¿Cuál es la forma correcta de escalar una superficie SDL? Encontré una explicación en línea, pero requería volver a dibujar la superficie píxel por píxel. Parece que debería haber alguna forma de hacerlo de forma nativa a través de SDL en lugar de volver a dibujar la imagen de esa manera. No he podido encontrar nada en la documentación de SDL que cubra esto. Puedo cambiar el tamaño de las superficies sin ningún problema modificando el ancho y la altura de las superficies, pero la superficie resultante se recorta.
Solución
SDL no es compatible con el escalado bliting. De acuerdo con la documentación de SDL_BlitSurface :
Nota: el blitter SDL no (todavía) tener la capacidad de escalar el superficies arruinadas hacia arriba o hacia abajo como es el caso con otros más sofisticados mecanismos de interrupción. Tienes que averiguar algo por ti mismo si desea escalar imágenes (por ejemplo, usar SDL_gfx).
Puede encontrar SDL_gfx aquí . Escribir su propia función de blitting no es tan malo, podría ser un experimento de aprendizaje divertido y útil (aunque estaría reinventando la rueda). Usar OpenGL también es una opción, ya que cosas como escalar y rotar se pueden hacer en una sola llamada de función.
Otros consejos
Sé que esta respuesta es demasiado tarde para ayudar a la persona que la hizo, pero decidí escribir esto para ayudar a cualquiera que se tope con esta pregunta. En SDL 2.0 puede usar la función SDL_BlitScaled ()
para escalar una superficie en un SDL_Rect
de destino. Hay un tutorial de LazyFoo que describe esto, o consulte esto documentación .
Para completar, y debido a que la pregunta no especifica la versión SDL, es posible escalar en SDL2 utilizando el método API SDL_RenderCopyEx
. No se necesitan libs adicionales además de la lib SDL2 básica.
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)
Al establecer el tamaño de dstrect
se puede escalar la textura a un número entero de píxeles. También es posible rotar y voltear la textura al mismo tiempo.
Técnicamente, esto no es escalar una superficie, sino escalar una textura. Sin embargo, el procedimiento debe ser tan relevante como las superficies casi siempre se convierten en texturas antes de que el renderizado ocurra en aplicaciones basadas en SDL2.
Referencia: https://wiki.libsdl.org/SDL_RenderCopyEx
Crea tus texturas como de costumbre:
surface = IMG_Load(filePath);
texture = SDL_CreateTextureFromSurface(renderer, surface);
Y cuando llegue el momento de representarlo, llame a SDL_RenderCopyEx
en lugar de SDL_RenderCopy