Load_IFF() move PBM code to PBM_decode(). Handle TINY and DPPV chunks

This commit is contained in:
Thomas Bernard 2018-02-02 00:43:37 +01:00
parent 241943196b
commit c3a8559256

View File

@ -573,6 +573,68 @@ void Set_IFF_color(word x_pos, byte color, word real_line_size, byte bitplanes)
} }
} }
static void PBM_Decode(T_IO_Context * context, byte compression, word width, word height)
{
byte * line_buffer;
word x_pos, y_pos;
word real_line_size = (width+1)&~1;
switch (compression)
{
case 0: // uncompressed
line_buffer=(byte *)malloc(real_line_size);
for (y_pos=0; ((y_pos<height) && (!File_error)); y_pos++)
{
if (Read_bytes(IFF_file,line_buffer,real_line_size))
for (x_pos=0; x_pos<width; x_pos++)
Set_pixel(context, x_pos,y_pos,line_buffer[x_pos]);
else
File_error=26;
}
free(line_buffer);
break;
case 1: // Compressed
for (y_pos=0; ((y_pos<height) && (!File_error)); y_pos++)
{
for (x_pos=0; ((x_pos<real_line_size) && (!File_error)); )
{
byte temp_byte, color;
if(Read_byte(IFF_file, &temp_byte)!=1)
{
File_error=27;
break;
}
if (temp_byte>127)
{
if(Read_byte(IFF_file, &color)!=1)
{
File_error=28;
break;
}
do {
Set_pixel(context, x_pos++,y_pos,color);
}
while(temp_byte++ != 0);
}
else
do
{
if(Read_byte(IFF_file, &color)!=1)
{
File_error=29;
break;
}
Set_pixel(context, x_pos++,y_pos,color);
}
while(temp_byte-- > 0);
}
}
break;
default:
Warning("PBM only supports compression type 0 and 1");
File_error = 50;
}
}
void Load_IFF(T_IO_Context * context) void Load_IFF(T_IO_Context * context)
{ {
@ -593,7 +655,7 @@ void Load_IFF(T_IO_Context * context)
byte color; byte color;
long file_size; long file_size;
dword dummy; dword dummy;
int iff_format; int iff_format = 0;
int plane; int plane;
dword AmigaViewModes = 0; dword AmigaViewModes = 0;
@ -617,17 +679,25 @@ void Load_IFF(T_IO_Context * context)
Read_dword_be(IFF_file,&dummy); Read_dword_be(IFF_file,&dummy);
Read_bytes(IFF_file,format,4); Read_bytes(IFF_file,format,4);
} }
if (!memcmp(format,"ILBM",4)) if (memcmp(format,"ILBM",4) == 0)
iff_format = FORMAT_LBM; iff_format = FORMAT_LBM;
else else if(memcmp(format,"PBM ",4) == 0)
iff_format = FORMAT_PBM; iff_format = FORMAT_PBM;
else
{
char tmp_msg[60];
snprintf(tmp_msg, sizeof(tmp_msg), "Unkown IFF format '%.4s'", format);
Warning(tmp_msg);
File_error=1;
}
if (!IFF_Wait_for("BMHD")) if (!IFF_Wait_for("BMHD"))
File_error=1; File_error=1;
Read_dword_be(IFF_file,&dummy); Read_dword_be(IFF_file,&dummy); // SIZE
// Maintenant on lit le header pour pouvoir commencer le chargement de l'image // Maintenant on lit le header pour pouvoir commencer le chargement de l'image
if ( (Read_word_be(IFF_file,&header.Width)) if (File_error == 0
&& (Read_word_be(IFF_file,&header.Width))
&& (Read_word_be(IFF_file,&header.Height)) && (Read_word_be(IFF_file,&header.Height))
&& (Read_word_be(IFF_file,&header.X_org)) && (Read_word_be(IFF_file,&header.X_org))
&& (Read_word_be(IFF_file,&header.Y_org)) && (Read_word_be(IFF_file,&header.Y_org))
@ -731,6 +801,29 @@ void Load_IFF(T_IO_Context * context)
Read_dword_be(IFF_file, &AmigaViewModes); // HIRES=0x8000 LACE=0x4 HAM=0x800 HALFBRITE=0x80 Read_dword_be(IFF_file, &AmigaViewModes); // HIRES=0x8000 LACE=0x4 HAM=0x800 HALFBRITE=0x80
section_size -= 4; section_size -= 4;
} }
else if (memcmp(section, "DPPV", 4) == 0) // DPaint II ILBM perspective chunk
{
fseek(IFF_file, (section_size+1)&~1, SEEK_CUR); // Skip it
}
else if (memcmp(section, "TINY", 4) == 0)
{
word tiny_width, tiny_height;
Read_word_be(IFF_file,&tiny_width);
Read_word_be(IFF_file,&tiny_height);
section_size -= 4;
// Load thumbnail if in preview mode
if ((context->Type == CONTEXT_PREVIEW || context->Type == CONTEXT_PREVIEW_PALETTE) && iff_format == FORMAT_PBM)
{
Pre_load(context, tiny_width, tiny_height,file_size,iff_format,PIXEL_SIMPLE,0);
PBM_Decode(context, header.Compression, tiny_width, tiny_height);
fclose(IFF_file);
IFF_file = NULL;
return;
}
else
fseek(IFF_file, (section_size+1)&~1, SEEK_CUR);
}
else if (memcmp(section, "BODY", 4) == 0) else if (memcmp(section, "BODY", 4) == 0)
{ {
Original_screen_X = header.X_screen; Original_screen_X = header.X_screen;
@ -889,7 +982,7 @@ void Load_IFF(T_IO_Context * context)
if(cmd < (cmd_count-1) || section_size > 0) if(cmd < (cmd_count-1) || section_size > 0)
Warning("Early end in VDAT chunk"); Warning("Early end in VDAT chunk");
if (section_size > 0) if (section_size > 0)
fseek(IFF_file, section_size, SEEK_CUR); // skip bytes fseek(IFF_file, (section_size+1)&~1, SEEK_CUR); // skip bytes
free(commands); free(commands);
} }
if (!File_error) if (!File_error)
@ -912,59 +1005,7 @@ void Load_IFF(T_IO_Context * context)
} }
else // "PBM ": Planar(?) BitMap else // "PBM ": Planar(?) BitMap
{ {
real_line_size=context->Width+(context->Width&1); PBM_Decode(context, header.Compression, context->Width, context->Height);
if (!header.Compression)
{ // non compressé
IFF_buffer=(byte *)malloc(real_line_size);
for (y_pos=0; ((y_pos<context->Height) && (!File_error)); y_pos++)
{
if (Read_bytes(IFF_file,IFF_buffer,real_line_size))
for (x_pos=0; x_pos<context->Width; x_pos++)
Set_pixel(context, x_pos,y_pos,IFF_buffer[x_pos]);
else
File_error=26;
}
free(IFF_buffer);
IFF_buffer = NULL;
}
else
{ // compressé
/*Init_lecture();*/
for (y_pos=0; ((y_pos<context->Height) && (!File_error)); y_pos++)
{
for (x_pos=0; ((x_pos<real_line_size) && (!File_error)); )
{
if(Read_byte(IFF_file, &temp_byte)!=1)
{
File_error=27;
break;
}
if (temp_byte>127)
{
if(Read_byte(IFF_file, &color)!=1)
{
File_error=28;
break;
}
b256=256-temp_byte;
for (counter=0; counter<=b256; counter++)
Set_pixel(context, x_pos++,y_pos,color);
}
else
for (counter=0; counter<=temp_byte; counter++)
{
byte byte_read=0;
if(Read_byte(IFF_file, &byte_read)!=1)
{
File_error=29;
break;
}
Set_pixel(context, x_pos++,y_pos,byte_read);
}
}
}
}
} }
} }
else else
@ -973,7 +1014,7 @@ void Load_IFF(T_IO_Context * context)
// skip section // skip section
snprintf(tmp_msg, sizeof(tmp_msg), "Skip unknown section '%.4s' of %u bytes", section, section_size); snprintf(tmp_msg, sizeof(tmp_msg), "Skip unknown section '%.4s' of %u bytes", section, section_size);
Warning(tmp_msg); Warning(tmp_msg);
fseek(IFF_file, section_size, SEEK_CUR); fseek(IFF_file, (section_size+1)&~1, SEEK_CUR);
} }
} }