summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Shaw <jshaw@netsurf-browser.org>2007-11-23 10:56:53 +0000
committerJames Shaw <jshaw@netsurf-browser.org>2007-11-23 10:56:53 +0000
commitff0b4e48901445e398f0c3191005f4c49f91a763 (patch)
tree832e8ac29c33a525404a05ebfffc034323201574
parent17bf24b62bffba644f14e3ce8d748ba481be30a7 (diff)
downloadlibrosprite-ff0b4e48901445e398f0c3191005f4c49f91a763.tar.gz
librosprite-ff0b4e48901445e398f0c3191005f4c49f91a763.tar.bz2
Detect Select 8bpp masks, more asserts
svn path=/import/jshaw/libsprite/; revision=9982
-rw-r--r--trunk/libsprite.c38
1 files changed, 35 insertions, 3 deletions
diff --git a/trunk/libsprite.c b/trunk/libsprite.c
index ab74eed..3154fff 100644
--- a/trunk/libsprite.c
+++ b/trunk/libsprite.c
@@ -17,6 +17,7 @@ struct sprite_area_control_block {
struct sprite_mode {
uint32_t colorbpp;
+ uint32_t maskbpp;
uint32_t xdpi;
uint32_t ydpi;
};
@@ -25,7 +26,6 @@ struct sprite_header {
unsigned char name[13]; /* last byte for 0 terminator */
struct sprite_mode* mode;
bool hasmask;
- uint32_t maskbpp;
bool haspalette;
uint32_t palettesize;
uint32_t* palette;
@@ -111,11 +111,21 @@ struct sprite_mode* sprite_get_mode(uint32_t spriteMode)
oldmodes[45].colorbpp = 2; oldmodes[45].xdpi = 90; oldmodes[45].ydpi = 45;
oldmodes[46].colorbpp = 4; oldmodes[46].xdpi = 90; oldmodes[46].ydpi = 45;
+ /* old modes have the same mask bpp as their colour bpp -- PRM1-781 */
+ for (uint32_t i = 0; i < 256; i++) {
+ oldmodes[i].maskbpp = oldmodes[i].colorbpp;
+ }
+
struct sprite_mode* mode = malloc(sizeof(struct sprite_mode));
- uint32_t spriteType = spriteMode >> 27; /* preserve bits 27-31 only */
+ uint32_t spriteType = (spriteMode & 0x78000000) >> 27; /* preserve bits 27-30 only */
if (spriteType != 0) {
+ bool hasEightBitAlpha = (spriteMode & 0x80000000) >> 31; /* bit 31 */
+ /* new modes have 1bpp masks (PRM5a-111)
+ * unless bit 31 is set (http://select.riscos.com/prm/graphics/sprites/alphachannel.html)
+ */
+ mode->maskbpp = (hasEightBitAlpha ? 8 : 1);
mode->xdpi = (spriteMode & 0x07ffc000) >> 14; /* preserve bits 14-26 only */
mode->ydpi = (spriteMode & 0x00003ffe) >> 1; /* preserve bits 1-13 only */
switch (spriteType) {
@@ -138,12 +148,17 @@ struct sprite_mode* sprite_get_mode(uint32_t spriteMode)
}
} else {
/* clone station mode and return */
+ assert(spriteMode < 256); /* don't think you can have modes over 255? */
memcpy(mode, &(oldmodes[spriteMode]), sizeof(struct sprite_mode));
}
return mode;
}
+/*sprite_get_image(struct sprite_header* header)
+{
+}*/
+
int main(int argc, char *argv[])
{
if (argc < 2) {
@@ -225,7 +240,11 @@ int main(int argc, char *argv[])
LOGDBG("lastUsedBit %u\n", lastUsedBit);
LOGDBG("imageOffset %u\n", imageOffset);
LOGDBG("maskOffset %u\n", maskOffset);
- LOGDBG("spriteModeWord %u\n", spriteModeWord);
+ if (spriteModeWord > 255) {
+ LOGDBG("spriteModeWord 0x%x\n", spriteModeWord);
+ } else {
+ LOGDBG("spriteModeWord %u\n", spriteModeWord);
+ }
LOGDBG("\tcolorbpp %u\n", header->mode->colorbpp);
LOGDBG("\txdpi %u\n", header->mode->xdpi);
LOGDBG("\tydpi %u\n", header->mode->ydpi);
@@ -234,6 +253,7 @@ int main(int argc, char *argv[])
if (header->haspalette) LOGDBG("paletteSize %u\n", header->palettesize);
LOGDBG("imageSize %u\n", imageSize);
LOGDBG("hasMask %s\n", header->hasmask ? "YES" : "NO");
+ if (header->hasmask) LOGDBG("maskbpp %u\n", header->mode->maskbpp);
if (header->hasmask) LOGDBG("maskSize %u\n", maskSize);
uint32_t* palette = NULL;
@@ -271,3 +291,15 @@ int main(int argc, char *argv[])
return EXIT_SUCCESS;
}
+
+/*
+ word boundary
+ |
+32bpp: bbggrr00 | bbggrr00
+24bpp: bbggrrbb | ggrr....
+16bpp: bgr0bgr0 | bgr0bgr0
+*/
+
+/*
+
+*/