summaryrefslogtreecommitdiff
path: root/trunk/libsprite.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/libsprite.c')
-rw-r--r--trunk/libsprite.c51
1 files changed, 34 insertions, 17 deletions
diff --git a/trunk/libsprite.c b/trunk/libsprite.c
index f52e200..2120f94 100644
--- a/trunk/libsprite.c
+++ b/trunk/libsprite.c
@@ -18,6 +18,12 @@ struct sprite_header {
uint32_t first_used_bit; /* old format only (spriteType = 0) */
uint32_t last_used_bit;
uint32_t image_size; /* bytes */
+ uint32_t mask_size;
+};
+
+struct sprite_mask_state {
+ uint32_t x;
+ uint32_t y;
};
static struct sprite_mode oldmodes[256];
@@ -331,6 +337,16 @@ uint32_t sprite_upscale_color(uint32_t pixel, struct sprite_mode* mode)
}
}
+/* Get the next mask byte.
+ * Mask of 0xff denotes 100% opaque, 0x00 denotes 100% transparent
+ */
+uint8_t sprite_get_mask(struct sprite* sprite, struct sprite_header* header, struct sprite_mask_state* mask_state)
+{
+ /* a 1bpp mask (for new mode sprites), each row is word aligned (therefore potential righthand wastage */
+ sprite = sprite; header = header; mask_state = mask_state;
+ return 0xff;
+}
+
void sprite_load_high_color(uint8_t* image_in, uint8_t* mask, struct sprite* sprite, struct sprite_header* header)
{
mask = mask;
@@ -440,22 +456,20 @@ struct sprite* sprite_load_sprite(FILE* spritefile)
sprite->palettesize = imageOffset - 44;
sprite->has_palette = (sprite->palettesize > 0);
- uint32_t image_size;
- uint32_t maskSize;
+ /* sprite has no mask if imageOffset == maskOffset */
if (imageOffset == maskOffset) {
- sprite->hasmask = false;
- image_size = nextSpriteOffset - 44 - sprite->palettesize;
- maskSize = 0;
+ sprite->has_mask = false;
+ header->image_size = nextSpriteOffset - 44 - sprite->palettesize;
+ header->mask_size = 0;
} else {
- sprite->hasmask = true;
- image_size = maskOffset - imageOffset;
- maskSize = nextSpriteOffset - 44 - sprite->palettesize - image_size;
+ sprite->has_mask = true;
+ header->image_size = maskOffset - imageOffset;
+ header->mask_size = nextSpriteOffset - 44 - sprite->palettesize - header->image_size;
}
- header->image_size = image_size;
-
- if (sprite->hasmask) LOGDBG("maskSize %u\n", maskSize);
+ if (sprite->has_mask) LOGDBG("mask_size (bits) %u\n", header->mask_size * 8);
+ if (sprite->has_mask) LOGDBG(" w*h %u\n", sprite->width * sprite->height);
if (sprite->has_palette) {
assert(sprite->palettesize % 8 == 0);
@@ -478,15 +492,18 @@ struct sprite* sprite_load_sprite(FILE* spritefile)
}
}
- uint8_t* image = malloc(image_size);
- sprite_read_bytes(spritefile, image, image_size);
+ uint8_t* image = malloc(header->image_size);
+ sprite_read_bytes(spritefile, image, header->image_size);
- uint8_t* mask = malloc(maskSize);
- sprite_read_bytes(spritefile, mask, maskSize);
+ uint8_t* mask = NULL;
+ if (sprite->has_mask) {
+ mask = malloc(header->mask_size);
+ sprite_read_bytes(spritefile, mask, header->mask_size);
+ }
- /* sanity check imageSize */
+ /* sanity check image_size */
assert((header->width_words) * 4 * (sprite->height) == header->image_size);
- /* TODO: sanity check maskSize */
+ /* TODO: sanity check mask_size */
if (sprite->mode->colorbpp > 8) {
sprite_load_high_color(image, mask, sprite, header);
} else {