Load_IFF() : support ACBM IFF subtype

This commit is contained in:
Thomas Bernard 2018-02-04 01:14:43 +01:00
parent f6fa546480
commit d59c7b6d26
3 changed files with 55 additions and 1 deletions

View File

@ -123,6 +123,7 @@ enum FILE_FORMATS
FORMAT_PKM, FORMAT_PKM,
FORMAT_LBM, FORMAT_LBM,
FORMAT_PBM, FORMAT_PBM,
FORMAT_ACBM,
FORMAT_IMG, FORMAT_IMG,
FORMAT_SCx, FORMAT_SCx,
FORMAT_PI1, FORMAT_PI1,

View File

@ -327,6 +327,10 @@ void Test_LBM(T_IO_Context * context)
{ {
Test_IFF(context, "ILBM"); Test_IFF(context, "ILBM");
} }
void Test_ACBM(T_IO_Context * context)
{
Test_IFF(context, "ACBM");
}
// -- Lire un fichier au format IFF ----------------------------------------- // -- Lire un fichier au format IFF -----------------------------------------
@ -620,6 +624,8 @@ void Load_IFF(T_IO_Context * context)
iff_format = FORMAT_LBM; iff_format = FORMAT_LBM;
else if(memcmp(format,"PBM ",4) == 0) else if(memcmp(format,"PBM ",4) == 0)
iff_format = FORMAT_PBM; iff_format = FORMAT_PBM;
else if(memcmp(format,"ACBM",4) == 0)
iff_format = FORMAT_ACBM;
else else
{ {
char tmp_msg[60]; char tmp_msg[60];
@ -828,6 +834,51 @@ printf("%d x %d = %d %d\n", tiny_width, tiny_height, tiny_width*tiny_height, s
section_size -= length; section_size -= length;
fseek(IFF_file, section_size, SEEK_CUR); fseek(IFF_file, section_size, SEEK_CUR);
} }
else if (memcmp(section, "ABIT", 4) == 0)
{
// ACBM format : ABIT = Amiga BITplanes
// The ABIT chunk contains contiguous bitplane data.
// The chunk contains sequential data for bitplane 0 through bitplane n.
Pre_load(context, header.Width, header.Height, file_size, iff_format, ratio, truecolor);
// compute row size
real_line_size = (context->Width+15) & ~15;
plane_line_size = real_line_size >> 3; // 8bits per byte
line_size = plane_line_size * header.BitPlanes;
buffer = malloc(line_size * context->Height);
if ((dword)(line_size * context->Height) == section_size)
header.Compression = 0; // size is of uncompressed data. Forcing.
for (plane = 0; plane < header.BitPlanes; plane++)
{
for (y_pos = 0; y_pos < context->Height; y_pos++)
{
if (header.Compression == 0)
{
if (!Read_bytes(IFF_file,buffer+line_size*y_pos+plane_line_size*plane,plane_line_size))
{
File_error = 21;
break;
}
}
else
{
Warning("Unhandled compression for ACBM ABIT chunk");
File_error = 32;
break;
}
}
}
if (File_error == 0)
{
for (y_pos = 0; y_pos < context->Height; y_pos++)
{
if (Image_HAM <= 1)
Draw_IFF_line(context, buffer+y_pos*line_size, y_pos,real_line_size, header.BitPlanes);
else
Draw_IFF_line_HAM(context, buffer+y_pos*line_size, y_pos,real_line_size, header.BitPlanes, SHAM_palettes, SHAM_palette_count);
}
}
free(buffer);
}
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;

View File

@ -60,6 +60,7 @@ void Save_PKM(T_IO_Context *);
// -- IFF ------------------------------------------------------------------- // -- IFF -------------------------------------------------------------------
void Test_LBM(T_IO_Context *); void Test_LBM(T_IO_Context *);
void Test_PBM(T_IO_Context *); void Test_PBM(T_IO_Context *);
void Test_ACBM(T_IO_Context *);
void Load_IFF(T_IO_Context *); void Load_IFF(T_IO_Context *);
void Save_IFF(T_IO_Context *); void Save_IFF(T_IO_Context *);
@ -163,7 +164,7 @@ void Load_SDL_Image(T_IO_Context *);
// ENUM Name TestFunc LoadFunc SaveFunc PalOnly Comment Layers Ext Exts // ENUM Name TestFunc LoadFunc SaveFunc PalOnly Comment Layers Ext Exts
const T_Format File_formats[] = { const T_Format File_formats[] = {
{FORMAT_ALL_IMAGES, "(all)", NULL, NULL, NULL, 0, 0, 0, "", "gif;png;bmp;2bp;pcx;pkm;iff;lbm;ilbm;sham;img;sci;scq;scf;scn;sco;pi1;pc1;cel;neo;c64;koa;koala;fli;bml;cdu;prg;tga;pnm;xpm;xcf;jpg;jpeg;tif;tiff;ico;ic2;cur;cm5;pph"}, {FORMAT_ALL_IMAGES, "(all)", NULL, NULL, NULL, 0, 0, 0, "", "gif;png;bmp;2bp;pcx;pkm;iff;lbm;ilbm;sham;acbm;pic;img;sci;scq;scf;scn;sco;pi1;pc1;cel;neo;c64;koa;koala;fli;bml;cdu;prg;tga;pnm;xpm;xcf;jpg;jpeg;tif;tiff;ico;ic2;cur;cm5;pph"},
{FORMAT_ALL_PALETTES, "(pal)", NULL, NULL, NULL, 1, 0, 0, "", "kcf;pal;gpl"}, {FORMAT_ALL_PALETTES, "(pal)", NULL, NULL, NULL, 1, 0, 0, "", "kcf;pal;gpl"},
{FORMAT_ALL_FILES, "(*.*)", NULL, NULL, NULL, 0, 0, 0, "", "*"}, {FORMAT_ALL_FILES, "(*.*)", NULL, NULL, NULL, 0, 0, 0, "", "*"},
{FORMAT_GIF, " gif", Test_GIF, Load_GIF, Save_GIF, 0, 1, 1, "gif", "gif"}, {FORMAT_GIF, " gif", Test_GIF, Load_GIF, Save_GIF, 0, 1, 1, "gif", "gif"},
@ -175,6 +176,7 @@ const T_Format File_formats[] = {
{FORMAT_PKM, " pkm", Test_PKM, Load_PKM, Save_PKM, 0, 1, 0, "pkm", "pkm"}, {FORMAT_PKM, " pkm", Test_PKM, Load_PKM, Save_PKM, 0, 1, 0, "pkm", "pkm"},
{FORMAT_LBM, " lbm", Test_LBM, Load_IFF, Save_IFF, 0, 0, 0, "iff", "iff;lbm;ilbm;sham"}, {FORMAT_LBM, " lbm", Test_LBM, Load_IFF, Save_IFF, 0, 0, 0, "iff", "iff;lbm;ilbm;sham"},
{FORMAT_PBM, " pbm", Test_PBM, Load_IFF, Save_IFF, 0, 0, 0, "iff", "iff;pbm;lbm"}, {FORMAT_PBM, " pbm", Test_PBM, Load_IFF, Save_IFF, 0, 0, 0, "iff", "iff;pbm;lbm"},
{FORMAT_ACBM," acbm",Test_ACBM,Load_IFF, NULL, 0, 0, 0, "iff", "iff;pic;acbm"},
{FORMAT_IMG, " img", Test_IMG, Load_IMG, Save_IMG, 0, 0, 0, "img", "img"}, {FORMAT_IMG, " img", Test_IMG, Load_IMG, Save_IMG, 0, 0, 0, "img", "img"},
{FORMAT_SCx, " sc?", Test_SCx, Load_SCx, Save_SCx, 0, 0, 0, "sc?", "sci;scq;scf;scn;sco"}, {FORMAT_SCx, " sc?", Test_SCx, Load_SCx, Save_SCx, 0, 0, 0, "sc?", "sci;scq;scf;scn;sco"},
{FORMAT_PI1, " pi1", Test_PI1, Load_PI1, Save_PI1, 0, 0, 0, "pi1", "pi1"}, {FORMAT_PI1, " pi1", Test_PI1, Load_PI1, Save_PI1, 0, 0, 0, "pi1", "pi1"},