From c6b9eba7eb17b1454a183ec78dd1ccef01578596 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Mon, 23 Feb 2015 21:42:16 +0000 Subject: [PATCH] Right click on the "add layer" button creates a new layer with a copy of the current layer contents Suggested by ilkke. git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@2092 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- src/init.c | 6 +++--- src/layers.c | 46 +++++++++++++++++++++++++++++++++++----------- src/layers.h | 1 + 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/init.c b/src/init.c index 1db97987..f0cdba10 100644 --- a/src/init.c +++ b/src/init.c @@ -1245,11 +1245,11 @@ void Init_buttons(void) Do_nothing, FAMILY_INSTANT); Init_button(BUTTON_LAYER_ADD, - "Add layer ", + "Add/Duplicate layer ", 86,0, 13,9, BUTTON_SHAPE_RECTANGLE, - Button_Layer_add, Button_Layer_add, + Button_Layer_add, Button_Layer_duplicate, 0,0, Do_nothing, FAMILY_INSTANT); @@ -1351,7 +1351,7 @@ void Init_buttons(void) 177,0, 13,13, BUTTON_SHAPE_RECTANGLE, - Button_Layer_add, Button_Layer_add, + Button_Layer_duplicate, Button_Layer_duplicate, 0,0, Do_nothing, FAMILY_INSTANT); diff --git a/src/layers.c b/src/layers.c index eb77a34d..d82df062 100644 --- a/src/layers.c +++ b/src/layers.c @@ -110,21 +110,45 @@ void Button_Layer_add(void) Backup_layers(LAYER_NONE); if (!Add_layer(Main_backups,Main_current_layer+1)) { - if (Main_backups->Pages->Image_mode == IMAGE_MODE_ANIMATION) - { - // Make a copy of current image, so the display is unchanged - memcpy( - Main_backups->Pages->Image[Main_current_layer].Pixels, - Main_backups->Pages->Image[Main_current_layer-1].Pixels, - Main_backups->Pages->Width*Main_backups->Pages->Height); - } - else - { + Update_depth_buffer(); + // I just noticed this might be unneeded, since the new layer + // is transparent, it shouldn't have any visible effect. + Display_all_screen(); + Display_layerbar(); + End_of_modification(); + } + } + + Unselect_button(BUTTON_LAYER_ADD); + Unselect_button(BUTTON_ANIM_ADD_FRAME); + Display_cursor(); +} + + +void Button_Layer_duplicate(void) +{ + int max[] = {MAX_NB_LAYERS, MAX_NB_FRAMES, 5}; + + Hide_cursor(); + + if (Main_backups->Pages->Nb_layers < max[Main_backups->Pages->Image_mode]) + { + // Backup with unchanged layers + Backup_layers(LAYER_NONE); + if (!Add_layer(Main_backups,Main_current_layer+1)) + { + // Make a copy of current image + memcpy( + Main_backups->Pages->Image[Main_current_layer].Pixels, + Main_backups->Pages->Image[Main_current_layer-1].Pixels, + Main_backups->Pages->Width*Main_backups->Pages->Height); + + if (Main_backups->Pages->Image_mode != IMAGE_MODE_ANIMATION) { Update_depth_buffer(); // I just noticed this might be unneeded, since the new layer // is transparent, it shouldn't have any visible effect. Display_all_screen(); - } + } Display_layerbar(); End_of_modification(); } diff --git a/src/layers.h b/src/layers.h index c9439912..61c8f8ac 100644 --- a/src/layers.h +++ b/src/layers.h @@ -21,6 +21,7 @@ */ void Button_Layer_add(void); +void Button_Layer_duplicate(void); void Button_Layer_remove(void); void Button_Layer_menu(void); void Button_Layer_set_transparent(void);