Load_IFF(): Use same palette structures for SHAM and PCHG + PCHG ok with EHB modes
This commit is contained in:
parent
ca352e756c
commit
5907219e6f
@ -468,20 +468,20 @@ static void Draw_IFF_line_PCHG(T_IO_Context *context, const byte * buffer, short
|
||||
}
|
||||
}
|
||||
|
||||
static void Draw_IFF_line_HAM(T_IO_Context *context, const byte * buffer, short y_pos, short real_line_size, byte bitplanes, const T_Components * SHAM_palettes, int SHAM_palette_count)
|
||||
static void Draw_IFF_line_HAM(T_IO_Context *context, const byte * buffer, short y_pos, short real_line_size, byte bitplanes, const T_IFF_PCHG_Palette * PCHG_palettes)
|
||||
{
|
||||
short x_pos;
|
||||
byte red, green, blue, temp;
|
||||
const T_Components * palette;
|
||||
|
||||
if (SHAM_palettes == NULL)
|
||||
if (PCHG_palettes == NULL)
|
||||
palette = context->Palette;
|
||||
else
|
||||
{
|
||||
if (SHAM_palette_count >= context->Height)
|
||||
palette = SHAM_palettes + 16*y_pos;
|
||||
else
|
||||
palette = SHAM_palettes + 16*(y_pos >> 1);
|
||||
// find the palette to use for the line
|
||||
while (PCHG_palettes->Next != NULL && PCHG_palettes->Next->StartLine <= y_pos)
|
||||
PCHG_palettes = PCHG_palettes->Next;
|
||||
palette = PCHG_palettes->Palette;
|
||||
}
|
||||
red = palette[0].R;
|
||||
green = palette[0].G;
|
||||
@ -600,8 +600,7 @@ static void PBM_Decode(T_IO_Context * context, FILE * file, byte compression, wo
|
||||
}
|
||||
|
||||
static void LBM_Decode(T_IO_Context * context, FILE * file, byte compression, byte Image_HAM,
|
||||
byte stored_bit_planes, byte real_bit_planes, const T_IFF_PCHG_Palette * PCHG_palettes,
|
||||
const T_Components * SHAM_palettes, int SHAM_palette_count)
|
||||
byte stored_bit_planes, byte real_bit_planes, const T_IFF_PCHG_Palette * PCHG_palettes)
|
||||
{
|
||||
int plane;
|
||||
byte * buffer;
|
||||
@ -625,12 +624,12 @@ static void LBM_Decode(T_IO_Context * context, FILE * file, byte compression, by
|
||||
{
|
||||
if (Read_bytes(file,buffer,line_size))
|
||||
{
|
||||
if (PCHG_palettes)
|
||||
if (Image_HAM > 1)
|
||||
Draw_IFF_line_HAM(context, buffer, y_pos,real_line_size, real_bit_planes, PCHG_palettes);
|
||||
else if (PCHG_palettes)
|
||||
Draw_IFF_line_PCHG(context, buffer, y_pos,real_line_size, real_bit_planes, PCHG_palettes);
|
||||
else if (Image_HAM <= 1)
|
||||
Draw_IFF_line(context, buffer, y_pos,real_line_size, real_bit_planes);
|
||||
else
|
||||
Draw_IFF_line_HAM(context, buffer, y_pos,real_line_size, real_bit_planes, SHAM_palettes, SHAM_palette_count);
|
||||
Draw_IFF_line(context, buffer, y_pos,real_line_size, real_bit_planes);
|
||||
}
|
||||
else
|
||||
File_error=21;
|
||||
@ -694,12 +693,12 @@ static void LBM_Decode(T_IO_Context * context, FILE * file, byte compression, by
|
||||
}
|
||||
if (!File_error)
|
||||
{
|
||||
if (PCHG_palettes)
|
||||
if (Image_HAM > 1)
|
||||
Draw_IFF_line_HAM(context, buffer, y_pos,real_line_size, real_bit_planes, PCHG_palettes);
|
||||
else if (PCHG_palettes)
|
||||
Draw_IFF_line_PCHG(context, buffer, y_pos,real_line_size, real_bit_planes, PCHG_palettes);
|
||||
else if (Image_HAM <= 1)
|
||||
Draw_IFF_line(context, buffer, y_pos,real_line_size,real_bit_planes);
|
||||
else
|
||||
Draw_IFF_line_HAM(context, buffer, y_pos,real_line_size, real_bit_planes, SHAM_palettes, SHAM_palette_count);
|
||||
Draw_IFF_line(context, buffer, y_pos,real_line_size,real_bit_planes);
|
||||
}
|
||||
}
|
||||
free(buffer);
|
||||
@ -869,15 +868,15 @@ static void RAST_chunk_decode(T_IO_Context * context, FILE * file, dword section
|
||||
}
|
||||
}
|
||||
|
||||
static void IFF_Set_EHB_Palette(T_IO_Context * context)
|
||||
static void IFF_Set_EHB_Palette(T_Components * palette)
|
||||
{
|
||||
int i, j; // 32 colors in the palette.
|
||||
for (i=0; i<32; i++) // The next 32 colors are the same with values divided by 2
|
||||
{
|
||||
j=i+32;
|
||||
context->Palette[j].R=context->Palette[i].R>>1;
|
||||
context->Palette[j].G=context->Palette[i].G>>1;
|
||||
context->Palette[j].B=context->Palette[i].B>>1;
|
||||
palette[j].R = palette[i].R>>1;
|
||||
palette[j].G = palette[i].G>>1;
|
||||
palette[j].B = palette[i].B>>1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -904,8 +903,6 @@ void Load_IFF(T_IO_Context * context)
|
||||
dword AmigaViewModes = 0;
|
||||
enum PIXEL_RATIO ratio = PIXEL_SIMPLE;
|
||||
byte * buffer;
|
||||
T_Components * SHAM_palettes = NULL;
|
||||
unsigned SHAM_palette_count = 0;
|
||||
byte bpp = 0;
|
||||
byte Image_HAM = 0;
|
||||
T_IFF_PCHG_Palette * PCHG_palettes = NULL;
|
||||
@ -1465,10 +1462,13 @@ void Load_IFF(T_IO_Context * context)
|
||||
memset(context->Palette,0,sizeof(T_Palette));
|
||||
if (Read_bytes(IFF_file,context->Palette,3*nb_colors))
|
||||
{
|
||||
if (((nb_colors==32) || (AmigaViewModes & 0x80)) && (header.BitPlanes==6))
|
||||
IFF_Set_EHB_Palette(context); // This is a Extra Half-Brite (EHB) 64 color image.
|
||||
|
||||
section_size -= 3*nb_colors;
|
||||
if (((nb_colors==32) || (AmigaViewModes & 0x80)) && (header.BitPlanes==6))
|
||||
{
|
||||
IFF_Set_EHB_Palette(context->Palette); // This is a Extra Half-Brite (EHB) 64 color image.
|
||||
nb_colors = 64;
|
||||
}
|
||||
|
||||
while(section_size > 0) // Read padding bytes
|
||||
{
|
||||
if (Read_byte(IFF_file,&temp_byte))
|
||||
@ -1529,7 +1529,10 @@ void Load_IFF(T_IO_Context * context)
|
||||
bpp = 3 * (header.BitPlanes - 2);
|
||||
}
|
||||
if ((AmigaViewModes & 0x80) && (header.BitPlanes == 6)) // This is a Extra Half-Brite (EHB) 64 color image.
|
||||
IFF_Set_EHB_Palette(context); // Set the palette in case CAMG is after CMAP
|
||||
{
|
||||
IFF_Set_EHB_Palette(context->Palette); // Set the palette in case CAMG is after CMAP
|
||||
nb_colors = 64;
|
||||
}
|
||||
}
|
||||
else if (memcmp(section, "DPPV", 4) == 0) // DPaint II ILBM perspective chunk
|
||||
{
|
||||
@ -1559,6 +1562,9 @@ void Load_IFF(T_IO_Context * context)
|
||||
else if (memcmp(section, "SHAM", 4) == 0) // Sliced HAM
|
||||
{
|
||||
word version;
|
||||
dword SHAM_palette_count;
|
||||
T_IFF_PCHG_Palette * prev_pal = NULL;
|
||||
T_IFF_PCHG_Palette * new_pal = NULL;
|
||||
|
||||
Image_HAM = header.BitPlanes;
|
||||
bpp = 3 * (header.BitPlanes - 2);
|
||||
@ -1566,22 +1572,32 @@ void Load_IFF(T_IO_Context * context)
|
||||
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)
|
||||
for (y_pos = 0; y_pos < header.Height && section_size >= 32; y_pos += (SHAM_palette_count < header.Height ? 2 : 1))
|
||||
{
|
||||
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;
|
||||
}
|
||||
for (counter = 0; (unsigned)counter < 16*SHAM_palette_count; counter++)
|
||||
new_pal->Next = NULL;
|
||||
new_pal->StartLine = y_pos;
|
||||
for (counter = 0; counter < 16; counter++)
|
||||
{
|
||||
Read_byte(IFF_file, &temp_byte); // 0R
|
||||
SHAM_palettes[counter].R = (temp_byte & 0x0f) * 0x11; // 4 bits to 8 bits
|
||||
new_pal->Palette[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
|
||||
new_pal->Palette[counter].G = (temp_byte & 0xf0) | (temp_byte >> 4);
|
||||
new_pal->Palette[counter].B = (temp_byte & 0x0f) * 0x11; // 4 bits to 8 bits
|
||||
section_size -= 2;
|
||||
}
|
||||
if (prev_pal != NULL)
|
||||
prev_pal->Next = new_pal;
|
||||
else
|
||||
PCHG_palettes = new_pal;
|
||||
prev_pal = new_pal;
|
||||
}
|
||||
if (section_size > 0)
|
||||
{
|
||||
Warning("Extra bytes at the end of SHAM chunk");
|
||||
@ -1591,27 +1607,7 @@ void Load_IFF(T_IO_Context * context)
|
||||
else if (memcmp(section, "BEAM", 4) == 0 || memcmp(section, "CTBL", 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)
|
||||
if (section_size >= header.Height * nb_colors * 2)
|
||||
{
|
||||
T_Palette palette;
|
||||
T_IFF_PCHG_Palette * prev_pal = NULL;
|
||||
@ -1812,6 +1808,8 @@ void Load_IFF(T_IO_Context * context)
|
||||
curr_pal->Palette[16+(PaletteChange >> 12)].G = ((PaletteChange & 0x00f0) >> 4) * 0x11;
|
||||
curr_pal->Palette[16+(PaletteChange >> 12)].B = ((PaletteChange & 0x000f) >> 0) * 0x11;
|
||||
}
|
||||
if (nb_colors == 64) // Extend the 32 colors decoded to 64
|
||||
IFF_Set_EHB_Palette(curr_pal->Palette);
|
||||
prev_pal = curr_pal;
|
||||
}
|
||||
}
|
||||
@ -1851,7 +1849,7 @@ void Load_IFF(T_IO_Context * context)
|
||||
if (iff_format == FORMAT_PBM)
|
||||
PBM_Decode(context, IFF_file, header.Compression, tiny_width, tiny_height);
|
||||
else
|
||||
LBM_Decode(context, IFF_file, header.Compression, Image_HAM, stored_bit_planes, real_bit_planes, PCHG_palettes, SHAM_palettes, SHAM_palette_count);
|
||||
LBM_Decode(context, IFF_file, header.Compression, Image_HAM, stored_bit_planes, real_bit_planes, PCHG_palettes);
|
||||
fclose(IFF_file);
|
||||
IFF_file = NULL;
|
||||
return;
|
||||
@ -1911,7 +1909,7 @@ void Load_IFF(T_IO_Context * context)
|
||||
if (Image_HAM <= 1)
|
||||
Draw_IFF_line(context, buffer+y_pos*line_size, y_pos,real_line_size, real_bit_planes);
|
||||
else
|
||||
Draw_IFF_line_HAM(context, buffer+y_pos*line_size, y_pos,real_line_size, real_bit_planes, SHAM_palettes, SHAM_palette_count);
|
||||
Draw_IFF_line_HAM(context, buffer+y_pos*line_size, y_pos,real_line_size, real_bit_planes, PCHG_palettes);
|
||||
}
|
||||
}
|
||||
free(buffer);
|
||||
@ -1956,7 +1954,7 @@ void Load_IFF(T_IO_Context * context)
|
||||
|
||||
if (iff_format == FORMAT_LBM) // "ILBM": InterLeaved BitMap
|
||||
{
|
||||
LBM_Decode(context, IFF_file, header.Compression, Image_HAM, stored_bit_planes, real_bit_planes, PCHG_palettes, SHAM_palettes, SHAM_palette_count);
|
||||
LBM_Decode(context, IFF_file, header.Compression, Image_HAM, stored_bit_planes, real_bit_planes, PCHG_palettes);
|
||||
}
|
||||
else // "PBM ": Packed BitMap
|
||||
{
|
||||
@ -1985,8 +1983,6 @@ void Load_IFF(T_IO_Context * context)
|
||||
}
|
||||
else
|
||||
File_error=1;
|
||||
if (SHAM_palettes)
|
||||
free(SHAM_palettes);
|
||||
if (previous_frame)
|
||||
free(previous_frame);
|
||||
if (anteprevious_frame)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user