Issue 505: Support for saving IFF/ILBM format, compatible with Deluxe Paint 3
git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1993 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
parent
3ae0ff5edf
commit
56cdbc4c10
@ -110,6 +110,7 @@ enum FILE_FORMATS
|
||||
FORMAT_PCX,
|
||||
FORMAT_PKM,
|
||||
FORMAT_LBM,
|
||||
FORMAT_PBM,
|
||||
FORMAT_IMG,
|
||||
FORMAT_SCx,
|
||||
FORMAT_PI1,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -512,7 +512,7 @@ static const T_Help_table helptable_credits[] =
|
||||
HELP_TEXT (" CEL,KCF : K.O.S. (KISekae Set system)")
|
||||
HELP_TEXT (" GIF : Compuserve")
|
||||
HELP_TEXT (" IMG : Bivas (W. Wiedmann?)")
|
||||
HELP_TEXT (" LBM : Electronic Arts")
|
||||
HELP_TEXT (" IFF : Electronic Arts")
|
||||
HELP_TEXT (" PAL : ermmh... nobody (?)")
|
||||
HELP_TEXT (" PCX : Z-Soft")
|
||||
HELP_TEXT (" PI1,PC1 : Degas Elite")
|
||||
@ -1204,7 +1204,7 @@ static const T_Help_table helptable_grad_rect[] =
|
||||
HELP_TEXT ("")
|
||||
HELP_TEXT ("These options allow you to use animation of")
|
||||
HELP_TEXT ("colors: Grafx2 will shift palette entries")
|
||||
HELP_TEXT ("at real-time. Note that only the LBM file")
|
||||
HELP_TEXT ("at real-time. Note that only the IFF file")
|
||||
HELP_TEXT ("format can record these settings, and very")
|
||||
HELP_TEXT ("few image viewers will play it back.")
|
||||
HELP_TEXT ("")
|
||||
|
||||
@ -2190,7 +2190,7 @@ int Load_CFG(int reload_all)
|
||||
break;
|
||||
case CHUNK_GRADIENTS: // Infos sur les dégradés
|
||||
// The gradients chunk is deprecated since the data
|
||||
// is now loaded/saved in GIF and LBM formats.
|
||||
// is now loaded/saved in GIF and IFF formats.
|
||||
// The chunk will be completely ignored.
|
||||
/*if (reload_all)
|
||||
{
|
||||
@ -2518,7 +2518,7 @@ int Save_CFG(void)
|
||||
|
||||
// Sauvegarde des informations des dégradés
|
||||
// The gradients chunk is deprecated since the data
|
||||
// is now loaded/saved in GIF and LBM formats.
|
||||
// is now loaded/saved in GIF and IFF formats.
|
||||
/*
|
||||
Chunk.Number=CHUNK_GRADIENTS;
|
||||
Chunk.Size=14*16+1;
|
||||
|
||||
@ -57,10 +57,11 @@ void Test_PKM(T_IO_Context *);
|
||||
void Load_PKM(T_IO_Context *);
|
||||
void Save_PKM(T_IO_Context *);
|
||||
|
||||
// -- LBM -------------------------------------------------------------------
|
||||
// -- IFF -------------------------------------------------------------------
|
||||
void Test_LBM(T_IO_Context *);
|
||||
void Load_LBM(T_IO_Context *);
|
||||
void Save_LBM(T_IO_Context *);
|
||||
void Test_PBM(T_IO_Context *);
|
||||
void Load_IFF(T_IO_Context *);
|
||||
void Save_IFF(T_IO_Context *);
|
||||
|
||||
// -- GIF -------------------------------------------------------------------
|
||||
void Test_GIF(T_IO_Context *);
|
||||
@ -142,12 +143,12 @@ void Save_PNG(T_IO_Context *);
|
||||
#endif
|
||||
|
||||
// -- SDL_Image -------------------------------------------------------------
|
||||
// (TGA, BMP, PNM, XPM, XCF, PCX, GIF, JPG, TIF, LBM, PNG, ICO)
|
||||
// (TGA, BMP, PNM, XPM, XCF, PCX, GIF, JPG, TIF, IFF, PNG, ICO)
|
||||
void Load_SDL_Image(T_IO_Context *);
|
||||
|
||||
// ENUM Name TestFunc LoadFunc SaveFunc PalOnly Comment Layers Ext Exts
|
||||
T_Format File_formats[] = {
|
||||
{FORMAT_ALL_IMAGES, "(all)", NULL, NULL, NULL, 0, 0, 0, "", "gif;png;bmp;pcx;pkm;lbm;iff;img;sci;scq;scf;scn;sco;pi1;pc1;cel;neo;kcf;pal;c64;koa;koala;fli;bml;cdu;prg;tga;pnm;xpm;xcf;jpg;jpeg;tif;tiff;ico;cm5"},
|
||||
{FORMAT_ALL_IMAGES, "(all)", NULL, NULL, NULL, 0, 0, 0, "", "gif;png;bmp;pcx;pkm;iff;lbm;ilbm;img;sci;scq;scf;scn;sco;pi1;pc1;cel;neo;kcf;pal;c64;koa;koala;fli;bml;cdu;prg;tga;pnm;xpm;xcf;jpg;jpeg;tif;tiff;ico;cm5"},
|
||||
{FORMAT_ALL_FILES, "(*.*)", NULL, NULL, NULL, 0, 0, 0, "", "*"},
|
||||
{FORMAT_GIF, " gif", Test_GIF, Load_GIF, Save_GIF, 0, 1, 1, "gif", "gif"},
|
||||
#ifndef __no_pnglib__
|
||||
@ -156,7 +157,8 @@ T_Format File_formats[] = {
|
||||
{FORMAT_BMP, " bmp", Test_BMP, Load_BMP, Save_BMP, 0, 0, 0, "bmp", "bmp"},
|
||||
{FORMAT_PCX, " pcx", Test_PCX, Load_PCX, Save_PCX, 0, 0, 0, "pcx", "pcx"},
|
||||
{FORMAT_PKM, " pkm", Test_PKM, Load_PKM, Save_PKM, 0, 1, 0, "pkm", "pkm"},
|
||||
{FORMAT_LBM, " lbm", Test_LBM, Load_LBM, Save_LBM, 0, 0, 0, "lbm", "lbm;iff;ilbm"},
|
||||
{FORMAT_LBM, " lbm", Test_LBM, Load_IFF, Save_IFF, 0, 0, 0, "iff", "iff;lbm;ilbm"},
|
||||
{FORMAT_PBM, " pbm", Test_PBM, Load_IFF, Save_IFF, 0, 0, 0, "iff", "iff;pbm"},
|
||||
{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_PI1, " pi1", Test_PI1, Load_PI1, Save_PI1, 0, 0, 0, "pi1", "pi1"},
|
||||
@ -556,36 +558,12 @@ void Pre_load(T_IO_Context *context, short width, short height, long file_size,
|
||||
// Gestion des lectures et écritures //
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
byte * Write_buffer;
|
||||
word Write_buffer_index;
|
||||
|
||||
void Init_write_buffer(void)
|
||||
{
|
||||
Write_buffer=(byte *)malloc(64000);
|
||||
Write_buffer_index=0;
|
||||
}
|
||||
|
||||
void Write_one_byte(FILE *file, byte b)
|
||||
{
|
||||
Write_buffer[Write_buffer_index++]=b;
|
||||
if (Write_buffer_index>=64000)
|
||||
{
|
||||
if (! Write_bytes(file,Write_buffer,64000))
|
||||
if (! Write_byte(file,b))
|
||||
File_error=1;
|
||||
Write_buffer_index=0;
|
||||
}
|
||||
}
|
||||
|
||||
void End_write(FILE *file)
|
||||
{
|
||||
if (Write_buffer_index)
|
||||
if (! Write_bytes(file,Write_buffer,Write_buffer_index))
|
||||
File_error=1;
|
||||
free(Write_buffer);
|
||||
Write_buffer = NULL;
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// -------- Modifier la valeur du code d'erreur d'accès à un fichier --------
|
||||
|
||||
@ -259,8 +259,6 @@ void Set_file_error(int value);
|
||||
/*
|
||||
void Init_preview(short width,short height,long size,int format,enum PIXEL_RATIO ratio);
|
||||
*/
|
||||
void Init_write_buffer(void);
|
||||
void Write_one_byte(FILE *file, byte b);
|
||||
void End_write(FILE *file);
|
||||
|
||||
#endif
|
||||
|
||||
@ -192,6 +192,9 @@ void Save_PAL(T_IO_Context * context)
|
||||
if ((file=fopen(filename,"w")))
|
||||
{
|
||||
int i;
|
||||
|
||||
setvbuf(file, NULL, _IOFBF, 64*1024);
|
||||
|
||||
if (fputs("JASC-PAL\n0100\n256\n", file)==EOF)
|
||||
File_error=1;
|
||||
for (i = 0; i < 256 && File_error==0; i++)
|
||||
@ -555,6 +558,8 @@ void Save_PKM(T_IO_Context * context)
|
||||
// Ouverture du fichier
|
||||
if ((file=fopen(filename,"wb")))
|
||||
{
|
||||
setvbuf(file, NULL, _IOFBF, 64*1024);
|
||||
|
||||
// Ecriture du header
|
||||
if (Write_bytes(file,&header.Ident,3) &&
|
||||
Write_byte(file,header.Method) &&
|
||||
@ -565,7 +570,6 @@ void Save_PKM(T_IO_Context * context)
|
||||
Write_bytes(file,&header.Palette,sizeof(T_Palette)) &&
|
||||
Write_word_le(file,header.Jump))
|
||||
{
|
||||
Init_write_buffer();
|
||||
|
||||
// Ecriture du commentaire
|
||||
// (Compteur_de_pixels est utilisé ici comme simple index de comptage)
|
||||
@ -655,8 +659,6 @@ void Save_PKM(T_IO_Context * context)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
End_write(file);
|
||||
}
|
||||
else
|
||||
File_error=1;
|
||||
@ -909,6 +911,8 @@ void Save_CEL(T_IO_Context * context)
|
||||
Get_full_filename(filename, context->File_name, context->File_directory);
|
||||
if ((file=fopen(filename,"wb")))
|
||||
{
|
||||
setvbuf(file, NULL, _IOFBF, 64*1024);
|
||||
|
||||
// On regarde si des couleurs >16 sont utilisées dans l'image
|
||||
for (x_pos=16;((x_pos<256) && (!color_usage[x_pos]));x_pos++);
|
||||
|
||||
@ -924,7 +928,6 @@ void Save_CEL(T_IO_Context * context)
|
||||
)
|
||||
{
|
||||
// Sauvegarde de l'image
|
||||
Init_write_buffer();
|
||||
for (y_pos=0;((y_pos<context->Height) && (!File_error));y_pos++)
|
||||
{
|
||||
for (x_pos=0;((x_pos<context->Width) && (!File_error));x_pos++)
|
||||
@ -939,7 +942,6 @@ void Save_CEL(T_IO_Context * context)
|
||||
if ((x_pos & 1)==1)
|
||||
Write_one_byte(file,last_byte);
|
||||
}
|
||||
End_write(file);
|
||||
}
|
||||
else
|
||||
File_error=1;
|
||||
@ -990,11 +992,9 @@ void Save_CEL(T_IO_Context * context)
|
||||
)
|
||||
{
|
||||
// Sauvegarde de l'image
|
||||
Init_write_buffer();
|
||||
for (y_pos=0;((y_pos<header2.Height) && (!File_error));y_pos++)
|
||||
for (x_pos=0;((x_pos<header2.Width) && (!File_error));x_pos++)
|
||||
Write_one_byte(file,Get_pixel(context, x_pos+header2.X_offset,y_pos+header2.Y_offset));
|
||||
End_write(file);
|
||||
}
|
||||
else
|
||||
File_error=1;
|
||||
@ -1226,6 +1226,7 @@ void Save_KCF(T_IO_Context * context)
|
||||
Get_full_filename(filename, context->File_name, context->File_directory);
|
||||
if ((file=fopen(filename,"wb")))
|
||||
{
|
||||
setvbuf(file, NULL, _IOFBF, 64*1024);
|
||||
// Sauvegarde de la palette
|
||||
|
||||
// On regarde si des couleurs >16 sont utilisées dans l'image
|
||||
@ -1545,6 +1546,8 @@ void Save_PI1(T_IO_Context * context)
|
||||
// Ouverture du fichier
|
||||
if ((file=fopen(filename,"wb")))
|
||||
{
|
||||
setvbuf(file, NULL, _IOFBF, 64*1024);
|
||||
|
||||
// allocation d'un buffer mémoire
|
||||
buffer=(byte *)malloc(32066);
|
||||
// Codage de la résolution
|
||||
@ -1882,6 +1885,8 @@ void Save_PC1(T_IO_Context * context)
|
||||
// Ouverture du fichier
|
||||
if ((file=fopen(filename,"wb")))
|
||||
{
|
||||
setvbuf(file, NULL, _IOFBF, 64*1024);
|
||||
|
||||
// Allocation des buffers mémoire
|
||||
bufferdecomp=(byte *)malloc(32000);
|
||||
buffercomp =(byte *)malloc(64066);
|
||||
@ -2055,6 +2060,8 @@ void Save_NEO(T_IO_Context * context)
|
||||
// Ouverture du fichier
|
||||
if ((file=fopen(filename,"wb")))
|
||||
{
|
||||
setvbuf(file, NULL, _IOFBF, 64*1024);
|
||||
|
||||
// allocation d'un buffer mémoire
|
||||
buffer=(byte *)malloc(32128);
|
||||
// Codage de la résolution
|
||||
@ -2656,6 +2663,8 @@ int Save_C64_hires(T_IO_Context *context, char *filename, byte saveWhat, byte lo
|
||||
return 1;
|
||||
}
|
||||
|
||||
setvbuf(file, NULL, _IOFBF, 64*1024);
|
||||
|
||||
if (loadAddr)
|
||||
{
|
||||
Write_byte(file,0);
|
||||
@ -2766,7 +2775,9 @@ int Save_C64_multi(T_IO_Context *context, char *filename, byte saveWhat, byte lo
|
||||
File_error = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
setvbuf(file, NULL, _IOFBF, 64*1024);
|
||||
|
||||
if (loadAddr)
|
||||
{
|
||||
Write_byte(file,0);
|
||||
@ -2812,7 +2823,9 @@ int Save_C64_fli(char *filename, byte saveWhat, byte loadAddr)
|
||||
File_error = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
setvbuf(file, NULL, _IOFBF, 64*1024);
|
||||
|
||||
if (loadAddr)
|
||||
{
|
||||
file_buffer[0]=0;
|
||||
@ -2962,7 +2975,7 @@ void Save_SCR(T_IO_Context * context)
|
||||
fclose(file);
|
||||
|
||||
free (output);
|
||||
output = NULL;
|
||||
output = NULL;
|
||||
|
||||
File_error = 0;
|
||||
}
|
||||
@ -3172,7 +3185,8 @@ void Save_CM5(T_IO_Context* context)
|
||||
File_error = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
setvbuf(file, NULL, _IOFBF, 64*1024);
|
||||
|
||||
// Write layer 0
|
||||
Set_saving_layer(context, 0);
|
||||
Write_byte(file, Get_pixel(context, 0, 0));
|
||||
@ -3199,7 +3213,8 @@ void Save_CM5(T_IO_Context* context)
|
||||
File_error = 2;
|
||||
return;
|
||||
}
|
||||
|
||||
setvbuf(file, NULL, _IOFBF, 64*1024);
|
||||
|
||||
Set_saving_layer(context, 4);
|
||||
|
||||
for (ty = 0; ty < 256; ty++)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user