2008-11-30 19 views
8

¿Cuál es la forma correcta de escalar una superficie SDL? Encontré una explicación en línea pero requirió volver a dibujar la Superficie píxel por píxel. Parece que debería haber alguna manera 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.Forma correcta de escalar una superficie SDL sin recorte?

Respuesta

7

SDL no admite ajuste de escala de blitting. De acuerdo con la documentación de SDL_BlitSurface:

Nota: el blitter SDL no (todavía) tiene la capacidad de escalar la blitted superficies hacia arriba o hacia abajo como es el caso con otros mecanismos blitting más sofisticados. Tienes que encontrar algo por ti mismo si quieres escalar imágenes (por ejemplo, usa SDL_gfx).

Puede encontrar SDL_gfx here. Escribir tu propia función de blitting no es tan malo, podría ser un experimento de aprendizaje útil y divertido (aunque estarías 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 a función.

1

Para completar, y dado que la pregunta no especifica la versión de SDL, es posible escalar en SDL2 utilizando el método API SDL_RenderCopyEx. No se necesitan libs adicionales además de la lib básica SDL2.

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 uno 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 está escalando una superficie sino más bien escalando una textura. El procedimiento debe ser tan relevante, ya que las superficies casi siempre se convierten en texturas antes de que la representación se realice en aplicaciones basadas en SDL2.

Referencia: https://wiki.libsdl.org/SDL_RenderCopyEx

Cree sus texturas como de costumbre:

surface = IMG_Load(filePath); 
texture = SDL_CreateTextureFromSurface(renderer, surface); 

Y cuando es el momento para hacerlo, llame SDL_RenderCopyEx en lugar de SDL_RenderCopy

4

Sé que esta respuesta es demasiado tarde para ayudar a la persona que lo solicitó, pero decidí escribir esto para ayudar a cualquier persona que tropiece con esta pregunta. En SDL 2.0, puede usar la función SDL_BlitScaled() para escalar una superficie en un destino SDL_Rect. Hay un tutorial por LazyFoo que describe esto, o mira esto documentation.