Load_IFF(): load multi palette ILBMs using the BEAM chunk
This commit is contained in:
parent
d4bf0a8af9
commit
3149d04110
@ -1323,7 +1323,85 @@ void Load_IFF(T_IO_Context * context)
|
||||
fseek(IFF_file, (section_size+1)&~1, SEEK_CUR);
|
||||
}
|
||||
}
|
||||
else if (memcmp(section, "PCHG", 4) == 0)
|
||||
else if (memcmp(section, "BEAM", 4) == 0)
|
||||
{
|
||||
// One palette per line is stored
|
||||
if (Image_HAM >= 6)
|
||||
{
|
||||
SHAM_palette_count = header.Height;
|
||||
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 && section_size > 0; 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;
|
||||
}
|
||||
}
|
||||
else if (section_size >= header.Height * nb_colors * 2)
|
||||
{
|
||||
T_Palette palette;
|
||||
T_IFF_PCHG_Palette * prev_pal = NULL;
|
||||
T_IFF_PCHG_Palette * new_pal = NULL;
|
||||
|
||||
for (y_pos = 0; y_pos < header.Height; y_pos++)
|
||||
{
|
||||
unsigned int i;
|
||||
for (i = 0; i < nb_colors; i++)
|
||||
{
|
||||
word value;
|
||||
Read_word_be(IFF_file, &value);
|
||||
section_size -= 2;
|
||||
palette[i].R = ((value & 0x0f00) >> 8) * 0x11;
|
||||
palette[i].G = ((value & 0x00f0) >> 4) * 0x11;
|
||||
palette[i].B = (value & 0x000f) * 0x11;
|
||||
}
|
||||
if (y_pos == 0)
|
||||
{
|
||||
prev_pal = malloc(sizeof(T_IFF_PCHG_Palette) + nb_colors*sizeof(T_Components));
|
||||
if (prev_pal == NULL)
|
||||
{
|
||||
Warning("Memory allocation error");
|
||||
File_error = 1;
|
||||
break;
|
||||
}
|
||||
prev_pal->Next = NULL;
|
||||
prev_pal->StartLine = 0;
|
||||
memcpy(prev_pal->Palette, palette, nb_colors*sizeof(T_Components));
|
||||
PCHG_palettes = prev_pal;
|
||||
}
|
||||
else if (memcmp(palette, prev_pal->Palette, nb_colors*sizeof(T_Components)) != 0)
|
||||
{
|
||||
new_pal = malloc(sizeof(T_IFF_PCHG_Palette) + nb_colors*sizeof(T_Components));
|
||||
if (new_pal == NULL)
|
||||
{
|
||||
Warning("Memory allocation error");
|
||||
File_error = 1;
|
||||
break;
|
||||
}
|
||||
new_pal->Next = NULL;
|
||||
new_pal->StartLine = y_pos;
|
||||
memcpy(new_pal->Palette, palette, nb_colors*sizeof(T_Components));
|
||||
prev_pal->Next = new_pal;
|
||||
prev_pal = new_pal;
|
||||
}
|
||||
}
|
||||
if (PCHG_palettes != NULL)
|
||||
bpp = 12;
|
||||
}
|
||||
else
|
||||
Warning("inconsistant size of BEAM chunk, ignoring");
|
||||
fseek(IFF_file, (section_size+1)&~1, SEEK_CUR);
|
||||
}
|
||||
else if (memcmp(section, "PCHG", 4) == 0) // Palette CHanGes
|
||||
{
|
||||
dword * lineBitMask;
|
||||
int i;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user