fixed RLEsprite bug
authorJohn Tsiombikas <nuclear@member.fsf.org>
Sun, 8 Mar 2020 22:46:16 +0000 (00:46 +0200)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Sun, 8 Mar 2020 22:46:16 +0000 (00:46 +0200)
GNUmakefile
src/game.c
src/game.h
src/introscr.c
src/sdl/main.c
src/sprite.c
src/sprite.h
tools/rlesprite/src/main.c

index 3fbb73f..0468c61 100644 (file)
@@ -19,7 +19,7 @@ else
 endif
 
 .PHONY: all
-all: data $(bin)
+all: $(bin)
 
 $(bin): $(obj) imago
        $(CC) -o $@ $(obj) $(LDFLAGS)
index 238ee08..4c220b5 100644 (file)
@@ -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;
        }
 }
 
index 0ac002d..d01ad00 100644 (file)
@@ -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_ */
index c9f3a03..c4d2040 100644 (file)
@@ -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);
 }
index 84bbe00..86e5198 100644 (file)
@@ -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))) {
index 067c41c..7426cb0 100644 (file)
@@ -2,10 +2,15 @@
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
+#include <assert.h>
 #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++;
+       }
+}
index 85c4027..18add75 100644 (file)
@@ -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_ */
index 1080b15..23bb581 100644 (file)
@@ -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; i<ysz; i++) {
@@ -254,7 +256,7 @@ int rlesprite(struct image *img, int x, int y, int xsz, int ysz)
        }
        numops = optr - ops;
 
-       pptr = img->pixels + 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: