Added "new_frame" command. Renamed writeable to writable.

This commit is contained in:
David Capello 2007-10-08 02:20:57 +00:00
parent a1b9a6844b
commit 0acca25989
31 changed files with 262 additions and 179 deletions

View File

@ -1,3 +1,10 @@
2007-10-07 David A. Capello <dacap@users.sourceforge.net>
* src/commands/cmd_new_frame.c (command_execute_new_frame): Added
from new_frame() routine (now with undo of everything).
* src/raster/undo.c (undo_set_frames): Added.
2007-10-03 David A. Capello <dacap@users.sourceforge.net>
* src/commands/cmd_crop.c: Added with crop_sprite/layer/frame &

View File

@ -1,5 +1,5 @@
ASE Files (.ASE) Format description
Copyright (C) 2004-2005 by David A. Capello
Copyright (C) 2004-2005, 2007 by David A. Capello
----------------------------------------------------------------------
1. References
@ -92,7 +92,7 @@ Layer Chunk (0x2004)
In the first frame should be a set of layer chunks to determine the
entire layers layout:
WORD Flags (1=readable, 2=writeable)
WORD Flags (1=readable, 2=writable)
WORD Layer type (0=normal (image) layer, 1=layer set)
WORD Layer child level (see NOTE.1)
WORD Default layer width in pixels (ignored)
@ -199,7 +199,7 @@ NOTE.3: The raw pixel data is saved row by row from top to bottom, and
each scanline is from pixel by pixel from left to right.
In RGB images, each pixel have 4 bytes in the order R, G, B, A.
In Grayscale images, each pixel have 2 bytes in the order K, A.
In Indexed images, each pixel have 1 bytes (the index).
In Indexed images, each pixel have 1 byte (the index).
========================================

View File

@ -36,7 +36,7 @@ bool command_enabled_copy(const char *argument)
if ((!current_sprite) ||
(!current_sprite->layer) ||
(!current_sprite->layer->readable) ||
(!current_sprite->layer->writeable) ||
(!current_sprite->layer->writable) ||
(!current_sprite->mask) ||
(!current_sprite->mask->bitmap))
return FALSE;

View File

@ -28,6 +28,11 @@
#endif
bool command_enabled_copy_frame(const char *argument)
{
return FALSE;
}
void command_execute_copy_frame(const char *argument)
{
}

View File

@ -97,7 +97,7 @@ static bool command_enabled_crop(const char *argument)
if ((!current_sprite) ||
(!current_sprite->layer) ||
(!current_sprite->layer->readable) ||
(!current_sprite->layer->writeable) ||
(!current_sprite->layer->writable) ||
(!current_sprite->mask) ||
(!current_sprite->mask->bitmap))
return FALSE;

View File

@ -36,7 +36,7 @@ bool command_enabled_cut(const char *argument)
if ((!current_sprite) ||
(!current_sprite->layer) ||
(!current_sprite->layer->readable) ||
(!current_sprite->layer->writeable) ||
(!current_sprite->layer->writable) ||
(!current_sprite->mask) ||
(!current_sprite->mask->bitmap))
return FALSE;

View File

@ -22,12 +22,19 @@
#include "jinete.h"
#include "core/app.h"
/* #include "core/app.h" */
#include "modules/sprites.h"
#include "raster/sprite.h"
/* #include "raster/sprite.h" */
#include "dialogs/filmedit.h"
#endif
bool command_enabled_film_editor(const char *argument)
{
return current_sprite != NULL;
}
void command_execute_film_editor(const char *argument)
{
switch_between_film_and_sprite_editor();
}

View File

@ -28,6 +28,11 @@
#endif
bool command_enabled_link_frame(const char *argument)
{
return FALSE;
}
void command_execute_link_frame(const char *argument)
{
}

View File

@ -23,7 +23,7 @@
#include "jinete/alert.h"
#include "dialogs/filesel.h"
#include "modules/gui.h"
#include "modules/gui.h"
#include "modules/sprites.h"
#include "raster/mask.h"
#include "raster/sprite.h"

View File

@ -28,6 +28,11 @@
#endif
bool command_enabled_move_frame(const char *argument)
{
return FALSE;
}
void command_execute_move_frame(const char *argument)
{
}

View File

