summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Shaw <jshaw@netsurf-browser.org>2007-11-23 17:38:15 +0000
committerJames Shaw <jshaw@netsurf-browser.org>2007-11-23 17:38:15 +0000
commited6181f3b893aa43d9abd7b950bd94e46eeca02d (patch)
treea63af25181cd8de419b89090297e5bd386103041
parent56bbfb5c6fbf7699c40e754a48d13d119483219b (diff)
downloadlibrosprite-ed6181f3b893aa43d9abd7b950bd94e46eeca02d.tar.gz
librosprite-ed6181f3b893aa43d9abd7b950bd94e46eeca02d.tar.bz2
Implement high colour parsing
svn path=/import/jshaw/libsprite/; revision=9985
-rw-r--r--trunk/libsprite.c41
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");