mirror of https://github.com/aseprite/aseprite.git
				
				
				
			Added Context and UIContext classes.
Added CurrentSprite class. Removed current_sprite global. Moved all functions of 'sprites' module to Context/UIContext.
This commit is contained in:
		
							parent
							
								
									8f92f78702
								
							
						
					
					
						commit
						c4be9fe5b4
					
				
							
								
								
									
										9
									
								
								TODO.txt
								
								
								
								
							
							
						
						
									
										9
									
								
								TODO.txt
								
								
								
								
							|  | @ -43,10 +43,7 @@ Wish-list | ||||||
| - dacap wish-list: | - dacap wish-list: | ||||||
|   + added starred file-items in the file-selector. |   + added starred file-items in the file-selector. | ||||||
|   + add AseContext structure to handle the current state of the |   + add AseContext structure to handle the current state of the | ||||||
|     application (and hook changes in the context/options): |     application (and hook changes in the context/options). | ||||||
|   + src/ase/ directory |  | ||||||
|   + src/ase/context.[ch] |  | ||||||
|   + the current sprite should be in the AseContext |  | ||||||
|   + the commands should be enabled/disabled/checked by the current |   + the commands should be enabled/disabled/checked by the current | ||||||
|     context state |     context state | ||||||
|   + the commands should use a new ase/ API and not the raster/ low-level |   + 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 |     - All "functions.c" should be in Undoable | ||||||
|   + the dependencies should be: |   + the dependencies should be: | ||||||
|     commands/ -> ase/ -> raster/ -> jinete/ |     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: | - manuq wish-list: | ||||||
|   + layer-with-constant-cel |   + layer-with-constant-cel | ||||||
| - Mateusz Czaplinski ideas: | - Mateusz Czaplinski ideas: | ||||||
|  |  | ||||||
|  | @ -80,6 +80,7 @@ $(ZLIB_LIB): $(ZLIB_OBJS) | ||||||
| # Rules to build objects and the application | # Rules to build objects and the application | ||||||
| 
 | 
 | ||||||
| VPATH = src					\ | VPATH = src					\ | ||||||
|  | 	src/ase					\ | ||||||
| 	src/commands				\ | 	src/commands				\ | ||||||
| 	src/commands/fx				\ | 	src/commands/fx				\ | ||||||
| 	src/console				\ | 	src/console				\ | ||||||
|  |  | ||||||
|  | @ -6,6 +6,8 @@ | ||||||
| ASE = aseprite$(EXE) | ASE = aseprite$(EXE) | ||||||
| 
 | 
 | ||||||
| COMMON_SOURCES =					\ | COMMON_SOURCES =					\ | ||||||
|  | 	src/ase/context.cpp				\ | ||||||
|  | 	src/ase/ui_context.cpp				\ | ||||||
| 	src/commands/cmd_about.cpp			\ | 	src/commands/cmd_about.cpp			\ | ||||||
| 	src/commands/cmd_advanced_mode.cpp		\ | 	src/commands/cmd_advanced_mode.cpp		\ | ||||||
| 	src/commands/cmd_background_from_layer.cpp	\ | 	src/commands/cmd_background_from_layer.cpp	\ | ||||||
|  |  | ||||||
|  | @ -94,6 +94,7 @@ $(ZLIB_LIB): $(ZLIB_OBJS) | ||||||
| # Rules to build objects and the application | # Rules to build objects and the application | ||||||
| 
 | 
 | ||||||
| VPATH = src					\ | VPATH = src					\ | ||||||
|  | 	src/ase					\ | ||||||
| 	src/commands				\ | 	src/commands				\ | ||||||
| 	src/commands/fx				\ | 	src/commands/fx				\ | ||||||
| 	src/console				\ | 	src/console				\ | ||||||
|  |  | ||||||
|  | @ -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 <cassert> | ||||||
|  | #include <algorithm> | ||||||
|  | 
 | ||||||
|  | #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
 | ||||||
|  | } | ||||||
|  | @ -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 <list> | ||||||
|  | 
 | ||||||
|  | class Sprite; | ||||||
|  | 
 | ||||||
|  | typedef std::list<Sprite*> 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
 | ||||||
|  | 
 | ||||||
|  | @ -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 <cassert> | ||||||
|  | #include <allegro/file.h> | ||||||
|  | 
 | ||||||
|  | #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); | ||||||
|  | } | ||||||
|  | @ -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
 | ||||||
|  | @ -29,18 +29,19 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_background_from_layer_enabled(const char *argument) | static bool cmd_background_from_layer_enabled(const char *argument) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|   return |   return | ||||||
|     current_sprite != NULL && |     sprite != NULL && | ||||||
|     current_sprite->layer != NULL && |     sprite->layer != NULL && | ||||||
|     sprite_get_background_layer(current_sprite) == NULL && |     sprite_get_background_layer(sprite) == NULL && | ||||||
|     layer_is_image(current_sprite->layer) && |     layer_is_image(sprite->layer) && | ||||||
|     layer_is_readable(current_sprite->layer) && |     layer_is_readable(sprite->layer) && | ||||||
|     layer_is_writable(current_sprite->layer); |     layer_is_writable(sprite->layer); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_background_from_layer_execute(const char *argument) | 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
 |   // each frame of the layer to be converted as `Background' must be
 | ||||||
|   // cleared using the selected background color in the color-bar
 |   // cleared using the selected background color in the color-bar
 | ||||||
