Fix issue 516: Some changes can't be undone on animations > 32 frames

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@2033 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Yves Rizoud 2012-10-16 00:07:42 +00:00
parent 20ed591264
commit e87f9140c7
10 changed files with 59 additions and 49 deletions

View File

@ -1705,7 +1705,7 @@ void Copy_some_colors(void)
if (confirmation) if (confirmation)
{ {
// Make a backup with the same pixel data as previous history steps // Make a backup with the same pixel data as previous history steps
Backup_the_spare(0); Backup_the_spare(LAYER_NONE);
for (index=0; index<256; index++) for (index=0; index<256; index++)
{ {
if (mask_color_to_copy[index]) if (mask_color_to_copy[index])
@ -1749,7 +1749,7 @@ void Button_Copy_page(void)
switch (clicked_button) switch (clicked_button)
{ {
case 1: // Pixels+palette case 1: // Pixels+palette
Backup_the_spare(-1); // backup is done by the following function
Copy_image_only(); Copy_image_only();
// copie de la palette // copie de la palette
memcpy(Spare_palette,Main_palette,sizeof(T_Palette)); memcpy(Spare_palette,Main_palette,sizeof(T_Palette));
@ -1762,7 +1762,7 @@ void Button_Copy_page(void)
break; break;
case 2: // Pixels only case 2: // Pixels only
Backup_the_spare(-1); // backup is done by the following function
Copy_image_only(); Copy_image_only();
// Equivalent of 'end_of_modifications' for spare. // Equivalent of 'end_of_modifications' for spare.
Update_spare_buffers(Spare_image_width,Spare_image_height); Update_spare_buffers(Spare_image_width,Spare_image_height);
@ -1773,7 +1773,7 @@ void Button_Copy_page(void)
break; break;
case 3: // Palette only case 3: // Palette only
Backup_the_spare(0); Backup_the_spare(LAYER_NONE);
// Copy palette // Copy palette
memcpy(Spare_palette,Main_palette,sizeof(T_Palette)); memcpy(Spare_palette,Main_palette,sizeof(T_Palette));
// Equivalent of 'end_of_modifications' for spare. // Equivalent of 'end_of_modifications' for spare.
@ -1788,7 +1788,7 @@ void Button_Copy_page(void)
break; break;
case 5: // Palette and remap case 5: // Palette and remap
Backup_the_spare(-1); Backup_the_spare(LAYER_ALL);
Remap_spare(); Remap_spare();
// Copy palette // Copy palette
memcpy(Spare_palette,Main_palette,sizeof(T_Palette)); memcpy(Spare_palette,Main_palette,sizeof(T_Palette));

View File

@ -1808,7 +1808,7 @@ void Run_script(const char *script_subdirectory, const char *script_filename)
// The backup also allows the script to read from it to make something // The backup also allows the script to read from it to make something
// like a feedback off effect (convolution matrix comes to mind). // like a feedback off effect (convolution matrix comes to mind).
Backup(); Backup();
Backup_the_spare(-1); Backup_the_spare(LAYER_ALL);
Palette_has_changed=0; Palette_has_changed=0;
Brush_was_altered=0; Brush_was_altered=0;

View File

@ -719,7 +719,7 @@ void Get_colors_from_brush(void)
//if (Confirmation_box("Modify current palette ?")) //if (Confirmation_box("Modify current palette ?"))
// Backup with unchanged layers, only palette is modified // Backup with unchanged layers, only palette is modified
Backup_layers(0); Backup_layers(LAYER_NONE);
// Init array of new colors // Init array of new colors
for (color=0;color<=255;color++) for (color=0;color<=255;color++)

View File

@ -107,7 +107,7 @@ void Button_Layer_add(void)
if (Main_backups->Pages->Nb_layers < max[Main_backups->Pages->Image_mode]) if (Main_backups->Pages->Nb_layers < max[Main_backups->Pages->Image_mode])
{ {
// Backup with unchanged layers // Backup with unchanged layers
Backup_layers(0); Backup_layers(LAYER_NONE);
if (!Add_layer(Main_backups,Main_current_layer+1)) if (!Add_layer(Main_backups,Main_current_layer+1))
{ {
if (Main_backups->Pages->Image_mode == IMAGE_MODE_ANIMATION) if (Main_backups->Pages->Image_mode == IMAGE_MODE_ANIMATION)
@ -142,7 +142,7 @@ void Button_Layer_remove(void)
if (Main_backups->Pages->Nb_layers > 1) if (Main_backups->Pages->Nb_layers > 1)
{ {
// Backup with unchanged layers // Backup with unchanged layers
Backup_layers(0); Backup_layers(LAYER_NONE);
if (!Delete_layer(Main_backups,Main_current_layer)) if (!Delete_layer(Main_backups,Main_current_layer))
{ {
Update_screen_targets(); Update_screen_targets();
@ -278,7 +278,7 @@ void Button_Layer_menu(void)
if (Main_backups->Pages->Transparent_color != transparent_color || if (Main_backups->Pages->Transparent_color != transparent_color ||
Main_backups->Pages->Background_transparent != transparent_background) Main_backups->Pages->Background_transparent != transparent_background)
{ {
Backup_layers(-1); Backup_layers(LAYER_NONE);
Main_backups->Pages->Transparent_color = transparent_color; Main_backups->Pages->Transparent_color = transparent_color;
Main_backups->Pages->Background_transparent = transparent_background; Main_backups->Pages->Background_transparent = transparent_background;
Redraw_layered_image(); Redraw_layered_image();
@ -297,7 +297,7 @@ void Button_Layer_set_transparent(void)
if (Main_backups->Pages->Transparent_color != Back_color) if (Main_backups->Pages->Transparent_color != Back_color)
{ {
Backup_layers(-1); Backup_layers(LAYER_ALL);
Main_backups->Pages->Transparent_color = Back_color; Main_backups->Pages->Transparent_color = Back_color;
Redraw_layered_image(); Redraw_layered_image();
@ -329,7 +329,7 @@ void Button_Layer_merge(void)
if (Main_current_layer>0) if (Main_current_layer>0)
{ {
// Backup layer below the current // Backup layer below the current
Backup_layers(1<<(Main_current_layer-1)); Backup_layers(Main_current_layer-1);
Merge_layer(); Merge_layer();
@ -354,7 +354,7 @@ void Button_Layer_up(void)
dword layer_flags; dword layer_flags;
// Backup with unchanged layers // Backup with unchanged layers
Backup_layers(0); Backup_layers(LAYER_NONE);
// swap // swap
tmp = Main_backups->Pages->Image[Main_current_layer]; tmp = Main_backups->Pages->Image[Main_current_layer];
@ -394,7 +394,7 @@ void Button_Layer_down(void)
dword layer_flags; dword layer_flags;
// Backup with unchanged layers // Backup with unchanged layers
Backup_layers(0); Backup_layers(LAYER_NONE);
// swap // swap
tmp = Main_backups->Pages->Image[Main_current_layer]; tmp = Main_backups->Pages->Image[Main_current_layer];
@ -513,7 +513,7 @@ void Button_Anim_time(void)
if (clicked_button==5) if (clicked_button==5)
{ {
// Accept changes // Accept changes
Backup_layers(0); Backup_layers(LAYER_NONE);
switch(mode) switch(mode)
{ {
case 0: case 0:

View File

@ -758,7 +758,7 @@ void Load_image(T_IO_Context *context)
if (format->Palette_only) if (format->Palette_only)
{ {
// Make a backup step // Make a backup step
Backup_layers(0); Backup_layers(LAYER_NONE);
} }
// Copy the loaded palette // Copy the loaded palette
memcpy(Main_palette, context->Palette, sizeof(T_Palette)); memcpy(Main_palette, context->Palette, sizeof(T_Palette));

View File

@ -363,7 +363,7 @@ byte C64_FLI_enforcer(void)
if (Main_backups->Pages->Nb_layers != 4) if (Main_backups->Pages->Nb_layers != 4)
return 2; return 2;
Backup_layers(1<<3); Backup_layers(3);
memset(bitmap,0,8000); memset(bitmap,0,8000);
memset(background,0,200); memset(background,0,200);

View File

@ -2784,7 +2784,7 @@ void Scroll_12_0(void)
Backup(); Backup();
else else
{ {
Backup_layers(-1); // Main_layers_visible Backup_layers(LAYER_ALL); // Main_layers_visible
if (Main_backups->Pages->Image_mode != IMAGE_MODE_ANIMATION) if (Main_backups->Pages->Image_mode != IMAGE_MODE_ANIMATION)
{ {
// Ensure the backup visible image is up-to-date // Ensure the backup visible image is up-to-date

View File

@ -609,8 +609,9 @@ void Free_last_page_of_list(T_List_of_pages * list)
} }
} }
// layer_mask tells which layers have to be fresh copies instead of references // layer tells which layers have to be fresh copies instead of references :
int Create_new_page(T_Page * new_page, T_List_of_pages * list, dword layer_mask) // it's a layer number (>=0) or LAYER_NONE or LAYER_ALL
int Create_new_page(T_Page * new_page, T_List_of_pages * list, int layer)
{ {
// This function fills the "Image" field of a new Page, // This function fills the "Image" field of a new Page,
@ -632,7 +633,7 @@ int Create_new_page(T_Page * new_page, T_List_of_pages * list, dword layer_mask)
int i; int i;
for (i=0; i<new_page->Nb_layers; i++) for (i=0; i<new_page->Nb_layers; i++)
{ {
if ((1<<i) & layer_mask) if (layer == LAYER_ALL || i == layer)
new_page->Image[i].Pixels=New_layer(new_page->Height*new_page->Width); new_page->Image[i].Pixels=New_layer(new_page->Height*new_page->Width);
else else
new_page->Image[i].Pixels=Dup_layer(list->Pages->Image[i].Pixels); new_page->Image[i].Pixels=Dup_layer(list->Pages->Image[i].Pixels);
@ -879,7 +880,7 @@ int Backup_new_image(int layers,int width,int height)
new_page->Height=height; new_page->Height=height;
new_page->Transparent_color=0; new_page->Transparent_color=0;
new_page->Gradients=Dup_gradient(NULL); new_page->Gradients=Dup_gradient(NULL);
if (!Create_new_page(new_page,Main_backups,0xFFFFFFFF)) if (!Create_new_page(new_page,Main_backups,LAYER_ALL))
{ {
Error(0); Error(0);
return 0; return 0;
@ -912,7 +913,7 @@ int Backup_with_new_dimensions(int width,int height)
new_page->Width=width; new_page->Width=width;
new_page->Height=height; new_page->Height=height;
new_page->Transparent_color=0; new_page->Transparent_color=0;
if (!Create_new_page(new_page,Main_backups,0xFFFFFFFF)) if (!Create_new_page(new_page,Main_backups,LAYER_ALL))
{ {
Error(0); Error(0);
return 0; return 0;
@ -1062,7 +1063,7 @@ int Backup_and_resize_the_spare(int width,int height)
new_page->Width=width; new_page->Width=width;
new_page->Height=height; new_page->Height=height;
if (Create_new_page(new_page,Spare_backups,0xFFFFFFFF)) if (Create_new_page(new_page,Spare_backups,LAYER_ALL))
{ {
byte i; byte i;
@ -1087,10 +1088,10 @@ void Backup(void)
// Sauve la page courante comme première page de backup et crée une nouvelle page // Sauve la page courante comme première page de backup et crée une nouvelle page
// pur continuer à dessiner. Utilisé par exemple pour le fill // pur continuer à dessiner. Utilisé par exemple pour le fill
{ {
Backup_layers(1<<Main_current_layer); Backup_layers(Main_current_layer);
} }
void Backup_layers(dword layer_mask) void Backup_layers(int layer)
{ {
int i; int i;
T_Page *new_page; T_Page *new_page;
@ -1115,19 +1116,22 @@ void Backup_layers(dword layer_mask)
// Fill it with a copy of the latest history // Fill it with a copy of the latest history
Copy_S_page(new_page,Main_backups->Pages); Copy_S_page(new_page,Main_backups->Pages);
new_page->Gradients=Dup_gradient(Main_backups->Pages); new_page->Gradients=Dup_gradient(Main_backups->Pages);
Create_new_page(new_page,Main_backups,layer_mask); Create_new_page(new_page,Main_backups,layer);
Download_infos_page_main(new_page); Download_infos_page_main(new_page);
Update_FX_feedback(Config.FX_Feedback); Update_FX_feedback(Config.FX_Feedback);
// Copy the actual pixels from the backup to the latest page // Copy the actual pixels from the backup to the latest page
if (layer != LAYER_NONE)
{
for (i=0; i<Main_backups->Pages->Nb_layers;i++) for (i=0; i<Main_backups->Pages->Nb_layers;i++)
{ {
if ((1<<i) & layer_mask) if (layer == LAYER_ALL || i == layer)
memcpy(Main_backups->Pages->Image[i].Pixels, memcpy(Main_backups->Pages->Image[i].Pixels,
Main_backups->Pages->Next->Image[i].Pixels, Main_backups->Pages->Next->Image[i].Pixels,
Main_image_width*Main_image_height); Main_image_width*Main_image_height);
} }
}
// Light up the 'has unsaved changes' indicator // Light up the 'has unsaved changes' indicator
Main_image_is_modified=1; Main_image_is_modified=1;
@ -1136,7 +1140,7 @@ void Backup_layers(dword layer_mask)
*/ */
} }
void Backup_the_spare(dword layer_mask) void Backup_the_spare(int layer)
{ {
int i; int i;
T_Page *new_page; T_Page *new_page;
@ -1152,16 +1156,19 @@ void Backup_the_spare(dword layer_mask)
// Fill it with a copy of the latest history // Fill it with a copy of the latest history
Copy_S_page(new_page,Spare_backups->Pages); Copy_S_page(new_page,Spare_backups->Pages);
new_page->Gradients=Dup_gradient(Spare_backups->Pages); new_page->Gradients=Dup_gradient(Spare_backups->Pages);
Create_new_page(new_page,Spare_backups,layer_mask); Create_new_page(new_page,Spare_backups,layer);
// Copy the actual pixels from the backup to the latest page // Copy the actual pixels from the backup to the latest page
if (layer != LAYER_NONE)
{
for (i=0; i<Spare_backups->Pages->Nb_layers;i++) for (i=0; i<Spare_backups->Pages->Nb_layers;i++)
{ {
if ((1<<i) & layer_mask) if (layer == LAYER_ALL || i == layer)
memcpy(Spare_backups->Pages->Image[i].Pixels, memcpy(Spare_backups->Pages->Image[i].Pixels,
Spare_backups->Pages->Next->Image[i].Pixels, Spare_backups->Pages->Next->Image[i].Pixels,
Spare_image_width*Spare_image_height); Spare_image_width*Spare_image_height);
} }
}
// Light up the 'has unsaved changes' indicator // Light up the 'has unsaved changes' indicator
Spare_image_is_modified=1; Spare_image_is_modified=1;

View File

@ -81,7 +81,7 @@ int Allocate_list_of_pages(T_List_of_pages * list);
void Backward_in_list_of_pages(T_List_of_pages * list); void Backward_in_list_of_pages(T_List_of_pages * list);
void Advance_in_list_of_pages(T_List_of_pages * list); void Advance_in_list_of_pages(T_List_of_pages * list);
void Free_last_page_of_list(T_List_of_pages * list); void Free_last_page_of_list(T_List_of_pages * list);
int Create_new_page(T_Page * new_page,T_List_of_pages * current_list, dword layer_mask); int Create_new_page(T_Page * new_page,T_List_of_pages * current_list, int layer);
void Change_page_number_of_list(T_List_of_pages * list,int number); void Change_page_number_of_list(T_List_of_pages * list,int number);
void Free_page_of_a_list(T_List_of_pages * list); void Free_page_of_a_list(T_List_of_pages * list);
@ -91,6 +91,9 @@ void Free_page_of_a_list(T_List_of_pages * list);
/// BACKUP HIGH-LEVEL FUNCTIONS /// BACKUP HIGH-LEVEL FUNCTIONS
/// ///
static const int LAYER_NONE = -1;
static const int LAYER_ALL = -2;
int Init_all_backup_lists(enum IMAGE_MODES image_mode,int width,int height); int Init_all_backup_lists(enum IMAGE_MODES image_mode,int width,int height);
void Set_number_of_backups(int nb_backups); void Set_number_of_backups(int nb_backups);
int Backup_new_image(int layers,int width,int height); int Backup_new_image(int layers,int width,int height);
@ -101,12 +104,12 @@ int Backup_with_new_dimensions(int width,int height);
/// pixels. This function is meant to be used from within Lua scripts. /// pixels. This function is meant to be used from within Lua scripts.
int Backup_in_place(int width,int height); int Backup_in_place(int width,int height);
/// Backup the spare image, the one you don't see. /// Backup the spare image, the one you don't see.
void Backup_the_spare(dword layer_mask); void Backup_the_spare(int layer);
int Backup_and_resize_the_spare(int width,int height); int Backup_and_resize_the_spare(int width,int height);
/// Backup with a new copy for the working layer, and references for all others. /// Backup with a new copy for the working layer, and references for all others.
void Backup(void); void Backup(void);
/// Backup with a new copy of some layers (the others are references). /// Backup with a new copy of some layers (the others are references).
void Backup_layers(dword layer_mask); void Backup_layers(int layer);
void Undo(void); void Undo(void);
void Redo(void); void Redo(void);
void Free_current_page(void); // 'Kill' button void Free_current_page(void); // 'Kill' button

View File

@ -1768,7 +1768,7 @@ void Button_Palette(void)
// est en mode X-SWAP. // est en mode X-SWAP.
if (!image_is_backed_up) if (!image_is_backed_up)
{ {
Backup_layers(-1); Backup_layers(LAYER_ALL);
image_is_backed_up=1; image_is_backed_up=1;
} }
@ -1916,7 +1916,7 @@ void Button_Palette(void)
{ {
if (!image_is_backed_up) if (!image_is_backed_up)
{ {
Backup_layers(-1); Backup_layers(LAYER_ALL);
image_is_backed_up = 1; image_is_backed_up = 1;
} }
@ -2290,7 +2290,7 @@ void Button_Palette(void)
{ {
if (!image_is_backed_up) if (!image_is_backed_up)
{ {
Backup_layers(-1); Backup_layers(LAYER_ALL);
image_is_backed_up=1; image_is_backed_up=1;
} }
Hide_cursor(); Hide_cursor();
@ -2371,7 +2371,7 @@ void Button_Palette(void)
// Make a backup because remapping is an undoable modification // Make a backup because remapping is an undoable modification
if (!image_is_backed_up) if (!image_is_backed_up)
{ {
Backup_layers(-1); Backup_layers(LAYER_ALL);
image_is_backed_up=1; image_is_backed_up=1;
} }
@ -2614,7 +2614,7 @@ void Button_Palette(void)
{ {
if (!image_is_backed_up) if (!image_is_backed_up)
{ {
Backup_layers(-1); Backup_layers(LAYER_ALL);
image_is_backed_up=1; image_is_backed_up=1;
} }
if (used_colors==-1) if (used_colors==-1)
@ -2743,7 +2743,7 @@ void Button_Palette(void)
{ {
if ( (!image_is_backed_up) if ( (!image_is_backed_up)
&& memcmp(Main_palette,working_palette,sizeof(T_Palette)) ) && memcmp(Main_palette,working_palette,sizeof(T_Palette)) )
Backup_layers(-1); Backup_layers(LAYER_NONE);
memcpy(Main_palette,working_palette,sizeof(T_Palette)); memcpy(Main_palette,working_palette,sizeof(T_Palette));
End_of_modification(); End_of_modification();
// Not really needed, the change was in palette entries // Not really needed, the change was in palette entries