(svn r1852) Start cleaning up sprite handling:
authortron
Tue, 08 Feb 2005 22:22:42 +0000
changeset 1348 1d123409026e
parent 1347 48793ec09d32
child 1349 07514c2cc6d1
(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)
gfx.c
gfx.h
spritecache.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;
 }
--- 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;
--- 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];