|  |  | ||||||
|  | @ -34,13 +34,14 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_canvas_size_enabled(const char *argument) | 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) | static void cmd_canvas_size_execute(const char *argument) | ||||||
| { | { | ||||||
|   JWidget window, left, top, right, bottom, ok; |   JWidget window, left, top, right, bottom, ok; | ||||||
|   Sprite* sprite = current_sprite; |   CurrentSprite sprite; | ||||||
| 
 | 
 | ||||||
|   // load the window widget
 |   // load the window widget
 | ||||||
|   window = load_widget("canvas.jid", "canvas_size"); |   window = load_widget("canvas.jid", "canvas_size"); | ||||||
|  |  | ||||||
|  | @ -36,9 +36,8 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_cel_properties_enabled(const char *argument) | static bool cmd_cel_properties_enabled(const char *argument) | ||||||
| { | { | ||||||
|   return |   CurrentSprite sprite; | ||||||
|     is_current_sprite_not_locked() |   return sprite && sprite->layer; | ||||||
|     && current_sprite->layer; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_cel_properties_execute(const char *argument) | 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 window = NULL; | ||||||
|   JWidget label_frame, label_pos, label_size; |   JWidget label_frame, label_pos, label_size; | ||||||
|   JWidget slider_opacity, button_ok; |   JWidget slider_opacity, button_ok; | ||||||
|   Sprite *sprite; |  | ||||||
|   Layer *layer; |   Layer *layer; | ||||||
|   Cel *cel; |   Cel *cel; | ||||||
|   char buf[1024]; |   char buf[1024]; | ||||||
|   int memsize; |   int memsize; | ||||||
| 
 | 
 | ||||||
|   /* get current sprite */ |   /* get current sprite */ | ||||||
|   sprite = lock_current_sprite(); |   CurrentSprite sprite; | ||||||
|   if (!sprite) |   if (!sprite) | ||||||
|     return; |     return; | ||||||
| 
 | 
 | ||||||
|  | @ -147,8 +145,6 @@ static void cmd_cel_properties_execute(const char *argument) | ||||||
| done:; | done:; | ||||||
|   if (window) |   if (window) | ||||||
|     jwidget_free(window); |     jwidget_free(window); | ||||||
| 
 |  | ||||||
|   sprite_unlock(sprite); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Command cmd_cel_properties = { | Command cmd_cel_properties = { | ||||||
|  |  | ||||||
|  | @ -32,12 +32,14 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_change_image_type_enabled(const char *argument) | 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) | static void cmd_change_image_type_execute(const char *argument) | ||||||
| { | { | ||||||
|   JWidget window, from, radio1, radio2, radio3, dither1, dither2; |   JWidget window, from, radio1, radio2, radio3, dither1, dither2; | ||||||
|  |   CurrentSprite current_sprite; | ||||||
| 
 | 
 | ||||||
|   /* load the window widget */ |   /* load the window widget */ | ||||||
|   window = load_widget("imgtype.jid", "image_type"); |   window = load_widget("imgtype.jid", "image_type"); | ||||||
|  |  | ||||||
|  | @ -30,22 +30,27 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_clear_enabled(const char *argument) | static bool cmd_clear_enabled(const char *argument) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|   return |   return | ||||||
|     current_sprite != NULL && |     sprite != NULL && | ||||||
|     current_sprite->layer != NULL && |     sprite->layer != NULL && | ||||||
|     layer_is_image(current_sprite->layer) && |     layer_is_image(sprite->layer) && | ||||||
|     layer_is_readable(current_sprite->layer) && |     layer_is_readable(sprite->layer) && | ||||||
|     layer_is_writable(current_sprite->layer); |     layer_is_writable(sprite->layer); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_clear_execute(const char *argument) | static void cmd_clear_execute(const char *argument) | ||||||
| { | { | ||||||
|   Sprite* sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|  |   if (!sprite) | ||||||
|  |     return; | ||||||
|  | 
 | ||||||
|   { |   { | ||||||
|     Undoable undoable(sprite, "Clear"); |     Undoable undoable(sprite, "Clear"); | ||||||
|     undoable.clear_mask(app_get_color_to_clear_layer(sprite->layer)); |     undoable.clear_mask(app_get_color_to_clear_layer(sprite->layer)); | ||||||
|     undoable.commit(); |     undoable.commit(); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|   update_screen_for_sprite(sprite); |   update_screen_for_sprite(sprite); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -21,6 +21,7 @@ | ||||||
| #include <allegro.h> | #include <allegro.h> | ||||||
| #include "jinete/jinete.h" | #include "jinete/jinete.h" | ||||||
| 
 | 
 | ||||||
|  | #include "ase/ui_context.h" | ||||||
| #include "commands/commands.h" | #include "commands/commands.h" | ||||||
| #include "core/app.h" | #include "core/app.h" | ||||||
| #include "modules/sprites.h" | #include "modules/sprites.h" | ||||||
|  | @ -34,7 +35,8 @@ static bool close_current_sprite(); | ||||||
| 
 | 
 | ||||||
| static bool cmd_close_file_enabled(const char *argument) | 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) | 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) | 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) | static void cmd_close_all_files_execute(const char *argument) | ||||||
| { | { | ||||||
|   if (!current_sprite) |   UIContext* context = UIContext::instance(); | ||||||
|     sprite_show(get_first_sprite()); |   if (!context->get_current_sprite()) | ||||||
|  |     context->show_sprite(context->get_first_sprite()); | ||||||
| 
 | 
 | ||||||
|   while (current_sprite != NULL && |   while (true) { | ||||||
| 	 close_current_sprite()) |     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() | static bool close_current_sprite() | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|  |   if (!sprite.writeable()) | ||||||
|  |     return false; | ||||||
| 
 | 
 | ||||||
|   /* see if the sprite has changes */ |   /* see if the sprite has changes */ | ||||||
|   while (sprite_is_modified(sprite)) { |   while (sprite_is_modified(sprite)) { | ||||||
|  | @ -83,7 +93,7 @@ static bool close_current_sprite() | ||||||
|     } |     } | ||||||
|     else if (ret != 2) { |     else if (ret != 2) { | ||||||
|       /* "cancel" or "ESC" */ |       /* "cancel" or "ESC" */ | ||||||
|       return FALSE; /* we back doing nothing */ |       return false; /* we back doing nothing */ | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|       /* "discard" */ |       /* "discard" */ | ||||||
|  | @ -92,9 +102,8 @@ static bool close_current_sprite() | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /* closes the sprite */ |   /* closes the sprite */ | ||||||
|   sprite_unmount(sprite); |   sprite.destroy(); | ||||||
|   sprite_free(sprite); |   return true; | ||||||
|   return TRUE; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Command cmd_close_file = { | Command cmd_close_file = { | ||||||
|  |  | ||||||
|  | @ -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) | static bool set_grid_button_select_hook(JWidget widget, void *data) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
| 
 | 
 | ||||||
|   if (sprite && sprite->mask && sprite->mask->bitmap) { |   if (sprite && sprite->mask && sprite->mask->bitmap) { | ||||||
|     JRect rect = jrect_new(sprite->mask->x, |     JRect rect = jrect_new(sprite->mask->x, | ||||||
|  |  | ||||||
|  | @ -30,20 +30,23 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_copy_enabled(const char *argument) | static bool cmd_copy_enabled(const char *argument) | ||||||
| { | { | ||||||
|   if ((!current_sprite) || |   CurrentSprite sprite; | ||||||
|       (!current_sprite->layer) || | 
 | ||||||
|       (!layer_is_readable(current_sprite->layer)) || |   if ((!sprite) || | ||||||
|       (!layer_is_writable(current_sprite->layer)) || |       (!sprite->layer) || | ||||||
|       (!current_sprite->mask) || |       (!layer_is_readable(sprite->layer)) || | ||||||
|       (!current_sprite->mask->bitmap)) |       (!layer_is_writable(sprite->layer)) || | ||||||
|     return FALSE; |       (!sprite->mask) || | ||||||
|  |       (!sprite->mask->bitmap)) | ||||||
|  |     return false; | ||||||
|   else |   else | ||||||
|     return GetImage(current_sprite) ? TRUE: FALSE; |     return GetImage(sprite) ? true: false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_copy_execute(const char *argument) | static void cmd_copy_execute(const char *argument) | ||||||
| { | { | ||||||
|   clipboard::copy(current_sprite); |   CurrentSprite sprite; | ||||||
|  |   clipboard::copy(sprite); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Command cmd_copy = { | Command cmd_copy = { | ||||||
|  |  | ||||||
|  | @ -38,15 +38,16 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_crop_sprite_enabled(const char *argument) | static bool cmd_crop_sprite_enabled(const char *argument) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|   return |   return | ||||||
|     current_sprite != NULL && |     sprite != NULL && | ||||||
|     current_sprite->mask != NULL && |     sprite->mask != NULL && | ||||||
|     current_sprite->mask->bitmap != NULL; |     sprite->mask->bitmap != NULL; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_crop_sprite_execute(const char *argument) | static void cmd_crop_sprite_execute(const char *argument) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   { |   { | ||||||
|     Undoable undoable(sprite, "Sprite Crop"); |     Undoable undoable(sprite, "Sprite Crop"); | ||||||
|     int bgcolor = get_color_for_image(sprite->imgtype, |     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) | 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) | static void cmd_autocrop_sprite_execute(const char *argument) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   { |   { | ||||||
|     Undoable undoable(sprite, "Sprite Autocrop"); |     Undoable undoable(sprite, "Sprite Autocrop"); | ||||||
|     undoable.autocrop_sprite(colorbar_get_bg_color(app_get_colorbar())); |     undoable.autocrop_sprite(colorbar_get_bg_color(app_get_colorbar())); | ||||||
|  |  | ||||||
|  | @ -30,20 +30,22 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_cut_enabled(const char *argument) | static bool cmd_cut_enabled(const char *argument) | ||||||
| { | { | ||||||
|   if ((!current_sprite) || |   CurrentSprite sprite; | ||||||
|       (!current_sprite->layer) || |   if ((!sprite) || | ||||||
|       (!layer_is_readable(current_sprite->layer)) || |       (!sprite->layer) || | ||||||
|       (!layer_is_writable(current_sprite->layer)) || |       (!layer_is_readable(sprite->layer)) || | ||||||
|       (!current_sprite->mask) || |       (!layer_is_writable(sprite->layer)) || | ||||||
|       (!current_sprite->mask->bitmap)) |       (!sprite->mask) || | ||||||
|     return FALSE; |       (!sprite->mask->bitmap)) | ||||||
|  |     return false; | ||||||
|   else |   else | ||||||
|     return GetImage(current_sprite) ? TRUE: FALSE; |     return GetImage(sprite) ? true: false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_cut_execute(const char *argument) | static void cmd_cut_execute(const char *argument) | ||||||
| { | { | ||||||
|   clipboard::cut(current_sprite); |   CurrentSprite sprite; | ||||||
|  |   clipboard::cut(sprite); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Command cmd_cut = { | Command cmd_cut = { | ||||||
|  |  | ||||||
|  | @ -27,14 +27,13 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_deselect_mask_enabled(const char *argument) | static bool cmd_deselect_mask_enabled(const char *argument) | ||||||
| { | { | ||||||
|   return |   CurrentSprite sprite; | ||||||
|     current_sprite != NULL && |   return sprite && !mask_is_empty(sprite->mask); | ||||||
|     !mask_is_empty(current_sprite->mask); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_deselect_mask_execute(const char *argument) | static void cmd_deselect_mask_execute(const char *argument) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   Mask *mask; |   Mask *mask; | ||||||
| 
 | 
 | ||||||
|   /* destroy the *deselected* mask */ |   /* destroy the *deselected* mask */ | ||||||
|  |  | ||||||
|  | @ -33,20 +33,20 @@ static Layer *duplicate_layer(); | ||||||
| 
 | 
 | ||||||
| static bool cmd_duplicate_layer_enabled(const char *argument) | static bool cmd_duplicate_layer_enabled(const char *argument) | ||||||
| { | { | ||||||
|   return |   CurrentSprite sprite; | ||||||
|     current_sprite != NULL && |   return sprite && sprite->layer; | ||||||
|     current_sprite->layer != NULL; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_duplicate_layer_execute(const char *argument) | static void cmd_duplicate_layer_execute(const char *argument) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|   if (duplicate_layer() != NULL) |   if (duplicate_layer() != NULL) | ||||||
|     update_screen_for_sprite(current_sprite); |     update_screen_for_sprite(sprite); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static Layer *duplicate_layer() | static Layer *duplicate_layer() | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   Layer *layer_copy; |   Layer *layer_copy; | ||||||
|   char buf[1024]; |   char buf[1024]; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -22,6 +22,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "jinete/jinete.h" | #include "jinete/jinete.h" | ||||||
| 
 | 
 | ||||||
|  | #include "ase/ui_context.h" | ||||||
| #include "commands/commands.h" | #include "commands/commands.h" | ||||||
| #include "core/app.h" | #include "core/app.h" | ||||||
| #include "core/cfg.h" | #include "core/cfg.h" | ||||||
|  | @ -31,13 +32,14 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_duplicate_sprite_enabled(const char *argument) | 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) | static void cmd_duplicate_sprite_execute(const char *argument) | ||||||
| { | { | ||||||
|   JWidget window, src_name, dst_name, flatten; |   JWidget window, src_name, dst_name, flatten; | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   char buf[1024]; |   char buf[1024]; | ||||||
| 
 | 
 | ||||||
|   /* load the window widget */ |   /* load the window widget */ | ||||||
|  | @ -74,9 +76,11 @@ static void cmd_duplicate_sprite_execute(const char *argument) | ||||||
|     if (sprite_copy != NULL) { |     if (sprite_copy != NULL) { | ||||||
|       sprite_set_filename(sprite_copy, jwidget_get_text(dst_name)); |       sprite_set_filename(sprite_copy, jwidget_get_text(dst_name)); | ||||||
| 
 | 
 | ||||||
|       sprite_mount(sprite_copy); |       UIContext* context = UIContext::instance(); | ||||||
|       set_current_sprite(sprite_copy); | 
 | ||||||
|       sprite_show(sprite_copy); |       context->add_sprite(sprite_copy); | ||||||
|  |       context->set_current_sprite(sprite_copy); | ||||||
|  |       context->show_sprite(sprite_copy); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -20,6 +20,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "jinete/jinete.h" | #include "jinete/jinete.h" | ||||||
| 
 | 
 | ||||||
|  | #include "ase/ui_context.h" | ||||||
| #include "commands/commands.h" | #include "commands/commands.h" | ||||||
| #include "core/app.h" | #include "core/app.h" | ||||||
| #include "modules/sprites.h" | #include "modules/sprites.h" | ||||||
|  | @ -27,7 +28,8 @@ | ||||||
| 
 | 
 | ||||||
| static void cmd_exit_execute(const char *argument) | 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) { |   while (sprite) { | ||||||
|     // check if this sprite is modified
 |     // check if this sprite is modified
 | ||||||
|  | @ -37,7 +39,7 @@ static void cmd_exit_execute(const char *argument) | ||||||
|       } |       } | ||||||
|       break; |       break; | ||||||
|     } |     } | ||||||
|     sprite = get_next_sprite(sprite); |     sprite = context->get_next_sprite(sprite); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /* close the window */ |   /* close the window */ | ||||||
|  |  | ||||||
|  | @ -26,7 +26,8 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_film_editor_enabled(const char *argument) | 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) | static void cmd_film_editor_execute(const char *argument) | ||||||
|  |  | ||||||
|  | @ -27,12 +27,13 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_flatten_layers_enabled(const char *argument) | 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) | static void cmd_flatten_layers_execute(const char *argument) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
| 
 | 
 | ||||||
|   if (undo_is_enabled(sprite->undo)) |   if (undo_is_enabled(sprite->undo)) | ||||||
|     undo_set_label(sprite->undo, "Flatten Layers"); |     undo_set_label(sprite->undo, "Flatten Layers"); | ||||||
|  |  | ||||||
|  | @ -36,7 +36,8 @@ static void do_flip(int horz); | ||||||
| 
 | 
 | ||||||
| static bool cmd_flip_horizontal_enabled(const char *argument) | 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) | 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) | 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) | 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) | static void do_flip(int horz) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   Image *image, *area; |   Image *image, *area; | ||||||
|   int x1, y1, x2, y2; |   int x1, y1, x2, y2; | ||||||
|   int x, y; |   int x, y; | ||||||
|  | @ -108,7 +110,7 @@ static void do_flip(int horz) | ||||||
| 		     !horz? y2-y: y1+y, | 		     !horz? y2-y: y1+y, | ||||||
| 		     image_getpixel(area, x, y)); | 		     image_getpixel(area, x, y)); | ||||||
|   image_free(area); |   image_free(area); | ||||||
|   update_screen_for_sprite(current_sprite); |   update_screen_for_sprite(sprite); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Command cmd_flip_horizontal = { | Command cmd_flip_horizontal = { | ||||||
|  |  | ||||||
|  | @ -30,19 +30,21 @@ void dialogs_frame_length(int sprite_frame); | ||||||
| 
 | 
 | ||||||
| static bool cmd_frame_properties_enabled(const char *argument) | 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) | 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 */ | /* if sprite_frame < 0, set the frame length of all frames */ | ||||||
| void dialogs_frame_length(int sprite_frame) | void dialogs_frame_length(int sprite_frame) | ||||||
| { | { | ||||||
|   JWidget window, frame, frlen, ok; |   JWidget window, frame, frlen, ok; | ||||||
|   Sprite* sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   char buf[64]; |   char buf[64]; | ||||||
| 
 | 
 | ||||||
|   window = load_widget("frlen.jid", "frame_duration"); |   window = load_widget("frlen.jid", "frame_duration"); | ||||||
|  |  | ||||||
|  | @ -31,14 +31,16 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_goto_first_frame_enabled(const char *argument) | 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) | 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); |   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) | 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) | static void cmd_goto_previous_frame_execute(const char *argument) | ||||||
| { | { | ||||||
|   if (current_sprite->frame > 0) |   CurrentSprite sprite; | ||||||
|     current_sprite->frame--; |  | ||||||
|   else |  | ||||||
|     current_sprite->frame = current_sprite->frames-1; |  | ||||||
| 
 | 
 | ||||||
|   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); |   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) | 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) | static void cmd_goto_next_frame_execute(const char *argument) | ||||||
| { | { | ||||||
|   if (current_sprite->frame < current_sprite->frames-1) |   CurrentSprite sprite; | ||||||
|     current_sprite->frame++; |  | ||||||
|   else |  | ||||||
|     current_sprite->frame = 0; |  | ||||||
| 
 | 
 | ||||||
|   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); |   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) | 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) | 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); |   editor_update_statusbar_for_standby(current_editor); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -34,26 +34,28 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_goto_previous_layer_enabled(const char *argument) | 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) | 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) |   if (i > 0) | ||||||
|     i--; |     i--; | ||||||
|   else |   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); |   editor_update_statusbar_for_standby(current_editor); | ||||||
| 
 | 
 | ||||||
|   statusbar_show_tip(app_get_statusbar(), 1000, |   statusbar_show_tip(app_get_statusbar(), 1000, | ||||||
| 		     _("Layer `%s' selected"), | 		     _("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) | 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) | 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++; |     i++; | ||||||
|   else |   else | ||||||
|     i = 0; |     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); |   editor_update_statusbar_for_standby(current_editor); | ||||||
| 
 | 
 | ||||||
|   statusbar_show_tip(app_get_statusbar(), 1000, |   statusbar_show_tip(app_get_statusbar(), 1000, | ||||||
| 		     _("Layer `%s' selected"), | 		     _("Layer `%s' selected"), | ||||||
| 		     current_sprite->layer->name); | 		     sprite->layer->name); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Command cmd_goto_previous_layer = { | Command cmd_goto_previous_layer = { | ||||||
|  |  | ||||||
|  | @ -28,12 +28,13 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_invert_mask_enabled(const char *argument) | 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) | static void cmd_invert_mask_execute(const char *argument) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   Mask *mask; |   Mask *mask; | ||||||
| 
 | 
 | ||||||
|   /* change the selection */ |   /* change the selection */ | ||||||
|  |  | ||||||
|  | @ -31,18 +31,19 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_layer_from_background_enabled(const char *argument) | static bool cmd_layer_from_background_enabled(const char *argument) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|   return |   return | ||||||
|     current_sprite != NULL && |     sprite && | ||||||
|     current_sprite->layer != NULL && |     sprite->layer && | ||||||
|     layer_is_image(current_sprite->layer) && |     layer_is_image(sprite->layer) && | ||||||
|     layer_is_readable(current_sprite->layer) && |     layer_is_readable(sprite->layer) && | ||||||
|     layer_is_writable(current_sprite->layer) && |     layer_is_writable(sprite->layer) && | ||||||
|     layer_is_background(current_sprite->layer); |     layer_is_background(sprite->layer); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_layer_from_background_execute(const char *argument) | static void cmd_layer_from_background_execute(const char *argument) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
| 
 | 
 | ||||||
|   if (undo_is_enabled(sprite->undo)) |   if (undo_is_enabled(sprite->undo)) | ||||||
|     undo_set_label(sprite->undo, "Layer from Background"); |     undo_set_label(sprite->undo, "Layer from Background"); | ||||||
|  |  | ||||||
|  | @ -29,16 +29,15 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_layer_properties_enabled(const char *argument) | static bool cmd_layer_properties_enabled(const char *argument) | ||||||
| { | { | ||||||
|   return |   CurrentSprite sprite; | ||||||
|     current_sprite != NULL && |   return sprite && sprite->layer; | ||||||
|     current_sprite->layer != NULL; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_layer_properties_execute(const char *argument) | static void cmd_layer_properties_execute(const char *argument) | ||||||
| { | { | ||||||
|   JWidget window, box1, box2, box3, label_name, entry_name; |   JWidget window, box1, box2, box3, label_name, entry_name; | ||||||
|   JWidget button_ok, button_cancel, label_bm, view_bm, list_bm; |   JWidget button_ok, button_cancel, label_bm, view_bm, list_bm; | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   Layer *layer = sprite->layer; |   Layer *layer = sprite->layer; | ||||||
| 
 | 
 | ||||||
|   window = jwindow_new(_("Layer Properties")); |   window = jwindow_new(_("Layer Properties")); | ||||||
|  |  | ||||||
|  | @ -31,13 +31,13 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_load_mask_enabled(const char *argument) | 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) | static void cmd_load_mask_execute(const char *argument) | ||||||
| { | { | ||||||
|   /* get current sprite */ |   CurrentSprite sprite; | ||||||
|   Sprite *sprite = current_sprite; |  | ||||||
|   jstring filename = ase_file_selector(_("Load .msk File"), "", "msk"); |   jstring filename = ase_file_selector(_("Load .msk File"), "", "msk"); | ||||||
|   if (!filename.empty()) { |   if (!filename.empty()) { | ||||||
|     Mask *mask = load_msk_file(filename.c_str()); |     Mask *mask = load_msk_file(filename.c_str()); | ||||||
|  |  | ||||||
|  | @ -27,12 +27,13 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_mask_all_enabled(const char *argument) | 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) | static void cmd_mask_all_execute(const char *argument) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
| 
 | 
 | ||||||
|   /* undo */ |   /* undo */ | ||||||
|   if (undo_is_enabled(sprite->undo)) { |   if (undo_is_enabled(sprite->undo)) { | ||||||
|  |  | ||||||
|  | @ -26,7 +26,8 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_mask_by_color_enabled(const char *argument) | 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) | static void cmd_mask_by_color_execute(const char *argument) | ||||||
|  |  | ||||||
|  | @ -33,18 +33,15 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_merge_down_layer_enabled(const char *argument) | static bool cmd_merge_down_layer_enabled(const char *argument) | ||||||
| { | { | ||||||
|   Layer *src_layer, *dst_layer; |   CurrentSprite sprite; | ||||||
|   Sprite *sprite; |  | ||||||
| 
 |  | ||||||
|   sprite = current_sprite; |  | ||||||
|   if (!sprite) |   if (!sprite) | ||||||
|     return FALSE; |     return FALSE; | ||||||
| 
 | 
 | ||||||
|   src_layer = sprite->layer; |   Layer *src_layer = sprite->layer; | ||||||
|   if (!src_layer || !layer_is_image(src_layer)) |   if (!src_layer || !layer_is_image(src_layer)) | ||||||
|     return FALSE; |     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)) |   if (!dst_layer || !layer_is_image(dst_layer)) | ||||||
|     return FALSE; |     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) | static void cmd_merge_down_layer_execute(const char *argument) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   Layer *src_layer, *dst_layer; |   Layer *src_layer, *dst_layer; | ||||||
|   Cel *src_cel, *dst_cel; |   Cel *src_cel, *dst_cel; | ||||||
|   Image *src_image, *dst_image; |   Image *src_image, *dst_image; | ||||||
|  |  | ||||||
|  | @ -24,6 +24,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "jinete/jinete.h" | #include "jinete/jinete.h" | ||||||
| 
 | 
 | ||||||
|  | #include "ase/ui_context.h" | ||||||
| #include "commands/commands.h" | #include "commands/commands.h" | ||||||
| #include "console/console.h" | #include "console/console.h" | ||||||
| #include "core/app.h" | #include "core/app.h" | ||||||
|  | @ -150,7 +151,8 @@ static void cmd_new_file_execute(const char *argument) | ||||||
| 	undo_enable(sprite->undo); | 	undo_enable(sprite->undo); | ||||||
| 
 | 
 | ||||||
| 	/* show the sprite to the user */ | 	/* show the sprite to the user */ | ||||||
| 	sprite_show(sprite); | 	UIContext* context = UIContext::instance(); | ||||||
|  | 	context->show_sprite(sprite); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -38,17 +38,18 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_new_frame_enabled(const char *argument) | static bool cmd_new_frame_enabled(const char *argument) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|   return |   return | ||||||
|     current_sprite && |     sprite && | ||||||
|     current_sprite->layer && |     sprite->layer && | ||||||
|     layer_is_readable(current_sprite->layer) && |     layer_is_readable(sprite->layer) && | ||||||
|     layer_is_writable(current_sprite->layer) && |     layer_is_writable(sprite->layer) && | ||||||
|     layer_is_image(current_sprite->layer); |     layer_is_image(sprite->layer); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_new_frame_execute(const char *argument) | static void cmd_new_frame_execute(const char *argument) | ||||||
| { | { | ||||||
|   Sprite* sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   { |   { | ||||||
|     Undoable undoable(sprite, "New Frame"); |     Undoable undoable(sprite, "New Frame"); | ||||||
|     undoable.new_frame(); |     undoable.new_frame(); | ||||||
|  |  | ||||||
|  | @ -31,13 +31,14 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_new_layer_enabled(const char *argument) | 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) | static void cmd_new_layer_execute(const char *argument) | ||||||
| { | { | ||||||
|   JWidget window, name_widget; |   JWidget window, name_widget; | ||||||
|   Sprite* sprite = current_sprite; /* get current sprite */ |   CurrentSprite sprite; | ||||||
| 
 | 
 | ||||||
|   /* load the window widget */ |   /* load the window widget */ | ||||||
|   window = load_widget("newlay.jid", "new_layer"); |   window = load_widget("newlay.jid", "new_layer"); | ||||||
|  |  | ||||||
|  | @ -30,15 +30,16 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_new_layer_set_enabled(const char *argument) | 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) | static void cmd_new_layer_set_execute(const char *argument) | ||||||
| { | { | ||||||
|   JWidget window; |   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"); |   window = load_widget("newlay.jid", "new_layer_set"); | ||||||
|   if (!window) |   if (!window) | ||||||
|     return; |     return; | ||||||
|  |  | ||||||
|  | @ -23,6 +23,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "jinete/jinete.h" | #include "jinete/jinete.h" | ||||||
| 
 | 
 | ||||||
|  | #include "ase/ui_context.h" | ||||||
| #include "commands/commands.h" | #include "commands/commands.h" | ||||||
| #include "console/console.h" | #include "console/console.h" | ||||||
| #include "core/app.h" | #include "core/app.h" | ||||||
|  | @ -56,7 +57,7 @@ static void openfile_bg(void *fop_data) | ||||||
|   fop_operate(fop); |   fop_operate(fop); | ||||||
| 
 | 
 | ||||||
|   if (fop_is_stop(fop) && fop->sprite) { |   if (fop_is_stop(fop) && fop->sprite) { | ||||||
|     sprite_free(fop->sprite); |     delete fop->sprite; | ||||||
|     fop->sprite = NULL; |     fop->sprite = NULL; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | @ -197,9 +198,11 @@ static void cmd_open_file_execute(const char *argument) | ||||||
| 	  else { | 	  else { | ||||||
| 	    Sprite *sprite = fop->sprite; | 	    Sprite *sprite = fop->sprite; | ||||||
| 	    if (sprite) { | 	    if (sprite) { | ||||||
|  | 	      UIContext* context = UIContext::instance(); | ||||||
|  | 
 | ||||||
| 	      recent_file(fop->filename); | 	      recent_file(fop->filename); | ||||||
| 	      sprite_mount(sprite); | 	      context->add_sprite(sprite); | ||||||
| 	      sprite_show(sprite); | 	      context->show_sprite(sprite); | ||||||
| 	    } | 	    } | ||||||
| 	    /* if the sprite isn't NULL and the file-operation wasn't
 | 	    /* if the sprite isn't NULL and the file-operation wasn't
 | ||||||
| 	       stopped by the user...  */ | 	       stopped by the user...  */ | ||||||
|  |  | ||||||
|  | @ -32,7 +32,6 @@ | ||||||
| #include "modules/gui.h" | #include "modules/gui.h" | ||||||
| #include "modules/palettes.h" | #include "modules/palettes.h" | ||||||
| #include "modules/sprites.h" | #include "modules/sprites.h" | ||||||
| #include "modules/sprites.h" |  | ||||||
| #include "raster/image.h" | #include "raster/image.h" | ||||||
| #include "raster/palette.h" | #include "raster/palette.h" | ||||||
| #include "raster/sprite.h" | #include "raster/sprite.h" | ||||||
|  | @ -75,8 +74,9 @@ static void cmd_palette_editor_execute(const char *argument) | ||||||
|   JWidget button_ramp, button_quantize; |   JWidget button_ramp, button_quantize; | ||||||
|   int frame, columns; |   int frame, columns; | ||||||
|   Palette *palette = NULL; |   Palette *palette = NULL; | ||||||
|   int imgtype = current_sprite ? current_sprite->imgtype: IMAGE_INDEXED; |   CurrentSprite sprite; | ||||||
|   int frame_bak = current_sprite ? current_sprite->frame : 0; |   int imgtype = sprite ? sprite->imgtype: IMAGE_INDEXED; | ||||||
|  |   int frame_bak = sprite ? sprite->frame : 0; | ||||||
|   bool all_frames_same_palette = TRUE; |   bool all_frames_same_palette = TRUE; | ||||||
| 
 | 
 | ||||||
|   if (imgtype == IMAGE_GRAYSCALE) { |   if (imgtype == IMAGE_GRAYSCALE) { | ||||||
|  | @ -114,16 +114,16 @@ static void cmd_palette_editor_execute(const char *argument) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /* create current_sprite->frames palettes */ |   /* create current_sprite->frames palettes */ | ||||||
|   if (current_sprite) { |   if (sprite) { | ||||||
|     palettes = (Palette **)jmalloc(sizeof(Palette *) * current_sprite->frames); |     palettes = (Palette **)jmalloc(sizeof(Palette *) * sprite->frames); | ||||||
|     if (!palettes) { |     if (!palettes) { | ||||||
|       jalert(_("Error<<Not enough memory||&OK")); |       jalert(_("Error<<Not enough memory||&OK")); | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|     for (frame=0; frame<current_sprite->frames; ++frame) { |     for (frame=0; frame<sprite->frames; ++frame) { | ||||||
|       palettes[frame] = palette_new(frame, MAX_PALETTE_COLORS); |       palettes[frame] = palette_new(frame, MAX_PALETTE_COLORS); | ||||||
|       palette_copy_colors(palettes[frame], |       palette_copy_colors(palettes[frame], | ||||||
| 			  sprite_get_palette(current_sprite, frame)); | 			  sprite_get_palette(sprite, frame)); | ||||||
| 
 | 
 | ||||||
|       if (frame > 0 && |       if (frame > 0 && | ||||||
| 	  palette_count_diff(palettes[frame-1], palettes[frame], NULL, NULL) > 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); |     jwidget_deselect(check_all_frames); | ||||||
|    |    | ||||||
|   /* frame */ |   /* frame */ | ||||||
|   if (current_sprite) { |   if (sprite) { | ||||||
|     jslider_set_range(slider_frame, 0, current_sprite->frames-1); |     jslider_set_range(slider_frame, 0, sprite->frames-1); | ||||||
|     jslider_set_value(slider_frame, current_sprite->frame); |     jslider_set_value(slider_frame, sprite->frame); | ||||||
|      |      | ||||||
|     if (jwidget_is_selected(check_all_frames)) |     if (jwidget_is_selected(check_all_frames)) | ||||||
|       jwidget_disable(slider_frame); |       jwidget_disable(slider_frame); | ||||||
|  | @ -207,8 +207,8 @@ static void cmd_palette_editor_execute(const char *argument) | ||||||
| 
 | 
 | ||||||
|   /* check the killer widget */ |   /* check the killer widget */ | ||||||
|   if (jwindow_get_killer(window) == button_ok) { |   if (jwindow_get_killer(window) == button_ok) { | ||||||
|     if (current_sprite) { |     if (sprite) { | ||||||
|       sprite_reset_palettes(current_sprite); |       sprite_reset_palettes(sprite); | ||||||
| 
 | 
 | ||||||
|       /* one palette */ |       /* one palette */ | ||||||
|       if (jwidget_is_selected(check_all_frames)) { |       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], | 	palette_copy_colors(palettes[0], | ||||||
| 			    get_current_palette()); | 			    get_current_palette()); | ||||||
| 
 | 
 | ||||||
| 	sprite_set_palette(current_sprite, palettes[0], TRUE); | 	sprite_set_palette(sprite, palettes[0], TRUE); | ||||||
|       } |       } | ||||||
|       /* various palettes */ |       /* various palettes */ | ||||||
|       else { |       else { | ||||||
|  | @ -224,11 +224,11 @@ static void cmd_palette_editor_execute(const char *argument) | ||||||
| 	palette_copy_colors(palettes[frame], | 	palette_copy_colors(palettes[frame], | ||||||
| 			    get_current_palette()); | 			    get_current_palette()); | ||||||
| 
 | 
 | ||||||
| 	for (frame=0; frame<current_sprite->frames; ++frame) { | 	for (frame=0; frame<sprite->frames; ++frame) { | ||||||
| 	  if (frame == 0 || | 	  if (frame == 0 || | ||||||
| 	      palette_count_diff(palettes[frame], | 	      palette_count_diff(palettes[frame], | ||||||
| 				 palettes[frame-1], NULL, NULL) > 0) { | 				 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 */ |   /* cancel or ESC */ | ||||||
|   else { |   else { | ||||||
|     /* restore the system palette */ |     /* restore the system palette */ | ||||||
|     if (current_sprite) { |     if (sprite) { | ||||||
|       current_sprite->frame = frame_bak; |       sprite->frame = frame_bak; | ||||||
|       set_current_palette(sprite_get_palette(current_sprite, frame_bak), TRUE); |       set_current_palette(sprite_get_palette(sprite, frame_bak), TRUE); | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|       set_current_palette(NULL, TRUE); |       set_current_palette(NULL, TRUE); | ||||||
|  | @ -264,9 +264,9 @@ static void cmd_palette_editor_execute(const char *argument) | ||||||
|   jwidget_free(window); |   jwidget_free(window); | ||||||
| 
 | 
 | ||||||
|   if (palettes) { |   if (palettes) { | ||||||
|     assert(current_sprite); |     assert(sprite); | ||||||
| 
 | 
 | ||||||
|     for (frame=0; frame<current_sprite->frames; ++frame) |     for (frame=0; frame<sprite->frames; ++frame) | ||||||
|       palette_free(palettes[frame]); |       palette_free(palettes[frame]); | ||||||
| 
 | 
 | ||||||
|     jfree(palettes); |     jfree(palettes); | ||||||
|  | @ -354,6 +354,7 @@ static void ramp_command(JWidget widget) | ||||||
| 
 | 
 | ||||||
| static void quantize_command(JWidget widget) | static void quantize_command(JWidget widget) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|   Palette *palette = palette_new(0, MAX_PALETTE_COLORS); |   Palette *palette = palette_new(0, MAX_PALETTE_COLORS); | ||||||
|   bool array[256]; |   bool array[256]; | ||||||
| 
 | 
 | ||||||
|  | @ -361,8 +362,8 @@ static void quantize_command(JWidget widget) | ||||||
|   palette_copy_colors(palette, |   palette_copy_colors(palette, | ||||||
| 		      paledit_get_palette(palette_editor)); | 		      paledit_get_palette(palette_editor)); | ||||||
| 
 | 
 | ||||||
|   if (current_sprite && current_sprite->imgtype == IMAGE_RGB) { |   if (sprite && sprite->imgtype == IMAGE_RGB) { | ||||||
|     sprite_quantize_ex(current_sprite, palette); |     sprite_quantize_ex(sprite, palette); | ||||||
|   } |   } | ||||||
|   else { |   else { | ||||||
|     jalert(_("Error<<You can use this command only for RGB sprites||&OK")); |     jalert(_("Error<<You can use this command only for RGB sprites||&OK")); | ||||||
|  | @ -436,12 +437,13 @@ static bool slider_columns_change_hook(JWidget widget, void *data) | ||||||
| 
 | 
 | ||||||
| static bool slider_frame_change_hook(JWidget widget, void *data) | static bool slider_frame_change_hook(JWidget widget, void *data) | ||||||
| { | { | ||||||
|   int old_frame = current_sprite->frame; |   CurrentSprite sprite; | ||||||
|  |   int old_frame = sprite->frame; | ||||||
|   int new_frame = jslider_get_value(slider_frame); |   int new_frame = jslider_get_value(slider_frame); | ||||||
| 
 | 
 | ||||||
|   palette_copy_colors(palettes[old_frame], |   palette_copy_colors(palettes[old_frame], | ||||||
| 		      get_current_palette()); | 		      get_current_palette()); | ||||||
|   current_sprite->frame = new_frame; |   sprite->frame = new_frame; | ||||||
|   set_new_palette(palettes[new_frame]); |   set_new_palette(palettes[new_frame]); | ||||||
| 
 | 
 | ||||||
|   return FALSE; |   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) | static bool check_all_frames_change_hook(JWidget widget, void *data) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|   int frame = jslider_get_value(slider_frame); |   int frame = jslider_get_value(slider_frame); | ||||||
| 
 | 
 | ||||||
|   palette_copy_colors(palettes[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; |     bool has_two_or_more_palettes = FALSE; | ||||||
|     int c; |     int c; | ||||||
| 
 | 
 | ||||||
|     for (c=1; c<current_sprite->frames; c++) { |     for (c=1; c<sprite->frames; c++) { | ||||||
|       if (palette_count_diff(palettes[c-1], palettes[c], NULL, NULL) > 0) { |       if (palette_count_diff(palettes[c-1], palettes[c], NULL, NULL) > 0) { | ||||||
| 	has_two_or_more_palettes = TRUE; | 	has_two_or_more_palettes = TRUE; | ||||||
| 	break; | 	break; | ||||||
|  |  | ||||||
|  | @ -26,17 +26,19 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_paste_enabled(const char *argument) | static bool cmd_paste_enabled(const char *argument) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
| 
 | 
 | ||||||
|   return (sprite && clipboard::can_paste()); |   return (sprite && clipboard::can_paste()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_paste_execute(const char *argument) | static void cmd_paste_execute(const char *argument) | ||||||
| { | { | ||||||
|   if (undo_is_enabled(current_sprite->undo)) |   CurrentSprite sprite; | ||||||
|     undo_set_label(current_sprite->undo, "Paste"); |  | ||||||
| 
 | 
 | ||||||
|   clipboard::paste(current_sprite); |   if (undo_is_enabled(sprite->undo)) | ||||||
|  |     undo_set_label(sprite->undo, "Paste"); | ||||||
|  | 
 | ||||||
|  |   clipboard::paste(sprite); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Command cmd_paste = { | Command cmd_paste = { | ||||||
|  |  | ||||||
|  | @ -43,12 +43,13 @@ END_OF_STATIC_FUNCTION(speed_timer_callback); | ||||||
| 
 | 
 | ||||||
| static bool cmd_play_animation_enabled(const char *argument) | 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) | static void cmd_play_animation_execute(const char *argument) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   int old_frame, msecs; |   int old_frame, msecs; | ||||||
|   bool done = FALSE; |   bool done = FALSE; | ||||||
|   bool onionskin = get_onionskin(); |   bool onionskin = get_onionskin(); | ||||||
|  |  | ||||||
|  | @ -43,7 +43,8 @@ static void preview_sprite(int flags); | ||||||
| 
 | 
 | ||||||
| static bool cmd_preview_enabled(const char *argument) | static bool cmd_preview_enabled(const char *argument) | ||||||
| { | { | ||||||
|   return current_sprite != NULL; |   CurrentSprite sprite; | ||||||
|  |   return sprite; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* ======================== */ | /* ======================== */ | ||||||
|  |  | ||||||
|  | @ -28,18 +28,21 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_redo_enabled(const char *argument) | 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) | static void cmd_redo_execute(const char *argument) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|  | 
 | ||||||
|   statusbar_show_tip(app_get_statusbar(), 1000, |   statusbar_show_tip(app_get_statusbar(), 1000, | ||||||
| 		     _("Redid %s"), | 		     _("Redid %s"), | ||||||
| 		     undo_get_next_redo_label(current_sprite->undo)); | 		     undo_get_next_redo_label(sprite->undo)); | ||||||
| 
 | 
 | ||||||
|   undo_do_redo(current_sprite->undo); |   undo_do_redo(sprite->undo); | ||||||
|   sprite_generate_mask_boundaries(current_sprite); |   sprite_generate_mask_boundaries(sprite); | ||||||
|   update_screen_for_sprite(current_sprite); |   update_screen_for_sprite(sprite); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Command cmd_redo = { | Command cmd_redo = { | ||||||
|  |  | ||||||
|  | @ -28,18 +28,19 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_remove_cel_enabled(const char *argument) | static bool cmd_remove_cel_enabled(const char *argument) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|   return |   return | ||||||
|     current_sprite && |     sprite && | ||||||
|     current_sprite->layer && |     sprite->layer && | ||||||
|     layer_is_readable(current_sprite->layer) && |     layer_is_readable(sprite->layer) && | ||||||
|     layer_is_writable(current_sprite->layer) && |     layer_is_writable(sprite->layer) && | ||||||
|     layer_is_image(current_sprite->layer) && |     layer_is_image(sprite->layer) && | ||||||
|     layer_get_cel(current_sprite->layer, current_sprite->frame); |     layer_get_cel(sprite->layer, sprite->frame); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_remove_cel_execute(const char *argument) | static void cmd_remove_cel_execute(const char *argument) | ||||||
| { | { | ||||||
|   Sprite* sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   Cel* cel = layer_get_cel(sprite->layer, sprite->frame); |   Cel* cel = layer_get_cel(sprite->layer, sprite->frame); | ||||||
|   { |   { | ||||||
|     Undoable undoable(sprite, "Remove Cel"); |     Undoable undoable(sprite, "Remove Cel"); | ||||||
|  |  | ||||||
|  | @ -28,14 +28,15 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_remove_frame_enabled(const char *argument) | static bool cmd_remove_frame_enabled(const char *argument) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|   return |   return | ||||||
|     current_sprite != NULL && |     sprite != NULL && | ||||||
|     current_sprite->frames > 1; |     sprite->frames > 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_remove_frame_execute(const char *argument) | static void cmd_remove_frame_execute(const char *argument) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   { |   { | ||||||
|     Undoable undoable(sprite, "Remove Frame"); |     Undoable undoable(sprite, "Remove Frame"); | ||||||
|     undoable.remove_frame(sprite->frame); |     undoable.remove_frame(sprite->frame); | ||||||
|  |  | ||||||
|  | @ -27,14 +27,15 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_remove_layer_enabled(const char *argument) | static bool cmd_remove_layer_enabled(const char *argument) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|   return |   return | ||||||
|     current_sprite != NULL && |     sprite != NULL && | ||||||
|     current_sprite->layer != NULL; |     sprite->layer != NULL; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_remove_layer_execute(const char *argument) | static void cmd_remove_layer_execute(const char *argument) | ||||||
| { | { | ||||||
|   Sprite* sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   { |   { | ||||||
|     Undoable undoable(sprite, "Remove Layer"); |     Undoable undoable(sprite, "Remove Layer"); | ||||||
|     undoable.remove_layer(sprite->layer); |     undoable.remove_layer(sprite->layer); | ||||||
|  |  | ||||||
|  | @ -27,14 +27,15 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_reselect_mask_enabled(const char *argument) | static bool cmd_reselect_mask_enabled(const char *argument) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|   return |   return | ||||||
|     current_sprite != NULL && |     sprite != NULL && | ||||||
|     sprite_request_mask(current_sprite, "*deselected*") != NULL; |     sprite_request_mask(sprite, "*deselected*") != NULL; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_reselect_mask_execute(const char *argument) | static void cmd_reselect_mask_execute(const char *argument) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   Mask *mask; |   Mask *mask; | ||||||
| 
 | 
 | ||||||
|   /* request *deselected* mask */ |   /* request *deselected* mask */ | ||||||
|  |  | ||||||
|  | @ -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) | static void save_as_dialog(const char* dlg_title, bool mark_as_saved) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   char exts[4096]; |   char exts[4096]; | ||||||
|   jstring filename; |   jstring filename; | ||||||
|   jstring newfilename; |   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) | 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) | 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
 |   /* if the sprite is associated to a file in the file-system, we can
 | ||||||
|      save it directly without user interaction */ |      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) | 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) | 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) | 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) | static void cmd_save_file_copy_as_execute(const char *argument) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   jstring old_filename = sprite->filename; |   jstring old_filename = sprite->filename; | ||||||
| 
 | 
 | ||||||
|   // show "Save As" dialog
 |   // show "Save As" dialog
 | ||||||
|  |  | ||||||
|  | @ -31,17 +31,17 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_save_mask_enabled(const char *argument) | static bool cmd_save_mask_enabled(const char *argument) | ||||||
| { | { | ||||||
|   if (!current_sprite) |   CurrentSprite sprite; | ||||||
|     return FALSE; |   if (!sprite) | ||||||
|  |     return false; | ||||||
|   else |   else | ||||||
|     return (current_sprite->mask && |     return (sprite->mask && | ||||||
| 	    current_sprite->mask->bitmap) ? TRUE: FALSE; | 	    sprite->mask->bitmap) ? true: false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_save_mask_execute(const char *argument) | static void cmd_save_mask_execute(const char *argument) | ||||||
| { | { | ||||||
|   /* get current sprite */ |   CurrentSprite sprite; | ||||||
|   Sprite *sprite = current_sprite; |  | ||||||
|   jstring filename = "default.msk"; |   jstring filename = "default.msk"; | ||||||
|   int ret; |   int ret; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -100,7 +100,7 @@ static void cmd_screen_shot_execute(const char *argument) | ||||||
|     sprite_save(sprite); |     sprite_save(sprite); | ||||||
| 
 | 
 | ||||||
|     /* destroy the sprite */ |     /* destroy the sprite */ | ||||||
|     sprite_free(sprite); |     delete sprite; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /* destroy the bitmap */ |   /* destroy the bitmap */ | ||||||
|  |  | ||||||
|  | @ -24,6 +24,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "jinete/jinete.h" | #include "jinete/jinete.h" | ||||||
| 
 | 
 | ||||||
|  | #include "ase/ui_context.h" | ||||||
| #include "commands/commands.h" | #include "commands/commands.h" | ||||||
| #include "core/app.h" | #include "core/app.h" | ||||||
| #include "modules/sprites.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) | static bool cmd_select_file_checked(const char *argument) | ||||||
| { | { | ||||||
|  |   CurrentSprite current_sprite; | ||||||
|  | 
 | ||||||
|   if (argument) { |   if (argument) { | ||||||
|     int sprite_id = ustrtol(argument, NULL, 10); |     int sprite_id = ustrtol(argument, NULL, 10); | ||||||
|     GfxObj *gfxobj = gfxobj_find(sprite_id); |     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) | static void cmd_select_file_execute(const char *argument) | ||||||
| { | { | ||||||
|  |   UIContext* context = UIContext::instance(); | ||||||
|  | 
 | ||||||
|   if (argument) { |   if (argument) { | ||||||
|     int sprite_id = ustrtol(argument, NULL, 10); |     int sprite_id = ustrtol(argument, NULL, 10); | ||||||
|     GfxObj *gfxobj = gfxobj_find(sprite_id); |     GfxObj* gfxobj = gfxobj_find(sprite_id); | ||||||
|     assert(gfxobj != NULL); |     assert(gfxobj != NULL); | ||||||
| 
 | 
 | ||||||
|     sprite_show((Sprite *)gfxobj); |     context->show_sprite((Sprite*)gfxobj); | ||||||
|   } |   } | ||||||
|   else { |   else { | ||||||
|     sprite_show(NULL); |     context->show_sprite(NULL); | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -36,13 +36,14 @@ void dialogs_frame_length(int sprite_frpos); | ||||||
| 
 | 
 | ||||||
| static bool cmd_sprite_properties_enabled(const char *argument) | 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) | static void cmd_sprite_properties_execute(const char *argument) | ||||||
| { | { | ||||||
|   JWidget window, killer, name, type, size, frames, speed, ok; |   JWidget window, killer, name, type, size, frames, speed, ok; | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   jstring imgtype_text; |   jstring imgtype_text; | ||||||
|   char buf[256]; |   char buf[256]; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -46,6 +46,7 @@ class SpriteSizeJob : public Job | ||||||
| public: | public: | ||||||
| 
 | 
 | ||||||
|   SpriteSizeJob(Sprite* sprite, int new_width, int new_height, ResizeMethod resize_method) |   SpriteSizeJob(Sprite* sprite, int new_width, int new_height, ResizeMethod resize_method) | ||||||
|  |     : Job("Sprite Size") | ||||||
|   { |   { | ||||||
|     m_sprite = sprite; |     m_sprite = sprite; | ||||||
|     m_new_width = new_width; |     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) | 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) | static void cmd_sprite_size_execute(const char *argument) | ||||||
| { | { | ||||||
|   JWidget window, width_px, height_px, width_perc, height_perc, lock_ratio, method, ok; |   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
 |   // load the window widget
 | ||||||
|   window = load_widget("sprsize.jid", "sprite_size"); |   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) | static bool lock_ratio_change_hook(JWidget widget, void *data) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|  | 
 | ||||||
|   if (widget->selected()) |   if (widget->selected()) | ||||||
|     width_px_change_hook(widget->find_sibling("width_px"), NULL); |     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) | static bool width_px_change_hook(JWidget widget, void *data) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|   int width = widget->text_int(); |   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); |   widget->find_sibling("width_perc")->textf(PERC_FORMAT, perc); | ||||||
| 
 | 
 | ||||||
|   if (widget->find_sibling("lock_ratio")->selected()) { |   if (widget->find_sibling("lock_ratio")->selected()) { | ||||||
|     widget->find_sibling("height_perc")->textf(PERC_FORMAT, perc); |     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; |   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) | static bool height_px_change_hook(JWidget widget, void *data) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|   int height = widget->text_int(); |   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); |   widget->find_sibling("height_perc")->textf(PERC_FORMAT, perc); | ||||||
| 
 | 
 | ||||||
|   if (widget->find_sibling("lock_ratio")->selected()) { |   if (widget->find_sibling("lock_ratio")->selected()) { | ||||||
|     widget->find_sibling("width_perc")->textf(PERC_FORMAT, perc); |     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; |   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) | static bool width_perc_change_hook(JWidget widget, void *data) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|   double width = widget->text_double(); |   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()) { |   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()); |     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) | static bool height_perc_change_hook(JWidget widget, void *data) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|   double height = widget->text_double(); |   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()) { |   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()); |     widget->find_sibling("width_perc")->text(widget->text()); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -28,18 +28,21 @@ | ||||||
| 
 | 
 | ||||||
| static bool cmd_undo_enabled(const char *argument) | 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) | static void cmd_undo_execute(const char *argument) | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|  | 
 | ||||||
|   statusbar_show_tip(app_get_statusbar(), 1000, |   statusbar_show_tip(app_get_statusbar(), 1000, | ||||||
| 		     _("Undid %s"), | 		     _("Undid %s"), | ||||||
| 		     undo_get_next_undo_label(current_sprite->undo)); | 		     undo_get_next_undo_label(sprite->undo)); | ||||||
| 
 | 
 | ||||||
|   undo_do_undo(current_sprite->undo); |   undo_do_undo(sprite->undo); | ||||||
|   sprite_generate_mask_boundaries(current_sprite); |   sprite_generate_mask_boundaries(sprite); | ||||||
|   update_screen_for_sprite(current_sprite); |   update_screen_for_sprite(sprite); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Command cmd_undo = { | Command cmd_undo = { | ||||||
|  |  | ||||||
|  | @ -48,7 +48,8 @@ static void make_preview(); | ||||||
| 
 | 
 | ||||||
| static bool cmd_color_curve_enabled(const char *argument) | 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) | 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 window, button_ok; | ||||||
|   JWidget view_curve, curve_editor; |   JWidget view_curve, curve_editor; | ||||||
|   JWidget box_target, target_button; |   JWidget box_target, target_button; | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   Image *image; |   Image *image; | ||||||
|   Effect *effect; |   Effect *effect; | ||||||
| 
 | 
 | ||||||
|  | @ -71,7 +72,7 @@ static void cmd_color_curve_execute(const char *argument) | ||||||
| 		 the_curve); | 		 the_curve); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   image = GetImage(current_sprite); |   image = GetImage(sprite); | ||||||
|   if (!image) |   if (!image) | ||||||
|     return; |     return; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -70,7 +70,8 @@ static void make_preview(); | ||||||
| 
 | 
 | ||||||
| static bool cmd_convolution_matrix_enabled(const char *argument) | 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) | 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 view_convmatr, list_convmatr; | ||||||
|   JWidget box_target; |   JWidget box_target; | ||||||
|   JWidget reload, generate; |   JWidget reload, generate; | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   Image *image; |   Image *image; | ||||||
|   Effect *effect; |   Effect *effect; | ||||||
| 
 | 
 | ||||||
|   image = GetImage(current_sprite); |   image = GetImage(sprite); | ||||||
|   if (!image) |   if (!image) | ||||||
|     return; |     return; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -57,17 +57,19 @@ static void make_preview(); | ||||||
| 
 | 
 | ||||||
| static bool cmd_despeckle_enabled(const char *argument) | static bool cmd_despeckle_enabled(const char *argument) | ||||||
| { | { | ||||||
|   return current_sprite != NULL; |   CurrentSprite sprite; | ||||||
|  |   return sprite; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cmd_despeckle_execute(const char *argument) | static void cmd_despeckle_execute(const char *argument) | ||||||
| { | { | ||||||
|   JWidget window, box_target, target_button, button_ok; |   JWidget window, box_target, target_button, button_ok; | ||||||
|  |   CurrentSprite sprite; | ||||||
|   Image *image; |   Image *image; | ||||||
|   Effect *effect; |   Effect *effect; | ||||||
|   char buf[32]; |   char buf[32]; | ||||||
| 
 | 
 | ||||||
|   image = GetImage(current_sprite); |   image = GetImage(sprite); | ||||||
|   if (!image) |   if (!image) | ||||||
|     return; |     return; | ||||||
| 
 | 
 | ||||||
|  | @ -86,7 +88,7 @@ static void cmd_despeckle_execute(const char *argument) | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   effect = effect_new(current_sprite, "median"); |   effect = effect_new(sprite, "median"); | ||||||
|   if (!effect) { |   if (!effect) { | ||||||
|     console_printf(_("Error creating the effect applicator for this sprite\n")); |     console_printf(_("Error creating the effect applicator for this sprite\n")); | ||||||
|     jwidget_free(window); |     jwidget_free(window); | ||||||
|  | @ -98,7 +100,7 @@ static void cmd_despeckle_execute(const char *argument) | ||||||
| 
 | 
 | ||||||
|   preview = preview_new(effect); |   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); |   target_button_set_target(target_button, effect->target); | ||||||
| 
 | 
 | ||||||
|   sprintf(buf, "%d", get_config_int("Median", "Width", 3)); |   sprintf(buf, "%d", get_config_int("Median", "Width", 3)); | ||||||
|  | @ -141,7 +143,7 @@ static void cmd_despeckle_execute(const char *argument) | ||||||
|   effect_free(effect); |   effect_free(effect); | ||||||
| 
 | 
 | ||||||
|   /* update editors */ |   /* update editors */ | ||||||
|   update_screen_for_sprite(current_sprite); |   update_screen_for_sprite(sprite); | ||||||
| 
 | 
 | ||||||
|   /* save window configuration */ |   /* save window configuration */ | ||||||
|   save_window_pos(window, "Median"); |   save_window_pos(window, "Median"); | ||||||
|  |  | ||||||
|  | @ -51,17 +51,18 @@ static void make_preview(); | ||||||
| 
 | 
 | ||||||
| static bool cmd_invert_color_enabled(const char *argument) | 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) | static void cmd_invert_color_execute(const char *argument) | ||||||
| { | { | ||||||
|   JWidget window, box_target, target_button, button_ok; |   JWidget window, box_target, target_button, button_ok; | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   Image *image; |   Image *image; | ||||||
|   Effect *effect; |   Effect *effect; | ||||||
| 
 | 
 | ||||||
|   image = GetImage(current_sprite); |   image = GetImage(sprite); | ||||||
|   if (!image) |   if (!image) | ||||||
|     return; |     return; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -54,7 +54,8 @@ static void make_preview(); | ||||||
| 
 | 
 | ||||||
| static bool cmd_replace_color_enabled(const char *argument) | 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) | 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; |   JWidget button_ok; | ||||||
|   Image *image; |   Image *image; | ||||||
|   Effect *effect; |   Effect *effect; | ||||||
|   Sprite *sprite; |  | ||||||
| 
 | 
 | ||||||
|   sprite = lock_current_sprite(); |   CurrentSprite sprite; | ||||||
|   if (!sprite) |   if (!sprite) | ||||||
|     return; |     return; | ||||||
| 
 | 
 | ||||||
|   image = GetImage(current_sprite); |   image = GetImage(sprite); | ||||||
|   if (!image) |   if (!image) | ||||||
|     goto done; |     goto done; | ||||||
| 
 | 
 | ||||||
|  | @ -103,14 +103,14 @@ static void cmd_replace_color_execute(const char *argument) | ||||||
|   button_color1 = colorbutton_new |   button_color1 = colorbutton_new | ||||||
|     (get_config_color("ReplaceColor", "Color1", |     (get_config_color("ReplaceColor", "Color1", | ||||||
| 		      colorbar_get_fg_color(app_get_colorbar())), | 		      colorbar_get_fg_color(app_get_colorbar())), | ||||||
|      current_sprite->imgtype); |      sprite->imgtype); | ||||||
| 
 | 
 | ||||||
|   button_color2 = colorbutton_new |   button_color2 = colorbutton_new | ||||||
|     (get_config_color("ReplaceColor", "Color2", |     (get_config_color("ReplaceColor", "Color2", | ||||||
| 		      colorbar_get_bg_color(app_get_colorbar())), | 		      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); |   target_button_set_target(target_button, effect->target); | ||||||
| 
 | 
 | ||||||
|   jslider_set_value(slider_fuzziness, |   jslider_set_value(slider_fuzziness, | ||||||
|  | @ -149,7 +149,7 @@ static void cmd_replace_color_execute(const char *argument) | ||||||
|   effect_free(effect); |   effect_free(effect); | ||||||
| 
 | 
 | ||||||
|   /* update editors */ |   /* update editors */ | ||||||
|   update_screen_for_sprite(current_sprite); |   update_screen_for_sprite(sprite); | ||||||
| 
 | 
 | ||||||
|   /* save window configuration */ |   /* save window configuration */ | ||||||
|   save_window_pos(window, "ReplaceColor"); |   save_window_pos(window, "ReplaceColor"); | ||||||
|  | @ -157,8 +157,6 @@ static void cmd_replace_color_execute(const char *argument) | ||||||
| done:; | done:; | ||||||
|   if (window) |   if (window) | ||||||
|     jwidget_free(window); |     jwidget_free(window); | ||||||
| 
 |  | ||||||
|   sprite_unlock(sprite); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static bool color_change_hook(JWidget widget, void *data) | 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() | static void make_preview() | ||||||
| { | { | ||||||
|  |   CurrentSprite sprite; | ||||||
|   color_t from, to; |   color_t from, to; | ||||||
|   int fuzziness; |   int fuzziness; | ||||||
| 
 | 
 | ||||||
|  | @ -203,8 +202,8 @@ static void make_preview() | ||||||
|   to = get_config_color("ReplaceColor", "Color2", color_mask()); |   to = get_config_color("ReplaceColor", "Color2", color_mask()); | ||||||
|   fuzziness = get_config_int("ReplaceColor", "Fuzziness", 0); |   fuzziness = get_config_int("ReplaceColor", "Fuzziness", 0); | ||||||
| 
 | 
 | ||||||
|   set_replace_colors(get_color_for_layer(current_sprite->layer, from), |   set_replace_colors(get_color_for_layer(sprite->layer, from), | ||||||
| 		     get_color_for_layer(current_sprite->layer, to), | 		     get_color_for_layer(sprite->layer, to), | ||||||
| 		     MID(0, fuzziness, 255)); | 		     MID(0, fuzziness, 255)); | ||||||
| 
 | 
 | ||||||
|   if (jwidget_is_selected(check_preview)) |   if (jwidget_is_selected(check_preview)) | ||||||
|  |  | ||||||
|  | @ -30,6 +30,7 @@ | ||||||
| #include "jinete/jinete.h" | #include "jinete/jinete.h" | ||||||
| #include "jinete/jintern.h" | #include "jinete/jintern.h" | ||||||
| 
 | 
 | ||||||
|  | #include "ase/ui_context.h" | ||||||
| #include "commands/commands.h" | #include "commands/commands.h" | ||||||
| #include "console/console.h" | #include "console/console.h" | ||||||
| #include "core/app.h" | #include "core/app.h" | ||||||
|  | @ -291,10 +292,8 @@ void app_loop() | ||||||
|     switch (option->type) { |     switch (option->type) { | ||||||
| 
 | 
 | ||||||
|       case OPEN_GFX_FILE: { |       case OPEN_GFX_FILE: { | ||||||
| 	Sprite *sprite; |  | ||||||
| 
 |  | ||||||
| 	/* load the sprite */ | 	/* load the sprite */ | ||||||
| 	sprite = sprite_load(option->data); | 	Sprite *sprite = sprite_load(option->data); | ||||||
| 	if (!sprite) { | 	if (!sprite) { | ||||||
| 	  /* error */ | 	  /* error */ | ||||||
| 	  if (ase_mode & MODE_GUI) | 	  if (ase_mode & MODE_GUI) | ||||||
|  | @ -304,12 +303,13 @@ void app_loop() | ||||||
| 	} | 	} | ||||||
| 	else { | 	else { | ||||||
| 	  /* mount and select the sprite */ | 	  /* mount and select the sprite */ | ||||||
| 	  sprite_mount(sprite); | 	  UIContext* context = UIContext::instance(); | ||||||
| 	  set_current_sprite(sprite); | 	  context->add_sprite(sprite); | ||||||
|  | 	  context->set_current_sprite(sprite); | ||||||
| 
 | 
 | ||||||
| 	  if (ase_mode & MODE_GUI) { | 	  if (ase_mode & MODE_GUI) { | ||||||
| 	    /* show it */ | 	    /* 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 */ | ||||||
| 	    recent_file(option->data); | 	    recent_file(option->data); | ||||||
|  | @ -333,8 +333,11 @@ void app_loop() | ||||||
|     dialogs_select_language(FALSE); |     dialogs_select_language(FALSE); | ||||||
| 
 | 
 | ||||||
|     /* show tips? */ |     /* show tips? */ | ||||||
|     if (!current_sprite) |     { | ||||||
|       dialogs_tips(FALSE); |       CurrentSprite sprite; | ||||||
|  |       if (!sprite) | ||||||
|  | 	dialogs_tips(FALSE); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     // support to drop files from Windows explorer
 |     // support to drop files from Windows explorer
 | ||||||
|     install_drop_files(); |     install_drop_files(); | ||||||
|  | @ -383,6 +386,7 @@ void app_exit() | ||||||
| 
 | 
 | ||||||
|   /* finalize modules, configuration and core */ |   /* finalize modules, configuration and core */ | ||||||
|   modules_exit(); |   modules_exit(); | ||||||
|  |   UIContext::destroy_instance(); | ||||||
|   editor_cursor_exit(); |   editor_cursor_exit(); | ||||||
|   boundary_exit(); |   boundary_exit(); | ||||||
| 
 | 
 | ||||||
|  | @ -426,10 +430,11 @@ void app_trigger_event(int app_event) | ||||||
| void app_refresh_screen() | void app_refresh_screen() | ||||||
| { | { | ||||||
|   if (ase_mode & MODE_GUI) { |   if (ase_mode & MODE_GUI) { | ||||||
|  |     CurrentSprite sprite; | ||||||
|  | 
 | ||||||
|     /* update the color palette */ |     /* update the color palette */ | ||||||
|     set_current_palette(current_sprite != NULL ? |     set_current_palette(sprite != NULL ? | ||||||
| 			sprite_get_palette(current_sprite, | 			sprite_get_palette(sprite, sprite->frame): NULL, | ||||||
| 					   current_sprite->frame): NULL, |  | ||||||
| 			FALSE); | 			FALSE); | ||||||
| 
 | 
 | ||||||
|     /* redraw the screen */ |     /* redraw the screen */ | ||||||
|  | @ -442,15 +447,14 @@ void app_refresh_screen() | ||||||
|  */ |  */ | ||||||
| void app_realloc_sprite_list() | void app_realloc_sprite_list() | ||||||
| { | { | ||||||
|   Sprite* sprite; |   UIContext* context = UIContext::instance(); | ||||||
|   JLink link; |   const SpriteList& list = context->get_sprite_list(); | ||||||
| 
 | 
 | ||||||
|   /* insert all other sprites */ |   /* insert all other sprites */ | ||||||
|   JI_LIST_FOR_EACH(get_sprite_list(), link) { |   for (SpriteList::const_iterator | ||||||
|     sprite = reinterpret_cast<Sprite*>(link->data); | 	 it = list.begin(); it != list.end(); ++it) { | ||||||
|     tabs_set_text_for_tab(tabsbar, |     Sprite* sprite = *it; | ||||||
| 			  get_filename(sprite->filename), |     tabs_set_text_for_tab(tabsbar, get_filename(sprite->filename), sprite); | ||||||
| 			  sprite); |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -510,8 +514,9 @@ bool app_realloc_recent_list() | ||||||
| 
 | 
 | ||||||
| int app_get_current_image_type() | int app_get_current_image_type() | ||||||
| { | { | ||||||
|   if (current_sprite) |   CurrentSprite sprite; | ||||||
|     return current_sprite->imgtype; |   if (sprite) | ||||||
|  |     return sprite->imgtype; | ||||||
|   else if (screen != NULL && bitmap_color_depth(screen) == 8) |   else if (screen != NULL && bitmap_color_depth(screen) == 8) | ||||||
|     return IMAGE_INDEXED; |     return IMAGE_INDEXED; | ||||||
|   else |   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) | static void tabsbar_select_callback(JWidget tabs, void *data, int button) | ||||||
| { | { | ||||||
|   // Note: data can be NULL (the "Nothing" tab)
 |   // Note: data can be NULL (the "Nothing" tab)
 | ||||||
|  |   Sprite* sprite = (Sprite*)data; | ||||||
| 
 | 
 | ||||||
|   // put as current sprite
 |   // put as current sprite
 | ||||||
|   sprite_show((Sprite *)data); |   UIContext* context = UIContext::instance(); | ||||||
|  |   context->show_sprite(sprite); | ||||||
| 
 | 
 | ||||||
|   // middle button: close the sprite
 |   // middle button: close the sprite
 | ||||||
|   if (data && (button & 4)) |   if (data && (button & 4)) | ||||||
|  |  | ||||||
|  | @ -29,7 +29,7 @@ | ||||||
| #include "modules/gui.h" | #include "modules/gui.h" | ||||||
| #include "widgets/statebar.h" | #include "widgets/statebar.h" | ||||||
| 
 | 
 | ||||||
| Job::Job() | Job::Job(const char* job_name) | ||||||
| { | { | ||||||
|   m_mutex = NULL; |   m_mutex = NULL; | ||||||
|   m_thread = NULL; |   m_thread = NULL; | ||||||
|  | @ -45,7 +45,7 @@ Job::Job() | ||||||
|   m_monitor = add_gui_monitor(&Job::monitor_proc, |   m_monitor = add_gui_monitor(&Job::monitor_proc, | ||||||
| 			      &Job::monitor_free, | 			      &Job::monitor_free, | ||||||
| 			      (void*)this); | 			      (void*)this); | ||||||
|   m_alert_window = jalert_new(PACKAGE "<<Working...||&Cancel"); |   m_alert_window = jalert_new("%s<<Working...||&Cancel", job_name); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Job::~Job() | Job::~Job() | ||||||
|  |  | ||||||
|  | @ -35,9 +35,14 @@ class Job | ||||||
|   bool m_done_flag; |   bool m_done_flag; | ||||||
|   bool m_canceled_flag; |   bool m_canceled_flag; | ||||||
| 
 | 
 | ||||||
|  |   // these methods are privated and not defined
 | ||||||
|  |   Job(); | ||||||
|  |   Job(const Job&); | ||||||
|  |   Job& operator==(const Job&); | ||||||
|  |    | ||||||
| public: | public: | ||||||
| 
 | 
 | ||||||
|   Job(); |   Job(const char* job_name); | ||||||
|   virtual ~Job(); |   virtual ~Job(); | ||||||
| 
 | 
 | ||||||
|   void do_job(); |   void do_job(); | ||||||
|  |  | ||||||
|  | @ -27,7 +27,6 @@ | ||||||
| #include "modules/palettes.h" | #include "modules/palettes.h" | ||||||
| #include "modules/recent.h" | #include "modules/recent.h" | ||||||
| #include "modules/rootmenu.h" | #include "modules/rootmenu.h" | ||||||
| #include "modules/sprites.h" |  | ||||||
| #include "modules/tools.h" | #include "modules/tools.h" | ||||||
| 
 | 
 | ||||||
| #define DEF_MODULE(name, reqs) \ | #define DEF_MODULE(name, reqs) \ | ||||||
|  | @ -48,7 +47,6 @@ static Module module[] = | ||||||
|      first ones.  */ |      first ones.  */ | ||||||
| 
 | 
 | ||||||
|   DEF_MODULE(palette,		REQUIRE_INTERFACE), |   DEF_MODULE(palette,		REQUIRE_INTERFACE), | ||||||
|   DEF_MODULE(sprites,		REQUIRE_INTERFACE), |  | ||||||
|   DEF_MODULE(effect,		REQUIRE_INTERFACE), |   DEF_MODULE(effect,		REQUIRE_INTERFACE), | ||||||
|   DEF_MODULE(tools,		REQUIRE_INTERFACE), |   DEF_MODULE(tools,		REQUIRE_INTERFACE), | ||||||
|   DEF_MODULE(graphics,		REQUIRE_INTERFACE), |   DEF_MODULE(graphics,		REQUIRE_INTERFACE), | ||||||
|  |  | ||||||
|  | @ -163,7 +163,7 @@ bool animation_editor_is_movingcel() | ||||||
|  */ |  */ | ||||||
| void switch_between_animation_and_sprite_editor() | void switch_between_animation_and_sprite_editor() | ||||||
| { | { | ||||||
|   Sprite* sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   JWidget window; |   JWidget window; | ||||||
|   JWidget anieditor; |   JWidget anieditor; | ||||||
|   int layer; |   int layer; | ||||||
|  |  | ||||||
|  | @ -47,7 +47,7 @@ void canvas_resize() | ||||||
|   JWidget check_w, check_h; |   JWidget check_w, check_h; | ||||||
|   JWidget button_offset; |   JWidget button_offset; | ||||||
|   JWidget button_ok, button_cancel; |   JWidget button_ok, button_cancel; | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
| 
 | 
 | ||||||
|   if (!is_interactive () || !sprite) |   if (!is_interactive () || !sprite) | ||||||
|     return; |     return; | ||||||
|  |  | ||||||
|  | @ -53,12 +53,13 @@ void dialogs_draw_text() | ||||||
|   Image *image, *dest_image; |   Image *image, *dest_image; | ||||||
|   JWidget window, button_ok, color_box, color_but; |   JWidget window, button_ok, color_box, color_but; | ||||||
|   JWidget entry_size, entry_text; |   JWidget entry_size, entry_text; | ||||||
|  |   CurrentSprite sprite; | ||||||
|   char buf[256]; |   char buf[256]; | ||||||
| 
 | 
 | ||||||
|   if (!is_interactive() || !current_sprite) |   if (!is_interactive() || !sprite) | ||||||
|     return; |     return; | ||||||
| 
 | 
 | ||||||
|   dest_image = GetImage(current_sprite); |   dest_image = GetImage(sprite); | ||||||
|   if (!dest_image) |   if (!dest_image) | ||||||
|     return; |     return; | ||||||
| 
 | 
 | ||||||
|  | @ -84,7 +85,7 @@ void dialogs_draw_text() | ||||||
|   color_but = colorbutton_new |   color_but = colorbutton_new | ||||||
|     (get_config_color("DrawText", "Color", |     (get_config_color("DrawText", "Color", | ||||||
| 		      colorbar_get_fg_color(app_get_colorbar())), | 		      colorbar_get_fg_color(app_get_colorbar())), | ||||||
|      current_sprite->imgtype); |      sprite->imgtype); | ||||||
| 
 | 
 | ||||||
|   jwidget_add_child(color_box, color_but); |   jwidget_add_child(color_box, color_but); | ||||||
| 
 | 
 | ||||||
|  | @ -126,7 +127,7 @@ void dialogs_draw_text() | ||||||
|       ji_font_set_size(f, size); |       ji_font_set_size(f, size); | ||||||
| 
 | 
 | ||||||
|       /* setup color */ |       /* setup color */ | ||||||
|       color = get_color_for_image(current_sprite->imgtype, |       color = get_color_for_image(sprite->imgtype, | ||||||
| 				  color_with_type); | 				  color_with_type); | ||||||
| 
 | 
 | ||||||
|       /* update configuration */ |       /* update configuration */ | ||||||
|  | @ -137,9 +138,8 @@ void dialogs_draw_text() | ||||||
|       /* render text */ |       /* render text */ | ||||||
|       image = render_text(f, text, color); |       image = render_text(f, text, color); | ||||||
|       if (image) { |       if (image) { | ||||||
| 	clipboard::copy_image(image, sprite_get_palette(current_sprite, | 	clipboard::copy_image(image, sprite_get_palette(sprite, sprite->frame)); | ||||||
| 							current_sprite->frame)); | 	clipboard::paste(sprite); | ||||||
| 	clipboard::paste(current_sprite); |  | ||||||
|       } |       } | ||||||
|       else |       else | ||||||
| 	console_printf(_("Error rendering text.\n")); | 	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; |   int i, pixels, w, h; | ||||||
|   Image *image; |   Image *image; | ||||||
|   BITMAP *bmp; |   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)); |   clear_to_color(bmp, makecol32 (255, 0, 255)); | ||||||
|   textout(bmp, f, text, 0, 0, makecol32 (255, 255, 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) { |   if (!image) { | ||||||
|     destroy_bitmap(bmp); |     destroy_bitmap(bmp); | ||||||
|     return NULL; |     return NULL; | ||||||
|  |  | ||||||
|  | @ -58,13 +58,13 @@ void dialogs_mask_color() | ||||||
|   JWidget label_color, button_1, button_2; |   JWidget label_color, button_1, button_2; | ||||||
|   JWidget label_fuzziness; |   JWidget label_fuzziness; | ||||||
|   JWidget button_ok, button_cancel; |   JWidget button_ok, button_cancel; | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   Image *image; |   Image *image; | ||||||
| 
 | 
 | ||||||
|   if (!is_interactive () || !sprite) |   if (!is_interactive () || !sprite) | ||||||
|     return; |     return; | ||||||
| 
 | 
 | ||||||
|   image = GetImage(current_sprite); |   image = GetImage(sprite); | ||||||
|   if (!image) |   if (!image) | ||||||
|     return; |     return; | ||||||
| 
 | 
 | ||||||
|  | @ -190,18 +190,15 @@ static bool preview_change_hook(JWidget widget, void *data) | ||||||
| static Mask *gen_mask() | static Mask *gen_mask() | ||||||
| { | { | ||||||
|   int xpos, ypos, color, fuzziness; |   int xpos, ypos, color, fuzziness; | ||||||
|   Sprite *sprite; |   CurrentSprite sprite; | ||||||
|   Image *image; |  | ||||||
|   Mask *mask; |  | ||||||
| 
 | 
 | ||||||
|   sprite = current_sprite; |   Image* image = GetImage2(sprite, &xpos, &ypos, NULL); | ||||||
|   image = GetImage2(sprite, &xpos, &ypos, NULL); |  | ||||||
| 
 | 
 | ||||||
|   color = get_color_for_image(sprite->imgtype, |   color = get_color_for_image(sprite->imgtype, | ||||||
| 			      colorbutton_get_color(button_color)); | 			      colorbutton_get_color(button_color)); | ||||||
|   fuzziness = jslider_get_value(slider_fuzziness); |   fuzziness = jslider_get_value(slider_fuzziness); | ||||||
| 
 | 
 | ||||||
|   mask = mask_new(); |   Mask* mask = mask_new(); | ||||||
|   mask_by_color(mask, image, color, fuzziness); |   mask_by_color(mask, image, color, fuzziness); | ||||||
|   mask_move(mask, xpos, ypos); |   mask_move(mask, xpos, ypos); | ||||||
| 
 | 
 | ||||||
|  | @ -211,7 +208,7 @@ static Mask *gen_mask() | ||||||
| static void mask_preview() | static void mask_preview() | ||||||
| { | { | ||||||
|   if (jwidget_is_selected (check_preview)) { |   if (jwidget_is_selected (check_preview)) { | ||||||
|     Sprite *sprite = current_sprite; |     CurrentSprite sprite; | ||||||
|     Mask *mask = gen_mask(); |     Mask *mask = gen_mask(); | ||||||
|     Mask *old_mask = sprite->mask; |     Mask *old_mask = sprite->mask; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -127,7 +127,7 @@ void dialogs_vector_map() | ||||||
| { | { | ||||||
| #define PROJECT()	project(image, x, y, dmax, &u, &v) | #define PROJECT()	project(image, x, y, dmax, &u, &v) | ||||||
| 
 | 
 | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   Image *image, *image_copy; |   Image *image, *image_copy; | ||||||
|   double u, v, dmax; |   double u, v, dmax; | ||||||
|   int c, x, y; |   int c, x, y; | ||||||
|  | @ -135,7 +135,7 @@ void dialogs_vector_map() | ||||||
|   if (!is_interactive () || !sprite) |   if (!is_interactive () || !sprite) | ||||||
|     return; |     return; | ||||||
| 
 | 
 | ||||||
|   image = GetImage(current_sprite); |   image = GetImage(sprite); | ||||||
|   if (!image) |   if (!image) | ||||||
|     return; |     return; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -506,7 +506,7 @@ void fop_operate(FileOp *fop) | ||||||
| 	    if (fop->seq.image) image_free(fop->seq.image); | 	    if (fop->seq.image) image_free(fop->seq.image); | ||||||
| 	    if (fop->seq.last_cel) cel_free(fop->seq.last_cel); | 	    if (fop->seq.last_cel) cel_free(fop->seq.last_cel); | ||||||
| 	    if (fop->sprite) { | 	    if (fop->sprite) { | ||||||
| 	      sprite_free(fop->sprite); | 	      delete fop->sprite; | ||||||
| 	      fop->sprite = NULL; | 	      fop->sprite = NULL; | ||||||
| 	    } | 	    } | ||||||
| 	    break; | 	    break; | ||||||
|  | @ -744,7 +744,7 @@ Image *fop_sequence_image(FileOp *fop, int imgtype, int w, int h) | ||||||
| 
 | 
 | ||||||
|     layer = layer_new(sprite); |     layer = layer_new(sprite); | ||||||
|     if (!layer) { |     if (!layer) { | ||||||
|       sprite_free(sprite); |       delete sprite; | ||||||
|       return NULL; |       return NULL; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -254,7 +254,7 @@ error:; | ||||||
|   if (current_image_old) image_free(current_image_old); |   if (current_image_old) image_free(current_image_old); | ||||||
|   if (npal) palette_free(npal); |   if (npal) palette_free(npal); | ||||||
|   if (opal) palette_free(opal); |   if (opal) palette_free(opal); | ||||||
|   if (sprite) sprite_free(sprite); |   delete sprite; | ||||||
|   return ret; |   return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -20,6 +20,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "jinete/jinete.h" | #include "jinete/jinete.h" | ||||||
| 
 | 
 | ||||||
|  | #include "ase/ui_context.h" | ||||||
| #include "core/app.h" | #include "core/app.h" | ||||||
| #include "modules/editors.h" | #include "modules/editors.h" | ||||||
| #include "modules/gui.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) | void editors_hide_sprite(Sprite *sprite) | ||||||
| { | { | ||||||
|  |   CurrentSprite current_sprite; | ||||||
|   JWidget widget; |   JWidget widget; | ||||||
|   int refresh; |   int refresh; | ||||||
|   JLink link; |   JLink link; | ||||||
|  | @ -188,7 +190,9 @@ void editors_hide_sprite(Sprite *sprite) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   if (refresh) { |   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(); |     app_refresh_screen(); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | @ -218,7 +222,9 @@ void set_current_editor(JWidget editor) | ||||||
| 
 | 
 | ||||||
|     jwidget_dirty(jwidget_get_view(current_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_refresh_screen(); | ||||||
|     app_realloc_sprite_list(); |     app_realloc_sprite_list(); | ||||||
|   } |   } | ||||||
|  | @ -227,8 +233,11 @@ void set_current_editor(JWidget editor) | ||||||
| void set_sprite_in_current_editor(Sprite *sprite) | void set_sprite_in_current_editor(Sprite *sprite) | ||||||
| { | { | ||||||
|   if (current_editor) { |   if (current_editor) { | ||||||
|     set_current_sprite(sprite); |     UIContext* context = UIContext::instance(); | ||||||
|     send_sprite_to_top(sprite); |      | ||||||
|  |     context->set_current_sprite(sprite); | ||||||
|  |     if (sprite != NULL) | ||||||
|  |       context->send_sprite_to_top(sprite); | ||||||
| 
 | 
 | ||||||
|     editor_set_sprite(current_editor, 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() | static Sprite *get_more_reliable_sprite() | ||||||
| { | { | ||||||
|   Sprite *sprite; |   UIContext* context = UIContext::instance(); | ||||||
|   JLink link; |   const SpriteList& list = context->get_sprite_list(); | ||||||
| 
 |  | ||||||
|   JI_LIST_FOR_EACH(get_sprite_list(), link) { |  | ||||||
|     sprite = reinterpret_cast<Sprite*>(link->data); |  | ||||||
| 
 | 
 | ||||||
|  |   for (SpriteList::const_iterator | ||||||
|  | 	 it = list.begin(); it != list.end(); ++it) { | ||||||
|  |     Sprite* sprite = *it; | ||||||
|     if (!(is_sprite_in_some_editor(sprite))) |     if (!(is_sprite_in_some_editor(sprite))) | ||||||
|       return sprite; |       return sprite; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -29,6 +29,7 @@ | ||||||
| #include "jinete/jinete.h" | #include "jinete/jinete.h" | ||||||
| #include "jinete/jintern.h" | #include "jinete/jintern.h" | ||||||
| 
 | 
 | ||||||
|  | #include "ase/ui_context.h" | ||||||
| #include "commands/commands.h" | #include "commands/commands.h" | ||||||
| #include "console/console.h" | #include "console/console.h" | ||||||
| #include "core/app.h" | #include "core/app.h" | ||||||
|  | @ -411,7 +412,7 @@ void gui_feedback() | ||||||
| 
 | 
 | ||||||
|   if (next_idle_flags & REFRESH_FULL_SCREEN) { |   if (next_idle_flags & REFRESH_FULL_SCREEN) { | ||||||
|     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 */ |   /* record file if is necessary */ | ||||||
|  |  | ||||||
|  | @ -18,17 +18,12 @@ | ||||||
| 
 | 
 | ||||||
| #include "config.h" | #include "config.h" | ||||||
| 
 | 
 | ||||||
| #include <assert.h> | #include <cassert> | ||||||
| #include <allegro/file.h> |  | ||||||
| 
 | 
 | ||||||
| #include "jinete/jlist.h" | #include "jinete/jlist.h" | ||||||
| 
 | 
 | ||||||
| #include "core/app.h" | #include "ase/ui_context.h" | ||||||
| #include "core/core.h" |  | ||||||
| #include "file/file.h" |  | ||||||
| #include "effect/effect.h" | #include "effect/effect.h" | ||||||
| #include "modules/editors.h" |  | ||||||
| #include "modules/gui.h" |  | ||||||
| #include "modules/sprites.h" | #include "modules/sprites.h" | ||||||
| #include "raster/cel.h" | #include "raster/cel.h" | ||||||
| #include "raster/image.h" | #include "raster/image.h" | ||||||
|  | @ -37,151 +32,43 @@ | ||||||
| #include "raster/sprite.h" | #include "raster/sprite.h" | ||||||
| #include "raster/stock.h" | #include "raster/stock.h" | ||||||
| #include "util/misc.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 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); | 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(); |   UIContext* context = UIContext::instance(); | ||||||
|   current_sprite = NULL; | 
 | ||||||
|   return 0; |   m_sprite = context->get_current_sprite(); | ||||||
|  |   if (m_sprite) | ||||||
|  |     m_writeable = m_sprite->lock(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void exit_module_sprites() | CurrentSprite::~CurrentSprite() | ||||||
| { | { | ||||||
|   JLink link; |   if (m_sprite) | ||||||
| 
 |     m_sprite->unlock(); | ||||||
|   JI_LIST_FOR_EACH(sprites_list, link) { |  | ||||||
|     sprite_free(reinterpret_cast<Sprite*>(link->data)); |  | ||||||
|   } |  | ||||||
|   jlist_free(sprites_list); |  | ||||||
|   sprites_list = NULL; |  | ||||||
| 
 |  | ||||||
|   current_sprite = NULL; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| JList get_sprite_list() | void CurrentSprite::destroy() | ||||||
| { | { | ||||||
|   return sprites_list; |   if (m_sprite) { | ||||||
| } |     UIContext* context = UIContext::instance(); | ||||||
| 
 | 
 | ||||||
| Sprite* get_first_sprite() |     context->remove_sprite(m_sprite); | ||||||
| { |  | ||||||
|   return reinterpret_cast<Sprite*>(jlist_first_data(sprites_list)); |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| Sprite* get_next_sprite(Sprite* sprite) |     m_sprite->unlock(); | ||||||
| { |  | ||||||
|   JLink link = jlist_find(sprites_list, sprite); |  | ||||||
| 
 | 
 | ||||||
|   if (sprites_list->end != link && |     delete m_sprite; | ||||||
|       sprites_list->end != link->next) |     m_sprite = NULL; | ||||||
|     return reinterpret_cast<Sprite*>(link->next->data); |     m_writeable = false; | ||||||
|   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(); |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* 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) | ImageRef *images_ref_get_from_sprite(Sprite* sprite, int target, bool write) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -19,12 +19,14 @@ | ||||||
| #ifndef MODULES_SPRITES_H | #ifndef MODULES_SPRITES_H | ||||||
| #define MODULES_SPRITES_H | #define MODULES_SPRITES_H | ||||||
| 
 | 
 | ||||||
|  | #include <cassert> | ||||||
|  | 
 | ||||||
| #include "jinete/jbase.h" | #include "jinete/jbase.h" | ||||||
|  | #include "raster/sprite.h" | ||||||
| 
 | 
 | ||||||
| class Image; | class Image; | ||||||
| class Layer; | class Layer; | ||||||
| class Cel; | class Cel; | ||||||
| class Sprite; |  | ||||||
| 
 | 
 | ||||||
| struct ImageRef | struct ImageRef | ||||||
| { | { | ||||||
|  | @ -34,26 +36,26 @@ struct ImageRef | ||||||
|   ImageRef* next; |   ImageRef* next; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| extern Sprite* current_sprite; | class CurrentSprite | ||||||
|  | { | ||||||
|  |   Sprite* m_sprite; | ||||||
|  |   bool m_writeable; | ||||||
| 
 | 
 | ||||||
| int init_module_sprites(); | public: | ||||||
| void exit_module_sprites(); |   CurrentSprite(); | ||||||
|  |   ~CurrentSprite(); | ||||||
| 
 | 
 | ||||||
| JList get_sprite_list(); |   bool writeable() const { return m_writeable; } | ||||||
| Sprite* get_first_sprite(); |   void destroy(); | ||||||
| Sprite* get_next_sprite(Sprite* sprite); |  | ||||||
| 
 | 
 | ||||||
| void sprite_mount(Sprite* sprite); |   operator Sprite* () { return m_sprite; } | ||||||
| void sprite_unmount(Sprite* sprite); |  | ||||||
| 
 | 
 | ||||||
| void set_current_sprite(Sprite* sprite); |   Sprite* operator->() { | ||||||
| void send_sprite_to_top(Sprite* sprite); |     assert(m_sprite != NULL); | ||||||
| void sprite_show(Sprite* sprite); |     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); | ImageRef* images_ref_get_from_sprite(Sprite* sprite, int target, bool write); | ||||||
| void images_ref_free(ImageRef* image_ref); | void images_ref_free(ImageRef* image_ref); | ||||||
|  |  | ||||||
|  | @ -91,8 +91,8 @@ Sprite::Sprite(int imgtype, int w, int h) | ||||||
|   sprite_set_speed(this, 100); |   sprite_set_speed(this, 100); | ||||||
| 
 | 
 | ||||||
|   /* multiple access */ |   /* multiple access */ | ||||||
|   this->locked = FALSE; |   m_locked = 0; | ||||||
|   this->mutex = jmutex_new(); |   m_mutex = jmutex_new(); | ||||||
| 
 | 
 | ||||||
|   /* file format options */ |   /* file format options */ | ||||||
|   this->format_options = NULL; |   this->format_options = NULL; | ||||||
|  | @ -105,7 +105,7 @@ Sprite::~Sprite() | ||||||
| { | { | ||||||
|   JLink link; |   JLink link; | ||||||
| 
 | 
 | ||||||
|   assert(!this->locked); |   // assert(m_locked == 1);
 | ||||||
| 
 | 
 | ||||||
|   /* destroy images' stock */ |   /* destroy images' stock */ | ||||||
|   if (this->stock) |   if (this->stock) | ||||||
|  | @ -143,7 +143,7 @@ Sprite::~Sprite() | ||||||
|   if (this->bound.seg) jfree(this->bound.seg); |   if (this->bound.seg) jfree(this->bound.seg); | ||||||
| 
 | 
 | ||||||
|   /* destroy mutex */ |   /* destroy mutex */ | ||||||
|   jmutex_free(this->mutex); |   jmutex_free(this->m_mutex); | ||||||
| 
 | 
 | ||||||
|   /* destroy file format options */ |   /* destroy file format options */ | ||||||
|   if (this->format_options) |   if (this->format_options) | ||||||
|  | @ -178,7 +178,7 @@ Sprite* sprite_new_copy(const Sprite* src_sprite) | ||||||
|   undo_enable(dst_sprite->undo); |   undo_enable(dst_sprite->undo); | ||||||
| 
 | 
 | ||||||
|   if (dst_sprite->set == NULL) { |   if (dst_sprite->set == NULL) { | ||||||
|     sprite_free(dst_sprite); |     delete dst_sprite; | ||||||
|     return NULL; |     return NULL; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | @ -211,7 +211,7 @@ Sprite* sprite_new_flatten_copy(const Sprite* src_sprite) | ||||||
| 				      0, 0, src_sprite->w, src_sprite->h, | 				      0, 0, src_sprite->w, src_sprite->h, | ||||||
| 				      0, src_sprite->frames-1); | 				      0, src_sprite->frames-1); | ||||||
|   if (flat_layer == NULL) { |   if (flat_layer == NULL) { | ||||||
|     sprite_free(dst_sprite); |     delete dst_sprite; | ||||||
|     return NULL; |     return NULL; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | @ -237,7 +237,7 @@ Sprite* sprite_new_with_layer(int imgtype, int w, int h) | ||||||
|   /* new image */ |   /* new image */ | ||||||
|   image = image_new(imgtype, w, h); |   image = image_new(imgtype, w, h); | ||||||
|   if (!image) { |   if (!image) { | ||||||
|     sprite_free(sprite); |     delete sprite; | ||||||
|     return NULL; |     return NULL; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | @ -245,7 +245,7 @@ Sprite* sprite_new_with_layer(int imgtype, int w, int h) | ||||||
|   layer = layer_new(sprite); |   layer = layer_new(sprite); | ||||||
|   if (!layer) { |   if (!layer) { | ||||||
|     image_free(image); |     image_free(image); | ||||||
|     sprite_free(sprite); |     delete sprite; | ||||||
|     return NULL; |     return NULL; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | @ -276,16 +276,6 @@ Sprite* sprite_new_with_layer(int imgtype, int w, int h) | ||||||
|   return sprite; |   return sprite; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 |  | ||||||
|  * Destroys the sprite |  | ||||||
|  */ |  | ||||||
| void sprite_free(Sprite* sprite) |  | ||||||
| { |  | ||||||
|   assert(sprite); |  | ||||||
|   delete sprite; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| bool sprite_is_modified(Sprite* sprite) | bool sprite_is_modified(Sprite* sprite) | ||||||
| { | { | ||||||
|   assert(sprite != NULL); |   assert(sprite != NULL); | ||||||
|  | @ -301,19 +291,6 @@ bool sprite_is_associated_to_file(Sprite* sprite) | ||||||
|   return sprite->associated_to_file; |   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) | void sprite_mark_as_saved(Sprite* sprite) | ||||||
| { | { | ||||||
|   assert(sprite != NULL); |   assert(sprite != NULL); | ||||||
|  | @ -336,30 +313,27 @@ bool sprite_need_alpha(Sprite* sprite) | ||||||
|   return FALSE; |   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); |   if (++m_locked == 1) | ||||||
| 
 |     return true; | ||||||
|   jmutex_lock(sprite->mutex); |   else | ||||||
|   if (!sprite->locked) { |     return false; | ||||||
|     sprite->locked = TRUE; |  | ||||||
|     res = TRUE; |  | ||||||
|   } |  | ||||||
|   jmutex_unlock(sprite->mutex); |  | ||||||
| 
 |  | ||||||
|   return res; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void sprite_unlock(Sprite* sprite) | void Sprite::unlock() | ||||||
| { | { | ||||||
|   assert(sprite != NULL); |   ScopedLock hold(m_mutex); | ||||||
| 
 | 
 | ||||||
|   jmutex_lock(sprite->mutex); |   --m_locked; | ||||||
|   assert(sprite->locked); |   assert(m_locked >= 0); | ||||||
|   sprite->locked = FALSE; |  | ||||||
|   jmutex_unlock(sprite->mutex); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Palette* sprite_get_palette(Sprite* sprite, int frame) | 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); |   stock_free(dst_sprite->stock); | ||||||
|   dst_sprite->stock = stock_new_copy(src_sprite->stock); |   dst_sprite->stock = stock_new_copy(src_sprite->stock); | ||||||
|   if (!dst_sprite->stock) { |   if (!dst_sprite->stock) { | ||||||
|     sprite_free(dst_sprite); |     delete dst_sprite; | ||||||
|     return NULL; |     return NULL; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | @ -862,7 +836,7 @@ static Sprite* general_copy(const Sprite* src_sprite) | ||||||
|   if (src_sprite->path) { |   if (src_sprite->path) { | ||||||
|     dst_sprite->path = path_new_copy(src_sprite->path); |     dst_sprite->path = path_new_copy(src_sprite->path); | ||||||
|     if (!dst_sprite->path) { |     if (!dst_sprite->path) { | ||||||
|       sprite_free(dst_sprite); |       delete dst_sprite; | ||||||
|       return NULL; |       return NULL; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  | @ -876,7 +850,7 @@ static Sprite* general_copy(const Sprite* src_sprite) | ||||||
|   if (src_sprite->mask) { |   if (src_sprite->mask) { | ||||||
|     dst_sprite->mask = mask_new_copy(src_sprite->mask); |     dst_sprite->mask = mask_new_copy(src_sprite->mask); | ||||||
|     if (!dst_sprite->mask) { |     if (!dst_sprite->mask) { | ||||||
|       sprite_free(dst_sprite); |       delete dst_sprite; | ||||||
|       return NULL; |       return NULL; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -70,15 +70,19 @@ public: | ||||||
|     int zoom; |     int zoom; | ||||||
|   } preferred; |   } preferred; | ||||||
| 
 | 
 | ||||||
|  | private: | ||||||
|  | 
 | ||||||
|   /**
 |   /**
 | ||||||
|    * Mutex to modify the 'locked' flag. |    * 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 |    * 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); |   Sprite(int imgtype, int w, int h); | ||||||
|   virtual ~Sprite(); |   virtual ~Sprite(); | ||||||
|  | 
 | ||||||
|  |   bool lock(); | ||||||
|  |   void unlock(); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| Sprite* sprite_new(int imgtype, int w, int h); | Sprite* sprite_new(int imgtype, int w, int h); | ||||||
| Sprite* sprite_new_copy(const Sprite* src_sprite); | Sprite* sprite_new_copy(const Sprite* src_sprite); | ||||||
| Sprite* sprite_new_flatten_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); | 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_modified(Sprite* sprite); | ||||||
| bool sprite_is_associated_to_file(Sprite* sprite); | bool sprite_is_associated_to_file(Sprite* sprite); | ||||||
| bool sprite_is_locked(Sprite* sprite); |  | ||||||
| void sprite_mark_as_saved(Sprite* sprite); | void sprite_mark_as_saved(Sprite* sprite); | ||||||
| 
 | 
 | ||||||
| bool sprite_need_alpha(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); | struct Palette* sprite_get_palette(Sprite* sprite, int frame); | ||||||
| void sprite_set_palette(Sprite* sprite, struct Palette* pal, bool truncate); | void sprite_set_palette(Sprite* sprite, struct Palette* pal, bool truncate); | ||||||
| void sprite_reset_palettes(Sprite* sprite); | void sprite_reset_palettes(Sprite* sprite); | ||||||
|  |  | ||||||
|  | @ -112,7 +112,7 @@ void test () | ||||||
| 
 | 
 | ||||||
|   image_free(image_screen); |   image_free(image_screen); | ||||||
|   image_free(image_bg); |   image_free(image_bg); | ||||||
|   sprite_free(sprite); |   delete sprite; | ||||||
|   destroy_bitmap(bmp); |   destroy_bitmap(bmp); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -55,7 +55,7 @@ void set_frame_to_handle(Layer *_src_layer, int _src_frame, | ||||||
| 
 | 
 | ||||||
| void move_cel() | void move_cel() | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   Cel *src_cel, *dst_cel; |   Cel *src_cel, *dst_cel; | ||||||
| 
 | 
 | ||||||
|   assert(src_layer != NULL); |   assert(src_layer != NULL); | ||||||
|  | @ -147,7 +147,7 @@ void move_cel() | ||||||
| 
 | 
 | ||||||
| void copy_cel() | void copy_cel() | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   Cel *src_cel, *dst_cel; |   Cel *src_cel, *dst_cel; | ||||||
| 
 | 
 | ||||||
|   assert(src_layer != NULL); |   assert(src_layer != NULL); | ||||||
|  |  | ||||||
|  | @ -21,6 +21,7 @@ | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| #include "jinete/jinete.h" | #include "jinete/jinete.h" | ||||||
| 
 | 
 | ||||||
|  | #include "ase/ui_context.h" | ||||||
| #include "console/console.h" | #include "console/console.h" | ||||||
| #include "core/app.h" | #include "core/app.h" | ||||||
| #include "file/file.h" | #include "file/file.h" | ||||||
|  | @ -69,8 +70,10 @@ Sprite *NewSprite(int imgtype, int w, int h) | ||||||
|     return NULL; |     return NULL; | ||||||
| 
 | 
 | ||||||
|   undo_disable(sprite->undo); |   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)); |   assert(undo_is_disabled(sprite->undo)); | ||||||
|   return sprite; |   return sprite; | ||||||
|  | @ -99,8 +102,10 @@ Sprite *LoadSprite(const char *filename) | ||||||
|   sprite = sprite_load(filename); |   sprite = sprite_load(filename); | ||||||
|   if (sprite) { |   if (sprite) { | ||||||
|     undo_disable(sprite->undo); |     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)); |   assert(undo_is_disabled(sprite->undo)); | ||||||
|  | @ -112,7 +117,9 @@ Sprite *LoadSprite(const char *filename) | ||||||
|  */ |  */ | ||||||
| void SaveSprite(const char *filename) | void SaveSprite(const char *filename) | ||||||
| { | { | ||||||
|   if (current_sprite == NULL) { |   CurrentSprite sprite; | ||||||
|  | 
 | ||||||
|  |   if (sprite == NULL) { | ||||||
|     console_printf("SaveSprite: No current sprite\n"); |     console_printf("SaveSprite: No current sprite\n"); | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  | @ -122,11 +129,11 @@ void SaveSprite(const char *filename) | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   sprite_set_filename(current_sprite, filename); |   sprite_set_filename(sprite, filename); | ||||||
|   app_realloc_sprite_list(); |   app_realloc_sprite_list(); | ||||||
| 
 | 
 | ||||||
|   if (sprite_save(current_sprite) == 0) |   if (sprite_save(sprite) == 0) | ||||||
|     sprite_mark_as_saved(current_sprite); |     sprite_mark_as_saved(sprite); | ||||||
|   else |   else | ||||||
|     console_printf("SaveSprite: Error saving sprite file %s\n", filename); |     console_printf("SaveSprite: Error saving sprite file %s\n", filename); | ||||||
| } | } | ||||||
|  | @ -137,7 +144,8 @@ void SaveSprite(const char *filename) | ||||||
|  */ |  */ | ||||||
| void SetSprite(Sprite *sprite) | 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) | void RemoveCel(Layer *layer, Cel *cel) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   Image *image; |   Image *image; | ||||||
|   Cel *it; |   Cel *it; | ||||||
|   int frame; |   int frame; | ||||||
|  |  | ||||||
|  | @ -83,7 +83,8 @@ Image* GetImage2(Sprite* sprite, int* x, int* y, int* opacity) | ||||||
| 
 | 
 | ||||||
| void LoadPalette(const char *filename) | void LoadPalette(const char *filename) | ||||||
| { | { | ||||||
|   if (current_sprite) { |   CurrentSprite sprite; | ||||||
|  |   if (sprite) { | ||||||
|     DIRS *dir, *dirs; |     DIRS *dir, *dirs; | ||||||
|     char buf[512]; |     char buf[512]; | ||||||
| 
 | 
 | ||||||
|  | @ -101,8 +102,8 @@ void LoadPalette(const char *filename) | ||||||
| 	  set_current_palette(pal, FALSE); | 	  set_current_palette(pal, FALSE); | ||||||
| 
 | 
 | ||||||
| 	  /* just one palette */ | 	  /* just one palette */ | ||||||
| 	  sprite_reset_palettes(current_sprite); | 	  sprite_reset_palettes(sprite); | ||||||
| 	  sprite_set_palette(current_sprite, pal, 0); | 	  sprite_set_palette(sprite, pal, 0); | ||||||
| 
 | 
 | ||||||
| 	  /* redraw the entire screen */ | 	  /* redraw the entire screen */ | ||||||
| 	  jmanager_refresh_screen(); | 	  jmanager_refresh_screen(); | ||||||
|  |  | ||||||
|  | @ -477,11 +477,9 @@ static bool colorbar_msg_proc(JWidget widget, JMessage msg) | ||||||
|       /* time to refresh all the editors which have the current
 |       /* time to refresh all the editors which have the current
 | ||||||
| 	 sprite selected? */ | 	 sprite selected? */ | ||||||
|       if (msg->timer.timer_id == colorbar->refresh_timer_id) { |       if (msg->timer.timer_id == colorbar->refresh_timer_id) { | ||||||
| 	Sprite *sprite = current_sprite; | 	CurrentSprite sprite; | ||||||
| 
 | 	if (sprite != NULL) | ||||||
| 	if (sprite != NULL) { |  | ||||||
| 	  update_editors_with_sprite(sprite); | 	  update_editors_with_sprite(sprite); | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	jmanager_stop_timer(colorbar->refresh_timer_id); | 	jmanager_stop_timer(colorbar->refresh_timer_id); | ||||||
|       } |       } | ||||||
|  | @ -653,8 +651,8 @@ static bool tooltip_window_msg_proc(JWidget widget, JMessage msg) | ||||||
|   switch (msg->type) { |   switch (msg->type) { | ||||||
| 
 | 
 | ||||||
|     case JM_CLOSE: { |     case JM_CLOSE: { | ||||||
|       /* change the sprite palette */ |       // change the sprite palette
 | ||||||
|       Sprite *sprite = current_sprite; |       CurrentSprite sprite; | ||||||
| 
 | 
 | ||||||
|       if (sprite != NULL) { |       if (sprite != NULL) { | ||||||
| 	Palette *pal = sprite_get_palette(sprite, sprite->frame); | 	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 | 	   different from the current sprite's palette, then we have | ||||||
| 	   to start the "refresh_timer" to refresh all the editors | 	   to start the "refresh_timer" to refresh all the editors | ||||||
| 	   with that sprite */ | 	   with that sprite */ | ||||||
| 	if (current_sprite != NULL && bitmap_color_depth(screen) != 8) { | 	CurrentSprite sprite; | ||||||
| 	  Sprite *sprite = current_sprite; | 	if (sprite != NULL && bitmap_color_depth(screen) != 8) { | ||||||
| 	  Palette *pal = sprite_get_palette(sprite, sprite->frame); | 	  Palette *pal = sprite_get_palette(sprite, sprite->frame); | ||||||
| 	   | 	   | ||||||
| 	  if (palette_count_diff(pal, get_current_palette(), NULL, NULL) > 0) { | 	  if (palette_count_diff(pal, get_current_palette(), NULL, NULL) > 0) { | ||||||
|  |  | ||||||
|  | @ -26,6 +26,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "jinete/jinete.h" | #include "jinete/jinete.h" | ||||||
| 
 | 
 | ||||||
|  | #include "ase/ui_context.h" | ||||||
| #include "commands/commands.h" | #include "commands/commands.h" | ||||||
| #include "core/app.h" | #include "core/app.h" | ||||||
| #include "core/cfg.h" | #include "core/cfg.h" | ||||||
|  | @ -1026,8 +1027,10 @@ static bool editor_msg_proc(JWidget widget, JMessage msg) | ||||||
|       break; |       break; | ||||||
| 
 | 
 | ||||||
|     case JM_BUTTONPRESSED: { |     case JM_BUTTONPRESSED: { | ||||||
|  |       UIContext* context = UIContext::instance(); | ||||||
|  | 
 | ||||||
|       set_current_editor(widget); |       set_current_editor(widget); | ||||||
|       set_current_sprite(editor->sprite); |       context->set_current_sprite(editor->sprite); | ||||||
| 
 | 
 | ||||||
|       if (!editor->sprite) |       if (!editor->sprite) | ||||||
| 	break; | 	break; | ||||||
|  | @ -1396,7 +1399,6 @@ static void editor_update_candraw(JWidget widget) | ||||||
| 
 | 
 | ||||||
|   editor->cursor_candraw = |   editor->cursor_candraw = | ||||||
|     (editor->sprite != NULL && |     (editor->sprite != NULL && | ||||||
|      !sprite_is_locked(editor->sprite) && |  | ||||||
|      editor->sprite->layer != NULL && |      editor->sprite->layer != NULL && | ||||||
|      layer_is_image(editor->sprite->layer) && |      layer_is_image(editor->sprite->layer) && | ||||||
|      layer_is_readable(editor->sprite->layer) && |      layer_is_readable(editor->sprite->layer) && | ||||||
|  |  | ||||||
|  | @ -751,7 +751,7 @@ static void openfile_bg(void *_data) | ||||||
|   sprite = fop->sprite; |   sprite = fop->sprite; | ||||||
|   if (sprite) { |   if (sprite) { | ||||||
|     if (fop_is_stop(fop)) |     if (fop_is_stop(fop)) | ||||||
|       sprite_free(fop->sprite); |       delete fop->sprite; | ||||||
|     else { |     else { | ||||||
|       /* the palette to convert the Image to a BITMAP */ |       /* the palette to convert the Image to a BITMAP */ | ||||||
|       palette_to_allegro(sprite_get_palette(sprite, 0), data->rgbpal); |       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 = image_new(sprite->imgtype, sprite->w, sprite->h); | ||||||
|       image_clear(image, 0); |       image_clear(image, 0); | ||||||
|       sprite_render(sprite, image, 0, 0); |       sprite_render(sprite, image, 0, 0); | ||||||
|       sprite_free(sprite); |       delete sprite; | ||||||
| 
 | 
 | ||||||
|       /* calculate the thumbnail size */ |       /* calculate the thumbnail size */ | ||||||
|       thumb_w = MAX_THUMBNAIL_SIZE * image->w / MAX(image->w, image->h); |       thumb_w = MAX_THUMBNAIL_SIZE * image->w / MAX(image->w, image->h); | ||||||
|  |  | ||||||
|  | @ -316,23 +316,31 @@ static bool statusbar_msg_proc(JWidget widget, JMessage msg) | ||||||
| 	} | 	} | ||||||
|       } |       } | ||||||
|       /* draw current sprite size in memory */ |       /* draw current sprite size in memory */ | ||||||
|       else if (current_sprite != NULL) { |       else { | ||||||
| 	char buf[1024]; | 	CurrentSprite sprite; | ||||||
|  | 	if (sprite != NULL) { | ||||||
|  | 	  char buf[1024]; | ||||||
| 
 | 
 | ||||||
| 	ustrcpy(buf, "Sprite:"); | 	  if (sprite.writeable()) { | ||||||
| 	get_pretty_memsize(sprite_get_memsize(current_sprite), | 	    ustrcpy(buf, "Sprite:"); | ||||||
| 			   buf+ustrsize(buf), | 	    get_pretty_memsize(sprite_get_memsize(sprite), | ||||||
| 			   sizeof(buf)-ustrsize(buf)); | 			       buf+ustrsize(buf), | ||||||
|  | 			       sizeof(buf)-ustrsize(buf)); | ||||||
| 
 | 
 | ||||||
| 	ustrcat(buf, " Undo:"); | 	    ustrcat(buf, " Undo:"); | ||||||
| 	get_pretty_memsize(undo_get_memsize(current_sprite->undo), | 	    get_pretty_memsize(undo_get_memsize(sprite->undo), | ||||||
| 			   buf+ustrsize(buf), | 			       buf+ustrsize(buf), | ||||||
| 			   sizeof(buf)-ustrsize(buf)); | 			       sizeof(buf)-ustrsize(buf)); | ||||||
|  | 	  } | ||||||
|  | 	  else { | ||||||
|  | 	    ustrcpy(buf, "Sprite is Locked"); | ||||||
|  | 	  } | ||||||
| 
 | 
 | ||||||
| 	textout_right_ex(ji_screen, widget->font(), buf, | 	  textout_right_ex(ji_screen, widget->font(), buf, | ||||||
| 			 rc->x2-2, | 			   rc->x2-2, | ||||||
| 			 (widget->rc->y1+widget->rc->y2)/2-text_height(widget->font())/2, | 			   (widget->rc->y1+widget->rc->y2)/2-text_height(widget->font())/2, | ||||||
| 			 ji_color_foreground(), -1); | 			   ji_color_foreground(), -1); | ||||||
|  | 	} | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       jrect_free(rc); |       jrect_free(rc); | ||||||
|  | @ -341,7 +349,7 @@ static bool statusbar_msg_proc(JWidget widget, JMessage msg) | ||||||
| 
 | 
 | ||||||
|     case JM_MOUSEENTER: |     case JM_MOUSEENTER: | ||||||
|       if (!jwidget_has_child(widget, statusbar->commands_box)) { |       if (!jwidget_has_child(widget, statusbar->commands_box)) { | ||||||
| 	Sprite *sprite = current_sprite; | 	CurrentSprite sprite; | ||||||
| 
 | 
 | ||||||
| 	if (!sprite) { | 	if (!sprite) { | ||||||
| 	  jwidget_disable(statusbar->b_first); | 	  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) | static bool slider_change_hook(JWidget widget, void *data) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
| 
 |  | ||||||
|   if (sprite) { |   if (sprite) { | ||||||
|     if ((sprite->layer) && |     if ((sprite->layer) && | ||||||
| 	(sprite->layer->type == GFXOBJ_LAYER_IMAGE)) { | 	(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) | static void button_command(JWidget widget, void *data) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
| 
 | 
 | ||||||
|   if (sprite) { |   if (sprite) { | ||||||
|     const char *cmd = NULL; |     const char *cmd = NULL; | ||||||
|  | @ -462,7 +469,7 @@ static void button_command(JWidget widget, void *data) | ||||||
| 
 | 
 | ||||||
| static void update_from_layer(StatusBar *statusbar) | static void update_from_layer(StatusBar *statusbar) | ||||||
| { | { | ||||||
|   Sprite *sprite = current_sprite; |   CurrentSprite sprite; | ||||||
|   Cel *cel; |   Cel *cel; | ||||||
| 
 | 
 | ||||||
|   /* layer button */ |   /* layer button */ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue