]> code.delx.au - gnu-emacs/blob - test/manual/etags/lua-src/allegro.lua
Merge from origin/emacs-25
[gnu-emacs] / test / manual / etags / lua-src / allegro.lua
1 -- ase -- allegro-sprite-editor: the ultimate sprites factory
2 -- Copyright (C) 2001-2004 by David A. Capello
3 --
4 -- Read "LEGAL.txt" for more information.
5
6 -- internal routine
7 local function get_layer_by_name (sprite, layer, name)
8 if layer.readable == false then
9 return nil;
10 end
11
12 if layer.name and strcmp (layer.name, name) == 0 then
13 return layer;
14 end
15
16 if layer_is_set (layer) then
17 local it, sub;
18
19 it = layer.layers;
20 while it do
21 sub = get_layer_by_name (sprite, it, name)
22 if sub then
23 return sub;
24 end
25 it = it.next
26 end
27 end
28
29 return nil;
30 end
31
32 -- internal routine
33 local function count_layers (layer)
34 local count;
35
36 if layer.parent.type == GFXOBJ_SPRITE then
37 count = 0;
38 else
39 count = 1;
40 end
41
42 if layer_is_set (layer) then
43 local it = layer.layers;
44 while it do
45 count = count + count_layers (it);
46 it = it.next;
47 end
48 end
49
50 return count;
51 end
52
53 -- Layer *GetLayerByName (const char *name);
54 function GetLayerByName (name)
55 local sprite = current_sprite;
56
57 if sprite and name then
58 return get_layer_by_name (sprite, sprite.set, name);
59 else
60 return nil;
61 end
62 end
63
64 -- const char *GetUniqueLayerName (void);
65 function GetUniqueLayerName ()
66 local sprite = current_sprite;
67
68 if sprite then
69 return _("Layer") .. " " .. count_layers (sprite.set);
70 else
71 return nil;
72 end
73 end
74
75 -- void SelectLayer (Layer *layer);
76 function SelectLayer (layer)
77 if current_sprite then
78 sprite_set_layer (current_sprite, layer);
79 end
80 end
81
82 -- Layer *NewLayer (const char *name, int x, int y, int w, int h);
83 -- creates a new layer with the "name" in the current sprite (in the
84 -- current frame) with the specified position and size (if w=h=0 the
85 -- routine will use the sprite dimension)
86 function NewLayer (name, x, y, w, h)
87 local sprite = current_sprite;
88 local layer = nil;
89 local image, frame, index;
90
91 if sprite and name then
92 if not w or w == 0 then w = sprite.w; end
93 if not h or h == 0 then h = sprite.h; end
94
95 -- new image
96 image = image_new (sprite.imgtype, w, h);
97 if not image then
98 return nil;
99 end
100
101 -- new layer
102 layer = layer_image_new (sprite.imgtype, w, h);
103 if not layer then
104 image_free (image);
105 return nil;
106 end
107
108 -- clear with mask color
109 image_clear (image, 0);
110
111 -- configure layer name and blend mode
112 layer_set_name (layer, name);
113 layer_set_blend_mode (layer, BLEND_MODE_NORMAL);
114
115 -- add image in the layer stock
116 index = stock_add_image (layer.stock, image);
117
118 -- create frame (XXX in the current frpos? --dacap)
119 frame = frame_new (sprite.frpos, index, x, y, 255);
120
121 -- add frame
122 layer_add_frame (layer, frame);
123
124 -- undo stuff
125 if undo_is_enabled (sprite.undo) then
126 undo_open (sprite.undo);
127 undo_add_layer (sprite.undo, sprite.set, layer);
128 undo_set_layer (sprite.undo, sprite);
129 undo_close (sprite.undo);
130 end
131
132 -- add the layer in the sprite set
133 layer_add_layer (sprite.set, layer);
134
135 -- select the new layer
136 sprite_set_layer (sprite, layer);
137 end
138
139 return layer;
140 end
141
142 -- Layer *NewLayerSet (const char *name);
143 -- creates a new layer set with the "name" in the current sprite
144 function NewLayerSet (name)
145 local sprite = current_sprite;
146 local layer = nil;
147
148 if sprite and name then
149 -- new layer
150 layer = layer_set_new ();
151 if not layer then
152 return nil;
153 end
154
155 -- configure layer name and blend mode
156 layer_set_name (layer, name);
157
158 -- add the layer in the sprite set
159 layer_add_layer (sprite.set, layer);
160
161 -- select the new layer
162 sprite_set_layer (sprite, layer);
163 end
164
165 return layer;
166 end
167
168 -- void RemoveLayer (void);
169 -- removes the current selected layer
170 function RemoveLayer ()
171 local sprite = current_sprite;
172
173 if sprite and sprite.layer then
174 local layer = sprite.layer;
175 local parent = layer.parent;
176 local layer_select;
177
178 -- select: previous layer, or next layer, or parent (if it is not
179 -- the main layer of sprite set)
180 if layer.prev then
181 layer_select = layer.prev;
182 elseif layer.next then
183 layer_select = layer.next;
184 elseif parent != sprite.set then
185 layer_select = parent;
186 else
187 layer_select = nil;
188 end
189
190 -- undo stuff
191 if undo_is_enabled (sprite.undo) then
192 undo_open (sprite.undo);
193 undo_set_layer (sprite.undo, sprite);
194 undo_remove_layer (sprite.undo, layer);
195 undo_close (sprite.undo);
196 end
197
198 -- select other layer
199 sprite_set_layer (sprite, layer_select);
200
201 -- remove the layer
202 layer_remove_layer (parent, layer);
203
204 -- destroy the layer
205 layer_free (layer);
206 end
207 end
208
209 -- void MoveLayerTop (void);
210 -- moves the current layer in the top of the main set
211 function MoveLayerTop ()
212 if current_sprite and current_sprite.layer then
213 local layer = current_sprite.layer;
214
215 layer_remove_layer (layer.parent, layer);
216
217 layer_add_layer (current_sprite.set, layer);
218 end
219 end
220
221 -- void MoveLayerBottom (void);
222 -- moves the current layer in the bottom of the main set
223 function MoveLayerBottom ()
224 if current_sprite and current_sprite.layer then
225 local layer = current_sprite.layer;
226
227 layer_remove_layer (layer.parent, layer);
228
229 layer_add_layer (current_sprite.set, layer);
230 layer_move_layer (current_sprite.set, layer, nil);
231 end
232 end
233
234 -- void MoveLayerBefore (Layer *this_one);
235 -- moves the current layer above the layer "this_one"
236 function MoveLayerBefore (this_one)
237 if current_sprite and current_sprite.layer then
238 local layer = current_sprite.layer;
239 local layer_dest;
240
241 if not this_one then
242 layer_dest = current_sprite.set;
243 else
244 layer_dest = this_one;
245 end
246
247 if layer_dest then
248 layer_remove_layer (layer.parent, layer);
249 layer_add_layer (layer_dest.parent, layer);
250 layer_move_layer (layer_dest.parent, layer, layer_dest);
251 end
252 end
253 end
254
255 -- void MoveLayerAfter (Layer *this_one);
256 -- moves the current layer below the layer "this_one" (if that layer
257 -- is a set, the layer is put in the top of the layer set)
258 function MoveLayerAfter (this_one)
259 if current_sprite and current_sprite.layer then
260 local layer = current_sprite.layer;
261 local layer_dest;
262
263 if not this_one then
264 layer_dest = current_sprite.set;
265 else
266 layer_dest = this_one;
267 end
268
269 if layer_dest then
270 layer_remove_layer (layer.parent, layer);
271
272 -- insert in the first position of the set
273 if layer_is_set (layer_dest) then
274 layer_add_layer (layer_dest, layer);
275 -- insert below the layer
276 else
277 layer_add_layer (layer_dest.parent, layer);
278 layer_move_layer (layer_dest.parent, layer, layer_dest.prev);
279 end
280 end
281 end
282 end