# HG changeset patch # User tron # Date 1107901362 0 # Node ID 7b598080024cfa5e0acab9dac854e5c5a31e4b06 # Parent 1b8ff901b45524c6b80e4d445e35357ebc569fe4 (svn r1852) Start cleaning up sprite handling: - Complement the sprite header struct with a variable sized array for the sprite data and rename it to Sprite. - Use the correct type Sprite* instead of casting all the time (this causes some "assignment from incompatible pointer type" warnings, nothing serious, will be resolved soon) diff -r 1b8ff901b455 -r 7b598080024c gfx.c --- a/gfx.c Tue Feb 08 18:07:27 2005 +0000 +++ b/gfx.c Tue Feb 08 22:22:42 2005 +0000 @@ -5,7 +5,7 @@ #include "table/palettes.h" #include "hal.h" -static void GfxMainBlitter(byte *sprite, int x, int y, int mode); +static void GfxMainBlitter(Sprite *sprite, int x, int y, int mode); static int _stringwidth_out; static byte _cursor_backup[64*64]; @@ -1312,7 +1312,7 @@ typedef void (*BlitZoomFunc)(BlitterParams *bp); -static void GfxMainBlitter(byte *sprite, int x, int y, int mode) +static void GfxMainBlitter(Sprite *sprite, int x, int y, int mode) { DrawPixelInfo *dpi = _cur_dpi; int start_x, start_y; @@ -1334,13 +1334,13 @@ }; /* decode sprite header */ - x += (int16)READ_LE_UINT16(&((SpriteHdr*)sprite)->x_offs); - y += (int16)READ_LE_UINT16(&((SpriteHdr*)sprite)->y_offs); - bp.width_org = bp.width = READ_LE_UINT16(&((SpriteHdr*)sprite)->width); - bp.height_org = bp.height = ((SpriteHdr*)sprite)->height; - info = ((SpriteHdr*)sprite)->info; + x += (int16)TO_LE16(sprite->x_offs); + y += (int16)TO_LE16(sprite->y_offs); + bp.width_org = bp.width = TO_LE16(sprite->width); + bp.height_org = bp.height = sprite->height; + info = sprite->info; bp.info = info; - bp.sprite_org = bp.sprite = sprite + sizeof(SpriteHdr); + bp.sprite_org = bp.sprite = sprite->data; bp.dst = dpi->dst_ptr; bp.mode = mode; bp.pitch = dpi->pitch; @@ -1905,17 +1905,17 @@ static void SetCursorSprite(uint cursor) { CursorVars *cv = &_cursor; - byte *p; + const Sprite *p; if (cv->sprite == cursor) return; p = GetSpritePtr(cursor & 0x3FFF); cv->sprite = cursor; - cv->size.y = *(byte*)(p+1); - cv->size.x = READ_LE_UINT16(p+2); - cv->offs.x = (int16)READ_LE_UINT16(p+4); - cv->offs.y = (int16)READ_LE_UINT16(p+6); + cv->size.y = p->height; + cv->size.x = TO_LE16(p->width); + cv->offs.x = (int16)TO_LE16(p->x_offs); + cv->offs.y = (int16)TO_LE16(p->y_offs); cv->dirty = true; } diff -r 1b8ff901b455 -r 7b598080024c gfx.h --- a/gfx.h Tue Feb 08 18:07:27 2005 +0000 +++ b/gfx.h Tue Feb 08 22:22:42 2005 +0000 @@ -17,13 +17,15 @@ }; -typedef struct SpriteHdr { +typedef struct Sprite { byte info; byte height; - uint16 width; - int16 x_offs, y_offs; -} SpriteHdr; -assert_compile(sizeof(SpriteHdr) == 8); + uint16 width; // LE! + int16 x_offs; // LE! + int16 y_offs; // LE! + byte data[VARARRAY_SIZE]; +} Sprite; +assert_compile(sizeof(Sprite) == 8); typedef struct CursorVars { Point pos, size, offs, delta; diff -r 1b8ff901b455 -r 7b598080024c spritecache.c --- a/spritecache.c Tue Feb 08 18:07:27 2005 +0000 +++ b/spritecache.c Tue Feb 08 22:22:42 2005 +0000 @@ -26,7 +26,7 @@ static int _loading_stage; static int _skip_specials; uint16 _custom_sprites_base; -static SpriteHdr _cur_sprite; +static Sprite _cur_sprite; static byte *_sprite_ptr[NUM_SPRITES]; @@ -982,7 +982,7 @@ SpriteDimension *sd; #ifndef WANT_SPRITESIZES - byte *p; + const Sprite* p; p = _sprite_ptr[sprite]; if (p == NULL) @@ -990,10 +990,10 @@ /* decode sprite header */ sd = &sd_static; - sd->xoffs = (int16)READ_LE_UINT16(&((SpriteHdr*)p)->x_offs); - sd->yoffs = (int16)READ_LE_UINT16(&((SpriteHdr*)p)->y_offs); - sd->xsize = READ_LE_UINT16(&((SpriteHdr*)p)->width); - sd->ysize = ((SpriteHdr*)p)->height; + sd->xoffs = (int16)TO_LE16(p->x_offs); + sd->yoffs = (int16)TO_LE16(p->y_offs); + sd->xsize = TO_LE16(p->width); + sd->ysize = p->height; #else sd = &sd_static; sd->xoffs = _sprite_xoffs[sprite];