@ -22,12 +22,77 @@
#include "jinete.h"
#include "console/console.h"
#include "core/app.h"
#include "modules/gui.h"
#include "modules/color.h"
#include "modules/sprites.h"
#include "raster/image.h"
#include "raster/frame.h"
#include "raster/layer.h"
#include "raster/sprite.h"
#include "raster/stock.h"
#include "raster/undo.h"
#include "widgets/colbar.h"
#endif
bool command_enabled_new_frame(const char *argument)
{
return
current_sprite &&
current_sprite->layer &&
current_sprite->layer->readable &&
current_sprite->layer->writable &&
layer_is_image(current_sprite->layer);
}
void command_execute_new_frame(const char *argument)
{
int bg, image_index;
Frame *frame;
Image *image;
int frpos;
frpos = current_sprite->frpos;
while (layer_get_frame(current_sprite->layer, frpos))
frpos++;
/* create a new empty frame with a new clean image */
image = image_new(current_sprite->imgtype,
current_sprite->w,
current_sprite->h);
if (!image) {
console_printf(_("Not enough memory.\n"));
return;
}
/* background color (right color) */
bg = get_color_for_image(image->imgtype,
color_bar_get_color(app_get_color_bar(), 1));
image_clear(image, bg);
/* add the image in the stock */
image_index = stock_add_image(current_sprite->layer->stock, image);
undo_open(current_sprite->undo);
if (frpos >= current_sprite->frames) {
undo_set_frames(current_sprite->undo, current_sprite);
sprite_set_frames(current_sprite, frpos+1);
}
undo_int(current_sprite->undo, &current_sprite->gfxobj, &current_sprite->frpos);
sprite_set_frpos(current_sprite, frpos);
undo_add_image(current_sprite->undo,
current_sprite->layer->stock, image);
/* add the frame in the layer */
frame = frame_new(current_sprite->frpos, image_index);
undo_add_frame(current_sprite->undo, current_sprite->layer, frame);
layer_add_frame(current_sprite->layer, frame);
undo_close(current_sprite->undo);
GUI_Refresh(current_sprite);
}

View File

@ -56,6 +56,6 @@ void command_execute_save_file(const char *argument)
save-as dialog to the user to select for first time the file-name
for this sprite */
else {
command_execute(command_get_by_name(CMD_SAVE_FILE), argument);
command_execute(command_get_by_name(CMD_SAVE_FILE_AS), argument);
}
}

View File

@ -50,7 +50,7 @@ void command_execute_save_file_as(const char *argument)
for (;;) {
newfilename = GUI_FileSelect(_("Save Sprite"), filename,
get_writeable_extensions());
get_writable_extensions());
if (!newfilename)
return;
ustrcpy(filename, newfilename);

View File

