Use Open_file_write() in Save_GPL() Save_PAL() and Save_XPM()

They are Text format, correctly handle line endings
according to the type
This commit is contained in:
Thomas Bernard 2018-02-20 13:11:05 +01:00
parent d1426c61c5
commit 3d4f39fe36
2 changed files with 36 additions and 41 deletions

View File

@ -5124,20 +5124,21 @@ void Save_SCx(T_IO_Context * context)
//////////////////////////////////// XPM //////////////////////////////////// //////////////////////////////////// XPM ////////////////////////////////////
void Save_XPM(T_IO_Context* context) void Save_XPM(T_IO_Context* context)
{ {
// XPM are unix files, so use LF '\n' line endings
FILE* file; FILE* file;
char filename[MAX_PATH_CHARACTERS];
int i,j; int i,j;
Get_full_filename(filename, context->File_name, context->File_directory);
File_error = 0; File_error = 0;
file = fopen(filename, "w"); file = Open_file_write(context);
if (file == NULL) if (file == NULL)
{ {
File_error = 1; File_error = 1;
return; return;
} }
setvbuf(file, NULL, _IOFBF, 64*1024); setvbuf(file, NULL, _IOFBF, 64*1024);
// in case there are less colors than 256, we could
// optimize, and use only 1 character per pixel if possible
fprintf(file, "/* XPM */\nstatic char* pixmap[] = {\n"); fprintf(file, "/* XPM */\nstatic char* pixmap[] = {\n");
fprintf(file, "\"%d %d 256 2\",\n", context->Width, context->Height); fprintf(file, "\"%d %d 256 2\",\n", context->Width, context->Height);

View File

@ -212,15 +212,13 @@ void Load_GPL(T_IO_Context * context)
void void
Save_GPL (T_IO_Context * context) Save_GPL (T_IO_Context * context)
{ {
// Gimp is a unix program, so use Unix file endings (LF aka '\n')
FILE *file; FILE *file;
char filename[MAX_PATH_CHARACTERS]; // full filename
Get_full_filename(filename, context->File_name, context->File_directory);
File_error=0; File_error=0;
// Open output file // Open output file
if ((file=fopen(filename,"w"))){ if ((file=Open_file_write(context)) != NULL ){
int i; int i;
fprintf (file, "GIMP Palette\n"); fprintf (file, "GIMP Palette\n");
fprintf (file, "Name: %s\n", context->File_name); fprintf (file, "Name: %s\n", context->File_name);
@ -251,9 +249,6 @@ Save_GPL (T_IO_Context * context)
void Load_PAL(T_IO_Context * context) void Load_PAL(T_IO_Context * context)
{ {
FILE *file; // Fichier du fichier FILE *file; // Fichier du fichier
char filename[MAX_PATH_CHARACTERS]; // Nom complet du fichier
//long file_size; // Taille du fichier
File_error=0; File_error=0;
@ -276,8 +271,10 @@ void Load_PAL(T_IO_Context * context)
else else
File_error = 2; File_error = 2;
} else { } else {
fread(filename, 1, 8, file); char buffer[16];
if (strncmp(filename,"JASC-PAL",8) == 0) fread(buffer, 1, 8, file);
buffer[8] = '\0';
if (strncmp(buffer,"JASC-PAL",8) == 0)
{ {
int i, n, r, g, b; int i, n, r, g, b;
fscanf(file, "%d",&n); fscanf(file, "%d",&n);
@ -296,33 +293,32 @@ void Load_PAL(T_IO_Context * context)
context->Palette[i].G = g; context->Palette[i].G = g;
context->Palette[i].B = b; context->Palette[i].B = b;
} }
} else if(strncmp(filename, "RIFF", 4) == 0) { }
// Microsoft RIFF format. else if(strncmp(buffer, "RIFF", 4) == 0)
fseek(file, 8, SEEK_SET); {
fread(filename, 1, 8, file); // Microsoft RIFF format.
if (strncmp(filename, "PAL data", 8) == 0) fseek(file, 8, SEEK_SET);
{ fread(buffer, 1, 8, file);
char buffer[4]; if (strncmp(buffer, "PAL data", 8) == 0)
word color_count; {
word i = 0; word color_count;
word i = 0;
fseek(file, 22, SEEK_SET); fseek(file, 22, SEEK_SET);
Read_word_le(file, &color_count); Read_word_le(file, &color_count);
for(i = 0; i < color_count; i++) for(i = 0; i < color_count; i++)
{ {
Read_bytes(file, buffer, 4); Read_bytes(file, buffer, 4);
context->Palette[i].R = buffer[0]; context->Palette[i].R = buffer[0];
context->Palette[i].G = buffer[1]; context->Palette[i].G = buffer[1];
context->Palette[i].B = buffer[2]; context->Palette[i].B = buffer[2];
} }
} else File_error = 2; } else File_error = 2;
} else } else
File_error = 2; File_error = 2;
} }
// Fermeture du fichier
fclose(file); fclose(file);
} }
else else
@ -334,25 +330,23 @@ void Load_PAL(T_IO_Context * context)
// -- Sauver un fichier au format PAL --------------------------------------- // -- Sauver un fichier au format PAL ---------------------------------------
void Save_PAL(T_IO_Context * context) void Save_PAL(T_IO_Context * context)
{ {
// JASC-PAL is a DOS/Windows format, so use CRLF line endings "\r\n"
FILE *file; FILE *file;
char filename[MAX_PATH_CHARACTERS]; ///< full filename
Get_full_filename(filename, context->File_name, context->File_directory);
File_error=0; File_error=0;
// Open output file // Open output file
if ((file=fopen(filename,"w"))) if ((file=Open_file_write(context)) != NULL)
{ {
int i; int i;
setvbuf(file, NULL, _IOFBF, 64*1024); setvbuf(file, NULL, _IOFBF, 64*1024);
if (fputs("JASC-PAL\n0100\n256\n", file)==EOF) if (fputs("JASC-PAL\r\n0100\r\n256\r\n", file)==EOF)
File_error=1; File_error=1;
for (i = 0; i < 256 && File_error==0; i++) for (i = 0; i < 256 && File_error==0; i++)
{ {
if (fprintf(file,"%d %d %d\n",context->Palette[i].R, context->Palette[i].G, context->Palette[i].B) <= 0) if (fprintf(file,"%d %d %d\r\n",context->Palette[i].R, context->Palette[i].G, context->Palette[i].B) <= 0)
File_error=1; File_error=1;
} }