From ca4cf08917d2c51d7a98c4cea6dae71c0ae7225d Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Mon, 9 Mar 2020 00:46:16 +0200 Subject: [PATCH] fixed RLEsprite bug --- GNUmakefile | 2 +- src/game.c | 14 +++++++++++--- src/game.h | 9 +-------- src/introscr.c | 2 +- src/sdl/main.c | 4 ++-- src/sprite.c | 34 ++++++++++++++++++++++++++++++++++ src/sprite.h | 5 ++--- tools/rlesprite/src/main.c | 11 +++++++---- 8 files changed, 59 insertions(+), 22 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index 3fbb73f..0468c61 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -19,7 +19,7 @@ else endif .PHONY: all -all: data $(bin) +all: $(bin) $(bin): $(obj) imago $(CC) -o $@ $(obj) $(LDFLAGS) diff --git a/src/game.c b/src/game.c index 238ee08..4c220b5 100644 --- a/src/game.c +++ b/src/game.c @@ -1,5 +1,6 @@ #include "game.h" #include "screens.h" +#include "sprite.h" int fb_width, fb_height; long fb_size; @@ -10,9 +11,14 @@ long time_msec; void (*draw)(void); void (*key_event)(int key, int pressed); +static struct sprites dbgfont; + int init(int argc, char **argv) { + if(load_sprites(&dbgfont, "data/dbgfont.spr") == -1) { + return -1; + } if(intro_init() == -1) { return -1; } @@ -30,15 +36,17 @@ void cleanup(void) menu_cleanup(); } -void cs_puts_font(cs_font_func csfont, int sz, void *fb, int x, int y, const char *str) +void dbg_print(void *fb, int x, int y, const char *str) { + uint16_t *dest = (uint16_t*)fb + y * fb_width + x; + while(*str) { int c = *str++; if(c > ' ' && c < 128) { - csfont(fb, x, y, c - ' '); + draw_sprite(dest, fb_width * 2, &dbgfont, c - ' '); } - x += sz; + dest += 8; } } diff --git a/src/game.h b/src/game.h index 0ac002d..d01ad00 100644 --- a/src/game.h +++ b/src/game.h @@ -41,13 +41,6 @@ extern void (*key_event)(int key, int pressed); void game_quit(void); -/* compiled sprites available */ -typedef void (*cs_font_func)(void *, int, int, int); -void cs_dbgfont(void *fb, int x, int y, int idx); - -/* helper to print text with cs_font */ -void cs_puts_font(cs_font_func csfont, int sz, void *fb, int x, int y, const char *str); - -#define cs_dputs(fb, x, y, str) cs_puts_font(cs_dbgfont, 9, fb, x, y, str) +void dbg_print(void *fb, int x, int y, const char *str); #endif /* GAME_H_ */ diff --git a/src/introscr.c b/src/introscr.c index c9f3a03..c4d2040 100644 --- a/src/introscr.c +++ b/src/introscr.c @@ -66,7 +66,7 @@ void intro_draw(void) } } - //cs_dputs(fb_pixels, 10, 10, "foo"); + dbg_print(fb_pixels, 10, 10, "foo"); blit_frame(fb_pixels, 1); } diff --git a/src/sdl/main.c b/src/sdl/main.c index 84bbe00..86e5198 100644 --- a/src/sdl/main.c +++ b/src/sdl/main.c @@ -36,8 +36,8 @@ int main(int argc, char **argv) xsz = FB_WIDTH * fbscale; ysz = FB_HEIGHT * fbscale; - fb_width = xsz; - fb_height = ysz; + fb_width = FB_WIDTH; + fb_height = FB_HEIGHT; fb_size = FB_WIDTH * FB_HEIGHT * FB_BPP / 8; if(!(fb_buf = malloc(fb_size + FB_WIDTH * 4))) { diff --git a/src/sprite.c b/src/sprite.c index 067c41c..7426cb0 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -2,10 +2,15 @@ #include #include #include +#include #include "inttypes.h" #include "sprite.h" #include "util.h" + +#define SOP_OP(op) ((op) & 0xff) +#define SOP_LEN(op) ((op) >> 16) + #pragma pack (push, 1) struct file_header { char magic[8]; @@ -134,3 +139,32 @@ err: free(spr->ops); return -1; } + +void draw_sprite(void *dest, int fbpitch, struct sprites *ss, int idx) +{ + struct sprite_op *sop = ss->sprites[idx].ops; + unsigned char *fbptr = dest; + int xoffs = 0; + + for(;;) { + assert((xoffs & 1) == 0); + switch(sop->op) { + case SOP_END: + return; + case SOP_ENDL: + fbptr += fbpitch; + xoffs = 0; + break; + case SOP_SKIP: + xoffs += sop->size; + break; + case SOP_COPY: + memcpy(fbptr + xoffs, sop->data, sop->size); + xoffs += sop->size; + break; + default: + break; + } + sop++; + } +} diff --git a/src/sprite.h b/src/sprite.h index 85c4027..18add75 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -9,9 +9,6 @@ enum { SOP_COPY }; -#define SOP_OP(op) ((op) & 0xff) -#define SOP_LEN(op) ((op) >> 16) - struct sprite_op { unsigned char op; unsigned short size; @@ -34,4 +31,6 @@ void destroy_sprites(struct sprites *ss); int load_sprites(struct sprites *ss, const char *fname); +void draw_sprite(void *dest, int fbpitch, struct sprites *ss, int idx); + #endif /* SPRITE_H_ */ diff --git a/tools/rlesprite/src/main.c b/tools/rlesprite/src/main.c index 1080b15..23bb581 100644 --- a/tools/rlesprite/src/main.c +++ b/tools/rlesprite/src/main.c @@ -211,9 +211,11 @@ int proc_sheet(const char *fname) int rlesprite(struct image *img, int x, int y, int xsz, int ysz) { int i, j, numops, mode, new_mode, start, skip_acc, pixsz = img->bpp / 8; - unsigned char *pptr = img->pixels + y * img->scansz + x * pixsz; + unsigned char *scanptr, *pptr; struct csop *ops, *optr, endop = {0}; + pptr = img->pixels + y * img->scansz + x * pixsz; + ops = optr = alloca((xsz + 1) * ysz * sizeof *ops); for(i=0; ipixels + y * img->scansz + x * img->bpp / 8; + scanptr = pptr = img->pixels + y * img->scansz + x * img->bpp / 8; optr = ops; skip_acc = 0; @@ -269,7 +271,8 @@ int rlesprite(struct image *img, int x, int y, int xsz, int ysz) /* maybe at some point combine multiple endl into yskips? meh */ fwrite(optr, sizeof *optr, 1, outfp); skip_acc = 0; - pptr += img->scansz - xsz * pixsz; + scanptr += img->scansz; + pptr = scanptr; break; case CSOP_COPY: @@ -284,7 +287,7 @@ int rlesprite(struct image *img, int x, int y, int xsz, int ysz) fwrite(optr, sizeof *optr, 1, outfp); fwrite(pptr, pixsz, optr->len, outfp); - pptr += optr->len; + pptr += optr->len * pixsz; break; default: -- 1.7.10.4