X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/c378d6c33f751d1a0b97958f3cacfe0b07c72f58..22bbf7ca22f11cc33d887d0162cf2ec6661c3a3e:/test/manual/etags/lua-src/allegro.lua diff --git a/test/manual/etags/lua-src/allegro.lua b/test/manual/etags/lua-src/allegro.lua new file mode 100644 index 0000000000..c316b6f26a --- /dev/null +++ b/test/manual/etags/lua-src/allegro.lua @@ -0,0 +1,282 @@ +-- ase -- allegro-sprite-editor: the ultimate sprites factory +-- Copyright (C) 2001-2004 by David A. Capello +-- +-- Read "LEGAL.txt" for more information. + +-- internal routine +local function get_layer_by_name (sprite, layer, name) + if layer.readable == false then + return nil; + end + + if layer.name and strcmp (layer.name, name) == 0 then + return layer; + end + + if layer_is_set (layer) then + local it, sub; + + it = layer.layers; + while it do + sub = get_layer_by_name (sprite, it, name) + if sub then + return sub; + end + it = it.next + end + end + + return nil; +end + +-- 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 + +-- Layer *GetLayerByName (const char *name); +function GetLayerByName (name) + local sprite = current_sprite; + + if sprite and name then + return get_layer_by_name (sprite, sprite.set, name); + else + return nil; + end +end + +-- const char *GetUniqueLayerName (void); +function GetUniqueLayerName () + local sprite = current_sprite; + + if sprite then + return _("Layer") .. " " .. count_layers (sprite.set); + else + return nil; + end +end + +-- void SelectLayer (Layer *layer); +function SelectLayer (layer) + if current_sprite then + sprite_set_layer (current_sprite, layer); + 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_image_new (sprite.imgtype, w, h); + 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 frame (XXX in the current frpos? --dacap) + frame = frame_new (sprite.frpos, index, x, y, 255); + + -- 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 + +-- void RemoveLayer (void); +-- 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 + +-- void MoveLayerTop (void); +-- moves the current layer in the top of the main set +function MoveLayerTop () + if current_sprite and current_sprite.layer then + local layer = current_sprite.layer; + + layer_remove_layer (layer.parent, layer); + + layer_add_layer (current_sprite.set, layer); + end +end + +-- void MoveLayerBottom (void); +-- moves the current layer in the bottom of the main set +function MoveLayerBottom () + if current_sprite and current_sprite.layer then + local layer = current_sprite.layer; + + layer_remove_layer (layer.parent, layer); + + layer_add_layer (current_sprite.set, layer); + layer_move_layer (current_sprite.set, layer, nil); + end +end + +-- void MoveLayerBefore (Layer *this_one); +-- moves the current layer above the layer "this_one" +function MoveLayerBefore (this_one) + if current_sprite and current_sprite.layer then + local layer = current_sprite.layer; + local layer_dest; + + if not this_one then + layer_dest = current_sprite.set; + else + layer_dest = this_one; + end + + if layer_dest then + layer_remove_layer (layer.parent, layer); + layer_add_layer (layer_dest.parent, layer); + layer_move_layer (layer_dest.parent, layer, layer_dest); + end + end +end + +-- void MoveLayerAfter (Layer *this_one); +-- moves the current layer below the layer "this_one" (if that layer +-- is a set, the layer is put in the top of the layer set) +function MoveLayerAfter (this_one) + if current_sprite and current_sprite.layer then + local layer = current_sprite.layer; + local layer_dest; + + if not this_one then + layer_dest = current_sprite.set; + else + layer_dest = this_one; + end + + if layer_dest then + layer_remove_layer (layer.parent, layer); + + -- insert in the first position of the set + if layer_is_set (layer_dest) then + layer_add_layer (layer_dest, layer); + -- insert below the layer + else + layer_add_layer (layer_dest.parent, layer); + layer_move_layer (layer_dest.parent, layer, layer_dest.prev); + end + end + end +end