From cdbc5be351bdf881756e9a9fc4075f475b03c607 Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Sat, 5 Mar 2011 16:16:32 +0000 Subject: [PATCH] Fix issue 354: Palette undo unreliable git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1744 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- src/palette.c | 122 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 90 insertions(+), 32 deletions(-) diff --git a/src/palette.c b/src/palette.c index 91bad838..4143abb9 100644 --- a/src/palette.c +++ b/src/palette.c @@ -207,6 +207,66 @@ void Spread_colors(short start,short end,T_Palette palette) } } +// FIXME: keep them in main function but pass them to Palette_edit_*() + T_Components * backup_palette; + T_Components * temp_palette; + T_Components * working_palette; + +byte Palette_undo_state = 0; +byte Palette_change_state = 0; + +/// Backup before doing one self-complete change. +void Palette_edit_step() +{ + // back up + memcpy(backup_palette,working_palette,sizeof(T_Palette)); + Palette_change_state=0; + Palette_undo_state=0; +} + +/// Mode for incremental changes. +void Palette_edit_select_range() +{ + if (Palette_change_state) + {/* + // acknowledge pending changes and back up + memcpy(backup_palette,working_palette,sizeof(T_Palette)); + memcpy(temp_palette,working_palette,sizeof(T_Palette)); + */} + Palette_change_state=0; +} + +/// Perform incremental change in RGB channel of some color(s). +void Palette_edit_alter_channel() +{ + if (!Palette_change_state) + { + memcpy(backup_palette,working_palette,sizeof(T_Palette)); + memcpy(temp_palette,working_palette,sizeof(T_Palette)); + } + Palette_change_state=1; +} + +/// Undo +void Palette_edit_undo_redo() +{ + if (Palette_change_state) + { + // swap backup and working (temp serves as intermediate) + memcpy(temp_palette,backup_palette,sizeof(T_Palette)); + memcpy(backup_palette,working_palette,sizeof(T_Palette)); + memcpy(working_palette,temp_palette,sizeof(T_Palette)); + } + else + { + // swap backup and working (temp serves as intermediate) + memcpy(temp_palette,backup_palette,sizeof(T_Palette)); + memcpy(backup_palette,working_palette,sizeof(T_Palette)); + memcpy(working_palette,temp_palette,sizeof(T_Palette)); + } + Palette_undo_state=(Palette_undo_state==0); +} + void Update_color_count(short * used_colors, dword * color_usage) { @@ -1027,9 +1087,9 @@ void Button_Palette(void) short used_colors = -1; // -1 <=> Inconnu byte conversion_table[256]; - T_Components * backup_palette; - T_Components * temp_palette; - T_Components * working_palette; + //T_Components * backup_palette; + //T_Components * temp_palette; + //T_Components * working_palette; static byte show_used_colors=0; @@ -1042,8 +1102,7 @@ void Button_Palette(void) Open_window(299, 188,"Palette"); memcpy(working_palette, Main_palette, sizeof(T_Palette)); - memcpy(backup_palette, Main_palette, sizeof(T_Palette)); - memcpy(temp_palette, Main_palette, sizeof(T_Palette)); + Palette_edit_step(); Window_set_palette_button(5, 79); // 1 @@ -1195,7 +1254,7 @@ void Button_Palette(void) int nb_colors; // Backup - memcpy(backup_palette,working_palette,sizeof(T_Palette)); + Palette_edit_step(); nb_colors = Get_clipboard_colors(working_palette, block_start); if (nb_colors>0) @@ -1261,8 +1320,7 @@ void Button_Palette(void) Window_rectangle(FGCOLOR_DISPLAY_X,FGCOLOR_DISPLAY_Y,FGCOLOR_DISPLAY_W,FGCOLOR_DISPLAY_H,Fore_color); Update_window_area(FGCOLOR_DISPLAY_X,FGCOLOR_DISPLAY_Y,FGCOLOR_DISPLAY_W,FGCOLOR_DISPLAY_H); - memcpy(backup_palette ,working_palette,sizeof(T_Palette)); - memcpy(temp_palette,working_palette,sizeof(T_Palette)); + Palette_edit_select_range(); } } else @@ -1337,6 +1395,7 @@ void Button_Palette(void) break; case 2 : // Jauge rouge Hide_cursor(); + Palette_edit_alter_channel(); if (block_start==block_end) { if(Palette_view_is_RGB) @@ -1417,6 +1476,7 @@ void Button_Palette(void) break; case 3 : // Jauge verte Hide_cursor(); + Palette_edit_alter_channel(); if (block_start==block_end) { if(Palette_view_is_RGB) @@ -1497,6 +1557,7 @@ void Button_Palette(void) case 4 : // Jauge bleue Hide_cursor(); + Palette_edit_alter_channel(); if (block_start==block_end) { if(Palette_view_is_RGB) @@ -1580,7 +1641,7 @@ void Button_Palette(void) { dword sum_r=0, sum_g=0, sum_b=0, used=0; - memcpy(backup_palette,working_palette,sizeof(T_Palette)); + Palette_edit_step(); // Compute weighted average for (i=block_start; i<=block_end; i++) { @@ -1614,7 +1675,7 @@ void Button_Palette(void) if (temp_color>=0) { dword sum_r=0, sum_g=0, sum_b=0, used; - memcpy(backup_palette,working_palette,sizeof(T_Palette)); + Palette_edit_step(); // Compute weighted average used=color_usage[temp_color]+color_usage[Fore_color]; @@ -1656,7 +1717,7 @@ void Button_Palette(void) case 6 : // Grey scale // Backup - memcpy(backup_palette,working_palette,sizeof(T_Palette)); + Palette_edit_step(); // Grey Scale for (i=block_start;i<=block_end;i++) { @@ -1680,7 +1741,7 @@ void Button_Palette(void) && (temp_color!=block_start)) { Hide_cursor(); - memcpy(backup_palette,working_palette,sizeof(T_Palette)); + Palette_edit_step();// Not undoable if X-Swap // On calcule le nombre de couleurs a swapper sans risquer de sortir // de la palette (La var. first_color est utilisée pour économiser 1 var; c'est tout) @@ -1742,12 +1803,12 @@ void Button_Palette(void) } break; - case 9 : // Copy + case 9 : // Copy (to other slot) temp_color=Wait_click_in_palette(Window_palette_button_list); if ((temp_color>=0) && (temp_color!=block_start)) { Hide_cursor(); - memcpy(backup_palette,working_palette,sizeof(T_Palette)); + Palette_edit_step(); memcpy(working_palette+temp_color,backup_palette+block_start, ((temp_color+block_end-block_start<=255)?block_end+1-block_start:256-temp_color)*3); memcpy(temp_palette,working_palette,sizeof(T_Palette)); @@ -1788,7 +1849,7 @@ void Button_Palette(void) case 10 : // Spread if (block_start!=block_end) { - memcpy(backup_palette,working_palette,sizeof(T_Palette)); + Palette_edit_step(); Spread_colors(block_start,block_end,working_palette); } else @@ -1796,7 +1857,7 @@ void Button_Palette(void) temp_color=Wait_click_in_palette(Window_palette_button_list); if (temp_color>=0) { - memcpy(backup_palette,working_palette,sizeof(T_Palette)); + Palette_edit_step(); if (temp_colorPosition) @@ -2037,6 +2097,7 @@ void Button_Palette(void) if (!Palette_view_is_RGB) break; Hide_cursor(); + Palette_edit_alter_channel(); if (block_start==block_end) { if (red_slider->Position RGB // Acte les changements en cours sur une ou plusieurs couleurs - memcpy(temp_palette,working_palette,sizeof(T_Palette)); - memcpy(backup_palette, working_palette,sizeof(T_Palette)); + Palette_edit_select_range(); Hide_cursor(); @@ -2398,7 +2458,7 @@ void Button_Palette(void) new_blue=(new_color&0x0000FF); // Backup - memcpy(backup_palette,working_palette,sizeof(T_Palette)); + Palette_edit_step(); // Assign color for (i=block_start;i<=block_end;i++) { @@ -2445,8 +2505,7 @@ void Button_Palette(void) Window_rectangle(FGCOLOR_DISPLAY_X,FGCOLOR_DISPLAY_Y,FGCOLOR_DISPLAY_W,FGCOLOR_DISPLAY_H,Fore_color); Update_window_area(FGCOLOR_DISPLAY_X,FGCOLOR_DISPLAY_Y,FGCOLOR_DISPLAY_W,FGCOLOR_DISPLAY_H); - memcpy(backup_palette ,working_palette,sizeof(T_Palette)); - memcpy(temp_palette,working_palette,sizeof(T_Palette)); + Palette_edit_select_range(); } Display_cursor(); @@ -2541,7 +2600,7 @@ void Button_Palette(void) if (used_colors==-1) Update_color_count(&used_colors, color_usage); - memcpy(backup_palette,working_palette,sizeof(T_Palette)); + Palette_edit_step(); memcpy(temp_palette,Main_palette,sizeof(T_Palette)); memcpy(Main_palette,working_palette,sizeof(T_Palette)); Set_nice_menu_colors(color_usage,0); @@ -2594,8 +2653,7 @@ void Button_Palette(void) Window_rectangle(FGCOLOR_DISPLAY_X,FGCOLOR_DISPLAY_Y,FGCOLOR_DISPLAY_W,FGCOLOR_DISPLAY_H,Fore_color); Update_window_area(FGCOLOR_DISPLAY_X,FGCOLOR_DISPLAY_Y,FGCOLOR_DISPLAY_W,FGCOLOR_DISPLAY_H); - memcpy(backup_palette ,working_palette,sizeof(T_Palette)); - memcpy(temp_palette,working_palette,sizeof(T_Palette)); + Palette_edit_select_range(); } Display_cursor(); Wait_end_of_click(); @@ -2622,7 +2680,7 @@ void Button_Palette(void) Hide_cursor(); // Backup - memcpy(backup_palette,working_palette,sizeof(T_Palette)); + Palette_edit_step(); nb_colors = Get_clipboard_colors(working_palette, block_start); if (nb_colors>0)