X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=eradicate;a=blobdiff_plain;f=src%2Fsprite.c;h=7426cb075ae909d027321e13588131ed096ee980;hp=067c41c404e5a11b82a096e052562edf61c15ff2;hb=ca4cf08917d2c51d7a98c4cea6dae71c0ae7225d;hpb=2bd7529337d75380170f58364b1328ef3b8dc845 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++; + } +}