diff options
author | tron <tron@openttd.org> | 2005-02-08 22:22:42 +0000 |
---|---|---|
committer | tron <tron@openttd.org> | 2005-02-08 22:22:42 +0000 |
commit | 49a4d014b94ba40a489ba9c6d3deef4c3ccb6d35 (patch) | |
tree | 73dd253044f97e09dbf5a1fb4d5e7cbd51f0eb5d | |
parent | b0042740a6eb071008bc1a349f3340517c0f3f2d (diff) | |
download | openttd-49a4d014b94ba40a489ba9c6d3deef4c3ccb6d35.tar.xz |
(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)
-rw-r--r-- | gfx.c | 26 | ||||
-rw-r--r-- | gfx.h | 12 | ||||
-rw-r--r-- | spritecache.c | 12 |
3 files changed, 26 insertions, 24 deletions
@@ -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 @@ static void GfxBlitZoomOutUncomp(BlitterParams *bp) 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 @@ static void GfxMainBlitter(byte *sprite, int x, int y, int mode) }; /* 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 @@ bool FillDrawPixelInfo(DrawPixelInfo *n, DrawPixelInfo *o, int left, int top, in 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; } @@ -17,13 +17,15 @@ struct DrawPixelInfo { }; -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 --git a/spritecache.c b/spritecache.c index e15af9ada..75ded63a4 100644 --- a/spritecache.c +++ b/spritecache.c @@ -26,7 +26,7 @@ static const char *_cur_grffile; 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 @@ const SpriteDimension *GetSpriteDimension(uint sprite) SpriteDimension *sd; #ifndef WANT_SPRITESIZES - byte *p; + const Sprite* p; p = _sprite_ptr[sprite]; if (p == NULL) @@ -990,10 +990,10 @@ const SpriteDimension *GetSpriteDimension(uint sprite) /* 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]; |