diff --git a/ChangeLog b/ChangeLog index cf756e44a..511c1345f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,24 @@ +2007-11-09 David A. Capello + + * src/script/functions.c: Added: NewLayer(Set), RemoveLayer, + FlattenLayers, RemoveFrame. + +2007-11-08 David A. Capello + + * src/commands/cmd_merge_down_layer.c: Done. + + * src/commands/cmd_remove_layer.c: Done. + + * src/commands/cmd_new_layer_set.c: Done. + + * src/commands/cmd_new_layer.c: Done. + 2007-11-07 David A. Capello + * src/commands/cmd_duplicate_sprite.c: Done. + + * src/commands/cmd_change_image_type.c: Done. + * src/commands/cmd_color_curve.c: Done. Removed src/dialogs/effect/dcolcurv.c * src/commands/cmd_convolution_matrix.c: Done. Removed src/dialogs/effect/dconvmtr.c diff --git a/data/scripts/duplay.lua b/data/scripts/duplay.lua deleted file mode 100644 index e3267b06a..000000000 --- a/data/scripts/duplay.lua +++ /dev/null @@ -1,42 +0,0 @@ --- ase -- allegro-sprite-editor: the ultimate sprites factory --- Copyright (C) 2001-2005 by David A. Capello - -function DuplicateLayer() - local sprite = current_sprite - - if not sprite or not sprite.layer then - return nil - end - - local layer_copy = layer_new_copy(sprite.layer) - if not layer_copy then - print("Not enough memory") - return nil - end - - layer_set_name(layer_copy, layer_copy.name .. " Copy") - - if undo_is_enabled(sprite.undo) then - undo_open(sprite.undo) - undo_add_layer(sprite.undo, sprite.layer.parent, layer_copy) - end - - layer_add_layer(sprite.layer.parent, layer_copy) - - if undo_is_enabled(sprite.undo) then - undo_move_layer(sprite.undo, layer_copy) - undo_set_layer(sprite.undo, sprite) - undo_close(sprite.undo) - end - - layer_move_layer(sprite.layer.parent, layer_copy, sprite.layer) - sprite_set_layer(sprite, layer_copy) - - return layer_copy -end - -function GUI_DuplicateLayer() - if DuplicateLayer() then - GUI_Refresh(current_sprite) - end -end diff --git a/data/scripts/dupspr.lua b/data/scripts/dupspr.lua deleted file mode 100644 index 7377bc8d6..000000000 --- a/data/scripts/dupspr.lua +++ /dev/null @@ -1,49 +0,0 @@ --- ase -- allegro-sprite-editor: the ultimate sprites factory --- Copyright (C) 2001-2005 by David A. Capello - -function GUI_DuplicateSprite() - local sprite = current_sprite - if not sprite then return end - - -- load the window widget - local window = ji_load_widget("dupspr.jid", "duplicate_sprite") - if not window then return end - - local src_name, dst_name, flatten - = jwidget_find_name(window, "src_name"), - jwidget_find_name(window, "dst_name"), - jwidget_find_name(window, "flatten") - - jwidget_set_text(src_name, get_filename(sprite.filename)) - jwidget_set_text(dst_name, sprite.filename .. " Copy") - - if get_config_bool("DuplicateSprite", "Flatten", false) then - jwidget_select(flatten) - end - - -- open the window - jwindow_open_fg(window) - - if jwindow_get_killer(window) == jwidget_find_name(window, "ok") then - set_config_bool("DuplicateSprite", "Flatten", - jwidget_is_selected(flatten)) - - local sprite_copy - - if jwidget_is_selected(flatten) then - sprite_copy = sprite_new_flatten_copy(sprite) - else - sprite_copy = sprite_new_copy(sprite) - end - - if sprite_copy then - sprite_set_filename(sprite_copy, jwidget_get_text(dst_name)) - - sprite_mount(sprite_copy) - set_current_sprite(sprite_copy) - sprite_show(sprite_copy) - end - end - - jwidget_free(window) -end diff --git a/data/scripts/flatten.lua b/data/scripts/flatten.lua deleted file mode 100644 index 52159884b..000000000 --- a/data/scripts/flatten.lua +++ /dev/null @@ -1,63 +0,0 @@ --- ase -- allegro-sprite-editor: the ultimate sprites factory --- Copyright (C) 2001-2005 by David A. Capello - -function FlattenLayers() - local sprite = current_sprite - if not sprite then - return - end - - -- generate the flat_layer - local flat_layer = layer_flatten(sprite.set, - sprite.imgtype, 0, 0, sprite.w, sprite.h, - 0, sprite.frames-1) - if not flat_layer then - print("Not enough memory") - return nil - end - - -- open undo, and add the new layer - if undo_is_enabled(sprite.undo) then - undo_open(sprite.undo) - undo_add_layer(sprite.undo, sprite.set, flat_layer) - end - - layer_add_layer(sprite.set, flat_layer) - - -- select the new layer - if undo_is_enabled(sprite.undo) then - undo_set_layer(sprite.undo, sprite) - end - - sprite_set_layer(sprite, flat_layer) - - -- remove old layers - local it = sprite.set.layers - local next - - while it do - next = it.next - - if it.id != flat_layer.id then - -- undo - if undo_is_enabled(sprite.undo) then - undo_remove_layer(sprite.undo, it) - end - - -- remove and destroy "it" layer - layer_remove_layer(sprite.set, it) - layer_free(it) - end - - it = next - end - - -- close the undo - if undo_is_enabled(sprite.undo) then - undo_close(sprite.undo) - end - - GUI_Refresh(sprite) - - return flat_layer -end diff --git a/data/scripts/flip.lua b/data/scripts/flip.lua deleted file mode 100644 index 2045df75e..000000000 --- a/data/scripts/flip.lua +++ /dev/null @@ -1,16 +0,0 @@ --- ase -- allegro-sprite-editor: the ultimate sprites factory --- Copyright (C) 2001-2005 by David A. Capello - -function GUI_FlipHorizontal() - if current_sprite then - flip_horizontal() - GUI_Refresh(current_sprite) - end -end - -function GUI_FlipVertical() - if current_sprite then - flip_vertical() - GUI_Refresh(current_sprite) - end -end diff --git a/data/scripts/frmprop.lua b/data/scripts/frmprop.lua deleted file mode 100644 index 5454a4abd..000000000 --- a/data/scripts/frmprop.lua +++ /dev/null @@ -1,77 +0,0 @@ --- ase -- allegro-sprite-editor: the ultimate sprites factory --- Copyright (C) 2001-2005 by David A. Capello - -function GUI_FrameProperties() - -- get current sprite - local sprite = current_sprite - if not sprite then return end - - -- get selected layer - local layer = sprite.layer - if not layer then return end - - -- get current frame - local frame = layer_get_frame(layer, sprite.frpos) - if not frame then return end - - local window = ji_load_widget("frmprop.jid", "frame_properties") - if not window then return end - - local entry_frpos = jwidget_find_name(window, "frpos") - local entry_xpos = jwidget_find_name(window, "xpos") - local entry_ypos = jwidget_find_name(window, "ypos") - local slider_opacity = jwidget_find_name(window, "opacity") - local button_ok = jwidget_find_name(window, "ok") - - jwidget_set_text(entry_frpos, tostring(frame.frpos)) - jwidget_set_text(entry_xpos, tostring(frame.x)) - jwidget_set_text(entry_ypos, tostring(frame.y)) - jslider_set_value(slider_opacity, frame.opacity) - - repeat - jwindow_open_fg(window) - - if jwindow_get_killer(window) == button_ok then - local new_frpos = MID(0, tonumber(jwidget_get_text (entry_frpos)), - sprite.frames-1) - local existent_frame = layer_get_frame(layer, new_frpos) - - if new_frpos != frame.frpos and existent_frame then - jalert("Error<imgtype == IMAGE_RGB) { + jwidget_set_text(from, _("RGB")); + jwidget_disable(radio1); + jwidget_select(radio3); /* to Indexed by default */ + } + else if (current_sprite->imgtype == IMAGE_GRAYSCALE) { + jwidget_set_text(from, _("Grayscale")); + jwidget_disable(radio2); + jwidget_select(radio1); /* to RGB by default */ + } + else if (current_sprite->imgtype == IMAGE_INDEXED) { + jwidget_set_text(from, _("Indexed")); + jwidget_disable(radio3); + jwidget_select(radio1); /* to RGB by default */ + } + + if (get_config_bool("Options", "Dither", FALSE)) + jwidget_select(dither2); + else + jwidget_select(dither1); + + /* open the window */ + jwindow_open_fg(window); + + if (jwindow_get_killer(window) == jwidget_find_name(window, "ok")) { + int destimgtype, dithermethod; + + if (jwidget_is_selected(radio1)) + destimgtype = IMAGE_RGB; + else if (jwidget_is_selected(radio2)) + destimgtype = IMAGE_GRAYSCALE; + else if (jwidget_is_selected(radio3)) + destimgtype = IMAGE_INDEXED; + + if (jwidget_is_selected(dither1)) + dithermethod = DITHERING_NONE; + else if (jwidget_is_selected(dither2)) + dithermethod = DITHERING_ORDERED; + + use_current_sprite_rgb_map(); + sprite_set_imgtype(current_sprite, destimgtype, dithermethod); + restore_rgb_map(); + + app_refresh_screen(); + } + + jwidget_free(window); } diff --git a/src/commands/cmd_duplicate_layer.c b/src/commands/cmd_duplicate_layer.c index 05971e459..801236964 100644 --- a/src/commands/cmd_duplicate_layer.c +++ b/src/commands/cmd_duplicate_layer.c @@ -22,12 +22,64 @@ #include "jinete.h" +#include "console/console.h" #include "core/app.h" +#include "modules/gui.h" #include "modules/sprites.h" +#include "raster/layer.h" #include "raster/sprite.h" +#include "raster/undo.h" #endif +static Layer *DuplicateLayer(void); + +bool command_enabled_duplicate_layer(const char *argument) +{ + return + current_sprite != NULL && + current_sprite->layer != NULL; +} + void command_execute_duplicate_layer(const char *argument) { + if (DuplicateLayer() != NULL) + GUI_Refresh(current_sprite); +} + +static Layer *DuplicateLayer(void) +{ + Sprite *sprite = current_sprite; + Layer *layer_copy; + char buf[1024]; + + if (!sprite || !sprite->layer) + return NULL; + + layer_copy = layer_new_copy(sprite->layer); + if (!layer_copy) { + console_printf("Not enough memory"); + return NULL; + } + + sprintf(buf, "%s %s", layer_copy->name, _("Copy")); + layer_set_name(layer_copy, buf); + + if (undo_is_enabled(sprite->undo)) { + undo_open(sprite->undo); + undo_add_layer(sprite->undo, (Layer *)sprite->layer->parent, layer_copy); + } + + layer_add_layer((Layer *)sprite->layer->parent, layer_copy); + + if (undo_is_enabled(sprite->undo)) { + undo_move_layer(sprite->undo, layer_copy); + undo_set_layer(sprite->undo, sprite); + undo_close(sprite->undo); + } + + layer_move_layer((Layer *)sprite->layer->parent, layer_copy, sprite->layer); + sprite_set_layer(sprite, layer_copy); + + return layer_copy; } diff --git a/src/commands/cmd_duplicate_sprite.c b/src/commands/cmd_duplicate_sprite.c index 613d46a79..94f1c872e 100644 --- a/src/commands/cmd_duplicate_sprite.c +++ b/src/commands/cmd_duplicate_sprite.c @@ -20,14 +20,67 @@ #ifndef USE_PRECOMPILED_HEADER +#include + #include "jinete.h" #include "core/app.h" +#include "core/cfg.h" +#include "modules/gui.h" #include "modules/sprites.h" #include "raster/sprite.h" #endif +bool command_enabled_duplicate_sprite(const char *argument) +{ + return current_sprite != NULL; +} + void command_execute_duplicate_sprite(const char *argument) { + JWidget window, src_name, dst_name, flatten; + Sprite *sprite = current_sprite; + Sprite *sprite_copy; + char buf[1024]; + + /* load the window widget */ + window = load_widget("dupspr.jid", "duplicate_sprite"); + if (!window) + return; + + src_name = jwidget_find_name(window, "src_name"); + dst_name = jwidget_find_name(window, "dst_name"); + flatten = jwidget_find_name(window, "flatten"); + + jwidget_set_text(src_name, get_filename(sprite->filename)); + + sprintf(buf, "%s %s", sprite->filename, _("Copy")); + jwidget_set_text(dst_name, buf); + + if (get_config_bool("DuplicateSprite", "Flatten", FALSE)) + jwidget_select(flatten); + + /* open the window */ + jwindow_open_fg(window); + + if (jwindow_get_killer(window) == jwidget_find_name(window, "ok")) { + set_config_bool("DuplicateSprite", "Flatten", + jwidget_is_selected(flatten)); + + if (jwidget_is_selected(flatten)) + sprite_copy = sprite_new_flatten_copy(sprite); + else + sprite_copy = sprite_new_copy(sprite); + + if (sprite_copy != NULL) { + sprite_set_filename(sprite_copy, jwidget_get_text(dst_name)); + + sprite_mount(sprite_copy); + set_current_sprite(sprite_copy); + sprite_show(sprite_copy); + } + } + + jwidget_free(window); } diff --git a/src/commands/cmd_flatten_layers.c b/src/commands/cmd_flatten_layers.c index 48f1619da..e5235cb3f 100644 --- a/src/commands/cmd_flatten_layers.c +++ b/src/commands/cmd_flatten_layers.c @@ -20,14 +20,17 @@ #ifndef USE_PRECOMPILED_HEADER -#include "jinete.h" - -#include "core/app.h" #include "modules/sprites.h" -#include "raster/sprite.h" +#include "script/functions.h" #endif +bool command_enabled_flatten_layers(const char *argument) +{ + return current_sprite != NULL; +} + void command_execute_flatten_layers(const char *argument) { + FlattenLayers(); } diff --git a/src/commands/cmd_frame_properties.c b/src/commands/cmd_frame_properties.c index 5d5462884..f6161812b 100644 --- a/src/commands/cmd_frame_properties.c +++ b/src/commands/cmd_frame_properties.c @@ -23,11 +23,110 @@ #include "jinete.h" #include "core/app.h" +#include "modules/gui.h" #include "modules/sprites.h" +#include "raster/frame.h" +#include "raster/layer.h" #include "raster/sprite.h" +#include "raster/undo.h" #endif +bool command_enabled_frame_properties(const char *argument) +{ + return current_sprite != NULL; +} + void command_execute_frame_properties(const char *argument) { + JWidget window, entry_frpos, entry_xpos, entry_ypos, slider_opacity, button_ok; + Sprite *sprite; + Layer *layer; + Frame *frame; + char buf[1024]; + + /* get current sprite */ + sprite = current_sprite; + if (!sprite) + return; + + /* get selected layer */ + layer = sprite->layer; + if (!layer) + return; + + /* get current frame */ + frame = layer_get_frame(layer, sprite->frpos); + if (!frame) + return; + + window = load_widget("frmprop.jid", "frame_properties"); + if (!window) + return; + + entry_frpos = jwidget_find_name(window, "frpos"); + entry_xpos = jwidget_find_name(window, "xpos"); + entry_ypos = jwidget_find_name(window, "ypos"); + slider_opacity = jwidget_find_name(window, "opacity"); + button_ok = jwidget_find_name(window, "ok"); + + sprintf(buf, "%d", frame->frpos); jwidget_set_text(entry_frpos, buf); + sprintf(buf, "%d", frame->x); jwidget_set_text(entry_xpos, buf); + sprintf(buf, "%d", frame->y); jwidget_set_text(entry_ypos, buf); + jslider_set_value(slider_opacity, frame->opacity); + + while (TRUE) { + jwindow_open_fg(window); + + if (jwindow_get_killer(window) == button_ok) { + int new_frpos, new_xpos, new_ypos; + Frame *existent_frame; + + new_frpos = strtol(jwidget_get_text(entry_frpos), NULL, 10); + new_frpos = MID(0, new_frpos, sprite->frames-1); + existent_frame = layer_get_frame(layer, new_frpos); + + if (new_frpos != frame->frpos && existent_frame) { + jalert("Error<undo)) { + undo_open(sprite->undo); + undo_remove_frame(sprite->undo, layer, frame); + } + + layer_remove_frame(layer, frame); + + /* change frame properties */ + new_xpos = strtol(jwidget_get_text(entry_xpos), NULL, 10); + new_ypos = strtol(jwidget_get_text(entry_ypos), NULL, 10); + + frame_set_frpos(frame, new_frpos); + frame_set_position(frame, + MID(-9999, new_xpos, 9999), + MID(-9999, new_ypos, 9999)); + frame_set_opacity(frame, jslider_get_value(slider_opacity)); + + /* add again the same frame */ + if (undo_is_enabled(sprite->undo)) { + undo_add_frame(sprite->undo, layer, frame); + undo_close(sprite->undo); + } + + layer_add_frame(layer, frame); + + /* set the sprite position, refresh and break the loop */ + sprite_set_frpos(sprite, new_frpos); + GUI_Refresh(sprite); + break; + } + } + else + break; + } + + jwidget_free(window); } diff --git a/src/commands/cmd_layer_properties.c b/src/commands/cmd_layer_properties.c index dd59b1722..042d9f67f 100644 --- a/src/commands/cmd_layer_properties.c +++ b/src/commands/cmd_layer_properties.c @@ -23,11 +23,99 @@ #include "jinete.h" #include "core/app.h" +#include "modules/gui.h" #include "modules/sprites.h" +#include "raster/layer.h" #include "raster/sprite.h" #endif +bool command_enabled_layer_properties(const char *argument) +{ + return current_sprite != NULL; +} + void command_execute_layer_properties(const char *argument) { + JWidget window, box1, box2, box3, label_name, entry_name; + JWidget button_ok, button_cancel, label_bm, view_bm, list_bm; + Sprite *sprite; + Layer *layer; + + /* get current sprite */ + sprite = current_sprite; + if (!sprite) + return; + + /* get selected layer */ + layer = sprite->layer; + if (!layer) + return; + + window = jwindow_new(_("Layer Properties")); + box1 = jbox_new(JI_VERTICAL); + box2 = jbox_new(JI_HORIZONTAL); + box3 = jbox_new(JI_HORIZONTAL + JI_HOMOGENEOUS); + label_name = jlabel_new(_("Name:")); + entry_name = jentry_new(256, layer->name); + button_ok = jbutton_new(_("&OK")); + button_cancel = jbutton_new(_("&Cancel")); + + if (layer->gfxobj.type == GFXOBJ_LAYER_IMAGE) { + label_bm = jlabel_new(_("Blend mode:")); + view_bm = jview_new(); + list_bm = jlistbox_new(); + + jwidget_add_child(list_bm, jlistitem_new(_("Normal"))); + jwidget_add_child(list_bm, jlistitem_new(_("Dissolve"))); + jwidget_add_child(list_bm, jlistitem_new(_("Multiply"))); + jwidget_add_child(list_bm, jlistitem_new(_("Screen"))); + jwidget_add_child(list_bm, jlistitem_new(_("Overlay"))); + jwidget_add_child(list_bm, jlistitem_new(_("Hard Light"))); + jwidget_add_child(list_bm, jlistitem_new(_("Dodge"))); + jwidget_add_child(list_bm, jlistitem_new(_("Burn"))); + jwidget_add_child(list_bm, jlistitem_new(_("Darken"))); + jwidget_add_child(list_bm, jlistitem_new(_("Lighten"))); + jwidget_add_child(list_bm, jlistitem_new(_("Addition"))); + jwidget_add_child(list_bm, jlistitem_new(_("Subtract"))); + jwidget_add_child(list_bm, jlistitem_new(_("Difference"))); + jwidget_add_child(list_bm, jlistitem_new(_("Hue"))); + jwidget_add_child(list_bm, jlistitem_new(_("Saturation"))); + jwidget_add_child(list_bm, jlistitem_new(_("Color"))); + jwidget_add_child(list_bm, jlistitem_new(_("Luminosity"))); + + jlistbox_select_index(list_bm, layer->blend_mode); + + jview_attach(view_bm, list_bm); + jwidget_set_static_size(view_bm, 128, 64); + jwidget_expansive(view_bm, TRUE); + } + + jwidget_expansive(entry_name, TRUE); + + jwidget_add_child(box2, label_name); + jwidget_add_child(box2, entry_name); + jwidget_add_child(box1, box2); + if (layer->gfxobj.type == GFXOBJ_LAYER_IMAGE) { + jwidget_add_child(box1, label_bm); + jwidget_add_child(box1, view_bm); + } + jwidget_add_child(box3, button_ok); + jwidget_add_child(box3, button_cancel); + jwidget_add_child(box1, box3); + jwidget_add_child(window, box1); + + jwidget_magnetic(button_ok, TRUE); + + jwindow_open_fg(window); + + if (jwindow_get_killer(window) == button_ok) { + layer_set_name(layer, jwidget_get_text(entry_name)); + if (layer->gfxobj.type == GFXOBJ_LAYER_IMAGE) + layer_set_blend_mode(layer, jlistbox_get_selected_index(list_bm)); + + GUI_Refresh(sprite); + } + + jwidget_free(window); } diff --git a/src/commands/cmd_merge_down_layer.c b/src/commands/cmd_merge_down_layer.c index e6b772864..405e9c5db 100644 --- a/src/commands/cmd_merge_down_layer.c +++ b/src/commands/cmd_merge_down_layer.c @@ -23,11 +23,123 @@ #include "jinete.h" #include "core/app.h" +#include "modules/gui.h" #include "modules/sprites.h" +#include "raster/frame.h" +#include "raster/image.h" +#include "raster/layer.h" #include "raster/sprite.h" +#include "raster/stock.h" +#include "raster/undo.h" #endif +bool command_enabled_merge_down_layer(const char *argument) +{ + Layer *src_layer, *dst_layer; + Sprite *sprite; + + sprite = current_sprite; + if (!sprite) + return FALSE; + + src_layer = sprite->layer; + if (!src_layer || !layer_is_image(src_layer)) + return FALSE; + + dst_layer = layer_get_prev(sprite->layer); + if (!dst_layer || !layer_is_image(dst_layer)) + return FALSE; + + return TRUE; +} + void command_execute_merge_down_layer(const char *argument) { + Sprite *sprite = current_sprite; + Layer *src_layer, *dst_layer; + Frame *src_frame, *dst_frame; + Image *src_image, *dst_image; + int frpos, index; + + src_layer = sprite->layer; + dst_layer = layer_get_prev(sprite->layer); + + if (undo_is_enabled(sprite->undo)) + undo_open(sprite->undo); + + for (frpos=0; frposframes; ++frpos) { + /* get frames */ + src_frame = layer_get_frame(src_layer, frpos); + dst_frame = layer_get_frame(dst_layer, frpos); + + /* get images */ + if (src_frame) + src_image = stock_get_image(src_layer->stock, src_frame->image); + else + src_image = NULL; + + if (dst_frame) + dst_image = stock_get_image(dst_layer->stock, dst_frame->image); + else + dst_image = NULL; + + /* with source image? */ + if (src_image) { + /* no destination image */ + if (!dst_image) { + /* copy this frame to the destination layer */ + dst_image = image_new_copy(src_image); + index = stock_add_image(dst_layer->stock, dst_image); + if (undo_is_enabled(sprite->undo)) { + undo_add_image(sprite->undo, dst_layer->stock, dst_image); + } + dst_frame = frame_new(frpos, index); + frame_set_position(dst_frame, src_frame->x, src_frame->y); + frame_set_opacity(dst_frame, src_frame->opacity); + if (undo_is_enabled(sprite->undo)) { + undo_add_frame(sprite->undo, dst_layer, dst_frame); + } + layer_add_frame(dst_layer, dst_frame); + } + /* with destination */ + else { + int x1 = MIN(src_frame->x, dst_frame->x); + int y1 = MIN(src_frame->y, dst_frame->y); + int x2 = MAX(src_frame->x+src_image->w-1, dst_frame->x+dst_image->w-1); + int y2 = MAX(src_frame->y+src_image->h-1, dst_frame->y+dst_image->h-1); + Image *new_image = image_crop(dst_image, + x1-dst_frame->x, + y1-dst_frame->y, + x2-x1+1, y2-y1+1); + + /* merge src_image in new_image */ + image_merge(new_image, src_image, + src_frame->x-x1, + src_frame->y-y1, + src_frame->opacity, + src_layer->blend_mode); + + frame_set_position(dst_frame, x1, y1); + if (undo_is_enabled(sprite->undo)) { + undo_replace_image(sprite->undo, dst_layer->stock, dst_frame->image); + } + stock_replace_image(dst_layer->stock, dst_frame->image, new_image); + + image_free(dst_image); + } + } + } + + if (undo_is_enabled(sprite->undo)) { + undo_set_layer(sprite->undo, sprite); + undo_remove_layer(sprite->undo, src_layer); + undo_close(sprite->undo); + } + + sprite_set_layer(sprite, dst_layer); + layer_remove_layer((Layer *)src_layer->parent, src_layer); + layer_free(src_layer); + + GUI_Refresh(sprite); } diff --git a/src/commands/cmd_new_layer.c b/src/commands/cmd_new_layer.c index 62c960943..134b7e48c 100644 --- a/src/commands/cmd_new_layer.c +++ b/src/commands/cmd_new_layer.c @@ -23,11 +23,55 @@ #include "jinete.h" #include "core/app.h" +#include "modules/gui.h" #include "modules/sprites.h" +#include "raster/layer.h" #include "raster/sprite.h" #endif +bool command_enabled_new_layer(const char *argument) +{ + return current_sprite != NULL; +} + void command_execute_new_layer(const char *argument) { + JWidget window; + Sprite *sprite = current_sprite; /* get current sprite */ + char buf[512]; + + /* load the window widget */ + window = load_widget("newlay.jid", "new_layer"); + if (!window) + return; + + jwidget_set_text(jwidget_find_name(window, "name"), GetUniqueLayerName()); + + sprintf(buf, "%d", sprite->w); + jwidget_set_text(jwidget_find_name(window, "width"), buf); + + sprintf(buf, "%d", sprite->h); + jwidget_set_text(jwidget_find_name(window, "height"), buf); + + jwindow_open_fg(window); + + if (jwindow_get_killer(window) == jwidget_find_name(window, "ok")) { + const char *name = jwidget_get_text(jwidget_find_name(window, "name")); + Layer *layer; + int w, h; + + w = strtol(jwidget_get_text(jwidget_find_name(window, "width")), NULL, 10); + h = strtol(jwidget_get_text(jwidget_find_name(window, "height")), NULL, 10); + w = MID(1, w, 9999); + h = MID(1, h, 9999); + layer = NewLayer(name, 0, 0, w, h); + if (!layer) { + jalert(_("Error<layer, sprite->frpos); + if (frame) { + RemoveFrame(sprite->layer, frame); + GUI_Refresh(sprite); + } } diff --git a/src/commands/cmd_remove_layer.c b/src/commands/cmd_remove_layer.c index 4843b6d84..899ac6d11 100644 --- a/src/commands/cmd_remove_layer.c +++ b/src/commands/cmd_remove_layer.c @@ -20,14 +20,19 @@ #ifndef USE_PRECOMPILED_HEADER -#include "jinete.h" - -#include "core/app.h" +#include "modules/gui.h" #include "modules/sprites.h" #include "raster/sprite.h" #endif +bool command_enabled_remove_layer(const char *argument) +{ + return current_sprite != NULL; +} + void command_execute_remove_layer(const char *argument) { + RemoveLayer(); + GUI_Refresh(current_sprite); } diff --git a/src/commands/commands.c b/src/commands/commands.c index e6cf33bf5..cc99faf12 100644 --- a/src/commands/commands.c +++ b/src/commands/commands.c @@ -85,24 +85,35 @@ void command_execute_preview_tiled(const char *argument); /* sprite */ bool command_enabled_sprite_properties(const char *argument); void command_execute_sprite_properties(const char *argument); +bool command_enabled_duplicate_sprite(const char *argument); void command_execute_duplicate_sprite(const char *argument); +bool command_enabled_change_image_type(const char *argument); void command_execute_change_image_type(const char *argument); bool command_enabled_crop_sprite(const char *argument); void command_execute_crop_sprite(const char *argument); bool command_enabled_autocrop_sprite(const char *argument); void command_execute_autocrop_sprite(const char *argument); /* layer */ +bool command_enabled_layer_properties(const char *argument); void command_execute_layer_properties(const char *argument); +bool command_enabled_new_layer(const char *argument); void command_execute_new_layer(const char *argument); +bool command_enabled_new_layer_set(const char *argument); void command_execute_new_layer_set(const char *argument); +bool command_enabled_remove_layer(const char *argument); void command_execute_remove_layer(const char *argument); +bool command_enabled_duplicate_layer(const char *argument); void command_execute_duplicate_layer(const char *argument); +bool command_enabled_merge_down_layer(const char *argument); void command_execute_merge_down_layer(const char *argument); +bool command_enabled_flatten_layers(const char *argument); void command_execute_flatten_layers(const char *argument); bool command_enabled_crop_layer(const char *argument); void command_execute_crop_layer(const char *argument); /* frame */ +bool command_enabled_frame_properties(const char *argument); void command_execute_frame_properties(const char *argument); +bool command_enabled_remove_frame(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); @@ -208,20 +219,20 @@ static Command commands[] = { CMD_EXE_ENA2(preview_normal, preview), CMD_EXE_ENA2(preview_fit_to_screen, preview), CMD_EXE_ENA(sprite_properties), - { CMD_DUPLICATE_SPRITE, NULL, NULL, NULL, NULL }, - { CMD_CHANGE_IMAGE_TYPE, NULL, NULL, NULL, NULL }, + CMD_EXE_ENA(duplicate_sprite), + CMD_EXE_ENA(change_image_type), CMD_EXE_ENA(crop_sprite), CMD_EXE_ENA(autocrop_sprite), - { CMD_LAYER_PROPERTIES, NULL, NULL, NULL, NULL }, - { CMD_NEW_LAYER, NULL, NULL, NULL, NULL }, - { CMD_NEW_LAYER_SET, NULL, NULL, NULL, NULL }, - { CMD_REMOVE_LAYER, NULL, NULL, NULL, NULL }, - { CMD_DUPLICATE_LAYER, NULL, NULL, NULL, NULL }, - { CMD_MERGE_DOWN_LAYER, NULL, NULL, NULL, NULL }, - { CMD_FLATTEN_LAYERS, NULL, NULL, NULL, NULL }, + CMD_EXE_ENA(layer_properties), + CMD_EXE_ENA(new_layer), + CMD_EXE_ENA(new_layer_set), + CMD_EXE_ENA(remove_layer), + CMD_EXE_ENA(duplicate_layer), + CMD_EXE_ENA(merge_down_layer), + CMD_EXE_ENA(flatten_layers), CMD_EXE_ENA(crop_layer), - { CMD_FRAME_PROPERTIES, NULL, NULL, NULL, NULL }, - { CMD_REMOVE_FRAME, NULL, NULL, NULL, NULL }, + CMD_EXE_ENA(frame_properties), + CMD_EXE_ENA(remove_frame), CMD_EXE_ENA(new_frame), CMD_EXE_ENA(move_frame), CMD_EXE_ENA(copy_frame), diff --git a/src/modules/gui.c b/src/modules/gui.c index c5a7581d8..2738e894b 100644 --- a/src/modules/gui.c +++ b/src/modules/gui.c @@ -305,6 +305,8 @@ void gui_feedback(void) /* jmanager_dispatch_draw_messages(); */ } + + rest(0); /* don't eat CPU... rest some time */ } void gui_setup_screen(void) @@ -686,7 +688,6 @@ static bool manager_msg_proc(JWidget widget, JMessage msg) case JM_IDLE: gui_feedback(); - rest(1); /* don't eat CPU... rest some time */ break; case JM_CHAR: { diff --git a/src/raster/quant.h b/src/raster/quant.h index 645c76316..4f8ffc6b4 100644 --- a/src/raster/quant.h +++ b/src/raster/quant.h @@ -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 @@ -29,14 +29,14 @@ enum { struct Image; -struct Image *image_set_imgtype (struct Image *image, int imgtype, - int dithering_method, - RGB_MAP *rgb_map, - RGB *palette); +struct Image *image_set_imgtype(struct Image *image, int imgtype, + int dithering_method, + RGB_MAP *rgb_map, + RGB *palette); -struct Image *image_rgb_to_indexed (struct Image *src_image, - int offsetx, int offsety, - RGB_MAP *rgb_map, - RGB *palette); +struct Image *image_rgb_to_indexed(struct Image *src_image, + int offsetx, int offsety, + RGB_MAP *rgb_map, + RGB *palette); #endif /* RASTER_QUANT_H */ diff --git a/src/raster/stock.h b/src/raster/stock.h index f17bb659d..72baab3c0 100644 --- a/src/raster/stock.h +++ b/src/raster/stock.h @@ -42,7 +42,7 @@ 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); +void stock_replace_image(Stock *stock, int index, struct Image *image); struct Image *stock_get_image(Stock *stock, int index); diff --git a/src/script/genbinds.c b/src/script/genbinds.c index 7da86bcb3..31db128ee 100644 --- a/src/script/genbinds.c +++ b/src/script/genbinds.c @@ -6284,66 +6284,6 @@ void register_bindings(lua_State *L) /* Lua -> C */ /*======================================================================*/ -const char *GetUniqueLayerName(void) -{ - lua_State *L = get_lua_state(); - const char *return_value; - lua_pushstring(L, "GetUniqueLayerName"); - lua_gettable(L, LUA_GLOBALSINDEX); - do_script_raw(L, 0, 1); - return_value = lua_tostring(L, -1); - lua_pop(L, 1); - return return_value; -} - -Layer *NewLayer(const char *name, int x, int y, int w, int h) -{ - lua_State *L = get_lua_state(); - Layer *return_value; - lua_pushstring(L, "NewLayer"); - lua_gettable(L, LUA_GLOBALSINDEX); - lua_pushstring(L, name); - lua_pushnumber(L, x); - lua_pushnumber(L, y); - lua_pushnumber(L, w); - lua_pushnumber(L, h); - do_script_raw(L, 5, 1); - return_value = to_userdata(L, Type_Layer, -1); - lua_pop(L, 1); - return return_value; -} - -Layer *NewLayerSet(const char *name) -{ - lua_State *L = get_lua_state(); - Layer *return_value; - lua_pushstring(L, "NewLayerSet"); - lua_gettable(L, LUA_GLOBALSINDEX); - lua_pushstring(L, name); - do_script_raw(L, 1, 1); - return_value = to_userdata(L, Type_Layer, -1); - lua_pop(L, 1); - return return_value; -} - -void RemoveLayer(void) -{ - lua_State *L = get_lua_state(); - lua_pushstring(L, "RemoveLayer"); - lua_gettable(L, LUA_GLOBALSINDEX); - do_script_raw(L, 0, 0); -} - -void RemoveFrame(Layer *layer, Frame *frame) -{ - lua_State *L = get_lua_state(); - lua_pushstring(L, "RemoveFrame"); - lua_gettable(L, LUA_GLOBALSINDEX); - push_userdata(L, Type_Layer, layer); - push_userdata(L, Type_Frame, frame); - do_script_raw(L, 2, 0); -} - void MaskAll(void) { lua_State *L = get_lua_state(); diff --git a/src/script/import.h b/src/script/import.h index 10e4b5290..2f2fef263 100644 --- a/src/script/import.h +++ b/src/script/import.h @@ -10,16 +10,6 @@ #include "raster/layer.h" #include "raster/sprite.h" -/* layer.lua */ -const char *GetUniqueLayerName(void); - -Layer *NewLayer(const char *name, int x, int y, int w, int h); -Layer *NewLayerSet(const char *name); -void RemoveLayer(void); - -/* remfrm.lua */ -void RemoveFrame(Layer *layer, Frame *frame); - /* mask.lua */ void MaskAll(void); void DeselectMask(void); diff --git a/src/util/frmove.c b/src/util/frmove.c index 9313e8f1f..af8de31df 100644 --- a/src/util/frmove.c +++ b/src/util/frmove.c @@ -32,7 +32,7 @@ #include "raster/sprite.h" #include "raster/stock.h" #include "raster/undo.h" -#include "script/import.h" +#include "script/functions.h" #include "util/frmove.h" #include "widgets/colbar.h"