SDL-1.2: Implement X mirroring for quads
This commit is contained in:
parent
2d22b88695
commit
f753ede740
|
@ -11,7 +11,7 @@ extern "C"
|
|||
|
||||
struct sprite
|
||||
{
|
||||
SDL_Surface *s;
|
||||
SDL_Surface *s, *s_x;
|
||||
short x, y, w, h;
|
||||
unsigned char u, v;
|
||||
bool transparent;
|
||||
|
@ -24,8 +24,9 @@ struct quad
|
|||
short y0, y1, y2, y3;
|
||||
unsigned char u0, u1, u2, u3;
|
||||
unsigned char v0, v1, v2, v3;
|
||||
short w, h;
|
||||
bool transparent;
|
||||
SDL_Surface *s;
|
||||
SDL_Surface *s, *s_x;
|
||||
};
|
||||
|
||||
struct rect
|
||||
|
|
|
@ -7,29 +7,38 @@
|
|||
int quad_from_sprite(const struct sprite *const s, struct quad *const q)
|
||||
{
|
||||
q->s = s->s;
|
||||
q->s_x = s->s_x;
|
||||
q->u0 = q->u2 = s->u;
|
||||
q->v0 = q->v1 = s->v;
|
||||
q->u1 = q->u3 = s->u + s->w - 1;
|
||||
q->v2 = q->v3 = s->v + s->h - 1;
|
||||
q->w = s->w;
|
||||
q->h = s->h;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void quad_sort(struct quad *const q)
|
||||
{
|
||||
const bool xflip = q->x0 > q->x1;
|
||||
|
||||
SDL_Rect r =
|
||||
{
|
||||
.x = q->x0,
|
||||
.x = xflip ? q->x1 : q->x0,
|
||||
.y = q->y0
|
||||
};
|
||||
|
||||
const short w = q->u1 - q->u0 + 1, h = q->v2 - q->v0 + 1;
|
||||
|
||||
SDL_Rect clip =
|
||||
{
|
||||
.x = q->u0,
|
||||
.x = xflip ? q->w - q->u0 - w: q->u0,
|
||||
.y = q->v0,
|
||||
.w = q->u1 - q->u0 + 1,
|
||||
.h= q->v2 - q->v0 + 1
|
||||
.w = w,
|
||||
.h = h
|
||||
};
|
||||
|
||||
if (SDL_BlitSurface(q->s, &clip, gfx_screen(), &r))
|
||||
SDL_Surface *const s = xflip ? q->s_x : q->s;
|
||||
|
||||
if (SDL_BlitSurface(s, &clip, gfx_screen(), &r))
|
||||
fprintf(stderr, "SDL_BlitSurface: %s\n", SDL_GetError());
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#include <header.h>
|
||||
#include <sdl-1.2/gfx_private.h>
|
||||
#include <SDL/SDL.h>
|
||||
#include <SDL/SDL_rotozoom.h>
|
||||
#include <errno.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -19,20 +20,32 @@ int sprite_clone(const struct sprite *const src, struct sprite *const dst)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int set_transparent(SDL_Surface *const s)
|
||||
{
|
||||
/* Magenta as transparent. */
|
||||
const Uint32 map = SDL_MapRGB(s->format, 255, 0, 255);
|
||||
const int ret = SDL_SetColorKey(s, SDL_SRCCOLORKEY | SDL_RLEACCEL, map);
|
||||
|
||||
if (ret)
|
||||
fprintf(stderr, "SDL_SetColorKey: %s\n", SDL_GetError());
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int sprite_screen_resize_ev(struct sprite *const s)
|
||||
{
|
||||
int ret = -1;
|
||||
SDL_Surface *const old = s->s;
|
||||
SDL_Surface *const old = s->s, *const old_x = s->s_x;
|
||||
|
||||
/* Magenta as transparent. */
|
||||
if (s->transparent
|
||||
&& SDL_SetColorKey(old, SDL_SRCCOLORKEY | SDL_RLEACCEL,
|
||||
SDL_MapRGB(old->format, 255, 0, 255)))
|
||||
if (s->transparent && (set_transparent(old) || set_transparent(old_x)))
|
||||
goto end;
|
||||
else if (!(s->s = SDL_DisplayFormat(old)))
|
||||
{
|
||||
fprintf(stderr, "SDL_SetColorKey: %s\n", SDL_GetError());
|
||||
fprintf(stderr, "SDL_DisplayFormat: %s\n", SDL_GetError());
|
||||
goto end;
|
||||
}
|
||||
else if (!(s->s = SDL_DisplayFormat(old)))
|
||||
else if (!(s->s_x = SDL_DisplayFormat(old_x)))
|
||||
{
|
||||
fprintf(stderr, "SDL_DisplayFormat: %s\n", SDL_GetError());
|
||||
goto end;
|
||||
|
@ -42,6 +55,7 @@ int sprite_screen_resize_ev(struct sprite *const s)
|
|||
|
||||
end:
|
||||
SDL_FreeSurface(old);
|
||||
SDL_FreeSurface(old_x);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -57,31 +71,35 @@ static int load_bitmap(struct sprite *const s, FILE *const f)
|
|||
{
|
||||
int ret = -1;
|
||||
SDL_RWops *ops = NULL;
|
||||
SDL_Surface *ts = NULL;
|
||||
SDL_Surface *ts = NULL, *zs = NULL;
|
||||
|
||||
if (!(ops = SDL_RWFromFP(f, 0)))
|
||||
{
|
||||
fprintf(stderr, "SDL_RWFromFP: %s\n", SDL_GetError());
|
||||
goto end;
|
||||
}
|
||||
if (!(ts = SDL_LoadBMP_RW(ops, 0)))
|
||||
else if (!(ts = SDL_LoadBMP_RW(ops, 0)))
|
||||
{
|
||||
fprintf(stderr, "SDL_LoadBMP_RW: %s\n", SDL_GetError());
|
||||
goto end;
|
||||
}
|
||||
/* Magenta as transparent. */
|
||||
else if (s->transparent
|
||||
&& SDL_SetColorKey(ts, SDL_SRCCOLORKEY | SDL_RLEACCEL,
|
||||
SDL_MapRGB(ts->format, 255, 0, 255)))
|
||||
else if (!(zs = zoomSurface(ts, -1, 1, 0)))
|
||||
{
|
||||
fprintf(stderr, "SDL_SetColorKey: %s\n", SDL_GetError());
|
||||
fprintf(stderr, "zoomSurface: %s\n", SDL_GetError());
|
||||
goto end;
|
||||
}
|
||||
else if (s->transparent && (set_transparent(ts) || set_transparent(zs)))
|
||||
goto end;
|
||||
else if (!(s->s = SDL_DisplayFormat(ts)))
|
||||
{
|
||||
fprintf(stderr, "SDL_DisplayFormat: %s\n", SDL_GetError());
|
||||
goto end;
|
||||
}
|
||||
else if (!(s->s_x = SDL_DisplayFormat(zs)))
|
||||
{
|
||||
fprintf(stderr, "SDL_DisplayFormat: %s\n", SDL_GetError());
|
||||
goto end;
|
||||
}
|
||||
|
||||
gfx_register_sprite(s);
|
||||
s->w = ts->w;
|
||||
|
|
Loading…
Reference in New Issue