@ -102,9 +102,13 @@ void command_execute_crop_layer(const char *argument);
/* frame */
void command_execute_frame_properties(const char *argument);
void command_execute_remove_frame(const char *argument);
bool command_enabled_new_frame(const char *argument);
void command_execute_new_frame(const char *argument);
bool command_enabled_move_frame(const char *argument);
void command_execute_move_frame(const char *argument);
bool command_enabled_copy_frame(const char *argument);
void command_execute_copy_frame(const char *argument);
bool command_enabled_link_frame(const char *argument);
void command_execute_link_frame(const char *argument);
bool command_enabled_crop_frame(const char *argument);
void command_execute_crop_frame(const char *argument);
@ -143,6 +147,7 @@ bool command_checked_rectangle_tool(const char *argument);
void command_execute_rectangle_tool(const char *argument);
bool command_checked_ellipse_tool(const char *argument);
void command_execute_ellipse_tool(const char *argument);
bool command_enabled_film_editor(const char *argument);
void command_execute_film_editor(const char *argument);
void command_execute_palette_editor(const char *argument);
void command_execute_convolution_matrix(const char *argument);
@ -214,10 +219,10 @@ static Command commands[] = {
CMD_EXE_ENA(crop_layer),
{ CMD_FRAME_PROPERTIES, NULL, NULL, NULL, NULL },
{ CMD_REMOVE_FRAME, NULL, NULL, NULL, NULL },
{ CMD_NEW_FRAME, NULL, NULL, NULL, NULL },
{ CMD_MOVE_FRAME, NULL, NULL, NULL, NULL },
{ CMD_COPY_FRAME, NULL, NULL, NULL, NULL },
{ CMD_LINK_FRAME, NULL, NULL, NULL, NULL },
CMD_EXE_ENA(new_frame),
CMD_EXE_ENA(move_frame),
CMD_EXE_ENA(copy_frame),
CMD_EXE_ENA(link_frame),
CMD_EXE_ENA(crop_frame),
CMD_EXE_ENA(mask_all),
CMD_EXE_ENA(deselect_mask),
@ -236,7 +241,7 @@ static Command commands[] = {
CMD_EXE_CHK(line_tool),
CMD_EXE_CHK(rectangle_tool),
CMD_EXE_CHK(ellipse_tool),
{ CMD_FILM_EDITOR, NULL, NULL, NULL, NULL },
CMD_EXE_ENA(film_editor),
{ CMD_PALETTE_EDITOR, NULL, NULL, NULL, NULL },
{ CMD_CONVOLUTION_MATRIX, NULL, NULL, NULL, NULL },
{ CMD_COLOR_CURVE, NULL, NULL, NULL, NULL },

View File

@ -329,20 +329,20 @@ static bool layer_box_msg_proc (JWidget widget, JMessage msg)
/* undo */
if (command && strcmp(command->name, CMD_UNDO) == 0) {
if (undo_can_undo (sprite->undo)) {
undo_undo (sprite->undo);
destroy_thumbnails ();
jmanager_refresh_screen ();
if (undo_can_undo(sprite->undo)) {
undo_undo(sprite->undo);
destroy_thumbnails();
jmanager_refresh_screen();
}
return TRUE;
}
/* redo */
if (command && strcmp(command->name, CMD_REDO) == 0) {
if (undo_can_redo (sprite->undo)) {
undo_redo (sprite->undo);
destroy_thumbnails ();
jmanager_refresh_screen ();
if (undo_can_redo(sprite->undo)) {
undo_redo(sprite->undo);
destroy_thumbnails();
jmanager_refresh_screen();
}
return TRUE;
}
@ -612,9 +612,9 @@ static bool frame_box_msg_proc (JWidget widget, JMessage msg)
y += h;
}
blit (bmp, ji_screen, 0, 0, vp->x1, vp->y1, jrect_w(vp), jrect_h(vp));
destroy_bitmap (bmp);
jrect_free (vp);
blit(bmp, ji_screen, 0, 0, vp->x1, vp->y1, jrect_w(vp), jrect_h(vp));
destroy_bitmap(bmp);
jrect_free(vp);
return TRUE;
}
@ -660,10 +660,10 @@ static bool frame_box_msg_proc (JWidget widget, JMessage msg)
(ji_screen,
frame_box->rect.x1, frame_box->rect.y1,
frame_box->rect.x2-1, frame_box->rect.y2-1);
rectdotted (ji_screen,
frame_box->rect.x1, frame_box->rect.y1,
frame_box->rect.x2-1, frame_box->rect.y2-1,
makecol (0, 0, 0), makecol (255, 255, 255));
rectdotted(ji_screen,
frame_box->rect.x1, frame_box->rect.y1,
frame_box->rect.x2-1, frame_box->rect.y2-1,
makecol (0, 0, 0), makecol (255, 255, 255));
jmouse_show();
}
}
@ -695,22 +695,22 @@ static bool frame_box_msg_proc (JWidget widget, JMessage msg)
rectdotted(ji_screen,
frame_box->rect.x1, frame_box->rect.y1,
frame_box->rect.x2-1, frame_box->rect.y2-1,
makecol (0, 0, 0), makecol (255, 255, 255));
makecol(0, 0, 0), makecol(255, 255, 255));
jmouse_show();
}
/* select */
else if (state == STATE_SELECTING) {
select_frpos_motion (widget);
select_layer_motion (widget, frame_box->layer_box, frame_box);
select_frpos_motion(widget);
select_layer_motion(widget, frame_box->layer_box, frame_box);
}
return TRUE;
}
break;
case JM_BUTTONRELEASED:
if (jwidget_has_capture (widget)) {
jwidget_release_mouse (widget);
if (jwidget_has_capture(widget)) {
jwidget_release_mouse(widget);
if ((state == STATE_SCROLLING) || (state == STATE_MOVING))
jmouse_set_cursor(JI_CURSOR_NORMAL);
@ -723,23 +723,23 @@ static bool frame_box_msg_proc (JWidget widget, JMessage msg)
jmouse_show();
}
set_frame_to_handle (frame_box->layer, frame_box->frame);
set_frame_to_handle(frame_box->layer, frame_box->frame);
if (msg->mouse.right) {
JWidget popup_menuitem = get_frame_popup_menuitem ();
JWidget popup_menuitem = get_frame_popup_menuitem();
if (popup_menuitem && jmenuitem_get_submenu (popup_menuitem)) {
if (popup_menuitem && jmenuitem_get_submenu(popup_menuitem)) {
/* show the frame pop-up menu */
jmenu_popup (jmenuitem_get_submenu (popup_menuitem),
msg->mouse.x, msg->mouse.y);
jmenu_popup(jmenuitem_get_submenu(popup_menuitem),
msg->mouse.x, msg->mouse.y);
jview_update (jwidget_get_view (frame_box->widget));
jview_update (jwidget_get_view (frame_box->layer_box->widget));
jview_update(jwidget_get_view (frame_box->widget));
jview_update(jwidget_get_view (frame_box->layer_box->widget));
}
}
else if (state == STATE_MOVING) {
move_frame ();
jwidget_dirty (widget);
move_frame();
jwidget_dirty(widget);
}
}

View File

@ -1,5 +1,5 @@
/* ase -- allegro-sprite-editor: the ultimate sprites factory
* Copyright (C) 2001-2005 David A. Capello
* Copyright (C) 2001-2005, 2007 David A. 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
@ -190,15 +190,15 @@ Sprite *ase_file_read_f (FILE *f)
}
/* set frames and speed */
sprite_set_frames (sprite, header.frames);
sprite_set_speed (sprite, header.speed);
sprite_set_frames(sprite, header.frames);
sprite_set_speed(sprite, header.speed);
/* prepare variables for layer chunks */
last_layer = sprite->set;
current_level = -1;
/* progress */
add_progress (header.size);
add_progress(header.size);
/* read frame by frame to end-of-file */
for (frpos=0; frpos<sprite->frames; frpos++) {
@ -627,7 +627,7 @@ static Layer *ase_file_read_layer_chunk (FILE *f, int imgtype, Layer **previous_
if (layer) {
/* flags */
layer->readable = (flags & 1) ? TRUE: FALSE;
layer->writeable = (flags & 2) ? TRUE: FALSE;
layer->writable = (flags & 2) ? TRUE: FALSE;
/* name */
if (name)
@ -660,7 +660,7 @@ static void ase_file_write_layer_chunk (FILE *f, Layer *layer)
ase_file_write_start_chunk (f, ASE_FILE_CHUNK_LAYER);
/* flags */
fputw ((layer->readable & 1) | ((layer->writeable & 1) << 1), f);
fputw ((layer->readable & 1) | ((layer->writable & 1) << 1), f);
/* layer type */
fputw (layer_is_image (layer) ? 0:

View File

@ -152,7 +152,7 @@ const char *get_readable_extensions(void)
return file_extensions;
}
const char *get_writeable_extensions(void)
const char *get_writable_extensions(void)
{
int c;

View File

@ -1,5 +1,5 @@
/* ase -- allegro-sprite-editor: the ultimate sprites factory
* Copyright (C) 2001-2005 David A. Capello
* Copyright (C) 2001-2005, 2007 David A. 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
@ -50,16 +50,16 @@ void file_sequence_set_color(int index, int r, int g, int b);
void file_sequence_get_color(int index, int *r, int *g, int *b);
struct Image *file_sequence_image(int imgtype, int w, int h);
struct Sprite *file_sequence_sprite(void);
struct Image *file_sequence_image_to_save (void);
struct Image *file_sequence_image_to_save(void);
/* available extensions for each load/save operation */
const char *get_readable_extensions (void);
const char *get_writeable_extensions (void);
const char *get_readable_extensions(void);
const char *get_writable_extensions(void);
/* mainly routines to load/save images */
struct Sprite *sprite_load (const char *filename);
int sprite_save (struct Sprite *sprite);
struct Sprite *sprite_load(const char *filename);
int sprite_save(struct Sprite *sprite);
#endif /* FILE_H */

View File

@ -210,7 +210,7 @@ static Stock *layer_get_images(Sprite *sprite, Layer *layer, int target, int wri
if (!layer->readable)
return stock;
if (write && !layer->writeable)
if (write && !layer->writable)
return stock;
switch (layer->gfxobj.type) {
@ -267,7 +267,7 @@ static void layer_get_pos (Sprite *sprite, Layer *layer, int target, int write,
if (!layer->readable)
return;
if (write && !layer->writeable)
if (write && !layer->writable)
return;
switch (layer->gfxobj.type) {

View File

@ -1,5 +1,5 @@
/* ase -- allegro-sprite-editor: the ultimate sprites factory
* Copyright (C) 2001-2005 David A. Capello
* Copyright (C) 2001-2005, 2007 David A. 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
@ -30,15 +30,15 @@ struct Stock;
extern struct Sprite *current_sprite;
int init_module_sprites (void);
void exit_module_sprites (void);
int init_module_sprites(void);
void exit_module_sprites(void);
JList get_sprite_list (void);
struct Sprite *get_first_sprite (void);
struct Sprite *get_next_sprite (struct Sprite *sprite);
JList get_sprite_list(void);
struct Sprite *get_first_sprite(void);
struct Sprite *get_next_sprite(struct Sprite *sprite);
struct Sprite *get_clipboard_sprite (void);
void set_clipboard_sprite (struct Sprite *sprite);
struct Sprite *get_clipboard_sprite(void);
void set_clipboard_sprite(struct Sprite *sprite);
void sprite_mount(struct Sprite *sprite);
void sprite_unmount(struct Sprite *sprite);
@ -48,7 +48,7 @@ void set_current_sprite(struct Sprite *sprite);
void send_sprite_to_top(struct Sprite *sprite);
void sprite_show(struct Sprite *sprite);
struct Stock *sprite_get_images (struct Sprite *sprite, int target, int write, int **x, int **y);
struct Stock *sprite_get_images(struct Sprite *sprite, int target, int write, int **x, int **y);
#endif /* MODULES_SPRITES_H */

View File

@ -682,7 +682,7 @@ void control_tool(JWidget widget, Tool *tool, const char *_color)
return;
}
/* error, the active layer is locked */
else if (!editor->sprite->layer->writeable) {
else if (!editor->sprite->layer->writable) {
jalert(_("Warning"
"<<The active layer is locked,"
"<<unlock it and try again"
@ -1193,7 +1193,7 @@ void do_tool_points(Sprite *sprite, Tool *tool, const char *_color,
/* we have a image layer to paint in? */
/* error, the active layer is not visible */
/* error, the active layer is locked */
if (!image || !sprite->layer->readable || !sprite->layer->writeable)
if (!image || !sprite->layer->readable || !sprite->layer->writable)
return;
/* select the hline procedure */

View File

@ -1,5 +1,5 @@
/* ase -- allegro-sprite-editor: the ultimate sprites factory
* Copyright (C) 2001-2005 David A. Capello
* Copyright (C) 2001-2005, 2007 David A. 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
@ -40,7 +40,7 @@ static int has_frames (Layer *layer, int frpos);
\
layer->parent = NULL; \
layer->readable = TRUE; \
layer->writeable = TRUE; \
layer->writable = TRUE; \
\
layer->imgtype = 0; \
layer->blend_mode = 0; \
@ -171,7 +171,7 @@ Layer *layer_new_copy(const Layer *layer)
if (layer_copy) {
layer_set_name(layer_copy, layer->name);
layer_copy->readable = layer->readable;
layer_copy->writeable = layer->writeable;
layer_copy->writable = layer->writable;
}
return layer_copy;

View File

@ -1,5 +1,5 @@
/* ase -- allegro-sprite-editor: the ultimate sprites factory
* Copyright (C) 2001-2005 David A. Capello
* Copyright (C) 2001-2005, 2007 David A. 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
@ -26,15 +26,15 @@ struct Frame;
struct Image;
struct Stock;
typedef struct Layer Layer;
struct Layer
typedef struct Layer Layer;
struct Layer
{
GfxObj gfxobj;
char name[256]; /* layer name */
GfxObj *parent; /* parent object */
unsigned readable : 1;
unsigned writeable : 1;
unsigned writable : 1;
/* for GFXOBJ_LAYER_IMAGE */
int imgtype; /* image type */
@ -54,27 +54,27 @@ struct Layer
/* int blend_mode; */
};
Layer *layer_new (int imgtype);
Layer *layer_set_new (void);
Layer *layer_new(int imgtype);
Layer *layer_set_new(void);
/* Layer *layer_new_text (const char *text); */
Layer *layer_new_copy (const Layer *layer);
Layer *layer_new_with_image (int imgtype, int x, int y, int w, int h, int frpos);
void layer_free (Layer *layer);
Layer *layer_new_copy(const Layer *layer);
Layer *layer_new_with_image(int imgtype, int x, int y, int w, int h, int frpos);
void layer_free(Layer *layer);
int layer_is_image (const Layer *layer);
int layer_is_set (const Layer *layer);
int layer_is_image(const Layer *layer);
int layer_is_set(const Layer *layer);
Layer *layer_get_prev (Layer *layer);
Layer *layer_get_next (Layer *layer);
Layer *layer_get_prev(Layer *layer);
Layer *layer_get_next(Layer *layer);
void layer_set_name (Layer *layer, const char *name);
void layer_set_blend_mode (Layer *layer, int blend_mode);
void layer_set_parent (Layer *layer, GfxObj *gfxobj);
void layer_set_name(Layer *layer, const char *name);
void layer_set_blend_mode(Layer *layer, int blend_mode);
void layer_set_parent(Layer *layer, GfxObj *gfxobj);
/* for LAYER_IMAGE */
void layer_add_frame (Layer *layer, struct Frame *frame);
void layer_remove_frame (Layer *layer, struct Frame *frame);
struct Frame *layer_get_frame (Layer *layer, int frpos);
void layer_add_frame(Layer *layer, struct Frame *frame);
void layer_remove_frame(Layer *layer, struct Frame *frame);
struct Frame *layer_get_frame(Layer *layer, int frpos);
/* for LAYER_SET */
void layer_add_layer(Layer *set, Layer *layer);

View File

@ -1,5 +1,5 @@
/* ase -- allegro-sprite-editor: the ultimate sprites factory
* Copyright (C) 2001-2005 David A. Capello
* Copyright (C) 2001-2005, 2007 David A. 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
@ -23,9 +23,9 @@
struct Image;
typedef struct Stock Stock;
struct Stock
typedef struct Stock Stock;
struct Stock
{
GfxObj gfxobj;
int imgtype; /* type of images (all images in the stock
@ -35,15 +35,15 @@ struct Stock
bool ref; /* this is a reference (non-original) stock? */
};
Stock *stock_new (int imgtype);
Stock *stock_new_ref (int imgtype);
Stock *stock_new_copy (const Stock *stock);
void stock_free (Stock *stock);
Stock *stock_new(int imgtype);
Stock *stock_new_ref(int imgtype);
Stock *stock_new_copy(const Stock *stock);
void stock_free(Stock *stock);
int stock_add_image (Stock *stock, struct Image *image);
void stock_remove_image (Stock *stock, struct Image *image);
void stock_replace_image (Stock *stock, int index, Image *image);
int stock_add_image(Stock *stock, struct Image *image);
void stock_remove_image(Stock *stock, struct Image *image);
void stock_replace_image(Stock *stock, int index, Image *image);
struct Image *stock_get_image (Stock *stock, int index);
struct Image *stock_get_image(Stock *stock, int index);
#endif /* RASTER_STOCK_H */

View File

@ -72,8 +72,9 @@ enum {
UNDO_TYPE_MOVE_LAYER,
UNDO_TYPE_SET_LAYER,
/* undo management */
/* misc */
UNDO_TYPE_SET_MASK,
UNDO_TYPE_SET_FRAMES,
};
typedef struct UndoChunk
@ -151,6 +152,9 @@ static void redo_set_layer(UndoStream *stream, UndoChunk *chunk, int state);
static void chunk_set_mask(UndoStream *stream, Sprite *sprite);
static void redo_set_mask(UndoStream *stream, UndoChunk *chunk, int state);
static void chunk_set_frames(UndoStream *stream, Sprite *sprite);
static void redo_set_frames(UndoStream *stream, UndoChunk *chunk, int state);
static UndoAction undo_actions[] = { /* in UNDO_TYPEs order */
{ "Open", redo_open },
{ "Close", redo_close },
@ -168,6 +172,7 @@ static UndoAction undo_actions[] = { /* in UNDO_TYPEs order */
{ "Move layer", redo_move_layer },
{ "Set layer", redo_set_layer },
{ "Set mask", redo_set_mask },
{ "Set frames", redo_set_frames },
};
/* UndoChunk */
@ -318,7 +323,7 @@ static void run_undo(Undo *undo, int state, int discard_tail)
else if (chunk->type == UNDO_TYPE_CLOSE)
level--;
undo_chunk_free (chunk);
undo_chunk_free(chunk);
if (state == DO_UNDO)
undo->diff_count--;
@ -386,7 +391,7 @@ static void update_undo(Undo *undo)
/* "undo" is too big? */
while (groups > 1 && undo->undo_stream->size > undo->size_limit) {
run_undo (undo, DO_UNDO, TRUE);
run_undo(undo, DO_UNDO, TRUE);
groups--;
}
}
@ -1172,6 +1177,44 @@ static void redo_set_mask(UndoStream *stream, UndoChunk *chunk, int state)
}
}
/***********************************************************************
"set_frames"
DWORD sprite ID
DWORD frames
***********************************************************************/
void undo_set_frames(Undo *undo, Sprite *sprite)
{
chunk_set_frames(undo->undo_stream, sprite);
update_undo(undo);
}
static void chunk_set_frames(UndoStream *stream, Sprite *sprite)
{
UndoChunk *chunk = undo_chunk_new(UNDO_TYPE_SET_FRAMES);
undo_chunk_put32(chunk, sprite->gfxobj.id);
undo_chunk_put32(chunk, sprite->frames);
undo_stream_push_chunk(stream, chunk);
}
static void redo_set_frames(UndoStream *stream, UndoChunk *chunk, int state)
{
unsigned long sprite_id = undo_chunk_get32(chunk);
Sprite *sprite = (Sprite *)gfxobj_find(sprite_id);
if (sprite) {
int frames = undo_chunk_get32(chunk);
chunk_set_frames(stream, sprite);
sprite_set_frames(sprite, frames);
}
}
/***********************************************************************
Helper routines for UndoChunk
@ -1426,7 +1469,7 @@ static Layer *undo_chunk_read_layer(UndoChunk *chunk)
layer->readable = TRUE;
if (flags & 2)
layer->writeable = TRUE;
layer->writable = TRUE;
_gfxobj_set_id((GfxObj *)layer, layer_id);
}
@ -1444,7 +1487,7 @@ static void undo_chunk_write_layer(UndoChunk *chunk, Layer *layer)
undo_chunk_put32(chunk, layer->gfxobj.id); /* ID */
undo_chunk_write_string(chunk, layer->name); /* name */
undo_chunk_put8(chunk, (((layer->readable)?1:0) |
(((layer->writeable)?1:0)<<1))); /* properties */
(((layer->writable)?1:0)<<1))); /* properties */
undo_chunk_put32(chunk, layer->gfxobj.type); /* type */
switch (layer->gfxobj.type) {

View File

@ -77,6 +77,7 @@ void undo_remove_layer(Undo *undo, struct Layer *layer);
void undo_move_layer(Undo *undo, struct Layer *layer);
void undo_set_layer(Undo *undo, struct Sprite *sprite);
void undo_set_mask(Undo *undo, struct Sprite *sprite);
void undo_set_frames(Undo *undo, struct Sprite *sprite);
#define undo_int(undo, gfxobj, value_address) \
undo_data((undo), (gfxobj), (void *)(value_address), sizeof(int))

View File

@ -284,8 +284,8 @@ static int metatable_index(lua_State *L)
Type_Layer: Type_Sprite, layer->parent);
else if (strcmp (index, "readable") == 0)
lua_pushboolean (L, layer->readable);
else if (strcmp (index, "writeable") == 0)
lua_pushboolean (L, layer->writeable);
else if (strcmp (index, "writable") == 0)
lua_pushboolean (L, layer->writable);
else if (strcmp (index, "prev") == 0)
push_userdata (L, Type_Layer, layer_get_prev (layer));
else if (strcmp (index, "next") == 0)

View File

@ -177,7 +177,7 @@ Sprite *sprite_load(const char *filename);
int sprite_save(Sprite *sprite);
char *get_readable_extensions(void);
char *get_writeable_extensions(void);
char *get_writable_extensions(void);
/* modules/editors.c */
@ -234,7 +234,6 @@ void flip_vertical(void);
void set_frame_to_handle(Layer *layer, Frame *frame);
void new_frame(void);
void move_frame(void);
void copy_frame(void);
void link_frame(void);

View File

@ -957,10 +957,10 @@ static int bind_get_readable_extensions(lua_State *L)
return 1;
}
static int bind_get_writeable_extensions(lua_State *L)
static int bind_get_writable_extensions(lua_State *L)
{
const char *return_value;
return_value = get_writeable_extensions();
return_value = get_writable_extensions();
lua_pushstring(L, return_value);
return 1;
}
@ -1155,12 +1155,6 @@ static int bind_set_frame_to_handle(lua_State *L)
return 0;
}
static int bind_new_frame(lua_State *L)
{
new_frame();
return 0;
}
static int bind_move_frame(lua_State *L)
{
move_frame();
@ -5708,7 +5702,7 @@ const luaL_reg bindings_routines[] = {
{ "sprite_load", bind_sprite_load },
{ "sprite_save", bind_sprite_save },
{ "get_readable_extensions", bind_get_readable_extensions },
{ "get_writeable_extensions", bind_get_writeable_extensions },
{ "get_writable_extensions", bind_get_writable_extensions },
{ "set_current_editor", bind_set_current_editor },
{ "update_editors_with_sprite", bind_update_editors_with_sprite },
{ "editors_draw_sprite", bind_editors_draw_sprite },
@ -5734,7 +5728,6 @@ const luaL_reg bindings_routines[] = {
{ "flip_horizontal", bind_flip_horizontal },
{ "flip_vertical", bind_flip_vertical },
{ "set_frame_to_handle", bind_set_frame_to_handle },
{ "new_frame", bind_new_frame },
{ "move_frame", bind_move_frame },
{ "copy_frame", bind_copy_frame },
{ "link_frame", bind_link_frame },

View File

@ -1,5 +1,5 @@
/* ase -- allegro-sprite-editor: the ultimate sprites factory
* Copyright (C) 2001-2005 David A. Capello
* Copyright (C) 2001-2005, 2007 David A. 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
@ -49,58 +49,6 @@ void set_frame_to_handle (Layer *layer, Frame *frame)
handle_frame = frame;
}
void new_frame (void)
{
int bg, image_index;
Frame *frame;
Image *image;
if (!current_sprite ||
!current_sprite->layer ||
!layer_is_image (current_sprite->layer))
return;
while (layer_get_frame (current_sprite->layer, current_sprite->frpos))
current_sprite->frpos++;
if (current_sprite->frpos >= current_sprite->frames)
sprite_set_frames(current_sprite, current_sprite->frpos+1);
/* create a new empty frame with a new clean image */
image = image_new (current_sprite->imgtype,
current_sprite->w,
current_sprite->h);
if (!image) {
console_printf (_("Not enough memory.\n"));
return;
}
/* background color (right color) */
bg = get_color_for_image (image->imgtype,
color_bar_get_color (app_get_color_bar (), 1));
image_clear (image, bg);
/* add the image in the stock */
image_index = stock_add_image (current_sprite->layer->stock, image);
undo_open (current_sprite->undo);
undo_add_image (current_sprite->undo,
current_sprite->layer->stock, image);
/* add the frame in the layer */
frame = frame_new (current_sprite->frpos, image_index);
undo_add_frame (current_sprite->undo, current_sprite->layer, frame);
layer_add_frame (current_sprite->layer, frame);
undo_close (current_sprite->undo);
GUI_Refresh (current_sprite);
handle_layer = NULL;
handle_frame = NULL;
}
void move_frame (void)
{
if (handle_layer && handle_frame &&

View File

@ -1099,7 +1099,7 @@ static bool editor_msg_proc (JWidget widget, JMessage msg)
else if (msg->mouse.left && has_only_shifts(msg, KB_CTRL_FLAG)) {
if ((editor->sprite->layer) &&
(editor->sprite->layer->gfxobj.type == GFXOBJ_LAYER_IMAGE) &&
(editor->sprite->layer->writeable)) {
(editor->sprite->layer->writable)) {
bool click2 = get_config_bool("Options", "MoveClick2", FALSE);
interactive_move_layer(click2 ? MODE_CLICKANDCLICK: