diff --git a/src/gfx/sdl-1.2/inc/gfx/port.h b/src/gfx/sdl-1.2/inc/gfx/port.h index add8b8c..9e58498 100644 --- a/src/gfx/sdl-1.2/inc/gfx/port.h +++ b/src/gfx/sdl-1.2/inc/gfx/port.h @@ -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 diff --git a/src/gfx/sdl-1.2/src/quad.c b/src/gfx/sdl-1.2/src/quad.c index b680e0c..0bdead6 100644 --- a/src/gfx/sdl-1.2/src/quad.c +++ b/src/gfx/sdl-1.2/src/quad.c @@ -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()); } diff --git a/src/gfx/sdl-1.2/src/sprite.c b/src/gfx/sdl-1.2/src/sprite.c index b5d61b6..6dbfa96 100644 --- a/src/gfx/sdl-1.2/src/sprite.c +++ b/src/gfx/sdl-1.2/src/sprite.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -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;