Load_IFF(): Use same palette structures for SHAM and PCHG + PCHG ok with EHB modes

This commit is contained in:
Thomas Bernard 2018-02-23 00:50:09 +01:00
parent ca352e756c
commit 5907219e6f

View File

@ -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; short x_pos;
byte red, green, blue, temp; byte red, green, blue, temp;
const T_Components * palette; const T_Components * palette;
if (SHAM_palettes == NULL) if (PCHG_palettes == NULL)
palette = context->Palette; palette = context->Palette;
else else
{ {
if (SHAM_palette_count >= context->Height) // find the palette to use for the line
palette = SHAM_palettes + 16*y_pos; while (PCHG_palettes->Next != NULL && PCHG_palettes->Next->StartLine <= y_pos)
else PCHG_palettes = PCHG_palettes->Next;
palette = SHAM_palettes + 16*(y_pos >> 1); palette = PCHG_palettes->Palette;
} }
red = palette[0].R; red = palette[0].R;
green = palette[0].G; 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, 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, byte stored_bit_planes, byte real_bit_planes, const T_IFF_PCHG_Palette * PCHG_palettes)
const T_Components * SHAM_palettes, int SHAM_palette_count)
{ {
int plane; int plane;
byte * buffer; 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 (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); 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 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 else
File_error=21; File_error=21;
@ -694,12 +693,12 @@ static void LBM_Decode(T_IO_Context * context, FILE * file, byte compression, by
} }
if (!File_error) 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); 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 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); 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. 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 for (i=0; i<32; i++) // The next 32 colors are the same with values divided by 2
{ {
j=i+32; j=i+32;
context->Palette[j].R=context->Palette[i].R>>1; palette[j].R = palette[i].R>>1;
context->Palette[j].G=context->Palette[i].G>>1; palette[j].G = palette[i].G>>1;
context->Palette[j].B=context->Palette[i].B>>1; palette[j].B = palette[i].B>>1;
} }
} }
@ -904,8 +903,6 @@ 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;
byte bpp = 0; byte bpp = 0;
byte Image_HAM = 0; byte Image_HAM = 0;
T_IFF_PCHG_Palette * PCHG_palettes = NULL; 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)); memset(context->Palette,0,sizeof(T_Palette));
if (Read_bytes(IFF_file,context->Palette,3*nb_colors)) 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; 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 while(section_size > 0) // Read padding bytes
{ {
if (Read_byte(IFF_file,&temp_byte)) if (Read_byte(IFF_file,&temp_byte))
@ -1529,7 +1529,10 @@ void Load_IFF(T_IO_Context * context)
bpp = 3 * (header.BitPlanes - 2); bpp = 3 * (header.BitPlanes - 2);
} }
if ((AmigaViewModes & 0x80) && (header.BitPlanes == 6)) // This is a Extra Half-Brite (EHB) 64 color image. 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 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 else if (memcmp(section, "SHAM", 4) == 0) // Sliced HAM
{ {
word version; word version;
dword SHAM_palette_count;
T_IFF_PCHG_Palette * prev_pal = NULL;
T_IFF_PCHG_Palette * new_pal = NULL;
Image_HAM = header.BitPlanes; Image_HAM = header.BitPlanes;
bpp = 3 * (header.BitPlanes - 2); bpp = 3 * (header.BitPlanes - 2);
@ -1566,21 +1572,31 @@ void Load_IFF(T_IO_Context * context)
section_size -= 2; section_size -= 2;
SHAM_palette_count = section_size >> 5; // 32 bytes per palette (16 colors * 2 bytes) 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_palette_count should be the image height, or height/2 for "interlaced" images
SHAM_palettes = malloc(sizeof(T_Components)*16*SHAM_palette_count); for (y_pos = 0; y_pos < header.Height && section_size >= 32; y_pos += (SHAM_palette_count < header.Height ? 2 : 1))
if (SHAM_palettes == NULL)
{ {
Warning("Memory allocation error"); new_pal = malloc(sizeof(T_IFF_PCHG_Palette) + nb_colors*sizeof(T_Components));
File_error = 1; if (new_pal == NULL)
break; {
} Warning("Memory allocation error");
for (counter = 0; (unsigned)counter < 16*SHAM_palette_count; counter++) File_error = 1;
{ break;
Read_byte(IFF_file, &temp_byte); // 0R }
SHAM_palettes[counter].R = (temp_byte & 0x0f) * 0x11; // 4 bits to 8 bits new_pal->Next = NULL;
Read_byte(IFF_file, &temp_byte); // GB new_pal->StartLine = y_pos;
SHAM_palettes[counter].G = (temp_byte & 0xf0) | (temp_byte >> 4); for (counter = 0; counter < 16; counter++)
SHAM_palettes[counter].B = (temp_byte & 0x0f) * 0x11; // 4 bits to 8 bits {
section_size -= 2; Read_byte(IFF_file, &temp_byte); // 0R
new_pal->Palette[counter].R = (temp_byte & 0x0f) * 0x11; // 4 bits to 8 bits
Read_byte(IFF_file, &temp_byte); // GB
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) if (section_size > 0)
{ {
@ -1591,27 +1607,7 @@ void Load_IFF(T_IO_Context * context)
else if (memcmp(section, "BEAM", 4) == 0 || memcmp(section, "CTBL", 4) == 0) else if (memcmp(section, "BEAM", 4) == 0 || memcmp(section, "CTBL", 4) == 0)
{ {
// One palette per line is stored // One palette per line is stored
if (Image_HAM >= 6) if (section_size >= header.Height * nb_colors * 2)
{
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_Palette palette;
T_IFF_PCHG_Palette * prev_pal = NULL; 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)].G = ((PaletteChange & 0x00f0) >> 4) * 0x11;
curr_pal->Palette[16+(PaletteChange >> 12)].B = ((PaletteChange & 0x000f) >> 0) * 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; prev_pal = curr_pal;
} }
} }
@ -1851,7 +1849,7 @@ void Load_IFF(T_IO_Context * context)
if (iff_format == FORMAT_PBM) if (iff_format == FORMAT_PBM)
PBM_Decode(context, IFF_file, header.Compression, tiny_width, tiny_height); PBM_Decode(context, IFF_file, header.Compression, tiny_width, tiny_height);
else 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); fclose(IFF_file);
IFF_file = NULL; IFF_file = NULL;
return; return;
@ -1911,7 +1909,7 @@ void Load_IFF(T_IO_Context * context)
if (Image_HAM <= 1) if (Image_HAM <= 1)
Draw_IFF_line(context, buffer+y_pos*line_size, y_pos,real_line_size, real_bit_planes); Draw_IFF_line(context, buffer+y_pos*line_size, y_pos,real_line_size, real_bit_planes);
else 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); free(buffer);
@ -1956,7 +1954,7 @@ void Load_IFF(T_IO_Context * context)
if (iff_format == FORMAT_LBM) // "ILBM": InterLeaved BitMap 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 else // "PBM ": Packed BitMap
{ {
@ -1985,8 +1983,6 @@ void Load_IFF(T_IO_Context * context)
} }
else else
File_error=1; File_error=1;
if (SHAM_palettes)
free(SHAM_palettes);
if (previous_frame) if (previous_frame)
free(previous_frame); free(previous_frame);
if (anteprevious_frame) if (anteprevious_frame)