summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Shaw <jshaw@netsurf-browser.org>2007-11-22 23:35:24 +0000
committerJames Shaw <jshaw@netsurf-browser.org>2007-11-22 23:35:24 +0000
commit17bf24b62bffba644f14e3ce8d748ba481be30a7 (patch)
tree30192b6e712540a966e6e638bcdb90ab04f8e77f
parent7be55f5ac60baa6bc014ee195018feab93693ebd (diff)
downloadlibrosprite-17bf24b62bffba644f14e3ce8d748ba481be30a7.tar.gz
librosprite-17bf24b62bffba644f14e3ce8d748ba481be30a7.tar.bz2
Add oldmodes from PRM 1, switch code to use more of the sprite_header
structure. svn path=/import/jshaw/libsprite/; revision=9981
-rw-r--r--trunk/libsprite.c139
1 files changed, 97 insertions, 42 deletions
diff --git a/trunk/libsprite.c b/trunk/libsprite.c
index f73d45b..ab74eed 100644
--- a/trunk/libsprite.c
+++ b/trunk/libsprite.c
@@ -22,13 +22,15 @@ struct sprite_mode {
};
struct sprite_header {
- char name[13];
+ unsigned char name[13]; /* last byte for 0 terminator */
struct sprite_mode* mode;
- bool hasMask;
+ bool hasmask;
uint32_t maskbpp;
- bool hasPalette;
- uint32_t paletteSize;
+ bool haspalette;
+ uint32_t palettesize;
uint32_t* palette;
+ uint32_t width; /* width and height in _pixels_ */
+ uint32_t height;
};
uint32_t sprite_read_word(FILE* stream)
@@ -63,10 +65,55 @@ struct sprite_mode* sprite_get_mode(uint32_t spriteMode)
oldmodes[i].ydpi = 0;
}
+ /* TODO: push this into a text file? */
+ /* TODO: check these DPIs */
+ oldmodes[0].colorbpp = 1; oldmodes[0].xdpi = 90; oldmodes[0].ydpi = 45;
+ oldmodes[1].colorbpp = 2; oldmodes[1].xdpi = 45; oldmodes[1].ydpi = 45;
+ oldmodes[2].colorbpp = 4; oldmodes[2].xdpi = 22; oldmodes[2].ydpi = 45;
+ oldmodes[4].colorbpp = 1; oldmodes[4].xdpi = 45; oldmodes[4].ydpi = 45;
+ oldmodes[5].colorbpp = 2; oldmodes[5].xdpi = 22; oldmodes[5].ydpi = 45;
+ oldmodes[8].colorbpp = 2; oldmodes[8].xdpi = 90; oldmodes[8].ydpi = 45;
+ oldmodes[9].colorbpp = 4; oldmodes[9].xdpi = 45; oldmodes[9].ydpi = 45;
+ oldmodes[10].colorbpp = 8; oldmodes[10].xdpi = 22; oldmodes[10].ydpi = 45;
+ oldmodes[11].colorbpp = 2; oldmodes[11].xdpi = 90; oldmodes[11].ydpi = 45;
+ oldmodes[12].colorbpp = 4; oldmodes[12].xdpi = 90; oldmodes[12].ydpi = 45;
+ oldmodes[13].colorbpp = 8; oldmodes[13].xdpi = 45; oldmodes[13].ydpi = 45;
+ oldmodes[14].colorbpp = 4; oldmodes[14].xdpi = 90; oldmodes[14].ydpi = 45;
+ oldmodes[15].colorbpp = 8; oldmodes[15].xdpi = 90; oldmodes[15].ydpi = 45;
+ oldmodes[16].colorbpp = 4; oldmodes[16].xdpi = 90; oldmodes[16].ydpi = 45;
+ oldmodes[17].colorbpp = 4; oldmodes[17].xdpi = 90; oldmodes[17].ydpi = 45;
+ oldmodes[18].colorbpp = 1; oldmodes[18].xdpi = 90; oldmodes[18].ydpi = 90;
+ oldmodes[19].colorbpp = 2; oldmodes[19].xdpi = 90; oldmodes[19].ydpi = 90;
+ oldmodes[20].colorbpp = 4; oldmodes[20].xdpi = 90; oldmodes[20].ydpi = 90;
+ oldmodes[21].colorbpp = 8; oldmodes[21].xdpi = 90; oldmodes[21].ydpi = 90;
+ oldmodes[22].colorbpp = 4; oldmodes[22].xdpi = 90; oldmodes[22].ydpi = 45;
+ oldmodes[23].colorbpp = 1; oldmodes[23].xdpi = 90; oldmodes[23].ydpi = 90;
+ oldmodes[24].colorbpp = 8; oldmodes[24].xdpi = 90; oldmodes[24].ydpi = 45;
+ oldmodes[25].colorbpp = 1; oldmodes[25].xdpi = 90; oldmodes[25].ydpi = 90;
+ oldmodes[26].colorbpp = 2; oldmodes[26].xdpi = 90; oldmodes[26].ydpi = 90;
+ oldmodes[27].colorbpp = 4; oldmodes[27].xdpi = 90; oldmodes[27].ydpi = 90;
+ oldmodes[28].colorbpp = 8; oldmodes[28].xdpi = 90; oldmodes[28].ydpi = 90;
+ oldmodes[29].colorbpp = 1; oldmodes[29].xdpi = 90; oldmodes[29].ydpi = 90;
+ oldmodes[30].colorbpp = 2; oldmodes[30].xdpi = 90; oldmodes[30].ydpi = 90;
+ oldmodes[31].colorbpp = 4; oldmodes[31].xdpi = 90; oldmodes[31].ydpi = 90;
+ oldmodes[33].colorbpp = 1; oldmodes[33].xdpi = 90; oldmodes[33].ydpi = 45;
+ oldmodes[34].colorbpp = 2; oldmodes[34].xdpi = 90; oldmodes[34].ydpi = 45;
+ oldmodes[35].colorbpp = 4; oldmodes[35].xdpi = 90; oldmodes[35].ydpi = 45;
+ oldmodes[36].colorbpp = 8; oldmodes[36].xdpi = 90; oldmodes[36].ydpi = 45;
+ oldmodes[37].colorbpp = 1; oldmodes[37].xdpi = 90; oldmodes[37].ydpi = 45;
+ oldmodes[38].colorbpp = 2; oldmodes[38].xdpi = 90; oldmodes[38].ydpi = 45;
+ oldmodes[39].colorbpp = 4; oldmodes[39].xdpi = 90; oldmodes[39].ydpi = 45;
+ oldmodes[40].colorbpp = 8; oldmodes[40].xdpi = 90; oldmodes[40].ydpi = 45;
+ oldmodes[41].colorbpp = 1; oldmodes[41].xdpi = 90; oldmodes[41].ydpi = 45;
+ oldmodes[42].colorbpp = 2; oldmodes[42].xdpi = 90; oldmodes[42].ydpi = 45;
+ oldmodes[43].colorbpp = 4; oldmodes[43].xdpi = 90; oldmodes[43].ydpi = 45;
+ oldmodes[44].colorbpp = 1; oldmodes[44].xdpi = 90; oldmodes[44].ydpi = 45;
+ oldmodes[45].colorbpp = 2; oldmodes[45].xdpi = 90; oldmodes[45].ydpi = 45;
+ oldmodes[46].colorbpp = 4; oldmodes[46].xdpi = 90; oldmodes[46].ydpi = 45;
+
struct sprite_mode* mode = malloc(sizeof(struct sprite_mode));
uint32_t spriteType = spriteMode >> 27; /* preserve bits 27-31 only */
- LOGDBG("spriteType %u\n", spriteType);
if (spriteType != 0) {
mode->xdpi = (spriteMode & 0x07ffc000) >> 14; /* preserve bits 14-26 only */
@@ -85,17 +132,15 @@ struct sprite_mode* sprite_get_mode(uint32_t spriteMode)
case 6:
mode->colorbpp = 32; break;
case 7:
- mode->colorbpp = 23; break; /* CMYK */
+ mode->colorbpp = 32; break; /* CMYK */
case 8:
mode->colorbpp = 24; break;
}
} else {
+ /* clone station mode and return */
memcpy(mode, &(oldmodes[spriteMode]), sizeof(struct sprite_mode));
}
- /*LOGDBG("verticalDPI %u\n", verticalDPI);
- LOGDBG("horizontalDPI %u\n", horizontalDPI);*/
-
return mode;
}
@@ -135,42 +180,45 @@ int main(int argc, char *argv[])
for (uint32_t i = 0; i < spriteCount; i++) {
uint32_t nextSpriteOffset = sprite_read_word(spritefile);
- unsigned char* name = malloc(13); /* last byte for 0 terminator */
- sprite_read_bytes(spritefile, name, 12);
- name[12] = '\0';
+ struct sprite_header* header = malloc(sizeof(struct sprite_header));
- uint32_t width = sprite_read_word(spritefile);
- uint32_t height = sprite_read_word(spritefile);
- uint32_t firstUsedBit = sprite_read_word(spritefile); /* old format only (spriteType = 0) */
- uint32_t lastUsedBit = sprite_read_word(spritefile);
- uint32_t imageOffset = sprite_read_word(spritefile);
+ sprite_read_bytes(spritefile, header->name, 12);
+ header->name[12] = '\0';
+
+ uint32_t width = sprite_read_word(spritefile);
+ uint32_t height = sprite_read_word(spritefile);
+ uint32_t firstUsedBit = sprite_read_word(spritefile); /* old format only (spriteType = 0) */
+ uint32_t lastUsedBit = sprite_read_word(spritefile);
+ uint32_t imageOffset = sprite_read_word(spritefile);
assert(imageOffset >= 44); /* should never be smaller than the size of the header) */
- uint32_t maskOffset = sprite_read_word(spritefile);
- uint32_t spriteModeWord= sprite_read_word(spritefile);
+ uint32_t maskOffset = sprite_read_word(spritefile);
+ uint32_t spriteModeWord = sprite_read_word(spritefile);
- struct sprite_mode* spriteMode = sprite_get_mode(spriteModeWord);
+ header->mode = sprite_get_mode(spriteModeWord);
+ assert(header->mode->colorbpp > 0);
+ assert(header->mode->xdpi > 0);
+ assert(header->mode->ydpi > 0);
- uint32_t paletteSize = imageOffset - 44;
- bool hasPalette = (paletteSize > 0);
+ header->palettesize = imageOffset - 44;
+ header->haspalette = (header->palettesize > 0);
- bool hasMask;
uint32_t imageSize;
uint32_t maskSize;
if (imageOffset == maskOffset) {
- hasMask = false;
- imageSize = nextSpriteOffset - 44 - paletteSize;
+ header->hasmask = false;
+ imageSize = nextSpriteOffset - 44 - header->palettesize;
maskSize = 0;
} else {
- hasMask = true;
+ header->hasmask = true;
imageSize = maskOffset - imageOffset;
- maskSize = nextSpriteOffset - 44 - paletteSize - imageSize;
+ maskSize = nextSpriteOffset - 44 - header->palettesize - imageSize;
}
LOGDBG("\nLoading sprite %u\n", i);
LOGDBG("nextSpriteOffset %u\n", nextSpriteOffset);
- LOGDBG("name %s\n", name);
+ LOGDBG("name %s\n", header->name);
LOGDBG("width %u\n", width);
LOGDBG("height %u\n", height);
LOGDBG("firstUsedBit %u\n", firstUsedBit);
@@ -178,26 +226,26 @@ int main(int argc, char *argv[])
LOGDBG("imageOffset %u\n", imageOffset);
LOGDBG("maskOffset %u\n", maskOffset);
LOGDBG("spriteModeWord %u\n", spriteModeWord);
- LOGDBG("\tcolorbpp %u\n", spriteMode->colorbpp);
- LOGDBG("\txdpi %u\n", spriteMode->xdpi);
- LOGDBG("\tydpi %u\n", spriteMode->ydpi);
+ LOGDBG("\tcolorbpp %u\n", header->mode->colorbpp);
+ LOGDBG("\txdpi %u\n", header->mode->xdpi);
+ LOGDBG("\tydpi %u\n", header->mode->ydpi);
- LOGDBG("hasPalette %s\n", hasPalette ? "YES" : "NO");
- LOGDBG("paletteSize %u\n", paletteSize);
+ LOGDBG("hasPalette %s\n", header->haspalette ? "YES" : "NO");
+ if (header->haspalette) LOGDBG("paletteSize %u\n", header->palettesize);
LOGDBG("imageSize %u\n", imageSize);
- LOGDBG("hasMask %s\n", hasMask ? "YES" : "NO");
- LOGDBG("maskSize %u\n", maskSize);
+ LOGDBG("hasMask %s\n", header->hasmask ? "YES" : "NO");
+ if (header->hasmask) LOGDBG("maskSize %u\n", maskSize);
uint32_t* palette = NULL;
- if (paletteSize > 0) {
- assert(paletteSize % 8 == 0);
- palette = malloc(sizeof(uint32_t) * paletteSize);
- uint32_t paletteEntries = paletteSize / 8;
+ if (header->haspalette) {
+ assert(header->palettesize % 8 == 0);
+ palette = malloc(sizeof(uint32_t) * header->palettesize);
+ uint32_t paletteEntries = header->palettesize / 8;
/* Each palette entry is two words big
- * The section entry is a duplicate of the first
- * I think this is in case you ever wanted flashing colours
- */
+ * The second word is a duplicate of the first
+ * I think this is in case you ever wanted flashing colours
+ */
for (uint32_t j = 0; j < paletteEntries; j++) {
uint32_t word1 = sprite_read_word(spritefile);
uint32_t word2 = sprite_read_word(spritefile);
@@ -212,6 +260,13 @@ int main(int argc, char *argv[])
unsigned char* mask = malloc(maskSize);
sprite_read_bytes(spritefile, mask, maskSize);
+
+ LOGDBG("calculated width in bytes %u\n", ((width + 1) * (height + 1) * 4));
+ uint32_t widthInBits = (width + 1) * 4 /* bytes per word */ * 8 /* bits per byte */;
+ uint32_t widthInPixelsWithoutCrop = widthInBits / header->mode->colorbpp;
+ uint32_t heightInPixels = height + 1;
+ LOGDBG("width in pixels (without crop) %u\n", widthInPixelsWithoutCrop);
+ LOGDBG("height in pixels %u\n", heightInPixels);
}
return EXIT_SUCCESS;