Load_IFF() : parse SHAM (Sliced-HAM) chunks
This commit is contained in:
parent
c5ea5d3a46
commit
38c9e3e2cf
@ -678,6 +678,8 @@ void Load_IFF(T_IO_Context * context)
|
|||||||
dword AmigaViewModes = 0;
|
dword AmigaViewModes = 0;
|
||||||
enum PIXEL_RATIO ratio = PIXEL_SIMPLE;
|
enum PIXEL_RATIO ratio = PIXEL_SIMPLE;
|
||||||
byte * buffer;
|
byte * buffer;
|
||||||
|
T_Components * SHAM_palettes = NULL;
|
||||||
|
unsigned SHAM_palette_count = 0;
|
||||||
|
|
||||||
Get_full_filename(filename, context->File_name, context->File_directory);
|
Get_full_filename(filename, context->File_name, context->File_directory);
|
||||||
|
|
||||||
@ -843,6 +845,36 @@ void Load_IFF(T_IO_Context * context)
|
|||||||
{
|
{
|
||||||
fseek(IFF_file, (section_size+1)&~1, SEEK_CUR); // Skip it
|
fseek(IFF_file, (section_size+1)&~1, SEEK_CUR); // Skip it
|
||||||
}
|
}
|
||||||
|
else if (memcmp(section, "SHAM", 4) == 0) // Sliced HAM
|
||||||
|
{
|
||||||
|
word version;
|
||||||
|
|
||||||
|
Read_word_be(IFF_file, &version); // always 0
|
||||||
|
section_size -= 2;
|
||||||
|
SHAM_palette_count = section_size >> 5; // 32 bytes per palette (16 colors * 2 bytes)
|
||||||
|
// SHAM_palette_count should be the image height, or height/2 for "interlaced" images
|
||||||
|
SHAM_palettes = malloc(sizeof(T_Components)*16*SHAM_palette_count);
|
||||||
|
if (SHAM_palettes == NULL)
|
||||||
|
{
|
||||||
|
Warning("Memory allocation error");
|
||||||
|
File_error = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (counter = 0; (unsigned)counter < 16*SHAM_palette_count; counter++)
|
||||||
|
{
|
||||||
|
Read_byte(IFF_file, &temp_byte); // 0R
|
||||||
|
SHAM_palettes[counter].R = (temp_byte & 0x0f) * 0x11; // 4 bits to 8 bits
|
||||||
|
Read_byte(IFF_file, &temp_byte); // GB
|
||||||
|
SHAM_palettes[counter].G = (temp_byte & 0xf0) | (temp_byte >> 4);
|
||||||
|
SHAM_palettes[counter].B = (temp_byte & 0x0f) * 0x11; // 4 bits to 8 bits
|
||||||
|
section_size -= 2;
|
||||||
|
}
|
||||||
|
if (section_size > 0)
|
||||||
|
{
|
||||||
|
Warning("Extra bytes at the end of SHAM chunk");
|
||||||
|
fseek(IFF_file, (section_size+1)&~1, SEEK_CUR);
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (memcmp(section, "TINY", 4) == 0)
|
else if (memcmp(section, "TINY", 4) == 0)
|
||||||
{
|
{
|
||||||
word tiny_width, tiny_height;
|
word tiny_width, tiny_height;
|
||||||
@ -1085,6 +1117,8 @@ printf("%d x %d = %d %d\n", tiny_width, tiny_height, tiny_width*tiny_height, s
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
File_error=1;
|
File_error=1;
|
||||||
|
if (SHAM_palettes)
|
||||||
|
free(SHAM_palettes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user