From c474208860ac40ff79881accbfc2dbc4f715543e Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Sun, 15 Aug 2010 14:47:37 +0000 Subject: [PATCH] Color cycling: saved in ILBM format. git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1574 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- src/fileformats.c | 22 +++++++++++++++++----- src/loadsave.c | 17 +++++++++++++++++ 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/fileformats.c b/src/fileformats.c index 06e95e5f..e8dee8e6 100644 --- a/src/fileformats.c +++ b/src/fileformats.c @@ -630,7 +630,7 @@ void Load_LBM(T_IO_Context * context) if (nb_colors&1) if (Read_byte(LBM_file,&temp_byte)) File_error=2; - + // Keep reading sections until we find the body while (1) { @@ -653,7 +653,6 @@ void Load_LBM(T_IO_Context * context) byte min_col; byte max_col; // - if ( (Read_dword_be(LBM_file,§ion_size)) && (Read_word_be(LBM_file,&padding)) && (Read_word_be(LBM_file,&rate)) @@ -963,6 +962,7 @@ void Save_LBM(T_IO_Context * context) byte temp_byte; word real_width; int file_size; + int i; File_error=0; Get_full_filename(filename, context->File_name, context->File_directory); @@ -1012,7 +1012,19 @@ void Save_LBM(T_IO_Context * context) Write_dword_be(LBM_file,sizeof(T_Palette)); Write_bytes(LBM_file,context->Palette,sizeof(T_Palette)); - + + for (i=0; iColor_cycles; i++) + { + Write_bytes(LBM_file,"CRNG",4); + Write_dword_be(LBM_file,8); // Section size + Write_word_be(LBM_file,0); // Padding + Write_word_be(LBM_file,context->Cycle_range[i].Speed*78); // Rate + Write_word_be(LBM_file,1|(context->Cycle_range[i].Inverse?2:0)); // Flags + Write_byte(LBM_file,context->Cycle_range[i].Start); // Min color + Write_byte(LBM_file,context->Cycle_range[i].End); // Max color + // No padding, size is multiple of 2 + } + Write_bytes(LBM_file,"BODY",4); Write_dword_be(LBM_file,0); // On mettra la taille à jour à la fin @@ -1037,8 +1049,8 @@ void Save_LBM(T_IO_Context * context) file_size=File_length(filename); LBM_file=fopen(filename,"rb+"); - fseek(LBM_file,820,SEEK_SET); - Write_dword_be(LBM_file,file_size-824); + fseek(LBM_file,820+context->Color_cycles*16,SEEK_SET); + Write_dword_be(LBM_file,file_size-824-context->Color_cycles*16); if (!File_error) { diff --git a/src/loadsave.c b/src/loadsave.c index e972c9e0..438dbe72 100644 --- a/src/loadsave.c +++ b/src/loadsave.c @@ -607,6 +607,9 @@ void Load_image(T_IO_Context *context) unsigned int index; // index de balayage des formats T_Format *format = &(File_formats[2]); // Format du fichier à charger int i; + + // Not sure it's the best place... + context->Color_cycles=0; // On place par défaut File_error à vrai au cas où on ne sache pas // charger le format du fichier: @@ -1082,6 +1085,8 @@ void Init_context_backup_image(T_IO_Context * context, char *file_name, char *fi /// Setup for loading/saving the current main image void Init_context_layered_image(T_IO_Context * context, char *file_name, char *file_directory) { + int i; + memset(context, 0, sizeof(T_IO_Context)); context->Type = CONTEXT_MAIN_IMAGE; @@ -1104,6 +1109,18 @@ void Init_context_layered_image(T_IO_Context * context, char *file_name, char *f context->Target_address=Main_backups->Pages->Image[0]; context->Pitch=Main_image_width; + // Color cyling ranges: + for (i=0; i<16; i++) + { + if (Gradient_array[i].Start!=Gradient_array[i].End && Gradient_array[i].Speed) + { + context->Cycle_range[context->Color_cycles].Start=Gradient_array[i].Start; + context->Cycle_range[context->Color_cycles].End=Gradient_array[i].End; + context->Cycle_range[context->Color_cycles].Inverse=Gradient_array[i].Inverse; + context->Cycle_range[context->Color_cycles].Speed=Gradient_array[i].Speed; + context->Color_cycles++; + } + } } /// Setup for loading/saving the flattened version of current main image