mirror of
https://github.com/aseprite/aseprite.git
synced 2025-02-26 00:40:27 +00:00
More commands transformed from Lua code to C
This commit is contained in:
parent
36f861ddd7
commit
89e2452ed0
19
ChangeLog
19
ChangeLog
@ -1,5 +1,24 @@
|
||||
2007-11-09 David A. Capello <dacap@users.sourceforge.net>
|
||||
|
||||
* src/script/functions.c: Added: NewLayer(Set), RemoveLayer,
|
||||
FlattenLayers, RemoveFrame.
|
||||
|
||||
2007-11-08 David A. Capello <dacap@users.sourceforge.net>
|
||||
|
||||
* 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 <dacap@users.sourceforge.net>
|
||||
|
||||
* 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
|
||||
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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<<You can't change frpos to " .. new_frpos ..
|
||||
"<<Already there is a frame in that pos.||&OK")
|
||||
else
|
||||
-- WE MUST REMOVE THE FRAME BEFORE CALL frame_set_frpos()
|
||||
if undo_is_enabled(sprite.undo) then
|
||||
undo_open(sprite.undo)
|
||||
undo_remove_frame(sprite.undo, layer, frame)
|
||||
end
|
||||
|
||||
layer_remove_frame(layer, frame)
|
||||
|
||||
-- change frame properties
|
||||
frame_set_frpos(frame, new_frpos)
|
||||
frame_set_position(frame,
|
||||
MID(-9999, tonumber(jwidget_get_text(entry_xpos)), 9999),
|
||||
MID(-9999, tonumber(jwidget_get_text(entry_ypos)), 9999))
|
||||
frame_set_opacity(frame, jslider_get_value(slider_opacity))
|
||||
|
||||
-- add again the same frame
|
||||
if undo_is_enabled(sprite.undo) then
|
||||
undo_add_frame(sprite.undo, layer, frame)
|
||||
undo_close(sprite.undo)
|
||||
end
|
||||
|
||||
layer_add_frame(layer, frame)
|
||||
|
||||
-- set the sprite position, refresh and break the loop
|
||||
sprite_set_frpos(sprite, new_frpos)
|
||||
GUI_Refresh(sprite)
|
||||
break
|
||||
end
|
||||
else
|
||||
break
|
||||
end
|
||||
until false
|
||||
|
||||
jwidget_free(window)
|
||||
end
|
@ -1,69 +0,0 @@
|
||||
-- ase -- allegro-sprite-editor: the ultimate sprites factory
|
||||
-- Copyright (C) 2001-2005 by David A. Capello
|
||||
|
||||
function GUI_ImageType()
|
||||
if not current_sprite then
|
||||
return
|
||||
end
|
||||
|
||||
-- load the window widget
|
||||
local window = ji_load_widget("imgtype.jid", "image_type")
|
||||
if not window then return end
|
||||
|
||||
local from, radio1, radio2, radio3, dither1, dither2 =
|
||||
jwidget_find_name(window, "from"),
|
||||
jwidget_find_name(window, "imgtype1"),
|
||||
jwidget_find_name(window, "imgtype2"),
|
||||
jwidget_find_name(window, "imgtype3"),
|
||||
jwidget_find_name(window, "dither1"),
|
||||
jwidget_find_name(window, "dither2")
|
||||
|
||||
if current_sprite.imgtype == IMAGE_RGB then
|
||||
jwidget_set_text(from, _("RGB"))
|
||||
jwidget_disable(radio1)
|
||||
jwidget_select(radio3) -- to Indexed by default
|
||||
elseif current_sprite.imgtype == IMAGE_GRAYSCALE then
|
||||
jwidget_set_text(from, _("Grayscale"))
|
||||
jwidget_disable(radio2)
|
||||
jwidget_select(radio1) -- to RGB by default
|
||||
elseif current_sprite.imgtype == IMAGE_INDEXED then
|
||||
jwidget_set_text(from, _("Indexed"))
|
||||
jwidget_disable(radio3)
|
||||
jwidget_select(radio1) -- to RGB by default
|
||||
end
|
||||
|
||||
if get_config_bool("Options", "Dither", false) then
|
||||
jwidget_select(dither2)
|
||||
else
|
||||
jwidget_select(dither1)
|
||||
end
|
||||
|
||||
-- open the window
|
||||
jwindow_open_fg(window)
|
||||
|
||||
if jwindow_get_killer(window) == jwidget_find_name(window, "ok") then
|
||||
local destimgtype, dithermethod
|
||||
|
||||
if jwidget_is_selected(radio1) then
|
||||
destimgtype = IMAGE_RGB
|
||||
elseif jwidget_is_selected(radio2) then
|
||||
destimgtype = IMAGE_GRAYSCALE
|
||||
elseif jwidget_is_selected(radio3) then
|
||||
destimgtype = IMAGE_INDEXED
|
||||
end
|
||||
|
||||
if jwidget_is_selected(dither1) then
|
||||
dithermethod = DITHERING_NONE
|
||||
elseif jwidget_is_selected(dither2) then
|
||||
dithermethod = DITHERING_ORDERED
|
||||
end
|
||||
|
||||
use_current_sprite_rgb_map()
|
||||
sprite_set_imgtype(current_sprite, destimgtype, dithermethod)
|
||||
restore_rgb_map()
|
||||
|
||||
app_refresh_screen()
|
||||
end
|
||||
|
||||
jwidget_free(window)
|
||||
end
|
@ -1,166 +0,0 @@
|
||||
-- ase -- allegro-sprite-editor: the ultimate sprites factory
|
||||
-- Copyright (C) 2001-2005 by David A. Capello
|
||||
|
||||
-- internal routine
|
||||
local function count_layers(layer)
|
||||
local count
|
||||
|
||||
if layer.parent.type == GFXOBJ_SPRITE then
|
||||
count = 0
|
||||
else
|
||||
count = 1
|
||||
end
|
||||
|
||||
if layer_is_set(layer) then
|
||||
local it = layer.layers
|
||||
while it do
|
||||
count = count + count_layers(it)
|
||||
it = it.next
|
||||
end
|
||||
end
|
||||
|
||||
return count
|
||||
end
|
||||
|
||||
-- const char *GetUniqueLayerName()
|
||||
function GetUniqueLayerName()
|
||||
local sprite = current_sprite
|
||||
if sprite then
|
||||
return _("Layer") .. " " .. count_layers(sprite.set)
|
||||
else
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
||||
-- Layer *NewLayer(const char *name, int x, int y, int w, int h)
|
||||
-- creates a new layer with the "name" in the current sprite(in the
|
||||
-- current frame) with the specified position and size(if w=h=0 the
|
||||
-- routine will use the sprite dimension)
|
||||
function NewLayer(name, x, y, w, h)
|
||||
local sprite = current_sprite
|
||||
local layer = nil
|
||||
local image, frame, index
|
||||
|
||||
if sprite and name then
|
||||
if not w or w == 0 then w = sprite.w end
|
||||
if not h or h == 0 then h = sprite.h end
|
||||
|
||||
-- new image
|
||||
image = image_new(sprite.imgtype, w, h)
|
||||
if not image then
|
||||
return nil
|
||||
end
|
||||
|
||||
-- new layer
|
||||
layer = layer_new(sprite.imgtype)
|
||||
if not layer then
|
||||
image_free(image)
|
||||
return nil
|
||||
end
|
||||
|
||||
-- clear with mask color
|
||||
image_clear(image, 0)
|
||||
|
||||
-- configure layer name and blend mode
|
||||
layer_set_name(layer, name)
|
||||
layer_set_blend_mode(layer, BLEND_MODE_NORMAL)
|
||||
|
||||
-- add image in the layer stock
|
||||
index = stock_add_image(layer.stock, image)
|
||||
|
||||
-- create a new frame in the current frpos
|
||||
frame = frame_new(sprite.frpos, index)
|
||||
frame_set_position(frame, x, y)
|
||||
|
||||
-- add frame
|
||||
layer_add_frame(layer, frame)
|
||||
|
||||
-- undo stuff
|
||||
if undo_is_enabled(sprite.undo) then
|
||||
undo_open(sprite.undo)
|
||||
undo_add_layer(sprite.undo, sprite.set, layer)
|
||||
undo_set_layer(sprite.undo, sprite)
|
||||
undo_close(sprite.undo)
|
||||
end
|
||||
|
||||
-- add the layer in the sprite set
|
||||
layer_add_layer(sprite.set, layer)
|
||||
|
||||
-- select the new layer
|
||||
sprite_set_layer(sprite, layer)
|
||||
end
|
||||
|
||||
return layer
|
||||
end
|
||||
|
||||
-- Layer *NewLayerSet(const char *name)
|
||||
-- creates a new layer set with the "name" in the current sprite
|
||||
function NewLayerSet(name)
|
||||
local sprite = current_sprite
|
||||
local layer = nil
|
||||
|
||||
if sprite and name then
|
||||
-- new layer
|
||||
layer = layer_set_new()
|
||||
if not layer then
|
||||
return nil
|
||||
end
|
||||
|
||||
-- configure layer name and blend mode
|
||||
layer_set_name(layer, name)
|
||||
|
||||
-- add the layer in the sprite set
|
||||
layer_add_layer(sprite.set, layer)
|
||||
|
||||
-- select the new layer
|
||||
sprite_set_layer(sprite, layer)
|
||||
end
|
||||
|
||||
return layer
|
||||
end
|
||||
|
||||
-- removes the current selected layer
|
||||
function RemoveLayer()
|
||||
local sprite = current_sprite
|
||||
if sprite and sprite.layer then
|
||||
local layer = sprite.layer
|
||||
local parent = layer.parent
|
||||
local layer_select
|
||||
|
||||
-- select: previous layer, or next layer, or parent(if it is not
|
||||
-- the main layer of sprite set)
|
||||
if layer.prev then
|
||||
layer_select = layer.prev
|
||||
elseif layer.next then
|
||||
layer_select = layer.next
|
||||
elseif parent != sprite.set then
|
||||
layer_select = parent
|
||||
else
|
||||
layer_select = nil
|
||||
end
|
||||
|
||||
-- undo stuff
|
||||
if undo_is_enabled(sprite.undo) then
|
||||
undo_open(sprite.undo)
|
||||
undo_set_layer(sprite.undo, sprite)
|
||||
undo_remove_layer(sprite.undo, layer)
|
||||
undo_close(sprite.undo)
|
||||
end
|
||||
|
||||
-- select other layer
|
||||
sprite_set_layer(sprite, layer_select)
|
||||
|
||||
-- remove the layer
|
||||
layer_remove_layer(parent, layer)
|
||||
|
||||
-- destroy the layer
|
||||
layer_free(layer)
|
||||
end
|
||||
end
|
||||
|
||||
function GUI_RemoveLayer()
|
||||
if current_sprite then
|
||||
RemoveLayer()
|
||||
GUI_Refresh(current_sprite)
|
||||
end
|
||||
end
|
@ -1,85 +0,0 @@
|
||||
-- ase -- allegro-sprite-editor: the ultimate sprites factory
|
||||
-- Copyright (C) 2001-2005 by David A. Capello
|
||||
|
||||
function GUI_LayerProperties()
|
||||
-- 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
|
||||
|
||||
local window = jwindow_new(_("Layer Properties"))
|
||||
local box1 = jbox_new(JI_VERTICAL)
|
||||
local box2 = jbox_new(JI_HORIZONTAL)
|
||||
local box3 = jbox_new(JI_HORIZONTAL + JI_HOMOGENEOUS)
|
||||
local label_name = jlabel_new(_("Name:"))
|
||||
local entry_name = jentry_new(256, layer.name)
|
||||
local button_ok = jbutton_new(_("&OK"))
|
||||
local button_cancel = jbutton_new(_("&Cancel"))
|
||||
local label_bm, view_bm, list_bm
|
||||
|
||||
if layer.type == GFXOBJ_LAYER_IMAGE then
|
||||
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)
|
||||
end
|
||||
|
||||
jwidget_expansive(entry_name, true)
|
||||
|
||||
jwidget_add_child(box2, label_name)
|
||||
jwidget_add_child(box2, entry_name)
|
||||
jwidget_add_child(box1, box2)
|
||||
if layer.type == GFXOBJ_LAYER_IMAGE then
|
||||
jwidget_add_child(box1, label_bm)
|
||||
jwidget_add_child(box1, view_bm)
|
||||
end
|
||||
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 then
|
||||
layer_set_name(layer, jwidget_get_text(entry_name))
|
||||
if layer.type == GFXOBJ_LAYER_IMAGE then
|
||||
layer_set_blend_mode(layer, jlistbox_get_selected_index(list_bm))
|
||||
end
|
||||
|
||||
GUI_Refresh(sprite)
|
||||
end
|
||||
|
||||
jwidget_free(window)
|
||||
end
|
@ -1,98 +0,0 @@
|
||||
-- ase -- allegro-sprite-editor: the ultimate sprites factory
|
||||
-- Copyright (C) 2001-2005 by David A. Capello
|
||||
|
||||
function GUI_MergeDown()
|
||||
local sprite, frpos, index
|
||||
local src_layer, dst_layer
|
||||
local src_frame, dst_frame
|
||||
local src_image, dst_image
|
||||
local old_id
|
||||
|
||||
sprite = current_sprite
|
||||
if not sprite then return end
|
||||
|
||||
src_layer = sprite.layer
|
||||
if not src_layer or not layer_is_image(src_layer) then return end
|
||||
|
||||
dst_layer = sprite.layer.prev
|
||||
if not dst_layer or not layer_is_image(dst_layer) then return end
|
||||
|
||||
if undo_is_enabled(sprite.undo) then
|
||||
undo_open(sprite.undo)
|
||||
end
|
||||
|
||||
for frpos = 0, sprite.frames-1 do
|
||||
-- get frames
|
||||
src_frame = layer_get_frame(src_layer, frpos)
|
||||
dst_frame = layer_get_frame(dst_layer, frpos)
|
||||
|
||||
-- get images
|
||||
if src_frame then
|
||||
src_image = stock_get_image(src_layer.stock, src_frame.image)
|
||||
else
|
||||
src_image = nil
|
||||
end
|
||||
|
||||
if dst_frame then
|
||||
dst_image = stock_get_image(dst_layer.stock, dst_frame.image)
|
||||
else
|
||||
dst_image = nil
|
||||
end
|
||||
|
||||
-- with source image?
|
||||
if src_image then
|
||||
-- no destination image
|
||||
if not dst_image then
|
||||
-- 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) then
|
||||
undo_add_image(sprite.undo, dst_layer.stock, dst_image)
|
||||
end
|
||||
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) then
|
||||
undo_add_frame(sprite.undo, dst_layer, dst_frame)
|
||||
end
|
||||
layer_add_frame(dst_layer, dst_frame)
|
||||
-- with destination
|
||||
else
|
||||
local x1 = MIN(src_frame.x, dst_frame.x)
|
||||
local y1 = MIN(src_frame.y, dst_frame.y)
|
||||
local x2 = MAX(src_frame.x+src_image.w-1, dst_frame.x+dst_image.w-1)
|
||||
local y2 = MAX(src_frame.y+src_image.h-1, dst_frame.y+dst_image.h-1)
|
||||
local 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) then
|
||||
undo_replace_image(sprite.undo, dst_layer.stock, dst_frame.image)
|
||||
end
|
||||
stock_replace_image(dst_layer.stock, dst_frame.image, new_image)
|
||||
|
||||
image_free(dst_image)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if undo_is_enabled(sprite.undo) then
|
||||
undo_set_layer(sprite.undo, sprite)
|
||||
undo_remove_layer(sprite.undo, src_layer)
|
||||
undo_close(sprite.undo)
|
||||
end
|
||||
|
||||
sprite_set_layer(sprite, dst_layer)
|
||||
layer_remove_layer(src_layer.parent, src_layer)
|
||||
layer_free(src_layer)
|
||||
|
||||
GUI_Refresh(sprite)
|
||||
end
|
@ -1,60 +0,0 @@
|
||||
-- ase -- allegro-sprite-editor: the ultimate sprites factory
|
||||
-- Copyright (C) 2001-2005 by David A. Capello
|
||||
|
||||
function GUI_NewLayer()
|
||||
-- get current sprite
|
||||
local sprite = current_sprite
|
||||
if not sprite then return end
|
||||
|
||||
-- load the window widget
|
||||
local window = ji_load_widget("newlay.jid", "new_layer")
|
||||
if not window then return end
|
||||
|
||||
jwidget_set_text(jwidget_find_name(window, "name"), GetUniqueLayerName())
|
||||
jwidget_set_text(jwidget_find_name(window, "width"), tostring(sprite.w))
|
||||
jwidget_set_text(jwidget_find_name(window, "height"), tostring(sprite.h))
|
||||
|
||||
jwindow_open_fg(window)
|
||||
|
||||
if jwindow_get_killer(window) == jwidget_find_name(window, "ok") then
|
||||
local name = jwidget_get_text(jwidget_find_name(window, "name"))
|
||||
local w = MID(1, tonumber(jwidget_get_text(jwidget_find_name(window, "width"))), 9999)
|
||||
local h = MID(1, tonumber(jwidget_get_text(jwidget_find_name(window, "height"))), 9999)
|
||||
local layer = NewLayer(name, 0, 0, w, h)
|
||||
if not layer then
|
||||
jalert(_("Error<<Not enough memory||&Close"))
|
||||
return
|
||||
end
|
||||
|
||||
GUI_Refresh(sprite)
|
||||
end
|
||||
|
||||
jwidget_free(window)
|
||||
end
|
||||
|
||||
function GUI_NewLayerSet()
|
||||
-- get current sprite
|
||||
local sprite = current_sprite
|
||||
if not sprite then
|
||||
return
|
||||
end
|
||||
|
||||
-- load the window widget
|
||||
local window = ji_load_widget("newlay.jid", "new_layer_set")
|
||||
if not window then return end
|
||||
|
||||
jwindow_open_fg(window)
|
||||
|
||||
if jwindow_get_killer(window) == jwidget_find_name(window, "ok") then
|
||||
local name = jwidget_get_text(jwidget_find_name(window, "name"))
|
||||
local layer = NewLayerSet(name)
|
||||
if not layer then
|
||||
jalert(_("Error<<Not enough memory||&Close"))
|
||||
return
|
||||
end
|
||||
|
||||
GUI_Refresh(sprite)
|
||||
end
|
||||
|
||||
jwidget_free(window)
|
||||
end
|
@ -1,47 +0,0 @@
|
||||
-- ase -- allegro-sprite-editor: the ultimate sprites factory
|
||||
-- Copyright (C) 2001-2005 by David A. Capello
|
||||
|
||||
function RemoveFrame(layer, frame)
|
||||
local sprite = current_sprite
|
||||
local frpos, it, used, image
|
||||
|
||||
if sprite and layer_is_image(layer) and frame then
|
||||
-- find if the image that use the frame to remove, is used by
|
||||
-- another frames
|
||||
used = false
|
||||
for frpos = 0, sprite.frames-1 do
|
||||
it = layer_get_frame(layer, frpos)
|
||||
if it and it.id != frame.id and it.image == frame.image then
|
||||
used = true
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
undo_open(sprite.undo)
|
||||
if not used then
|
||||
-- if the image is only used by this frame, we can remove the
|
||||
-- image from the stock
|
||||
image = stock_get_image(layer.stock, frame.image)
|
||||
undo_remove_image(sprite.undo, layer.stock, image)
|
||||
stock_remove_image(layer.stock, image)
|
||||
image_free(image)
|
||||
end
|
||||
undo_remove_frame(sprite.undo, layer, frame)
|
||||
undo_close(sprite.undo)
|
||||
|
||||
-- remove the frame
|
||||
layer_remove_frame(layer, frame)
|
||||
frame_free(frame)
|
||||
end
|
||||
end
|
||||
|
||||
function GUI_RemoveFrame()
|
||||
local sprite = current_sprite
|
||||
if sprite then
|
||||
local frame = layer_get_frame(sprite.layer, sprite.frpos)
|
||||
if frame then
|
||||
RemoveFrame(sprite.layer, frame)
|
||||
GUI_Refresh(sprite)
|
||||
end
|
||||
end
|
||||
end
|
@ -143,6 +143,7 @@ ASE_SOURCES = \
|
||||
src/raster/stock.c \
|
||||
src/raster/undo.c \
|
||||
src/script/bindings.c \
|
||||
src/script/functions.c \
|
||||
src/script/script.c \
|
||||
src/util/autocrop.c \
|
||||
src/util/boundary.c \
|
||||
|
@ -23,11 +23,82 @@
|
||||
#include "jinete.h"
|
||||
|
||||
#include "core/app.h"
|
||||
#include "core/cfg.h"
|
||||
#include "modules/gui.h"
|
||||
#include "modules/palette.h"
|
||||
#include "modules/sprites.h"
|
||||
#include "raster/image.h"
|
||||
#include "raster/quant.h"
|
||||
#include "raster/sprite.h"
|
||||
|
||||
#endif
|
||||
|
||||
bool command_enabled_change_image_type(const char *argument)
|
||||
{
|
||||
return current_sprite != NULL;
|
||||
}
|
||||
|
||||
void command_execute_change_image_type(const char *argument)
|
||||
{
|
||||
JWidget window, from, radio1, radio2, radio3, dither1, dither2;
|
||||
|
||||
/* load the window widget */
|
||||
window = load_widget("imgtype.jid", "image_type");
|
||||
if (!window)
|
||||
return;
|
||||
|
||||
from = jwidget_find_name(window, "from");
|
||||
radio1 = jwidget_find_name(window, "imgtype1");
|
||||
radio2 = jwidget_find_name(window, "imgtype2");
|
||||
radio3 = jwidget_find_name(window, "imgtype3");
|
||||
dither1 = jwidget_find_name(window, "dither1");
|
||||
dither2 = jwidget_find_name(window, "dither2");
|
||||
|
||||
if (current_sprite->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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -20,14 +20,67 @@
|
||||
|
||||
#ifndef USE_PRECOMPILED_HEADER
|
||||
|
||||
#include <allegro.h>
|
||||
|
||||
#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);
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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<<You can't change frpos to %d"
|
||||
"<<Already there is a frame in that pos.||&OK",
|
||||
new_frpos);
|
||||
}
|
||||
else {
|
||||
/* WE MUST REMOVE THE FRAME BEFORE CALL frame_set_frpos() */
|
||||
if (undo_is_enabled(sprite->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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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; frpos<sprite->frames; ++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);
|
||||
}
|
||||
|
@ -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<<Not enough memory||&Close"));
|
||||
return;
|
||||
}
|
||||
GUI_Refresh(sprite);
|
||||
}
|
||||
|
||||
jwidget_free(window);
|
||||
}
|
||||
|
@ -23,11 +23,39 @@
|
||||
#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_set(const char *argument)
|
||||
{
|
||||
return current_sprite != NULL;
|
||||
}
|
||||
|
||||
void command_execute_new_layer_set(const char *argument)
|
||||
{
|
||||
JWidget window;
|
||||
Sprite *sprite = current_sprite; /* get current sprite */
|
||||
|
||||
/* load the window widget */
|
||||
window = load_widget("newlay.jid", "new_layer_set");
|
||||
if (!window)
|
||||
return;
|
||||
|
||||
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 = NewLayerSet(name);
|
||||
if (!layer) {
|
||||
jalert(_("Error<<Not enough memory||&Close"));
|
||||
return;
|
||||
}
|
||||
GUI_Refresh(sprite);
|
||||
}
|
||||
|
||||
jwidget_free(window);
|
||||
}
|
||||
|
@ -20,14 +20,26 @@
|
||||
|
||||
#ifndef USE_PRECOMPILED_HEADER
|
||||
|
||||
#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 "script/functions.h"
|
||||
|
||||
#endif
|
||||
|
||||
bool command_enabled_remove_frame(const char *argument)
|
||||
{
|
||||
return current_sprite != NULL;
|
||||
}
|
||||
|
||||
void command_execute_remove_frame(const char *argument)
|
||||
{
|
||||
Sprite *sprite = current_sprite;
|
||||
Frame *frame = layer_get_frame(sprite->layer, sprite->frpos);
|
||||
if (frame) {
|
||||
RemoveFrame(sprite->layer, frame);
|
||||
GUI_Refresh(sprite);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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),
|
||||
|
@ -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: {
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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"
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user