diff options
author | James Shaw <jshaw@netsurf-browser.org> | 2007-11-23 17:38:15 +0000 |
---|---|---|
committer | James Shaw <jshaw@netsurf-browser.org> | 2007-11-23 17:38:15 +0000 |
commit | ed6181f3b893aa43d9abd7b950bd94e46eeca02d (patch) | |
tree | a63af25181cd8de419b89090297e5bd386103041 | |
parent | 56bbfb5c6fbf7699c40e754a48d13d119483219b (diff) | |
download | librosprite-ed6181f3b893aa43d9abd7b950bd94e46eeca02d.tar.gz librosprite-ed6181f3b893aa43d9abd7b950bd94e46eeca02d.tar.bz2 |
Implement high colour parsing
svn path=/import/jshaw/libsprite/; revision=9985
-rw-r--r-- | trunk/libsprite.c | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/trunk/libsprite.c b/trunk/libsprite.c index d3ce317..4d59489 100644 --- a/trunk/libsprite.c +++ b/trunk/libsprite.c @@ -168,24 +168,42 @@ struct sprite_mode* sprite_get_mode(uint32_t spriteMode) return mode; } -void sprite_load_high_color(uint8_t* image, uint8_t* mask, struct sprite* sprite, struct sprite_header* header) +void sprite_load_high_color(uint8_t* image_in, uint8_t* mask, struct sprite* sprite, struct sprite_header* header) { - image = image; mask = mask; sprite = sprite; header = header; + mask = mask; + + sprite->image = malloc(sprite->width * sprite->height * 4); /* all image data is 32bpp going out */ + + uint32_t currentByteIndex = 0; /* only for standalone test -- fread() will maintain this */ + uint32_t bpp = sprite->mode->colorbpp; + uint32_t bytesPerPixel = bpp / 8; + + /* TODO: waste */ + + for (uint32_t y = 0; y < sprite->height; y++) { + for (uint32_t x = 0; x < header->width_words * 32 /* 32 bits per word */; x+=bpp) { + uint32_t pixel = 0; + for (uint32_t j = 0; j < bytesPerPixel; j++) { + uint8_t b = image_in[currentByteIndex++]; + pixel = pixel | (b << (j * 8)); + } + printf("%4x", pixel); + /* TODO: put pixels in sprite->image */ + } + printf("\n"); + } } void sprite_load_low_color(uint8_t* image_in, uint8_t* mask, struct sprite* sprite, struct sprite_header* header) { mask = mask; /* TODO: mask */ - /* TODO: left/right wastage */ sprite->image = malloc(sprite->width * sprite->height * 4); /* all image data is 32bpp going out */ - uint32_t currentByteIndex = 0; /* only for standalone test -- fread() will maintain this */ - + uint32_t current_word_index = 0; uint32_t bpp = sprite->mode->colorbpp; - uint32_t bitmask = (1 << bpp) - 1; /* creates a mask of 1s that is bpp bits wide */ - uint8_t currentbyte = image_in[currentByteIndex++]; + uint32_t currentword = ((uint32_t*) image_in)[current_word_index++]; for (uint32_t y = 0; y < sprite->height; y++) { for (uint32_t x = 0; x < header->width_words * 32 /* 32 bits per word */; x+=bpp) { @@ -195,16 +213,17 @@ void sprite_load_low_color(uint8_t* image_in, uint8_t* mask, struct sprite* spri waste = true; } /* TODO: left wastage */ - uint32_t offset_into_byte = x % 8; + uint32_t offset_into_word = x % 32; if (!waste) { - uint32_t pixel = (currentbyte & (bitmask << offset_into_byte)) >> offset_into_byte; + uint32_t pixel = (currentword & (bitmask << offset_into_word)) >> offset_into_word; printf("%2x", pixel); + /* TODO: put pixels in sprite->image */ } - if (offset_into_byte + bpp == 8) { + if (offset_into_word + bpp == 32) { /* TODO: assert not exceeding image size */ - currentbyte = image_in[currentByteIndex++]; + currentword = ((uint32_t*)image_in)[current_word_index++]; } } printf("\n"); |