From c4be9fe5b49f252b34d7b7080b03e2fc74092c33 Mon Sep 17 00:00:00 2001 From: David Capello Date: Mon, 1 Jun 2009 02:59:15 +0000 Subject: [PATCH] Added Context and UIContext classes. Added CurrentSprite class. Removed current_sprite global. Moved all functions of 'sprites' module to Context/UIContext. --- TODO.txt | 9 +- makefile.gcc | 1 + makefile.lst | 2 + makefile.vc | 1 + src/ase/context.cpp | 138 ++++++++++++++++++ src/ase/context.h | 65 +++++++++ src/ase/ui_context.cpp | 98 +++++++++++++ src/ase/ui_context.h | 44 ++++++ src/commands/cmd_background_from_layer.cpp | 15 +- src/commands/cmd_canvas_size.cpp | 5 +- src/commands/cmd_cel_properties.cpp | 10 +- src/commands/cmd_change_image_type.cpp | 4 +- src/commands/cmd_clear.cpp | 17 ++- src/commands/cmd_close_file.cpp | 33 +++-- src/commands/cmd_configure_tools.cpp | 2 +- src/commands/cmd_copy.cpp | 21 +-- src/commands/cmd_crop.cpp | 14 +- src/commands/cmd_cut.cpp | 20 +-- src/commands/cmd_deselect_mask.cpp | 7 +- src/commands/cmd_duplicate_layer.cpp | 10 +- src/commands/cmd_duplicate_sprite.cpp | 14 +- src/commands/cmd_exit.cpp | 6 +- src/commands/cmd_film_editor.cpp | 3 +- src/commands/cmd_flatten_layers.cpp | 5 +- src/commands/cmd_flip.cpp | 10 +- src/commands/cmd_frame_properties.cpp | 8 +- src/commands/cmd_goto_frame.cpp | 46 +++--- src/commands/cmd_goto_layer.cpp | 28 ++-- src/commands/cmd_invert_mask.cpp | 5 +- src/commands/cmd_layer_from_background.cpp | 15 +- src/commands/cmd_layer_properties.cpp | 7 +- src/commands/cmd_load_mask.cpp | 6 +- src/commands/cmd_mask_all.cpp | 5 +- src/commands/cmd_mask_by_color.cpp | 3 +- src/commands/cmd_merge_down_layer.cpp | 11 +- src/commands/cmd_new_file.cpp | 4 +- src/commands/cmd_new_frame.cpp | 13 +- src/commands/cmd_new_layer.cpp | 5 +- src/commands/cmd_new_layer_set.cpp | 7 +- src/commands/cmd_open_file.cpp | 9 +- src/commands/cmd_palette_editor.cpp | 53 +++---- src/commands/cmd_paste.cpp | 10 +- src/commands/cmd_play_animation.cpp | 5 +- src/commands/cmd_preview.cpp | 3 +- src/commands/cmd_redo.cpp | 13 +- src/commands/cmd_remove_cel.cpp | 15 +- src/commands/cmd_remove_frame.cpp | 7 +- src/commands/cmd_remove_layer.cpp | 7 +- src/commands/cmd_reselect_mask.cpp | 7 +- src/commands/cmd_save_file.cpp | 15 +- src/commands/cmd_save_mask.cpp | 12 +- src/commands/cmd_screen_shot.cpp | 2 +- src/commands/cmd_select_file.cpp | 11 +- src/commands/cmd_sprite_properties.cpp | 5 +- src/commands/cmd_sprite_size.cpp | 30 ++-- src/commands/cmd_undo.cpp | 13 +- src/commands/fx/cmd_color_curve.cpp | 7 +- src/commands/fx/cmd_convolution_matrix.cpp | 7 +- src/commands/fx/cmd_despeckle.cpp | 12 +- src/commands/fx/cmd_invert_color.cpp | 7 +- src/commands/fx/cmd_replace_color.cpp | 23 ++- src/core/app.cpp | 49 ++++--- src/core/job.cpp | 4 +- src/core/job.h | 7 +- src/core/modules.cpp | 2 - src/dialogs/aniedit.cpp | 2 +- src/dialogs/canvasze.cpp | 2 +- src/dialogs/drawtext.cpp | 17 +-- src/dialogs/maskcol.cpp | 15 +- src/dialogs/vectmap.cpp | 4 +- src/file/file.cpp | 4 +- src/file/gif_format.cpp | 2 +- src/modules/editors.cpp | 27 ++-- src/modules/gui.cpp | 3 +- src/modules/sprites.cpp | 157 +++------------------ src/modules/sprites.h | 34 ++--- src/raster/sprite.cpp | 78 ++++------ src/raster/sprite.h | 18 +-- src/tests/raster/03sprite.cpp | 2 +- src/util/celmove.cpp | 4 +- src/util/functions.cpp | 28 ++-- src/util/misc.cpp | 7 +- src/widgets/colbar.cpp | 14 +- src/widgets/editor/editor.cpp | 6 +- src/widgets/fileview.cpp | 4 +- src/widgets/statebar.cpp | 45 +++--- 86 files changed, 930 insertions(+), 595 deletions(-) create mode 100644 src/ase/context.cpp create mode 100644 src/ase/context.h create mode 100644 src/ase/ui_context.cpp create mode 100644 src/ase/ui_context.h diff --git a/TODO.txt b/TODO.txt index cf536ccbe..27b697adb 100644 --- a/TODO.txt +++ b/TODO.txt @@ -43,10 +43,7 @@ Wish-list - dacap wish-list: + added starred file-items in the file-selector. + add AseContext structure to handle the current state of the - application (and hook changes in the context/options): - + src/ase/ directory - + src/ase/context.[ch] - + the current sprite should be in the AseContext + application (and hook changes in the context/options). + the commands should be enabled/disabled/checked by the current context state + the commands should use a new ase/ API and not the raster/ low-level @@ -54,10 +51,6 @@ Wish-list - All "functions.c" should be in Undoable + the dependencies should be: commands/ -> ase/ -> raster/ -> jinete/ - + the list of 'sprites' should be in the context (maybe a - AseSharedContext). - + the scripts should start with a new default AseContext (but - with the AseSharedContext visible) - manuq wish-list: + layer-with-constant-cel - Mateusz Czaplinski ideas: diff --git a/makefile.gcc b/makefile.gcc index 2c27ae4b6..82456ae11 100644 --- a/makefile.gcc +++ b/makefile.gcc @@ -80,6 +80,7 @@ $(ZLIB_LIB): $(ZLIB_OBJS) # Rules to build objects and the application VPATH = src \ + src/ase \ src/commands \ src/commands/fx \ src/console \ diff --git a/makefile.lst b/makefile.lst index 663c9e87b..5ee87d3b7 100644 --- a/makefile.lst +++ b/makefile.lst @@ -6,6 +6,8 @@ ASE = aseprite$(EXE) COMMON_SOURCES = \ + src/ase/context.cpp \ + src/ase/ui_context.cpp \ src/commands/cmd_about.cpp \ src/commands/cmd_advanced_mode.cpp \ src/commands/cmd_background_from_layer.cpp \ diff --git a/makefile.vc b/makefile.vc index cf776f5d7..7541a0de8 100644 --- a/makefile.vc +++ b/makefile.vc @@ -94,6 +94,7 @@ $(ZLIB_LIB): $(ZLIB_OBJS) # Rules to build objects and the application VPATH = src \ + src/ase \ src/commands \ src/commands/fx \ src/console \ diff --git a/src/ase/context.cpp b/src/ase/context.cpp new file mode 100644 index 000000000..ec55e9f4e --- /dev/null +++ b/src/ase/context.cpp @@ -0,0 +1,138 @@ +/* ASE - Allegro Sprite Editor + * Copyright (C) 2001-2009 David Capello + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" + +#include +#include + +#include "ase/context.h" + +Context::Context() +{ + m_current_sprite = NULL; +} + +Context::~Context() +{ + for (SpriteList::iterator + it = m_sprites.begin(); it != m_sprites.end(); ++it) { + Sprite* sprite = *it; + delete sprite; + } + m_sprites.clear(); +} + +const SpriteList& Context::get_sprite_list() const +{ + return m_sprites; +} + +Sprite* Context::get_first_sprite() const +{ + if (!m_sprites.empty()) + return m_sprites.front(); + else + return NULL; +} + +Sprite* Context::get_next_sprite(Sprite* sprite) const +{ + assert(sprite != NULL); + + SpriteList::const_iterator it = std::find(m_sprites.begin(), m_sprites.end(), sprite); + + if (it != m_sprites.end()) { + ++it; + if (it != m_sprites.end()) + return *it; + } + return NULL; +} + +/** + * Append the sprite to the context's sprites' list. + */ +void Context::add_sprite(Sprite* sprite) +{ + assert(sprite != NULL); + + m_sprites.push_front(sprite); + + // generate on_add_sprite event + on_add_sprite(sprite); +} + +void Context::remove_sprite(Sprite* sprite) +{ + assert(sprite != NULL); + + SpriteList::iterator it = std::find(m_sprites.begin(), m_sprites.end(), sprite); + assert(it != m_sprites.end()); + + // remove the item from the sprites list + m_sprites.erase(it); + + // generate on_remove_sprite event + on_remove_sprite(sprite); + + // the current sprite cannot be the removed sprite anymore + if (m_current_sprite == sprite) + set_current_sprite(NULL); +} + +void Context::send_sprite_to_top(Sprite* sprite) +{ + assert(sprite); + + SpriteList::iterator it = std::find(m_sprites.begin(), m_sprites.end(), sprite); + assert(it != m_sprites.end()); + + // remove the item from the sprites list + m_sprites.erase(it); + + // add it again + m_sprites.push_front(sprite); +} + +Sprite* Context::get_current_sprite() const +{ + return m_current_sprite; +} + +void Context::set_current_sprite(Sprite* sprite) +{ + m_current_sprite = sprite; + + on_set_current_sprite(sprite); +} + +void Context::on_add_sprite(Sprite* sprite) +{ + // do nothing +} + +void Context::on_remove_sprite(Sprite* sprite) +{ + // do nothing +} + +void Context::on_set_current_sprite(Sprite* sprite) +{ + // do nothing +} diff --git a/src/ase/context.h b/src/ase/context.h new file mode 100644 index 000000000..28fe451d0 --- /dev/null +++ b/src/ase/context.h @@ -0,0 +1,65 @@ +/* ASE - Allegro Sprite Editor + * Copyright (C) 2001-2009 David Capello + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef ASE_CONTEXT_H +#define ASE_CONTEXT_H + +#include + +class Sprite; + +typedef std::list SpriteList; + +class Context +{ + /** + * List of all sprites. + */ + SpriteList m_sprites; + + /** + * Current selected sprite to operate. + */ + Sprite* m_current_sprite; + +public: + + Context(); + virtual ~Context(); + + const SpriteList& get_sprite_list() const; + Sprite* get_first_sprite() const; + Sprite* get_next_sprite(Sprite* sprite) const; + + void add_sprite(Sprite* sprite); + void remove_sprite(Sprite* sprite); + void send_sprite_to_top(Sprite* sprite); + + Sprite* get_current_sprite() const; + void set_current_sprite(Sprite* sprite); + +protected: + + virtual void on_add_sprite(Sprite* sprite); + virtual void on_remove_sprite(Sprite* sprite); + virtual void on_set_current_sprite(Sprite* sprite); + +}; + +#endif // ASE_CONTEXT_H + diff --git a/src/ase/ui_context.cpp b/src/ase/ui_context.cpp new file mode 100644 index 000000000..a9b23d571 --- /dev/null +++ b/src/ase/ui_context.cpp @@ -0,0 +1,98 @@ +/* ASE - Allegro Sprite Editor + * Copyright (C) 2001-2009 David Capello + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" + +#include +#include + +#include "ase/ui_context.h" +#include "core/app.h" +#include "modules/editors.h" +#include "raster/sprite.h" +#include "widgets/tabs.h" + +////////////////////////////////////////////////////////////////////// +// UIContext singleton + +static UIContext* g_instance = NULL; + +UIContext* UIContext::instance() +{ + if (!g_instance) + g_instance = new UIContext; + return g_instance; +} + +void UIContext::destroy_instance() +{ + delete g_instance; + g_instance = NULL; +} + +////////////////////////////////////////////////////////////////////// + +UIContext::UIContext() +{ +} + +UIContext::~UIContext() +{ +} + +void UIContext::show_sprite(Sprite* sprite) const +{ + set_sprite_in_more_reliable_editor(sprite); +} + +void UIContext::on_add_sprite(Sprite* sprite) +{ + // base method + Context::on_add_sprite(sprite); + + // add the tab for this sprite + tabs_append_tab(app_get_tabsbar(), + get_filename(sprite->filename), sprite); + + // rebuild the menu list of sprites + app_realloc_sprite_list(); +} + +void UIContext::on_remove_sprite(Sprite* sprite) +{ + // base method + Context::on_remove_sprite(sprite); + + // remove this sprite from tabs + tabs_remove_tab(app_get_tabsbar(), sprite); + + // rebuild the menu list of sprites + app_realloc_sprite_list(); + + // select other sprites in the editors where are this sprite + editors_hide_sprite(sprite); +} + +void UIContext::on_set_current_sprite(Sprite* sprite) +{ + // base method + Context::on_set_current_sprite(sprite); + + // select the sprite in the tabs + tabs_select_tab(app_get_tabsbar(), sprite); +} diff --git a/src/ase/ui_context.h b/src/ase/ui_context.h new file mode 100644 index 000000000..fd11a3997 --- /dev/null +++ b/src/ase/ui_context.h @@ -0,0 +1,44 @@ +/* ASE - Allegro Sprite Editor + * Copyright (C) 2001-2009 David Capello + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef ASE_UI_CONTEXT_H +#define ASE_UI_CONTEXT_H + +#include "ase/context.h" + +class UIContext : public Context +{ +public: + + static UIContext* instance(); + static void destroy_instance(); + + UIContext(); + virtual ~UIContext(); + + void show_sprite(Sprite* sprite) const; + +protected: + + virtual void on_add_sprite(Sprite* sprite); + virtual void on_remove_sprite(Sprite* sprite); + virtual void on_set_current_sprite(Sprite* sprite); + +}; + +#endif // ASE_UI_CONTEXT_H diff --git a/src/commands/cmd_background_from_layer.cpp b/src/commands/cmd_background_from_layer.cpp index a82997229..febab2451 100644 --- a/src/commands/cmd_background_from_layer.cpp +++ b/src/commands/cmd_background_from_layer.cpp @@ -29,18 +29,19 @@ static bool cmd_background_from_layer_enabled(const char *argument) { + CurrentSprite sprite; return - current_sprite != NULL && - current_sprite->layer != NULL && - sprite_get_background_layer(current_sprite) == NULL && - layer_is_image(current_sprite->layer) && - layer_is_readable(current_sprite->layer) && - layer_is_writable(current_sprite->layer); + sprite != NULL && + sprite->layer != NULL && + sprite_get_background_layer(sprite) == NULL && + layer_is_image(sprite->layer) && + layer_is_readable(sprite->layer) && + layer_is_writable(sprite->layer); } static void cmd_background_from_layer_execute(const char *argument) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; // each frame of the layer to be converted as `Background' must be // cleared using the selected background color in the color-bar diff --git a/src/commands/cmd_canvas_size.cpp b/src/commands/cmd_canvas_size.cpp index fa5981b7d..e1c980f09 100644 --- a/src/commands/cmd_canvas_size.cpp +++ b/src/commands/cmd_canvas_size.cpp @@ -34,13 +34,14 @@ static bool cmd_canvas_size_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite != NULL; } static void cmd_canvas_size_execute(const char *argument) { JWidget window, left, top, right, bottom, ok; - Sprite* sprite = current_sprite; + CurrentSprite sprite; // load the window widget window = load_widget("canvas.jid", "canvas_size"); diff --git a/src/commands/cmd_cel_properties.cpp b/src/commands/cmd_cel_properties.cpp index 8e50b2e6e..c397b3cdc 100644 --- a/src/commands/cmd_cel_properties.cpp +++ b/src/commands/cmd_cel_properties.cpp @@ -36,9 +36,8 @@ static bool cmd_cel_properties_enabled(const char *argument) { - return - is_current_sprite_not_locked() - && current_sprite->layer; + CurrentSprite sprite; + return sprite && sprite->layer; } static void cmd_cel_properties_execute(const char *argument) @@ -46,14 +45,13 @@ static void cmd_cel_properties_execute(const char *argument) JWidget window = NULL; JWidget label_frame, label_pos, label_size; JWidget slider_opacity, button_ok; - Sprite *sprite; Layer *layer; Cel *cel; char buf[1024]; int memsize; /* get current sprite */ - sprite = lock_current_sprite(); + CurrentSprite sprite; if (!sprite) return; @@ -147,8 +145,6 @@ static void cmd_cel_properties_execute(const char *argument) done:; if (window) jwidget_free(window); - - sprite_unlock(sprite); } Command cmd_cel_properties = { diff --git a/src/commands/cmd_change_image_type.cpp b/src/commands/cmd_change_image_type.cpp index 1069ef33e..ef559a0f0 100644 --- a/src/commands/cmd_change_image_type.cpp +++ b/src/commands/cmd_change_image_type.cpp @@ -32,12 +32,14 @@ static bool cmd_change_image_type_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_change_image_type_execute(const char *argument) { JWidget window, from, radio1, radio2, radio3, dither1, dither2; + CurrentSprite current_sprite; /* load the window widget */ window = load_widget("imgtype.jid", "image_type"); diff --git a/src/commands/cmd_clear.cpp b/src/commands/cmd_clear.cpp index 6be748b15..d0edfcab9 100644 --- a/src/commands/cmd_clear.cpp +++ b/src/commands/cmd_clear.cpp @@ -30,22 +30,27 @@ static bool cmd_clear_enabled(const char *argument) { + CurrentSprite sprite; return - current_sprite != NULL && - current_sprite->layer != NULL && - layer_is_image(current_sprite->layer) && - layer_is_readable(current_sprite->layer) && - layer_is_writable(current_sprite->layer); + sprite != NULL && + sprite->layer != NULL && + layer_is_image(sprite->layer) && + layer_is_readable(sprite->layer) && + layer_is_writable(sprite->layer); } static void cmd_clear_execute(const char *argument) { - Sprite* sprite = current_sprite; + CurrentSprite sprite; + if (!sprite) + return; + { Undoable undoable(sprite, "Clear"); undoable.clear_mask(app_get_color_to_clear_layer(sprite->layer)); undoable.commit(); } + update_screen_for_sprite(sprite); } diff --git a/src/commands/cmd_close_file.cpp b/src/commands/cmd_close_file.cpp index f011c68d4..a6f7720a7 100644 --- a/src/commands/cmd_close_file.cpp +++ b/src/commands/cmd_close_file.cpp @@ -21,6 +21,7 @@ #include #include "jinete/jinete.h" +#include "ase/ui_context.h" #include "commands/commands.h" #include "core/app.h" #include "modules/sprites.h" @@ -34,7 +35,8 @@ static bool close_current_sprite(); static bool cmd_close_file_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite != NULL; } static void cmd_close_file_execute(const char *argument) @@ -48,17 +50,23 @@ static void cmd_close_file_execute(const char *argument) static bool cmd_close_all_files_enabled(const char *argument) { - return !jlist_empty(get_sprite_list()); + return !UIContext::instance()->get_sprite_list().empty(); } static void cmd_close_all_files_execute(const char *argument) { - if (!current_sprite) - sprite_show(get_first_sprite()); + UIContext* context = UIContext::instance(); + if (!context->get_current_sprite()) + context->show_sprite(context->get_first_sprite()); - while (current_sprite != NULL && - close_current_sprite()) - ; + while (true) { + if (context->get_current_sprite() != NULL) { + if (!close_current_sprite()) + break; + } + else + break; + } } /** @@ -67,7 +75,9 @@ static void cmd_close_all_files_execute(const char *argument) */ static bool close_current_sprite() { - Sprite *sprite = current_sprite; + CurrentSprite sprite; + if (!sprite.writeable()) + return false; /* see if the sprite has changes */ while (sprite_is_modified(sprite)) { @@ -83,7 +93,7 @@ static bool close_current_sprite() } else if (ret != 2) { /* "cancel" or "ESC" */ - return FALSE; /* we back doing nothing */ + return false; /* we back doing nothing */ } else { /* "discard" */ @@ -92,9 +102,8 @@ static bool close_current_sprite() } /* closes the sprite */ - sprite_unmount(sprite); - sprite_free(sprite); - return TRUE; + sprite.destroy(); + return true; } Command cmd_close_file = { diff --git a/src/commands/cmd_configure_tools.cpp b/src/commands/cmd_configure_tools.cpp index 444d5e2e7..c83a2559c 100644 --- a/src/commands/cmd_configure_tools.cpp +++ b/src/commands/cmd_configure_tools.cpp @@ -325,7 +325,7 @@ static bool view_grid_check_change_hook(JWidget widget, void *data) static bool set_grid_button_select_hook(JWidget widget, void *data) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; if (sprite && sprite->mask && sprite->mask->bitmap) { JRect rect = jrect_new(sprite->mask->x, diff --git a/src/commands/cmd_copy.cpp b/src/commands/cmd_copy.cpp index 411d4847a..cc583abd7 100644 --- a/src/commands/cmd_copy.cpp +++ b/src/commands/cmd_copy.cpp @@ -30,20 +30,23 @@ static bool cmd_copy_enabled(const char *argument) { - if ((!current_sprite) || - (!current_sprite->layer) || - (!layer_is_readable(current_sprite->layer)) || - (!layer_is_writable(current_sprite->layer)) || - (!current_sprite->mask) || - (!current_sprite->mask->bitmap)) - return FALSE; + CurrentSprite sprite; + + if ((!sprite) || + (!sprite->layer) || + (!layer_is_readable(sprite->layer)) || + (!layer_is_writable(sprite->layer)) || + (!sprite->mask) || + (!sprite->mask->bitmap)) + return false; else - return GetImage(current_sprite) ? TRUE: FALSE; + return GetImage(sprite) ? true: false; } static void cmd_copy_execute(const char *argument) { - clipboard::copy(current_sprite); + CurrentSprite sprite; + clipboard::copy(sprite); } Command cmd_copy = { diff --git a/src/commands/cmd_crop.cpp b/src/commands/cmd_crop.cpp index ae674a203..593afeb9b 100644 --- a/src/commands/cmd_crop.cpp +++ b/src/commands/cmd_crop.cpp @@ -38,15 +38,16 @@ static bool cmd_crop_sprite_enabled(const char *argument) { + CurrentSprite sprite; return - current_sprite != NULL && - current_sprite->mask != NULL && - current_sprite->mask->bitmap != NULL; + sprite != NULL && + sprite->mask != NULL && + sprite->mask->bitmap != NULL; } static void cmd_crop_sprite_execute(const char *argument) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; { Undoable undoable(sprite, "Sprite Crop"); int bgcolor = get_color_for_image(sprite->imgtype, @@ -68,12 +69,13 @@ static void cmd_crop_sprite_execute(const char *argument) static bool cmd_autocrop_sprite_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite != NULL; } static void cmd_autocrop_sprite_execute(const char *argument) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; { Undoable undoable(sprite, "Sprite Autocrop"); undoable.autocrop_sprite(colorbar_get_bg_color(app_get_colorbar())); diff --git a/src/commands/cmd_cut.cpp b/src/commands/cmd_cut.cpp index fc11a1273..8f13f44ad 100644 --- a/src/commands/cmd_cut.cpp +++ b/src/commands/cmd_cut.cpp @@ -30,20 +30,22 @@ static bool cmd_cut_enabled(const char *argument) { - if ((!current_sprite) || - (!current_sprite->layer) || - (!layer_is_readable(current_sprite->layer)) || - (!layer_is_writable(current_sprite->layer)) || - (!current_sprite->mask) || - (!current_sprite->mask->bitmap)) - return FALSE; + CurrentSprite sprite; + if ((!sprite) || + (!sprite->layer) || + (!layer_is_readable(sprite->layer)) || + (!layer_is_writable(sprite->layer)) || + (!sprite->mask) || + (!sprite->mask->bitmap)) + return false; else - return GetImage(current_sprite) ? TRUE: FALSE; + return GetImage(sprite) ? true: false; } static void cmd_cut_execute(const char *argument) { - clipboard::cut(current_sprite); + CurrentSprite sprite; + clipboard::cut(sprite); } Command cmd_cut = { diff --git a/src/commands/cmd_deselect_mask.cpp b/src/commands/cmd_deselect_mask.cpp index cc41cb478..d6d1102eb 100644 --- a/src/commands/cmd_deselect_mask.cpp +++ b/src/commands/cmd_deselect_mask.cpp @@ -27,14 +27,13 @@ static bool cmd_deselect_mask_enabled(const char *argument) { - return - current_sprite != NULL && - !mask_is_empty(current_sprite->mask); + CurrentSprite sprite; + return sprite && !mask_is_empty(sprite->mask); } static void cmd_deselect_mask_execute(const char *argument) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; Mask *mask; /* destroy the *deselected* mask */ diff --git a/src/commands/cmd_duplicate_layer.cpp b/src/commands/cmd_duplicate_layer.cpp index 1a0f68ea0..b35a0e8b8 100644 --- a/src/commands/cmd_duplicate_layer.cpp +++ b/src/commands/cmd_duplicate_layer.cpp @@ -33,20 +33,20 @@ static Layer *duplicate_layer(); static bool cmd_duplicate_layer_enabled(const char *argument) { - return - current_sprite != NULL && - current_sprite->layer != NULL; + CurrentSprite sprite; + return sprite && sprite->layer; } static void cmd_duplicate_layer_execute(const char *argument) { + CurrentSprite sprite; if (duplicate_layer() != NULL) - update_screen_for_sprite(current_sprite); + update_screen_for_sprite(sprite); } static Layer *duplicate_layer() { - Sprite *sprite = current_sprite; + CurrentSprite sprite; Layer *layer_copy; char buf[1024]; diff --git a/src/commands/cmd_duplicate_sprite.cpp b/src/commands/cmd_duplicate_sprite.cpp index b2de71b77..e8dcb6881 100644 --- a/src/commands/cmd_duplicate_sprite.cpp +++ b/src/commands/cmd_duplicate_sprite.cpp @@ -22,6 +22,7 @@ #include "jinete/jinete.h" +#include "ase/ui_context.h" #include "commands/commands.h" #include "core/app.h" #include "core/cfg.h" @@ -31,13 +32,14 @@ static bool cmd_duplicate_sprite_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_duplicate_sprite_execute(const char *argument) { JWidget window, src_name, dst_name, flatten; - Sprite *sprite = current_sprite; + CurrentSprite sprite; char buf[1024]; /* load the window widget */ @@ -74,9 +76,11 @@ static void cmd_duplicate_sprite_execute(const char *argument) if (sprite_copy != NULL) { sprite_set_filename(sprite_copy, jwidget_get_text(dst_name)); - sprite_mount(sprite_copy); - set_current_sprite(sprite_copy); - sprite_show(sprite_copy); + UIContext* context = UIContext::instance(); + + context->add_sprite(sprite_copy); + context->set_current_sprite(sprite_copy); + context->show_sprite(sprite_copy); } } diff --git a/src/commands/cmd_exit.cpp b/src/commands/cmd_exit.cpp index 9f0936593..2b87ef53d 100644 --- a/src/commands/cmd_exit.cpp +++ b/src/commands/cmd_exit.cpp @@ -20,6 +20,7 @@ #include "jinete/jinete.h" +#include "ase/ui_context.h" #include "commands/commands.h" #include "core/app.h" #include "modules/sprites.h" @@ -27,7 +28,8 @@ static void cmd_exit_execute(const char *argument) { - Sprite *sprite = get_first_sprite(); + UIContext* context = UIContext::instance(); + Sprite *sprite = context->get_first_sprite(); while (sprite) { // check if this sprite is modified @@ -37,7 +39,7 @@ static void cmd_exit_execute(const char *argument) } break; } - sprite = get_next_sprite(sprite); + sprite = context->get_next_sprite(sprite); } /* close the window */ diff --git a/src/commands/cmd_film_editor.cpp b/src/commands/cmd_film_editor.cpp index 3c5f176dd..817171a2d 100644 --- a/src/commands/cmd_film_editor.cpp +++ b/src/commands/cmd_film_editor.cpp @@ -26,7 +26,8 @@ static bool cmd_film_editor_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_film_editor_execute(const char *argument) diff --git a/src/commands/cmd_flatten_layers.cpp b/src/commands/cmd_flatten_layers.cpp index 25ab9b3c5..b85b04d16 100644 --- a/src/commands/cmd_flatten_layers.cpp +++ b/src/commands/cmd_flatten_layers.cpp @@ -27,12 +27,13 @@ static bool cmd_flatten_layers_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_flatten_layers_execute(const char *argument) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; if (undo_is_enabled(sprite->undo)) undo_set_label(sprite->undo, "Flatten Layers"); diff --git a/src/commands/cmd_flip.cpp b/src/commands/cmd_flip.cpp index 7b0cef8e6..25f30e16e 100644 --- a/src/commands/cmd_flip.cpp +++ b/src/commands/cmd_flip.cpp @@ -36,7 +36,8 @@ static void do_flip(int horz); static bool cmd_flip_horizontal_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_flip_horizontal_execute(const char *argument) @@ -50,7 +51,8 @@ static void cmd_flip_horizontal_execute(const char *argument) static bool cmd_flip_vertical_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_flip_vertical_execute(const char *argument) @@ -63,7 +65,7 @@ static void cmd_flip_vertical_execute(const char *argument) static void do_flip(int horz) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; Image *image, *area; int x1, y1, x2, y2; int x, y; @@ -108,7 +110,7 @@ static void do_flip(int horz) !horz? y2-y: y1+y, image_getpixel(area, x, y)); image_free(area); - update_screen_for_sprite(current_sprite); + update_screen_for_sprite(sprite); } Command cmd_flip_horizontal = { diff --git a/src/commands/cmd_frame_properties.cpp b/src/commands/cmd_frame_properties.cpp index 87b0acdd6..683812579 100644 --- a/src/commands/cmd_frame_properties.cpp +++ b/src/commands/cmd_frame_properties.cpp @@ -30,19 +30,21 @@ void dialogs_frame_length(int sprite_frame); static bool cmd_frame_properties_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_frame_properties_execute(const char *argument) { - dialogs_frame_length(current_sprite->frame); + CurrentSprite sprite; + dialogs_frame_length(sprite->frame); } /* if sprite_frame < 0, set the frame length of all frames */ void dialogs_frame_length(int sprite_frame) { JWidget window, frame, frlen, ok; - Sprite* sprite = current_sprite; + CurrentSprite sprite; char buf[64]; window = load_widget("frlen.jid", "frame_duration"); diff --git a/src/commands/cmd_goto_frame.cpp b/src/commands/cmd_goto_frame.cpp index 8d24bb340..198d77bc2 100644 --- a/src/commands/cmd_goto_frame.cpp +++ b/src/commands/cmd_goto_frame.cpp @@ -31,14 +31,16 @@ static bool cmd_goto_first_frame_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite != NULL; } static void cmd_goto_first_frame_execute(const char *argument) { - current_sprite->frame = 0; + CurrentSprite sprite; + sprite->frame = 0; - update_screen_for_sprite(current_sprite); + update_screen_for_sprite(sprite); editor_update_statusbar_for_standby(current_editor); } @@ -48,17 +50,20 @@ static void cmd_goto_first_frame_execute(const char *argument) static bool cmd_goto_previous_frame_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite != NULL; } static void cmd_goto_previous_frame_execute(const char *argument) { - if (current_sprite->frame > 0) - current_sprite->frame--; - else - current_sprite->frame = current_sprite->frames-1; + CurrentSprite sprite; - update_screen_for_sprite(current_sprite); + if (sprite->frame > 0) + sprite->frame--; + else + sprite->frame = sprite->frames-1; + + update_screen_for_sprite(sprite); editor_update_statusbar_for_standby(current_editor); } @@ -68,17 +73,20 @@ static void cmd_goto_previous_frame_execute(const char *argument) static bool cmd_goto_next_frame_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite != NULL; } static void cmd_goto_next_frame_execute(const char *argument) { - if (current_sprite->frame < current_sprite->frames-1) - current_sprite->frame++; - else - current_sprite->frame = 0; + CurrentSprite sprite; - update_screen_for_sprite(current_sprite); + if (sprite->frame < sprite->frames-1) + sprite->frame++; + else + sprite->frame = 0; + + update_screen_for_sprite(sprite); editor_update_statusbar_for_standby(current_editor); } @@ -88,14 +96,16 @@ static void cmd_goto_next_frame_execute(const char *argument) static bool cmd_goto_last_frame_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite != NULL; } static void cmd_goto_last_frame_execute(const char *argument) { - current_sprite->frame = current_sprite->frames-1; + CurrentSprite sprite; + sprite->frame = sprite->frames-1; - update_screen_for_sprite(current_sprite); + update_screen_for_sprite(sprite); editor_update_statusbar_for_standby(current_editor); } diff --git a/src/commands/cmd_goto_layer.cpp b/src/commands/cmd_goto_layer.cpp index 0c97e5fce..9691dcc3c 100644 --- a/src/commands/cmd_goto_layer.cpp +++ b/src/commands/cmd_goto_layer.cpp @@ -34,26 +34,28 @@ static bool cmd_goto_previous_layer_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite != NULL; } static void cmd_goto_previous_layer_execute(const char *argument) { - int i = sprite_layer2index(current_sprite, current_sprite->layer); + CurrentSprite sprite; + int i = sprite_layer2index(sprite, sprite->layer); if (i > 0) i--; else - i = sprite_count_layers(current_sprite)-1; + i = sprite_count_layers(sprite)-1; - current_sprite->layer = sprite_index2layer(current_sprite, i); + sprite->layer = sprite_index2layer(sprite, i); - update_screen_for_sprite(current_sprite); + update_screen_for_sprite(sprite); editor_update_statusbar_for_standby(current_editor); statusbar_show_tip(app_get_statusbar(), 1000, _("Layer `%s' selected"), - current_sprite->layer->name); + sprite->layer->name); } /* ======================== */ @@ -62,26 +64,28 @@ static void cmd_goto_previous_layer_execute(const char *argument) static bool cmd_goto_next_layer_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite != NULL; } static void cmd_goto_next_layer_execute(const char *argument) { - int i = sprite_layer2index(current_sprite, current_sprite->layer); + CurrentSprite sprite; + int i = sprite_layer2index(sprite, sprite->layer); - if (i < sprite_count_layers(current_sprite)-1) + if (i < sprite_count_layers(sprite)-1) i++; else i = 0; - current_sprite->layer = sprite_index2layer(current_sprite, i); + sprite->layer = sprite_index2layer(sprite, i); - update_screen_for_sprite(current_sprite); + update_screen_for_sprite(sprite); editor_update_statusbar_for_standby(current_editor); statusbar_show_tip(app_get_statusbar(), 1000, _("Layer `%s' selected"), - current_sprite->layer->name); + sprite->layer->name); } Command cmd_goto_previous_layer = { diff --git a/src/commands/cmd_invert_mask.cpp b/src/commands/cmd_invert_mask.cpp index ad2ecc206..5a7d588ae 100644 --- a/src/commands/cmd_invert_mask.cpp +++ b/src/commands/cmd_invert_mask.cpp @@ -28,12 +28,13 @@ static bool cmd_invert_mask_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_invert_mask_execute(const char *argument) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; Mask *mask; /* change the selection */ diff --git a/src/commands/cmd_layer_from_background.cpp b/src/commands/cmd_layer_from_background.cpp index 857e74751..393d3ee0c 100644 --- a/src/commands/cmd_layer_from_background.cpp +++ b/src/commands/cmd_layer_from_background.cpp @@ -31,18 +31,19 @@ static bool cmd_layer_from_background_enabled(const char *argument) { + CurrentSprite sprite; return - current_sprite != NULL && - current_sprite->layer != NULL && - layer_is_image(current_sprite->layer) && - layer_is_readable(current_sprite->layer) && - layer_is_writable(current_sprite->layer) && - layer_is_background(current_sprite->layer); + sprite && + sprite->layer && + layer_is_image(sprite->layer) && + layer_is_readable(sprite->layer) && + layer_is_writable(sprite->layer) && + layer_is_background(sprite->layer); } static void cmd_layer_from_background_execute(const char *argument) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; if (undo_is_enabled(sprite->undo)) undo_set_label(sprite->undo, "Layer from Background"); diff --git a/src/commands/cmd_layer_properties.cpp b/src/commands/cmd_layer_properties.cpp index bba1d9665..f4b6274b5 100644 --- a/src/commands/cmd_layer_properties.cpp +++ b/src/commands/cmd_layer_properties.cpp @@ -29,16 +29,15 @@ static bool cmd_layer_properties_enabled(const char *argument) { - return - current_sprite != NULL && - current_sprite->layer != NULL; + CurrentSprite sprite; + return sprite && sprite->layer; } static void cmd_layer_properties_execute(const char *argument) { JWidget window, box1, box2, box3, label_name, entry_name; JWidget button_ok, button_cancel, label_bm, view_bm, list_bm; - Sprite *sprite = current_sprite; + CurrentSprite sprite; Layer *layer = sprite->layer; window = jwindow_new(_("Layer Properties")); diff --git a/src/commands/cmd_load_mask.cpp b/src/commands/cmd_load_mask.cpp index 8141f2e51..3c4eb17c5 100644 --- a/src/commands/cmd_load_mask.cpp +++ b/src/commands/cmd_load_mask.cpp @@ -31,13 +31,13 @@ static bool cmd_load_mask_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_load_mask_execute(const char *argument) { - /* get current sprite */ - Sprite *sprite = current_sprite; + CurrentSprite sprite; jstring filename = ase_file_selector(_("Load .msk File"), "", "msk"); if (!filename.empty()) { Mask *mask = load_msk_file(filename.c_str()); diff --git a/src/commands/cmd_mask_all.cpp b/src/commands/cmd_mask_all.cpp index 08c200431..abecbe1ee 100644 --- a/src/commands/cmd_mask_all.cpp +++ b/src/commands/cmd_mask_all.cpp @@ -27,12 +27,13 @@ static bool cmd_mask_all_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_mask_all_execute(const char *argument) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; /* undo */ if (undo_is_enabled(sprite->undo)) { diff --git a/src/commands/cmd_mask_by_color.cpp b/src/commands/cmd_mask_by_color.cpp index bf0f31788..70e329a99 100644 --- a/src/commands/cmd_mask_by_color.cpp +++ b/src/commands/cmd_mask_by_color.cpp @@ -26,7 +26,8 @@ static bool cmd_mask_by_color_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_mask_by_color_execute(const char *argument) diff --git a/src/commands/cmd_merge_down_layer.cpp b/src/commands/cmd_merge_down_layer.cpp index 579157a60..425660dd0 100644 --- a/src/commands/cmd_merge_down_layer.cpp +++ b/src/commands/cmd_merge_down_layer.cpp @@ -33,18 +33,15 @@ static bool cmd_merge_down_layer_enabled(const char *argument) { - Layer *src_layer, *dst_layer; - Sprite *sprite; - - sprite = current_sprite; + CurrentSprite sprite; if (!sprite) return FALSE; - src_layer = sprite->layer; + Layer *src_layer = sprite->layer; if (!src_layer || !layer_is_image(src_layer)) return FALSE; - dst_layer = layer_get_prev(sprite->layer); + Layer* dst_layer = layer_get_prev(sprite->layer); if (!dst_layer || !layer_is_image(dst_layer)) return FALSE; @@ -53,7 +50,7 @@ static bool cmd_merge_down_layer_enabled(const char *argument) static void cmd_merge_down_layer_execute(const char *argument) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; Layer *src_layer, *dst_layer; Cel *src_cel, *dst_cel; Image *src_image, *dst_image; diff --git a/src/commands/cmd_new_file.cpp b/src/commands/cmd_new_file.cpp index f71ff641f..67fe31a89 100644 --- a/src/commands/cmd_new_file.cpp +++ b/src/commands/cmd_new_file.cpp @@ -24,6 +24,7 @@ #include "jinete/jinete.h" +#include "ase/ui_context.h" #include "commands/commands.h" #include "console/console.h" #include "core/app.h" @@ -150,7 +151,8 @@ static void cmd_new_file_execute(const char *argument) undo_enable(sprite->undo); /* show the sprite to the user */ - sprite_show(sprite); + UIContext* context = UIContext::instance(); + context->show_sprite(sprite); } } } diff --git a/src/commands/cmd_new_frame.cpp b/src/commands/cmd_new_frame.cpp index f4693d0c5..5ce76b7c5 100644 --- a/src/commands/cmd_new_frame.cpp +++ b/src/commands/cmd_new_frame.cpp @@ -38,17 +38,18 @@ static bool cmd_new_frame_enabled(const char *argument) { + CurrentSprite sprite; return - current_sprite && - current_sprite->layer && - layer_is_readable(current_sprite->layer) && - layer_is_writable(current_sprite->layer) && - layer_is_image(current_sprite->layer); + sprite && + sprite->layer && + layer_is_readable(sprite->layer) && + layer_is_writable(sprite->layer) && + layer_is_image(sprite->layer); } static void cmd_new_frame_execute(const char *argument) { - Sprite* sprite = current_sprite; + CurrentSprite sprite; { Undoable undoable(sprite, "New Frame"); undoable.new_frame(); diff --git a/src/commands/cmd_new_layer.cpp b/src/commands/cmd_new_layer.cpp index 570a6ed16..0b3d2b817 100644 --- a/src/commands/cmd_new_layer.cpp +++ b/src/commands/cmd_new_layer.cpp @@ -31,13 +31,14 @@ static bool cmd_new_layer_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_new_layer_execute(const char *argument) { JWidget window, name_widget; - Sprite* sprite = current_sprite; /* get current sprite */ + CurrentSprite sprite; /* load the window widget */ window = load_widget("newlay.jid", "new_layer"); diff --git a/src/commands/cmd_new_layer_set.cpp b/src/commands/cmd_new_layer_set.cpp index d513b1754..dd861c1e6 100644 --- a/src/commands/cmd_new_layer_set.cpp +++ b/src/commands/cmd_new_layer_set.cpp @@ -30,15 +30,16 @@ static bool cmd_new_layer_set_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_new_layer_set_execute(const char *argument) { JWidget window; - Sprite *sprite = current_sprite; /* get current sprite */ + CurrentSprite sprite; - /* load the window widget */ + // load the window widget window = load_widget("newlay.jid", "new_layer_set"); if (!window) return; diff --git a/src/commands/cmd_open_file.cpp b/src/commands/cmd_open_file.cpp index 2d23f52a6..5861b4fbe 100644 --- a/src/commands/cmd_open_file.cpp +++ b/src/commands/cmd_open_file.cpp @@ -23,6 +23,7 @@ #include "jinete/jinete.h" +#include "ase/ui_context.h" #include "commands/commands.h" #include "console/console.h" #include "core/app.h" @@ -56,7 +57,7 @@ static void openfile_bg(void *fop_data) fop_operate(fop); if (fop_is_stop(fop) && fop->sprite) { - sprite_free(fop->sprite); + delete fop->sprite; fop->sprite = NULL; } @@ -197,9 +198,11 @@ static void cmd_open_file_execute(const char *argument) else { Sprite *sprite = fop->sprite; if (sprite) { + UIContext* context = UIContext::instance(); + recent_file(fop->filename); - sprite_mount(sprite); - sprite_show(sprite); + context->add_sprite(sprite); + context->show_sprite(sprite); } /* if the sprite isn't NULL and the file-operation wasn't stopped by the user... */ diff --git a/src/commands/cmd_palette_editor.cpp b/src/commands/cmd_palette_editor.cpp index e30f08b79..f2675aca9 100644 --- a/src/commands/cmd_palette_editor.cpp +++ b/src/commands/cmd_palette_editor.cpp @@ -32,7 +32,6 @@ #include "modules/gui.h" #include "modules/palettes.h" #include "modules/sprites.h" -#include "modules/sprites.h" #include "raster/image.h" #include "raster/palette.h" #include "raster/sprite.h" @@ -75,8 +74,9 @@ static void cmd_palette_editor_execute(const char *argument) JWidget button_ramp, button_quantize; int frame, columns; Palette *palette = NULL; - int imgtype = current_sprite ? current_sprite->imgtype: IMAGE_INDEXED; - int frame_bak = current_sprite ? current_sprite->frame : 0; + CurrentSprite sprite; + int imgtype = sprite ? sprite->imgtype: IMAGE_INDEXED; + int frame_bak = sprite ? sprite->frame : 0; bool all_frames_same_palette = TRUE; if (imgtype == IMAGE_GRAYSCALE) { @@ -114,16 +114,16 @@ static void cmd_palette_editor_execute(const char *argument) } /* create current_sprite->frames palettes */ - if (current_sprite) { - palettes = (Palette **)jmalloc(sizeof(Palette *) * current_sprite->frames); + if (sprite) { + palettes = (Palette **)jmalloc(sizeof(Palette *) * sprite->frames); if (!palettes) { jalert(_("Error<frames; ++frame) { + for (frame=0; frameframes; ++frame) { palettes[frame] = palette_new(frame, MAX_PALETTE_COLORS); palette_copy_colors(palettes[frame], - sprite_get_palette(current_sprite, frame)); + sprite_get_palette(sprite, frame)); if (frame > 0 && palette_count_diff(palettes[frame-1], palettes[frame], NULL, NULL) > 0) { @@ -167,9 +167,9 @@ static void cmd_palette_editor_execute(const char *argument) jwidget_deselect(check_all_frames); /* frame */ - if (current_sprite) { - jslider_set_range(slider_frame, 0, current_sprite->frames-1); - jslider_set_value(slider_frame, current_sprite->frame); + if (sprite) { + jslider_set_range(slider_frame, 0, sprite->frames-1); + jslider_set_value(slider_frame, sprite->frame); if (jwidget_is_selected(check_all_frames)) jwidget_disable(slider_frame); @@ -207,8 +207,8 @@ static void cmd_palette_editor_execute(const char *argument) /* check the killer widget */ if (jwindow_get_killer(window) == button_ok) { - if (current_sprite) { - sprite_reset_palettes(current_sprite); + if (sprite) { + sprite_reset_palettes(sprite); /* one palette */ if (jwidget_is_selected(check_all_frames)) { @@ -216,7 +216,7 @@ static void cmd_palette_editor_execute(const char *argument) palette_copy_colors(palettes[0], get_current_palette()); - sprite_set_palette(current_sprite, palettes[0], TRUE); + sprite_set_palette(sprite, palettes[0], TRUE); } /* various palettes */ else { @@ -224,11 +224,11 @@ static void cmd_palette_editor_execute(const char *argument) palette_copy_colors(palettes[frame], get_current_palette()); - for (frame=0; frameframes; ++frame) { + for (frame=0; frameframes; ++frame) { if (frame == 0 || palette_count_diff(palettes[frame], palettes[frame-1], NULL, NULL) > 0) { - sprite_set_palette(current_sprite, palettes[frame], TRUE); + sprite_set_palette(sprite, palettes[frame], TRUE); } } } @@ -242,9 +242,9 @@ static void cmd_palette_editor_execute(const char *argument) /* cancel or ESC */ else { /* restore the system palette */ - if (current_sprite) { - current_sprite->frame = frame_bak; - set_current_palette(sprite_get_palette(current_sprite, frame_bak), TRUE); + if (sprite) { + sprite->frame = frame_bak; + set_current_palette(sprite_get_palette(sprite, frame_bak), TRUE); } else { set_current_palette(NULL, TRUE); @@ -264,9 +264,9 @@ static void cmd_palette_editor_execute(const char *argument) jwidget_free(window); if (palettes) { - assert(current_sprite); + assert(sprite); - for (frame=0; frameframes; ++frame) + for (frame=0; frameframes; ++frame) palette_free(palettes[frame]); jfree(palettes); @@ -354,6 +354,7 @@ static void ramp_command(JWidget widget) static void quantize_command(JWidget widget) { + CurrentSprite sprite; Palette *palette = palette_new(0, MAX_PALETTE_COLORS); bool array[256]; @@ -361,8 +362,8 @@ static void quantize_command(JWidget widget) palette_copy_colors(palette, paledit_get_palette(palette_editor)); - if (current_sprite && current_sprite->imgtype == IMAGE_RGB) { - sprite_quantize_ex(current_sprite, palette); + if (sprite && sprite->imgtype == IMAGE_RGB) { + sprite_quantize_ex(sprite, palette); } else { jalert(_("Error<frame; + CurrentSprite sprite; + int old_frame = sprite->frame; int new_frame = jslider_get_value(slider_frame); palette_copy_colors(palettes[old_frame], get_current_palette()); - current_sprite->frame = new_frame; + sprite->frame = new_frame; set_new_palette(palettes[new_frame]); return FALSE; @@ -449,6 +451,7 @@ static bool slider_frame_change_hook(JWidget widget, void *data) static bool check_all_frames_change_hook(JWidget widget, void *data) { + CurrentSprite sprite; int frame = jslider_get_value(slider_frame); palette_copy_colors(palettes[frame], @@ -458,7 +461,7 @@ static bool check_all_frames_change_hook(JWidget widget, void *data) bool has_two_or_more_palettes = FALSE; int c; - for (c=1; cframes; c++) { + for (c=1; cframes; c++) { if (palette_count_diff(palettes[c-1], palettes[c], NULL, NULL) > 0) { has_two_or_more_palettes = TRUE; break; diff --git a/src/commands/cmd_paste.cpp b/src/commands/cmd_paste.cpp index d43346b0b..0c41aa7cd 100644 --- a/src/commands/cmd_paste.cpp +++ b/src/commands/cmd_paste.cpp @@ -26,17 +26,19 @@ static bool cmd_paste_enabled(const char *argument) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; return (sprite && clipboard::can_paste()); } static void cmd_paste_execute(const char *argument) { - if (undo_is_enabled(current_sprite->undo)) - undo_set_label(current_sprite->undo, "Paste"); + CurrentSprite sprite; - clipboard::paste(current_sprite); + if (undo_is_enabled(sprite->undo)) + undo_set_label(sprite->undo, "Paste"); + + clipboard::paste(sprite); } Command cmd_paste = { diff --git a/src/commands/cmd_play_animation.cpp b/src/commands/cmd_play_animation.cpp index 1459394f4..8d0291634 100644 --- a/src/commands/cmd_play_animation.cpp +++ b/src/commands/cmd_play_animation.cpp @@ -43,12 +43,13 @@ END_OF_STATIC_FUNCTION(speed_timer_callback); static bool cmd_play_animation_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_play_animation_execute(const char *argument) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; int old_frame, msecs; bool done = FALSE; bool onionskin = get_onionskin(); diff --git a/src/commands/cmd_preview.cpp b/src/commands/cmd_preview.cpp index efe232abb..dc5f37fc2 100644 --- a/src/commands/cmd_preview.cpp +++ b/src/commands/cmd_preview.cpp @@ -43,7 +43,8 @@ static void preview_sprite(int flags); static bool cmd_preview_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } /* ======================== */ diff --git a/src/commands/cmd_redo.cpp b/src/commands/cmd_redo.cpp index 9cca74f7d..f8bbc2762 100644 --- a/src/commands/cmd_redo.cpp +++ b/src/commands/cmd_redo.cpp @@ -28,18 +28,21 @@ static bool cmd_redo_enabled(const char *argument) { - return current_sprite != NULL && undo_can_redo(current_sprite->undo); + CurrentSprite sprite; + return sprite != NULL && undo_can_redo(sprite->undo); } static void cmd_redo_execute(const char *argument) { + CurrentSprite sprite; + statusbar_show_tip(app_get_statusbar(), 1000, _("Redid %s"), - undo_get_next_redo_label(current_sprite->undo)); + undo_get_next_redo_label(sprite->undo)); - undo_do_redo(current_sprite->undo); - sprite_generate_mask_boundaries(current_sprite); - update_screen_for_sprite(current_sprite); + undo_do_redo(sprite->undo); + sprite_generate_mask_boundaries(sprite); + update_screen_for_sprite(sprite); } Command cmd_redo = { diff --git a/src/commands/cmd_remove_cel.cpp b/src/commands/cmd_remove_cel.cpp index eeef1c09b..dde74507d 100644 --- a/src/commands/cmd_remove_cel.cpp +++ b/src/commands/cmd_remove_cel.cpp @@ -28,18 +28,19 @@ static bool cmd_remove_cel_enabled(const char *argument) { + CurrentSprite sprite; return - current_sprite && - current_sprite->layer && - layer_is_readable(current_sprite->layer) && - layer_is_writable(current_sprite->layer) && - layer_is_image(current_sprite->layer) && - layer_get_cel(current_sprite->layer, current_sprite->frame); + sprite && + sprite->layer && + layer_is_readable(sprite->layer) && + layer_is_writable(sprite->layer) && + layer_is_image(sprite->layer) && + layer_get_cel(sprite->layer, sprite->frame); } static void cmd_remove_cel_execute(const char *argument) { - Sprite* sprite = current_sprite; + CurrentSprite sprite; Cel* cel = layer_get_cel(sprite->layer, sprite->frame); { Undoable undoable(sprite, "Remove Cel"); diff --git a/src/commands/cmd_remove_frame.cpp b/src/commands/cmd_remove_frame.cpp index 44a8f5494..39862a8c7 100644 --- a/src/commands/cmd_remove_frame.cpp +++ b/src/commands/cmd_remove_frame.cpp @@ -28,14 +28,15 @@ static bool cmd_remove_frame_enabled(const char *argument) { + CurrentSprite sprite; return - current_sprite != NULL && - current_sprite->frames > 1; + sprite != NULL && + sprite->frames > 1; } static void cmd_remove_frame_execute(const char *argument) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; { Undoable undoable(sprite, "Remove Frame"); undoable.remove_frame(sprite->frame); diff --git a/src/commands/cmd_remove_layer.cpp b/src/commands/cmd_remove_layer.cpp index 13cddbfc4..2bd2b47ef 100644 --- a/src/commands/cmd_remove_layer.cpp +++ b/src/commands/cmd_remove_layer.cpp @@ -27,14 +27,15 @@ static bool cmd_remove_layer_enabled(const char *argument) { + CurrentSprite sprite; return - current_sprite != NULL && - current_sprite->layer != NULL; + sprite != NULL && + sprite->layer != NULL; } static void cmd_remove_layer_execute(const char *argument) { - Sprite* sprite = current_sprite; + CurrentSprite sprite; { Undoable undoable(sprite, "Remove Layer"); undoable.remove_layer(sprite->layer); diff --git a/src/commands/cmd_reselect_mask.cpp b/src/commands/cmd_reselect_mask.cpp index 19e2cdbb9..c038e1e1d 100644 --- a/src/commands/cmd_reselect_mask.cpp +++ b/src/commands/cmd_reselect_mask.cpp @@ -27,14 +27,15 @@ static bool cmd_reselect_mask_enabled(const char *argument) { + CurrentSprite sprite; return - current_sprite != NULL && - sprite_request_mask(current_sprite, "*deselected*") != NULL; + sprite != NULL && + sprite_request_mask(sprite, "*deselected*") != NULL; } static void cmd_reselect_mask_execute(const char *argument) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; Mask *mask; /* request *deselected* mask */ diff --git a/src/commands/cmd_save_file.cpp b/src/commands/cmd_save_file.cpp index b63f9b238..d8c40ca03 100644 --- a/src/commands/cmd_save_file.cpp +++ b/src/commands/cmd_save_file.cpp @@ -145,7 +145,7 @@ static void save_sprite_in_background(Sprite* sprite, bool mark_as_saved) static void save_as_dialog(const char* dlg_title, bool mark_as_saved) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; char exts[4096]; jstring filename; jstring newfilename; @@ -200,7 +200,8 @@ static void save_as_dialog(const char* dlg_title, bool mark_as_saved) */ static bool cmd_save_file_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } /** @@ -210,7 +211,7 @@ static bool cmd_save_file_enabled(const char *argument) */ static void cmd_save_file_execute(const char *argument) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; /* if the sprite is associated to a file in the file-system, we can save it directly without user interaction */ @@ -231,7 +232,8 @@ static void cmd_save_file_execute(const char *argument) static bool cmd_save_file_as_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_save_file_as_execute(const char *argument) @@ -245,12 +247,13 @@ static void cmd_save_file_as_execute(const char *argument) static bool cmd_save_file_copy_as_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_save_file_copy_as_execute(const char *argument) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; jstring old_filename = sprite->filename; // show "Save As" dialog diff --git a/src/commands/cmd_save_mask.cpp b/src/commands/cmd_save_mask.cpp index abbd040d8..843afcd6e 100644 --- a/src/commands/cmd_save_mask.cpp +++ b/src/commands/cmd_save_mask.cpp @@ -31,17 +31,17 @@ static bool cmd_save_mask_enabled(const char *argument) { - if (!current_sprite) - return FALSE; + CurrentSprite sprite; + if (!sprite) + return false; else - return (current_sprite->mask && - current_sprite->mask->bitmap) ? TRUE: FALSE; + return (sprite->mask && + sprite->mask->bitmap) ? true: false; } static void cmd_save_mask_execute(const char *argument) { - /* get current sprite */ - Sprite *sprite = current_sprite; + CurrentSprite sprite; jstring filename = "default.msk"; int ret; diff --git a/src/commands/cmd_screen_shot.cpp b/src/commands/cmd_screen_shot.cpp index a82f6306c..ec1fffeba 100644 --- a/src/commands/cmd_screen_shot.cpp +++ b/src/commands/cmd_screen_shot.cpp @@ -100,7 +100,7 @@ static void cmd_screen_shot_execute(const char *argument) sprite_save(sprite); /* destroy the sprite */ - sprite_free(sprite); + delete sprite; } /* destroy the bitmap */ diff --git a/src/commands/cmd_select_file.cpp b/src/commands/cmd_select_file.cpp index 36636a9a5..99dc5136d 100644 --- a/src/commands/cmd_select_file.cpp +++ b/src/commands/cmd_select_file.cpp @@ -24,6 +24,7 @@ #include "jinete/jinete.h" +#include "ase/ui_context.h" #include "commands/commands.h" #include "core/app.h" #include "modules/sprites.h" @@ -44,6 +45,8 @@ static bool cmd_select_file_enabled(const char *argument) static bool cmd_select_file_checked(const char *argument) { + CurrentSprite current_sprite; + if (argument) { int sprite_id = ustrtol(argument, NULL, 10); GfxObj *gfxobj = gfxobj_find(sprite_id); @@ -57,15 +60,17 @@ static bool cmd_select_file_checked(const char *argument) static void cmd_select_file_execute(const char *argument) { + UIContext* context = UIContext::instance(); + if (argument) { int sprite_id = ustrtol(argument, NULL, 10); - GfxObj *gfxobj = gfxobj_find(sprite_id); + GfxObj* gfxobj = gfxobj_find(sprite_id); assert(gfxobj != NULL); - sprite_show((Sprite *)gfxobj); + context->show_sprite((Sprite*)gfxobj); } else { - sprite_show(NULL); + context->show_sprite(NULL); } } diff --git a/src/commands/cmd_sprite_properties.cpp b/src/commands/cmd_sprite_properties.cpp index 349a75011..3a5a9ef09 100644 --- a/src/commands/cmd_sprite_properties.cpp +++ b/src/commands/cmd_sprite_properties.cpp @@ -36,13 +36,14 @@ void dialogs_frame_length(int sprite_frpos); static bool cmd_sprite_properties_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_sprite_properties_execute(const char *argument) { JWidget window, killer, name, type, size, frames, speed, ok; - Sprite *sprite = current_sprite; + CurrentSprite sprite; jstring imgtype_text; char buf[256]; diff --git a/src/commands/cmd_sprite_size.cpp b/src/commands/cmd_sprite_size.cpp index 81d3b34e9..8fcabae11 100644 --- a/src/commands/cmd_sprite_size.cpp +++ b/src/commands/cmd_sprite_size.cpp @@ -46,6 +46,7 @@ class SpriteSizeJob : public Job public: SpriteSizeJob(Sprite* sprite, int new_width, int new_height, ResizeMethod resize_method) + : Job("Sprite Size") { m_sprite = sprite; m_new_width = new_width; @@ -122,13 +123,16 @@ static bool height_perc_change_hook(JWidget widget, void *data); static bool cmd_sprite_size_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_sprite_size_execute(const char *argument) { JWidget window, width_px, height_px, width_perc, height_perc, lock_ratio, method, ok; - Sprite* sprite = current_sprite; + CurrentSprite sprite; + if (!sprite) + return; // load the window widget window = load_widget("sprsize.jid", "sprite_size"); @@ -190,6 +194,8 @@ static void cmd_sprite_size_execute(const char *argument) static bool lock_ratio_change_hook(JWidget widget, void *data) { + CurrentSprite sprite; + if (widget->selected()) width_px_change_hook(widget->find_sibling("width_px"), NULL); @@ -198,14 +204,15 @@ static bool lock_ratio_change_hook(JWidget widget, void *data) static bool width_px_change_hook(JWidget widget, void *data) { + CurrentSprite sprite; int width = widget->text_int(); - double perc = 100.0 * width / current_sprite->w; + double perc = 100.0 * width / sprite->w; widget->find_sibling("width_perc")->textf(PERC_FORMAT, perc); if (widget->find_sibling("lock_ratio")->selected()) { widget->find_sibling("height_perc")->textf(PERC_FORMAT, perc); - widget->find_sibling("height_px")->textf("%d", current_sprite->h * width / current_sprite->w); + widget->find_sibling("height_px")->textf("%d", sprite->h * width / sprite->w); } return true; @@ -213,14 +220,15 @@ static bool width_px_change_hook(JWidget widget, void *data) static bool height_px_change_hook(JWidget widget, void *data) { + CurrentSprite sprite; int height = widget->text_int(); - double perc = 100.0 * height / current_sprite->h; + double perc = 100.0 * height / sprite->h; widget->find_sibling("height_perc")->textf(PERC_FORMAT, perc); if (widget->find_sibling("lock_ratio")->selected()) { widget->find_sibling("width_perc")->textf(PERC_FORMAT, perc); - widget->find_sibling("width_px")->textf("%d", current_sprite->w * height / current_sprite->h); + widget->find_sibling("width_px")->textf("%d", sprite->w * height / sprite->h); } return true; @@ -228,12 +236,13 @@ static bool height_px_change_hook(JWidget widget, void *data) static bool width_perc_change_hook(JWidget widget, void *data) { + CurrentSprite sprite; double width = widget->text_double(); - widget->find_sibling("width_px")->textf("%d", (int)(current_sprite->w * width / 100)); + widget->find_sibling("width_px")->textf("%d", (int)(sprite->w * width / 100)); if (widget->find_sibling("lock_ratio")->selected()) { - widget->find_sibling("height_px")->textf("%d", (int)(current_sprite->h * width / 100)); + widget->find_sibling("height_px")->textf("%d", (int)(sprite->h * width / 100)); widget->find_sibling("height_perc")->text(widget->text()); } @@ -242,12 +251,13 @@ static bool width_perc_change_hook(JWidget widget, void *data) static bool height_perc_change_hook(JWidget widget, void *data) { + CurrentSprite sprite; double height = widget->text_double(); - widget->find_sibling("height_px")->textf("%d", (int)(current_sprite->h * height / 100)); + widget->find_sibling("height_px")->textf("%d", (int)(sprite->h * height / 100)); if (widget->find_sibling("lock_ratio")->selected()) { - widget->find_sibling("width_px")->textf("%d", (int)(current_sprite->w * height / 100)); + widget->find_sibling("width_px")->textf("%d", (int)(sprite->w * height / 100)); widget->find_sibling("width_perc")->text(widget->text()); } diff --git a/src/commands/cmd_undo.cpp b/src/commands/cmd_undo.cpp index 2a309c12b..a1ebe8a0e 100644 --- a/src/commands/cmd_undo.cpp +++ b/src/commands/cmd_undo.cpp @@ -28,18 +28,21 @@ static bool cmd_undo_enabled(const char *argument) { - return current_sprite != NULL && undo_can_undo(current_sprite->undo); + CurrentSprite sprite; + return sprite != NULL && undo_can_undo(sprite->undo); } static void cmd_undo_execute(const char *argument) { + CurrentSprite sprite; + statusbar_show_tip(app_get_statusbar(), 1000, _("Undid %s"), - undo_get_next_undo_label(current_sprite->undo)); + undo_get_next_undo_label(sprite->undo)); - undo_do_undo(current_sprite->undo); - sprite_generate_mask_boundaries(current_sprite); - update_screen_for_sprite(current_sprite); + undo_do_undo(sprite->undo); + sprite_generate_mask_boundaries(sprite); + update_screen_for_sprite(sprite); } Command cmd_undo = { diff --git a/src/commands/fx/cmd_color_curve.cpp b/src/commands/fx/cmd_color_curve.cpp index ca90b5b2a..303ea79b0 100644 --- a/src/commands/fx/cmd_color_curve.cpp +++ b/src/commands/fx/cmd_color_curve.cpp @@ -48,7 +48,8 @@ static void make_preview(); static bool cmd_color_curve_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite != NULL; } static void cmd_color_curve_execute(const char *argument) @@ -56,7 +57,7 @@ static void cmd_color_curve_execute(const char *argument) JWidget window, button_ok; JWidget view_curve, curve_editor; JWidget box_target, target_button; - Sprite *sprite = current_sprite; + CurrentSprite sprite; Image *image; Effect *effect; @@ -71,7 +72,7 @@ static void cmd_color_curve_execute(const char *argument) the_curve); } - image = GetImage(current_sprite); + image = GetImage(sprite); if (!image) return; diff --git a/src/commands/fx/cmd_convolution_matrix.cpp b/src/commands/fx/cmd_convolution_matrix.cpp index 5f9ee6c16..1e909b0ea 100644 --- a/src/commands/fx/cmd_convolution_matrix.cpp +++ b/src/commands/fx/cmd_convolution_matrix.cpp @@ -70,7 +70,8 @@ static void make_preview(); static bool cmd_convolution_matrix_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite != NULL; } static void cmd_convolution_matrix_execute(const char *argument) @@ -79,11 +80,11 @@ static void cmd_convolution_matrix_execute(const char *argument) JWidget view_convmatr, list_convmatr; JWidget box_target; JWidget reload, generate; - Sprite *sprite = current_sprite; + CurrentSprite sprite; Image *image; Effect *effect; - image = GetImage(current_sprite); + image = GetImage(sprite); if (!image) return; diff --git a/src/commands/fx/cmd_despeckle.cpp b/src/commands/fx/cmd_despeckle.cpp index 1266b1a2d..862e9f49d 100644 --- a/src/commands/fx/cmd_despeckle.cpp +++ b/src/commands/fx/cmd_despeckle.cpp @@ -57,17 +57,19 @@ static void make_preview(); static bool cmd_despeckle_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_despeckle_execute(const char *argument) { JWidget window, box_target, target_button, button_ok; + CurrentSprite sprite; Image *image; Effect *effect; char buf[32]; - image = GetImage(current_sprite); + image = GetImage(sprite); if (!image) return; @@ -86,7 +88,7 @@ static void cmd_despeckle_execute(const char *argument) return; } - effect = effect_new(current_sprite, "median"); + effect = effect_new(sprite, "median"); if (!effect) { console_printf(_("Error creating the effect applicator for this sprite\n")); jwidget_free(window); @@ -98,7 +100,7 @@ static void cmd_despeckle_execute(const char *argument) preview = preview_new(effect); - target_button = target_button_new(current_sprite->imgtype, TRUE); + target_button = target_button_new(sprite->imgtype, TRUE); target_button_set_target(target_button, effect->target); sprintf(buf, "%d", get_config_int("Median", "Width", 3)); @@ -141,7 +143,7 @@ static void cmd_despeckle_execute(const char *argument) effect_free(effect); /* update editors */ - update_screen_for_sprite(current_sprite); + update_screen_for_sprite(sprite); /* save window configuration */ save_window_pos(window, "Median"); diff --git a/src/commands/fx/cmd_invert_color.cpp b/src/commands/fx/cmd_invert_color.cpp index a22d458ea..b95da641a 100644 --- a/src/commands/fx/cmd_invert_color.cpp +++ b/src/commands/fx/cmd_invert_color.cpp @@ -51,17 +51,18 @@ static void make_preview(); static bool cmd_invert_color_enabled(const char *argument) { - return current_sprite != NULL; + CurrentSprite sprite; + return sprite; } static void cmd_invert_color_execute(const char *argument) { JWidget window, box_target, target_button, button_ok; - Sprite *sprite = current_sprite; + CurrentSprite sprite; Image *image; Effect *effect; - image = GetImage(current_sprite); + image = GetImage(sprite); if (!image) return; diff --git a/src/commands/fx/cmd_replace_color.cpp b/src/commands/fx/cmd_replace_color.cpp index 82d4ef7e7..dbd29a9a9 100644 --- a/src/commands/fx/cmd_replace_color.cpp +++ b/src/commands/fx/cmd_replace_color.cpp @@ -54,7 +54,8 @@ static void make_preview(); static bool cmd_replace_color_enabled(const char *argument) { - return is_current_sprite_not_locked(); + CurrentSprite sprite; + return sprite; } static void cmd_replace_color_execute(const char *argument) @@ -65,13 +66,12 @@ static void cmd_replace_color_execute(const char *argument) JWidget button_ok; Image *image; Effect *effect; - Sprite *sprite; - sprite = lock_current_sprite(); + CurrentSprite sprite; if (!sprite) return; - image = GetImage(current_sprite); + image = GetImage(sprite); if (!image) goto done; @@ -103,14 +103,14 @@ static void cmd_replace_color_execute(const char *argument) button_color1 = colorbutton_new (get_config_color("ReplaceColor", "Color1", colorbar_get_fg_color(app_get_colorbar())), - current_sprite->imgtype); + sprite->imgtype); button_color2 = colorbutton_new (get_config_color("ReplaceColor", "Color2", colorbar_get_bg_color(app_get_colorbar())), - current_sprite->imgtype); + sprite->imgtype); - target_button = target_button_new(current_sprite->imgtype, FALSE); + target_button = target_button_new(sprite->imgtype, FALSE); target_button_set_target(target_button, effect->target); jslider_set_value(slider_fuzziness, @@ -149,7 +149,7 @@ static void cmd_replace_color_execute(const char *argument) effect_free(effect); /* update editors */ - update_screen_for_sprite(current_sprite); + update_screen_for_sprite(sprite); /* save window configuration */ save_window_pos(window, "ReplaceColor"); @@ -157,8 +157,6 @@ static void cmd_replace_color_execute(const char *argument) done:; if (window) jwidget_free(window); - - sprite_unlock(sprite); } static bool color_change_hook(JWidget widget, void *data) @@ -196,6 +194,7 @@ static bool preview_change_hook(JWidget widget, void *data) static void make_preview() { + CurrentSprite sprite; color_t from, to; int fuzziness; @@ -203,8 +202,8 @@ static void make_preview() to = get_config_color("ReplaceColor", "Color2", color_mask()); fuzziness = get_config_int("ReplaceColor", "Fuzziness", 0); - set_replace_colors(get_color_for_layer(current_sprite->layer, from), - get_color_for_layer(current_sprite->layer, to), + set_replace_colors(get_color_for_layer(sprite->layer, from), + get_color_for_layer(sprite->layer, to), MID(0, fuzziness, 255)); if (jwidget_is_selected(check_preview)) diff --git a/src/core/app.cpp b/src/core/app.cpp index 0f4dec899..4d87f3b26 100644 --- a/src/core/app.cpp +++ b/src/core/app.cpp @@ -30,6 +30,7 @@ #include "jinete/jinete.h" #include "jinete/jintern.h" +#include "ase/ui_context.h" #include "commands/commands.h" #include "console/console.h" #include "core/app.h" @@ -291,10 +292,8 @@ void app_loop() switch (option->type) { case OPEN_GFX_FILE: { - Sprite *sprite; - /* load the sprite */ - sprite = sprite_load(option->data); + Sprite *sprite = sprite_load(option->data); if (!sprite) { /* error */ if (ase_mode & MODE_GUI) @@ -304,12 +303,13 @@ void app_loop() } else { /* mount and select the sprite */ - sprite_mount(sprite); - set_current_sprite(sprite); + UIContext* context = UIContext::instance(); + context->add_sprite(sprite); + context->set_current_sprite(sprite); if (ase_mode & MODE_GUI) { /* show it */ - set_sprite_in_more_reliable_editor(get_first_sprite()); + set_sprite_in_more_reliable_editor(context->get_first_sprite()); /* recent file */ recent_file(option->data); @@ -333,8 +333,11 @@ void app_loop() dialogs_select_language(FALSE); /* show tips? */ - if (!current_sprite) - dialogs_tips(FALSE); + { + CurrentSprite sprite; + if (!sprite) + dialogs_tips(FALSE); + } // support to drop files from Windows explorer install_drop_files(); @@ -383,6 +386,7 @@ void app_exit() /* finalize modules, configuration and core */ modules_exit(); + UIContext::destroy_instance(); editor_cursor_exit(); boundary_exit(); @@ -426,10 +430,11 @@ void app_trigger_event(int app_event) void app_refresh_screen() { if (ase_mode & MODE_GUI) { + CurrentSprite sprite; + /* update the color palette */ - set_current_palette(current_sprite != NULL ? - sprite_get_palette(current_sprite, - current_sprite->frame): NULL, + set_current_palette(sprite != NULL ? + sprite_get_palette(sprite, sprite->frame): NULL, FALSE); /* redraw the screen */ @@ -442,15 +447,14 @@ void app_refresh_screen() */ void app_realloc_sprite_list() { - Sprite* sprite; - JLink link; + UIContext* context = UIContext::instance(); + const SpriteList& list = context->get_sprite_list(); /* insert all other sprites */ - JI_LIST_FOR_EACH(get_sprite_list(), link) { - sprite = reinterpret_cast(link->data); - tabs_set_text_for_tab(tabsbar, - get_filename(sprite->filename), - sprite); + for (SpriteList::const_iterator + it = list.begin(); it != list.end(); ++it) { + Sprite* sprite = *it; + tabs_set_text_for_tab(tabsbar, get_filename(sprite->filename), sprite); } } @@ -510,8 +514,9 @@ bool app_realloc_recent_list() int app_get_current_image_type() { - if (current_sprite) - return current_sprite->imgtype; + CurrentSprite sprite; + if (sprite) + return sprite->imgtype; else if (screen != NULL && bitmap_color_depth(screen) == 8) return IMAGE_INDEXED; else @@ -568,9 +573,11 @@ int app_get_color_to_clear_layer(Layer *layer) static void tabsbar_select_callback(JWidget tabs, void *data, int button) { // Note: data can be NULL (the "Nothing" tab) + Sprite* sprite = (Sprite*)data; // put as current sprite - sprite_show((Sprite *)data); + UIContext* context = UIContext::instance(); + context->show_sprite(sprite); // middle button: close the sprite if (data && (button & 4)) diff --git a/src/core/job.cpp b/src/core/job.cpp index d7885b061..38f96edfc 100644 --- a/src/core/job.cpp +++ b/src/core/job.cpp @@ -29,7 +29,7 @@ #include "modules/gui.h" #include "widgets/statebar.h" -Job::Job() +Job::Job(const char* job_name) { m_mutex = NULL; m_thread = NULL; @@ -45,7 +45,7 @@ Job::Job() m_monitor = add_gui_monitor(&Job::monitor_proc, &Job::monitor_free, (void*)this); - m_alert_window = jalert_new(PACKAGE "<imgtype); + sprite->imgtype); jwidget_add_child(color_box, color_but); @@ -126,7 +127,7 @@ void dialogs_draw_text() ji_font_set_size(f, size); /* setup color */ - color = get_color_for_image(current_sprite->imgtype, + color = get_color_for_image(sprite->imgtype, color_with_type); /* update configuration */ @@ -137,9 +138,8 @@ void dialogs_draw_text() /* render text */ image = render_text(f, text, color); if (image) { - clipboard::copy_image(image, sprite_get_palette(current_sprite, - current_sprite->frame)); - clipboard::paste(current_sprite); + clipboard::copy_image(image, sprite_get_palette(sprite, sprite->frame)); + clipboard::paste(sprite); } else console_printf(_("Error rendering text.\n")); @@ -186,6 +186,7 @@ static Image *render_text(FONT *f, const char *text, int color) } \ } + CurrentSprite sprite; int i, pixels, w, h; Image *image; BITMAP *bmp; @@ -206,7 +207,7 @@ static Image *render_text(FONT *f, const char *text, int color) clear_to_color(bmp, makecol32 (255, 0, 255)); textout(bmp, f, text, 0, 0, makecol32 (255, 255, 255)); - image = image_new(current_sprite->imgtype, w, h); + image = image_new(sprite->imgtype, w, h); if (!image) { destroy_bitmap(bmp); return NULL; diff --git a/src/dialogs/maskcol.cpp b/src/dialogs/maskcol.cpp index f0ee330a6..6e46c2f41 100644 --- a/src/dialogs/maskcol.cpp +++ b/src/dialogs/maskcol.cpp @@ -58,13 +58,13 @@ void dialogs_mask_color() JWidget label_color, button_1, button_2; JWidget label_fuzziness; JWidget button_ok, button_cancel; - Sprite *sprite = current_sprite; + CurrentSprite sprite; Image *image; if (!is_interactive () || !sprite) return; - image = GetImage(current_sprite); + image = GetImage(sprite); if (!image) return; @@ -190,18 +190,15 @@ static bool preview_change_hook(JWidget widget, void *data) static Mask *gen_mask() { int xpos, ypos, color, fuzziness; - Sprite *sprite; - Image *image; - Mask *mask; + CurrentSprite sprite; - sprite = current_sprite; - image = GetImage2(sprite, &xpos, &ypos, NULL); + Image* image = GetImage2(sprite, &xpos, &ypos, NULL); color = get_color_for_image(sprite->imgtype, colorbutton_get_color(button_color)); fuzziness = jslider_get_value(slider_fuzziness); - mask = mask_new(); + Mask* mask = mask_new(); mask_by_color(mask, image, color, fuzziness); mask_move(mask, xpos, ypos); @@ -211,7 +208,7 @@ static Mask *gen_mask() static void mask_preview() { if (jwidget_is_selected (check_preview)) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; Mask *mask = gen_mask(); Mask *old_mask = sprite->mask; diff --git a/src/dialogs/vectmap.cpp b/src/dialogs/vectmap.cpp index f65e130ab..dd7891ce6 100644 --- a/src/dialogs/vectmap.cpp +++ b/src/dialogs/vectmap.cpp @@ -127,7 +127,7 @@ void dialogs_vector_map() { #define PROJECT() project(image, x, y, dmax, &u, &v) - Sprite *sprite = current_sprite; + CurrentSprite sprite; Image *image, *image_copy; double u, v, dmax; int c, x, y; @@ -135,7 +135,7 @@ void dialogs_vector_map() if (!is_interactive () || !sprite) return; - image = GetImage(current_sprite); + image = GetImage(sprite); if (!image) return; diff --git a/src/file/file.cpp b/src/file/file.cpp index 168b1adfb..df0b8c990 100644 --- a/src/file/file.cpp +++ b/src/file/file.cpp @@ -506,7 +506,7 @@ void fop_operate(FileOp *fop) if (fop->seq.image) image_free(fop->seq.image); if (fop->seq.last_cel) cel_free(fop->seq.last_cel); if (fop->sprite) { - sprite_free(fop->sprite); + delete fop->sprite; fop->sprite = NULL; } break; @@ -744,7 +744,7 @@ Image *fop_sequence_image(FileOp *fop, int imgtype, int w, int h) layer = layer_new(sprite); if (!layer) { - sprite_free(sprite); + delete sprite; return NULL; } diff --git a/src/file/gif_format.cpp b/src/file/gif_format.cpp index e7efa020f..383cac953 100644 --- a/src/file/gif_format.cpp +++ b/src/file/gif_format.cpp @@ -254,7 +254,7 @@ error:; if (current_image_old) image_free(current_image_old); if (npal) palette_free(npal); if (opal) palette_free(opal); - if (sprite) sprite_free(sprite); + delete sprite; return ret; } diff --git a/src/modules/editors.cpp b/src/modules/editors.cpp index a8650d0c2..57fbe40ca 100644 --- a/src/modules/editors.cpp +++ b/src/modules/editors.cpp @@ -20,6 +20,7 @@ #include "jinete/jinete.h" +#include "ase/ui_context.h" #include "core/app.h" #include "modules/editors.h" #include "modules/gui.h" @@ -174,6 +175,7 @@ void editors_draw_sprite_tiled(Sprite *sprite, int x1, int y1, int x2, int y2) void editors_hide_sprite(Sprite *sprite) { + CurrentSprite current_sprite; JWidget widget; int refresh; JLink link; @@ -188,7 +190,9 @@ void editors_hide_sprite(Sprite *sprite) } if (refresh) { - set_current_sprite(editor_get_sprite(current_editor)); + UIContext* context = UIContext::instance(); + context->set_current_sprite(editor_get_sprite(current_editor)); + app_refresh_screen(); } } @@ -218,7 +222,9 @@ void set_current_editor(JWidget editor) jwidget_dirty(jwidget_get_view(current_editor)); - set_current_sprite(editor_get_sprite(current_editor)); + UIContext* context = UIContext::instance(); + context->set_current_sprite(editor_get_sprite(current_editor)); + app_refresh_screen(); app_realloc_sprite_list(); } @@ -227,8 +233,11 @@ void set_current_editor(JWidget editor) void set_sprite_in_current_editor(Sprite *sprite) { if (current_editor) { - set_current_sprite(sprite); - send_sprite_to_top(sprite); + UIContext* context = UIContext::instance(); + + context->set_current_sprite(sprite); + if (sprite != NULL) + context->send_sprite_to_top(sprite); editor_set_sprite(current_editor, sprite); @@ -420,12 +429,12 @@ static int is_sprite_in_some_editor(Sprite *sprite) */ static Sprite *get_more_reliable_sprite() { - Sprite *sprite; - JLink link; - - JI_LIST_FOR_EACH(get_sprite_list(), link) { - sprite = reinterpret_cast(link->data); + UIContext* context = UIContext::instance(); + const SpriteList& list = context->get_sprite_list(); + for (SpriteList::const_iterator + it = list.begin(); it != list.end(); ++it) { + Sprite* sprite = *it; if (!(is_sprite_in_some_editor(sprite))) return sprite; } diff --git a/src/modules/gui.cpp b/src/modules/gui.cpp index 5350e3c21..00d1929f7 100644 --- a/src/modules/gui.cpp +++ b/src/modules/gui.cpp @@ -29,6 +29,7 @@ #include "jinete/jinete.h" #include "jinete/jintern.h" +#include "ase/ui_context.h" #include "commands/commands.h" #include "console/console.h" #include "core/app.h" @@ -411,7 +412,7 @@ void gui_feedback() if (next_idle_flags & REFRESH_FULL_SCREEN) { next_idle_flags ^= REFRESH_FULL_SCREEN; - update_screen_for_sprite(current_sprite); + update_screen_for_sprite(UIContext::instance()->get_current_sprite()); } /* record file if is necessary */ diff --git a/src/modules/sprites.cpp b/src/modules/sprites.cpp index e3fb90bbf..e9fd2e5fa 100644 --- a/src/modules/sprites.cpp +++ b/src/modules/sprites.cpp @@ -18,17 +18,12 @@ #include "config.h" -#include -#include +#include #include "jinete/jlist.h" -#include "core/app.h" -#include "core/core.h" -#include "file/file.h" +#include "ase/ui_context.h" #include "effect/effect.h" -#include "modules/editors.h" -#include "modules/gui.h" #include "modules/sprites.h" #include "raster/cel.h" #include "raster/image.h" @@ -37,151 +32,43 @@ #include "raster/sprite.h" #include "raster/stock.h" #include "util/misc.h" -#include "widgets/editor.h" -#include "widgets/tabs.h" - -/* Current selected sprite to operate, it could be not the same of - editor_get_sprite(current_editor). */ - -Sprite* current_sprite = NULL; - -static JList sprites_list; static ImageRef *images_ref_get_from_layer(Sprite* sprite, Layer *layer, int target, bool write); static void layer_get_pos(Sprite* sprite, Layer *layer, int target, bool write, int **x, int **y, int *count); -int init_module_sprites() +////////////////////////////////////////////////////////////////////// + +CurrentSprite::CurrentSprite() { - sprites_list = jlist_new(); - current_sprite = NULL; - return 0; + UIContext* context = UIContext::instance(); + + m_sprite = context->get_current_sprite(); + if (m_sprite) + m_writeable = m_sprite->lock(); } -void exit_module_sprites() +CurrentSprite::~CurrentSprite() { - JLink link; - - JI_LIST_FOR_EACH(sprites_list, link) { - sprite_free(reinterpret_cast(link->data)); - } - jlist_free(sprites_list); - sprites_list = NULL; - - current_sprite = NULL; + if (m_sprite) + m_sprite->unlock(); } -JList get_sprite_list() +void CurrentSprite::destroy() { - return sprites_list; -} + if (m_sprite) { + UIContext* context = UIContext::instance(); -Sprite* get_first_sprite() -{ - return reinterpret_cast(jlist_first_data(sprites_list)); -} + context->remove_sprite(m_sprite); -Sprite* get_next_sprite(Sprite* sprite) -{ - JLink link = jlist_find(sprites_list, sprite); + m_sprite->unlock(); - if (sprites_list->end != link && - sprites_list->end != link->next) - return reinterpret_cast(link->next->data); - else - return NULL; -} - -/* adds the "sprite" in the list of sprites */ -void sprite_mount(Sprite* sprite) -{ - /* append the sprite to the list */ - jlist_prepend(sprites_list, sprite); - - if (is_interactive()) { - /* add the tab for this sprite */ - tabs_append_tab(app_get_tabsbar(), - get_filename(sprite->filename), sprite); - - /* rebuild the menu list of sprites */ - app_realloc_sprite_list(); + delete m_sprite; + m_sprite = NULL; + m_writeable = false; } } -/* removes the "sprite" from the list of sprites */ -void sprite_unmount(Sprite* sprite) -{ - /* remove from the sprite's list */ - jlist_remove(sprites_list, sprite); - - if (is_interactive()) { - /* remove this sprite from tabs */ - tabs_remove_tab(app_get_tabsbar(), sprite); - - /* rebuild the menu list of sprites */ - app_realloc_sprite_list(); - - /* select other sprites in the editors where are this sprite */ - editors_hide_sprite(sprite); - } - else { - if (current_sprite == sprite) - set_current_sprite(NULL); - } -} - -/* sets current sprite (doesn't show it, only sets the - "current_sprite" pointer). */ -void set_current_sprite(Sprite* sprite) -{ - current_sprite = sprite; - - /* select the sprite in the tabs */ - tabs_select_tab(app_get_tabsbar(), sprite); -} - -void send_sprite_to_top(Sprite* sprite) -{ - if (sprite && jlist_find(sprites_list, sprite) != sprites_list->end) { - jlist_remove(sprites_list, sprite); - jlist_prepend(sprites_list, sprite); - } -} - -/* puts the sprite in some editor */ -void sprite_show(Sprite* sprite) -{ - if (is_interactive()) - set_sprite_in_more_reliable_editor(sprite); -} - -bool is_current_sprite_not_locked() -{ - return - current_sprite != NULL && - !sprite_is_locked(current_sprite); -} - -bool is_current_sprite_writable() -{ - return - current_sprite != NULL - && !sprite_is_locked(current_sprite) - && current_sprite->layer != NULL - && layer_is_readable(current_sprite->layer) - && layer_is_writable(current_sprite->layer) - && layer_is_image(current_sprite->layer) - && layer_get_cel(current_sprite->layer, - current_sprite->frame) != NULL; -} - -Sprite* lock_current_sprite() -{ - if (current_sprite != NULL && - sprite_lock(current_sprite)) - return current_sprite; - else - return NULL; -} +////////////////////////////////////////////////////////////////////// ImageRef *images_ref_get_from_sprite(Sprite* sprite, int target, bool write) { diff --git a/src/modules/sprites.h b/src/modules/sprites.h index 7384655a9..4186758fa 100644 --- a/src/modules/sprites.h +++ b/src/modules/sprites.h @@ -19,12 +19,14 @@ #ifndef MODULES_SPRITES_H #define MODULES_SPRITES_H +#include + #include "jinete/jbase.h" +#include "raster/sprite.h" class Image; class Layer; class Cel; -class Sprite; struct ImageRef { @@ -34,26 +36,26 @@ struct ImageRef ImageRef* next; }; -extern Sprite* current_sprite; +class CurrentSprite +{ + Sprite* m_sprite; + bool m_writeable; -int init_module_sprites(); -void exit_module_sprites(); +public: + CurrentSprite(); + ~CurrentSprite(); -JList get_sprite_list(); -Sprite* get_first_sprite(); -Sprite* get_next_sprite(Sprite* sprite); + bool writeable() const { return m_writeable; } + void destroy(); -void sprite_mount(Sprite* sprite); -void sprite_unmount(Sprite* sprite); + operator Sprite* () { return m_sprite; } -void set_current_sprite(Sprite* sprite); -void send_sprite_to_top(Sprite* sprite); -void sprite_show(Sprite* sprite); + Sprite* operator->() { + assert(m_sprite != NULL); + return m_sprite; + } -bool is_current_sprite_not_locked(); -bool is_current_sprite_writable(); - -Sprite* lock_current_sprite(); +}; ImageRef* images_ref_get_from_sprite(Sprite* sprite, int target, bool write); void images_ref_free(ImageRef* image_ref); diff --git a/src/raster/sprite.cpp b/src/raster/sprite.cpp index 5602375f9..88f56d677 100644 --- a/src/raster/sprite.cpp +++ b/src/raster/sprite.cpp @@ -91,8 +91,8 @@ Sprite::Sprite(int imgtype, int w, int h) sprite_set_speed(this, 100); /* multiple access */ - this->locked = FALSE; - this->mutex = jmutex_new(); + m_locked = 0; + m_mutex = jmutex_new(); /* file format options */ this->format_options = NULL; @@ -105,7 +105,7 @@ Sprite::~Sprite() { JLink link; - assert(!this->locked); + // assert(m_locked == 1); /* destroy images' stock */ if (this->stock) @@ -143,7 +143,7 @@ Sprite::~Sprite() if (this->bound.seg) jfree(this->bound.seg); /* destroy mutex */ - jmutex_free(this->mutex); + jmutex_free(this->m_mutex); /* destroy file format options */ if (this->format_options) @@ -178,7 +178,7 @@ Sprite* sprite_new_copy(const Sprite* src_sprite) undo_enable(dst_sprite->undo); if (dst_sprite->set == NULL) { - sprite_free(dst_sprite); + delete dst_sprite; return NULL; } @@ -211,7 +211,7 @@ Sprite* sprite_new_flatten_copy(const Sprite* src_sprite) 0, 0, src_sprite->w, src_sprite->h, 0, src_sprite->frames-1); if (flat_layer == NULL) { - sprite_free(dst_sprite); + delete dst_sprite; return NULL; } @@ -237,7 +237,7 @@ Sprite* sprite_new_with_layer(int imgtype, int w, int h) /* new image */ image = image_new(imgtype, w, h); if (!image) { - sprite_free(sprite); + delete sprite; return NULL; } @@ -245,7 +245,7 @@ Sprite* sprite_new_with_layer(int imgtype, int w, int h) layer = layer_new(sprite); if (!layer) { image_free(image); - sprite_free(sprite); + delete sprite; return NULL; } @@ -276,16 +276,6 @@ Sprite* sprite_new_with_layer(int imgtype, int w, int h) return sprite; } -/** - * Destroys the sprite - */ -void sprite_free(Sprite* sprite) -{ - assert(sprite); - delete sprite; -} - - bool sprite_is_modified(Sprite* sprite) { assert(sprite != NULL); @@ -301,19 +291,6 @@ bool sprite_is_associated_to_file(Sprite* sprite) return sprite->associated_to_file; } -bool sprite_is_locked(Sprite* sprite) -{ - bool locked; - - assert(sprite != NULL); - - jmutex_lock(sprite->mutex); - locked = sprite->locked; - jmutex_unlock(sprite->mutex); - - return locked; -} - void sprite_mark_as_saved(Sprite* sprite) { assert(sprite != NULL); @@ -336,30 +313,27 @@ bool sprite_need_alpha(Sprite* sprite) return FALSE; } -bool sprite_lock(Sprite* sprite) +/** + * Lock the sprite to write or read it. + * + * @return true if the sprite can be written (because this is the first lock). + */ +bool Sprite::lock() { - bool res = FALSE; + ScopedLock hold(m_mutex); - assert(sprite != NULL); - - jmutex_lock(sprite->mutex); - if (!sprite->locked) { - sprite->locked = TRUE; - res = TRUE; - } - jmutex_unlock(sprite->mutex); - - return res; + if (++m_locked == 1) + return true; + else + return false; } -void sprite_unlock(Sprite* sprite) +void Sprite::unlock() { - assert(sprite != NULL); + ScopedLock hold(m_mutex); - jmutex_lock(sprite->mutex); - assert(sprite->locked); - sprite->locked = FALSE; - jmutex_unlock(sprite->mutex); + --m_locked; + assert(m_locked >= 0); } Palette* sprite_get_palette(Sprite* sprite, int frame) @@ -838,7 +812,7 @@ static Sprite* general_copy(const Sprite* src_sprite) stock_free(dst_sprite->stock); dst_sprite->stock = stock_new_copy(src_sprite->stock); if (!dst_sprite->stock) { - sprite_free(dst_sprite); + delete dst_sprite; return NULL; } @@ -862,7 +836,7 @@ static Sprite* general_copy(const Sprite* src_sprite) if (src_sprite->path) { dst_sprite->path = path_new_copy(src_sprite->path); if (!dst_sprite->path) { - sprite_free(dst_sprite); + delete dst_sprite; return NULL; } } @@ -876,7 +850,7 @@ static Sprite* general_copy(const Sprite* src_sprite) if (src_sprite->mask) { dst_sprite->mask = mask_new_copy(src_sprite->mask); if (!dst_sprite->mask) { - sprite_free(dst_sprite); + delete dst_sprite; return NULL; } } diff --git a/src/raster/sprite.h b/src/raster/sprite.h index 1624d3e20..556f06207 100644 --- a/src/raster/sprite.h +++ b/src/raster/sprite.h @@ -70,15 +70,19 @@ public: int zoom; } preferred; +private: + /** * Mutex to modify the 'locked' flag. */ - JMutex mutex; + JMutex m_mutex; /** - * True when a thread is reading/writing the sprite. + * Greater than zero when a thread is reading/writing the sprite. */ - bool locked; + int m_locked; + +public: /** * Data to save the file in the same format that it was loaded @@ -87,24 +91,22 @@ public: Sprite(int imgtype, int w, int h); virtual ~Sprite(); + + bool lock(); + void unlock(); }; Sprite* sprite_new(int imgtype, int w, int h); Sprite* sprite_new_copy(const Sprite* src_sprite); Sprite* sprite_new_flatten_copy(const Sprite* src_sprite); Sprite* sprite_new_with_layer(int imgtype, int w, int h); -void sprite_free(Sprite* sprite); bool sprite_is_modified(Sprite* sprite); bool sprite_is_associated_to_file(Sprite* sprite); -bool sprite_is_locked(Sprite* sprite); void sprite_mark_as_saved(Sprite* sprite); bool sprite_need_alpha(Sprite* sprite); -bool sprite_lock(Sprite* sprite); -void sprite_unlock(Sprite* sprite); - struct Palette* sprite_get_palette(Sprite* sprite, int frame); void sprite_set_palette(Sprite* sprite, struct Palette* pal, bool truncate); void sprite_reset_palettes(Sprite* sprite); diff --git a/src/tests/raster/03sprite.cpp b/src/tests/raster/03sprite.cpp index aa9ec1f13..9becc8ca4 100644 --- a/src/tests/raster/03sprite.cpp +++ b/src/tests/raster/03sprite.cpp @@ -112,7 +112,7 @@ void test () image_free(image_screen); image_free(image_bg); - sprite_free(sprite); + delete sprite; destroy_bitmap(bmp); } diff --git a/src/util/celmove.cpp b/src/util/celmove.cpp index f128105d2..d5ae7ac31 100644 --- a/src/util/celmove.cpp +++ b/src/util/celmove.cpp @@ -55,7 +55,7 @@ void set_frame_to_handle(Layer *_src_layer, int _src_frame, void move_cel() { - Sprite *sprite = current_sprite; + CurrentSprite sprite; Cel *src_cel, *dst_cel; assert(src_layer != NULL); @@ -147,7 +147,7 @@ void move_cel() void copy_cel() { - Sprite *sprite = current_sprite; + CurrentSprite sprite; Cel *src_cel, *dst_cel; assert(src_layer != NULL); diff --git a/src/util/functions.cpp b/src/util/functions.cpp index 2162c9751..070d04594 100644 --- a/src/util/functions.cpp +++ b/src/util/functions.cpp @@ -21,6 +21,7 @@ #include #include "jinete/jinete.h" +#include "ase/ui_context.h" #include "console/console.h" #include "core/app.h" #include "file/file.h" @@ -69,8 +70,10 @@ Sprite *NewSprite(int imgtype, int w, int h) return NULL; undo_disable(sprite->undo); - sprite_mount(sprite); - set_current_sprite(sprite); + + UIContext* context = UIContext::instance(); + context->add_sprite(sprite); + context->set_current_sprite(sprite); assert(undo_is_disabled(sprite->undo)); return sprite; @@ -99,8 +102,10 @@ Sprite *LoadSprite(const char *filename) sprite = sprite_load(filename); if (sprite) { undo_disable(sprite->undo); - sprite_mount(sprite); - set_current_sprite(sprite); + + UIContext* context = UIContext::instance(); + context->add_sprite(sprite); + context->set_current_sprite(sprite); } assert(undo_is_disabled(sprite->undo)); @@ -112,7 +117,9 @@ Sprite *LoadSprite(const char *filename) */ void SaveSprite(const char *filename) { - if (current_sprite == NULL) { + CurrentSprite sprite; + + if (sprite == NULL) { console_printf("SaveSprite: No current sprite\n"); return; } @@ -122,11 +129,11 @@ void SaveSprite(const char *filename) return; } - sprite_set_filename(current_sprite, filename); + sprite_set_filename(sprite, filename); app_realloc_sprite_list(); - if (sprite_save(current_sprite) == 0) - sprite_mark_as_saved(current_sprite); + if (sprite_save(sprite) == 0) + sprite_mark_as_saved(sprite); else console_printf("SaveSprite: Error saving sprite file %s\n", filename); } @@ -137,7 +144,8 @@ void SaveSprite(const char *filename) */ void SetSprite(Sprite *sprite) { - set_current_sprite(sprite); + UIContext* context = UIContext::instance(); + context->set_current_sprite(sprite); } /*===================================================================*/ @@ -396,7 +404,7 @@ static int get_max_layer_num(Layer *layer) void RemoveCel(Layer *layer, Cel *cel) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; Image *image; Cel *it; int frame; diff --git a/src/util/misc.cpp b/src/util/misc.cpp index f98dbe8a1..4c93de594 100644 --- a/src/util/misc.cpp +++ b/src/util/misc.cpp @@ -83,7 +83,8 @@ Image* GetImage2(Sprite* sprite, int* x, int* y, int* opacity) void LoadPalette(const char *filename) { - if (current_sprite) { + CurrentSprite sprite; + if (sprite) { DIRS *dir, *dirs; char buf[512]; @@ -101,8 +102,8 @@ void LoadPalette(const char *filename) set_current_palette(pal, FALSE); /* just one palette */ - sprite_reset_palettes(current_sprite); - sprite_set_palette(current_sprite, pal, 0); + sprite_reset_palettes(sprite); + sprite_set_palette(sprite, pal, 0); /* redraw the entire screen */ jmanager_refresh_screen(); diff --git a/src/widgets/colbar.cpp b/src/widgets/colbar.cpp index 6efd23ab0..b8bd2353a 100644 --- a/src/widgets/colbar.cpp +++ b/src/widgets/colbar.cpp @@ -477,11 +477,9 @@ static bool colorbar_msg_proc(JWidget widget, JMessage msg) /* time to refresh all the editors which have the current sprite selected? */ if (msg->timer.timer_id == colorbar->refresh_timer_id) { - Sprite *sprite = current_sprite; - - if (sprite != NULL) { + CurrentSprite sprite; + if (sprite != NULL) update_editors_with_sprite(sprite); - } jmanager_stop_timer(colorbar->refresh_timer_id); } @@ -653,8 +651,8 @@ static bool tooltip_window_msg_proc(JWidget widget, JMessage msg) switch (msg->type) { case JM_CLOSE: { - /* change the sprite palette */ - Sprite *sprite = current_sprite; + // change the sprite palette + CurrentSprite sprite; if (sprite != NULL) { Palette *pal = sprite_get_palette(sprite, sprite->frame); @@ -726,8 +724,8 @@ static bool tooltip_window_msg_proc(JWidget widget, JMessage msg) different from the current sprite's palette, then we have to start the "refresh_timer" to refresh all the editors with that sprite */ - if (current_sprite != NULL && bitmap_color_depth(screen) != 8) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; + if (sprite != NULL && bitmap_color_depth(screen) != 8) { Palette *pal = sprite_get_palette(sprite, sprite->frame); if (palette_count_diff(pal, get_current_palette(), NULL, NULL) > 0) { diff --git a/src/widgets/editor/editor.cpp b/src/widgets/editor/editor.cpp index be9cdd665..157ea5dfc 100644 --- a/src/widgets/editor/editor.cpp +++ b/src/widgets/editor/editor.cpp @@ -26,6 +26,7 @@ #include "jinete/jinete.h" +#include "ase/ui_context.h" #include "commands/commands.h" #include "core/app.h" #include "core/cfg.h" @@ -1026,8 +1027,10 @@ static bool editor_msg_proc(JWidget widget, JMessage msg) break; case JM_BUTTONPRESSED: { + UIContext* context = UIContext::instance(); + set_current_editor(widget); - set_current_sprite(editor->sprite); + context->set_current_sprite(editor->sprite); if (!editor->sprite) break; @@ -1396,7 +1399,6 @@ static void editor_update_candraw(JWidget widget) editor->cursor_candraw = (editor->sprite != NULL && - !sprite_is_locked(editor->sprite) && editor->sprite->layer != NULL && layer_is_image(editor->sprite->layer) && layer_is_readable(editor->sprite->layer) && diff --git a/src/widgets/fileview.cpp b/src/widgets/fileview.cpp index 9d833f9f5..30fd02aaf 100644 --- a/src/widgets/fileview.cpp +++ b/src/widgets/fileview.cpp @@ -751,7 +751,7 @@ static void openfile_bg(void *_data) sprite = fop->sprite; if (sprite) { if (fop_is_stop(fop)) - sprite_free(fop->sprite); + delete fop->sprite; else { /* the palette to convert the Image to a BITMAP */ palette_to_allegro(sprite_get_palette(sprite, 0), data->rgbpal); @@ -760,7 +760,7 @@ static void openfile_bg(void *_data) image = image_new(sprite->imgtype, sprite->w, sprite->h); image_clear(image, 0); sprite_render(sprite, image, 0, 0); - sprite_free(sprite); + delete sprite; /* calculate the thumbnail size */ thumb_w = MAX_THUMBNAIL_SIZE * image->w / MAX(image->w, image->h); diff --git a/src/widgets/statebar.cpp b/src/widgets/statebar.cpp index a1d0e85c1..b45c87313 100644 --- a/src/widgets/statebar.cpp +++ b/src/widgets/statebar.cpp @@ -316,23 +316,31 @@ static bool statusbar_msg_proc(JWidget widget, JMessage msg) } } /* draw current sprite size in memory */ - else if (current_sprite != NULL) { - char buf[1024]; + else { + CurrentSprite sprite; + if (sprite != NULL) { + char buf[1024]; - ustrcpy(buf, "Sprite:"); - get_pretty_memsize(sprite_get_memsize(current_sprite), - buf+ustrsize(buf), - sizeof(buf)-ustrsize(buf)); + if (sprite.writeable()) { + ustrcpy(buf, "Sprite:"); + get_pretty_memsize(sprite_get_memsize(sprite), + buf+ustrsize(buf), + sizeof(buf)-ustrsize(buf)); - ustrcat(buf, " Undo:"); - get_pretty_memsize(undo_get_memsize(current_sprite->undo), - buf+ustrsize(buf), - sizeof(buf)-ustrsize(buf)); + ustrcat(buf, " Undo:"); + get_pretty_memsize(undo_get_memsize(sprite->undo), + buf+ustrsize(buf), + sizeof(buf)-ustrsize(buf)); + } + else { + ustrcpy(buf, "Sprite is Locked"); + } - textout_right_ex(ji_screen, widget->font(), buf, - rc->x2-2, - (widget->rc->y1+widget->rc->y2)/2-text_height(widget->font())/2, - ji_color_foreground(), -1); + textout_right_ex(ji_screen, widget->font(), buf, + rc->x2-2, + (widget->rc->y1+widget->rc->y2)/2-text_height(widget->font())/2, + ji_color_foreground(), -1); + } } jrect_free(rc); @@ -341,7 +349,7 @@ static bool statusbar_msg_proc(JWidget widget, JMessage msg) case JM_MOUSEENTER: if (!jwidget_has_child(widget, statusbar->commands_box)) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; if (!sprite) { jwidget_disable(statusbar->b_first); @@ -401,8 +409,7 @@ static bool tipwindow_msg_proc(JWidget widget, JMessage msg) static bool slider_change_hook(JWidget widget, void *data) { - Sprite *sprite = current_sprite; - + CurrentSprite sprite; if (sprite) { if ((sprite->layer) && (sprite->layer->type == GFXOBJ_LAYER_IMAGE)) { @@ -423,7 +430,7 @@ static bool slider_change_hook(JWidget widget, void *data) static void button_command(JWidget widget, void *data) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; if (sprite) { const char *cmd = NULL; @@ -462,7 +469,7 @@ static void button_command(JWidget widget, void *data) static void update_from_layer(StatusBar *statusbar) { - Sprite *sprite = current_sprite; + CurrentSprite sprite; Cel *cel; /* layer button */