From b07ab82b2077c6f04f6a0524285a047ef22db585 Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Sat, 23 Jan 2010 20:51:32 +0000 Subject: [PATCH] Fix missing preview of palette formats. Fixed JASC PAL saving that didn't close file (!), so saving more than once would make empty file. Fixed loading palette formats that didn't have any effect. git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1280 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- loadsave.c | 72 +++++++++++++--------- miscfileformats.c | 150 ++++++++++++++++++++-------------------------- 2 files changed, 109 insertions(+), 113 deletions(-) diff --git a/loadsave.c b/loadsave.c index 064b45b2..35dc1ae1 100644 --- a/loadsave.c +++ b/loadsave.c @@ -285,6 +285,18 @@ void Palette_loaded(T_IO_Context *context) } */ Remap_screen_after_menu_colors_change(); + + // Preview palette + if (Get_fileformat(context->Format)->Palette_only) + { + short index; + + if (context->Type == CONTEXT_PREVIEW) + for (index=0; index<256; index++) + Window_rectangle(183+(index/16)*7,95+(index&15)*5,5,5,index); + + Update_window_area(183,95,120,80); + } break; case CONTEXT_MAIN_IMAGE: @@ -621,6 +633,7 @@ void Load_image(T_IO_Context *context) if (File_error) { + context->Format = DEFAULT_FILEFORMAT; // Last try: with SDL_image Load_SDL_Image(context); @@ -637,6 +650,7 @@ void Load_image(T_IO_Context *context) else // Si on a su déterminer avec succès le format du fichier: { + context->Format = format->Identifier; // On peut charger le fichier: // Dans certains cas il est possible que le chargement plante // après avoir modifié la palette. TODO @@ -698,42 +712,42 @@ void Load_image(T_IO_Context *context) if (context->Type == CONTEXT_MAIN_IMAGE) { - if ( (File_error!=1) && (!format->Palette_only) ) + if ( File_error!=1) { - /* Shouldn't happen ??? - if (Pixel_load_function==Pixel_load_in_preview) + if (format->Palette_only) { - dword color_usage[256]; - Count_used_colors_screen_area(color_usage,context->Preview_pos_X,context->Preview_pos_Y,context->Width/context->Preview_factor_X,context->Height/context->Preview_factor_Y); - //Count_used_colors(color_usage); - Display_cursor(); - Set_nice_menu_colors(color_usage,1); - Hide_cursor(); + // Make a backup step + Backup_layers(0); } - */ - strcpy(Main_backups->Pages->Filename,context->File_name); - strcpy(Main_backups->Pages->File_directory,context->File_directory); - - // On considère que l'image chargée n'est plus modifiée - Main_image_is_modified=0; - // Et on documente la variable Main_fileformat avec la valeur: - Main_fileformat=format->Identifier; - - // already done initially on Backup_with_new_dimensions - //Main_image_width= context->Width; - //Main_image_height= context->Height; + // Copy the loaded palette memcpy(Main_palette, context->Palette, sizeof(T_Palette)); memcpy(Main_backups->Pages->Palette, context->Palette, sizeof(T_Palette)); - - Main_current_layer = context->Nb_layers - 1; - Main_layers_visible = (2<Palette_only) + { + strcpy(Main_backups->Pages->Filename,context->File_name); + strcpy(Main_backups->Pages->File_directory,context->File_directory); + // On considère que l'image chargée n'est plus modifiée + Main_image_is_modified=0; + // Et on documente la variable Main_fileformat avec la valeur: + Main_fileformat=format->Identifier; + + // already done initially on Backup_with_new_dimensions + //Main_image_width= context->Width; + //Main_image_height= context->Height; + + Main_current_layer = context->Nb_layers - 1; + Main_layers_visible = (2<Type == CONTEXT_PREVIEW) - for (index=0; index<256; index++) - Window_rectangle(183+(index/16)*7,95+(index&15)*5,5,5,index); - - Update_window_area(183,95,120,80); -} - - // -- Tester si un fichier est au format PAL -------------------------------- void Test_PAL(T_IO_Context * context) @@ -71,14 +59,14 @@ void Test_PAL(T_IO_Context * context) // Le fichier ne peut être au format PAL que si sa taille vaut 768 octets if (file_size == sizeof(T_Palette)) File_error = 0; - else { - // Sinon c'est peut être un fichier palette ASCII "Jasc" - fread(filename, 1, 8, file); - if (strncmp(filename,"JASC-PAL",8) == 0) - { - File_error = 0; - } - } + else { + // Sinon c'est peut être un fichier palette ASCII "Jasc" + fread(filename, 1, 8, file); + if (strncmp(filename,"JASC-PAL",8) == 0) + { + File_error = 0; + } + } fclose(file); } } @@ -101,52 +89,45 @@ void Load_PAL(T_IO_Context * context) long file_size = File_length_file(file); // Le fichier ne peut être au format PAL que si sa taille vaut 768 octets if (file_size == sizeof(T_Palette)) - { - T_Palette palette_64; - // Pre_load(context, ?); // Pas possible... pas d'image... - - // Lecture du fichier dans context->Palette - if (Read_bytes(file, palette_64, sizeof(T_Palette))) - { - Palette_64_to_256(palette_64); - memcpy(context->Palette, palette_64, sizeof(T_Palette)); - Palette_loaded(context); - - // On dessine une preview de la palette (si chargement = preview) - Draw_palette_preview(context); - } - else - File_error = 2; - } else { - fread(filename, 1, 8, file); - if (strncmp(filename,"JASC-PAL",8) == 0) - { - int i, n, r, g, b; - fscanf(file, "%d",&n); - if(n != 100) - { - File_error = 2; - fclose(file); - return; - } - // Read color count - fscanf(file, "%d",&n); - for (i = 0; i < n; i++) - { - fscanf(file, "%d %d %d",&r, &g, &b); - context->Palette[i].R = r; - context->Palette[i].G = g; - context->Palette[i].B = b; - - Palette_loaded(context); - - // On dessine une preview de la palette (si chargement = preview) - Draw_palette_preview(context); - } - } else File_error = 2; - - } + { + T_Palette palette_64; + // Pre_load(context, ?); // Pas possible... pas d'image... + // Lecture du fichier dans context->Palette + if (Read_bytes(file, palette_64, sizeof(T_Palette))) + { + Palette_64_to_256(palette_64); + memcpy(context->Palette, palette_64, sizeof(T_Palette)); + Palette_loaded(context); + } + else + File_error = 2; + } else { + fread(filename, 1, 8, file); + if (strncmp(filename,"JASC-PAL",8) == 0) + { + int i, n, r, g, b; + fscanf(file, "%d",&n); + if(n != 100) + { + File_error = 2; + fclose(file); + return; + } + // Read color count + fscanf(file, "%d",&n); + for (i = 0; i < n; i++) + { + fscanf(file, "%d %d %d",&r, &g, &b); + context->Palette[i].R = r; + context->Palette[i].G = g; + context->Palette[i].B = b; + } + Palette_loaded(context); + } else File_error = 2; + + } + // Fermeture du fichier fclose(file); } @@ -159,31 +140,34 @@ void Load_PAL(T_IO_Context * context) // -- Sauver un fichier au format PAL --------------------------------------- void Save_PAL(T_IO_Context * context) { - FILE *file; // Fichier du fichier - char filename[MAX_PATH_CHARACTERS]; // Nom complet du fichier - //long file_size; // Taille du fichier + FILE *file; + char filename[MAX_PATH_CHARACTERS]; ///< full filename Get_full_filename(filename, context->File_name, context->File_directory); File_error=0; - // Ouverture du fichier + // Open output file if ((file=fopen(filename,"w"))) { - int i; - fputs("JASC-PAL\n0100\n256\n", file); - for (i = 0; i < 256; i++) - fprintf(file,"%d %d %d\n",context->Palette[i].R, context->Palette[i].G, context->Palette[i].B); - } - else // Si on n'a pas réussi à ouvrir le fichier, alors il y a eu une erreur - { - File_error=1; + int i; + if (fputs("JASC-PAL\n0100\n256\n", file)==EOF) + File_error=1; + 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) + File_error=1; + } + fclose(file); - remove(filename); - // On se fout du résultat de l'opération car si ça - // renvoie 0 c'est que le fichier avait été partiel- - // -lement écrit, sinon pas du tout. Or dans tous les - // cas ça revient au même pour nous: Sauvegarde ratée! + + if (File_error) + remove(filename); + } + else + { + // unable to open output file, nothing saved. + File_error=1; } } @@ -1171,8 +1155,6 @@ void Load_KCF(T_IO_Context * context) } else File_error=1; - - if (!File_error) Draw_palette_preview(context); }