summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortron <tron@openttd.org>2005-02-08 22:22:42 +0000
committertron <tron@openttd.org>2005-02-08 22:22:42 +0000
commit49a4d014b94ba40a489ba9c6d3deef4c3ccb6d35 (patch)
tree73dd253044f97e09dbf5a1fb4d5e7cbd51f0eb5d
parentb0042740a6eb071008bc1a349f3340517c0f3f2d (diff)
downloadopenttd-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.c26
-rw-r--r--gfx.h12
-rw-r--r--spritecache.c12
3 files changed, 26 insertions, 24 deletions
diff --git a/gfx.c b/gfx.c
index 9b5f17bf7..0fafb1adb 100644
--- a/gfx.c
+++ b/gfx.c
@@ -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;
}
diff --git a/gfx.h b/gfx.h
index 1feb46975..bbeb7b614 100644
--- a/gfx.h
+++ b/gfx.h
@@ -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];