aseprite/docs/script._tx
David Capello ce25bfaac4 Added all mask/selection commands.
Added all commands to select a tool.
Fixed a bug when setting the grid.
The about dialog shows AUTHORS.txt
2007-09-30 15:32:21 +00:00

932 lines
21 KiB
Plaintext
Raw Blame History

@#
@# Documentation about how to program scripts with ASE
@#
@document_title=ASE Scripting Manual
@html_footer=Back to contents
@rtfh=ASE - Scripting
@$\input texinfo
@$@documentlanguage es
@$@setfilename script.info
@$@settitle ASE Scripting Manual
@$@setchapternewpage odd
@$@paragraphindent 0
@$@setchapternewpage off
@# This should remain commented at the moment (dvi output) @$@finalout
@$
@$@ifinfo
@$This is the Info version of the ASE Scripting manual
@$
@$By David A. Capello
@$@end ifinfo
@$
@$@node Top, , (dir), (dir)
@titlepage
@<pre>
@!indent
ASE Scripting 0.6
By <a href="http://www.davidcapello.com.ar/">David A. Capello</a>, 2005.
@indent
@</pre>
#include &ltstd_disclaimer.h&gt
<blockquote class="text"><i>
"I do not accept responsibility for any effects, adverse or otherwise,
that this code may have on you, your computer, your sanity, your dog,
and anything else that you can think of. Use it at your own risk."
</i></blockquote>
@!titlepage
@!text
@heading
Contents
@contents
@text
@text
@heading
Introduction
ASE has scripting facilities. You can make a script (a text file)
with a set of routines to make images, effects, or anything you
think. ASE uses Lua library to do this, so you should know program
in Lua, anyway, it's really simple, so you'll not have any
inconvenient.
The complete reference of Lua language is in <a href="lua-5.0.pdf">lua-5.0.pdf</a>. Also, you
need a text editor to write Lua scripts (the Windows Notepad can
be used).
@hnode Warning about Lua
You should known that ASE uses a patched version of Lua, where you
can use the != operator instead of ~=
<codeblock>
if current_sprite != nil then
-- we can use the current_sprite variable...
end
<endblock>
@heading
Basic Lua Programming
@hnode Comments
Comments start with --
<codeblock>
-- this line will be never parsed
<endblock>
Or you can comment multiple lines
<codeblock>
--[[
blah blah blah...
]]--
<endblock>
@hnode Example 1
<codeblock>
local a = 4
local b = 5
print ("a+b is: " .. (a+b))
<endblock>
Here we define two variables "a" and "b" with the values "4" and "5"
respectively. Then we print the string "a+b is: " follower by the
result of the operation a+b (4+5) that is 9, so the final message is:
<textblock>
a+b is: 9
<endblock>
Also we could use:
<codeblock>
print (a.."+"..b.." is: "..(a+b))
<endblock>
To print:
<textblock>
4+5 is: 9
<endblock>
@hnode Example 2
<codeblock>
function add (a, b)
return a+b
end
print ("1+2 = " .. add (1, 2))
<endblock>
With the "function" keyword you define a new function, in this case
the "add" function, the names between parenthesis indicate the
arguments (parameters) that you must give to that routine.
@hnode Example 3
<codeblock>
for c = 1, 10 do
print (c)
end
<endblock>
This repeat the block between the "do" keyword and the "end" keyword
10 times (from 1 to 10 inclusive).
So this print:
<textblock>
1
2
3
4
5
6
7
8
9
10
<endblock>
@hnode Example 4
<codeblock>
for c = 1, 10 do
if c == 5 then
break
end
print (c)
end
<endblock>
In this case when "c" come to 5 the for is breaked so the other
iterations aren't made. This print:
<textblock>
1
2
3
4
<endblock>
@hnode Example 5
<codeblock>
for c = 1, 5 do
if c != 3 then
print ("c isn't 3 (c is " .. c .. ")")
else
print ("c is 3")
end
end
<endblock>
The != operator means "not equal" (negation of equality). You can
use the original Lua operator ~= too.
This print:
<textblock>
c isn't 3 (c is 1)
c isn't 3 (c is 2)
c is 3
c isn't 3 (c is 4)
c isn't 3 (c is 5)
<endblock>
@hnode Example 6
<codeblock>
local done = false
local a = 1
while not done do
print (a)
if a == 3 then
done = true
end
a = a + 1
end
<endblock>
This print:
<textblock>
1
2
3
<endblock>
And can be implemented in this way too:
<codeblock>
local a = 1
while a &lt= 3 do
print (a)
a = a + 1
end
<endblock>
@heading
ImgType
The imgtype (image-type) is the format of each pixel in a image.
Sprites have a lot of images, but all images must have the same
imgtype. The know imgtypes are: RGB, Grayscale, Indexed, Bitmap.
@hnode IMAGE_RGB
Means that the image have four components (channels or bytes) per
pixel, where the values of these components can be between 0 and 255
(256 differents tones), where 255 the maximum intensity.
RGB is RGBA really:
@tallbullets
<ul><li>
R: Red.
<li>
G: Green.
<li>
B: Blue.
<li>
A: Alpha (transparency or opacity).
</ul>
(0,0,0,0) is mask color, (0,0,0,255) is black, and (255,255,255,255)
is white.
@hnode IMAGE_GRAYSCALE
The image has two channels (two bytes) per pixel.
@tallbullets
<ul><li>
K: Luminance (or black channel)
<li>
A: Alpha (transparency or opacity).
</ul>
(0,0) is mask color, (0,255) is black, (255,255) is white.
@hnode IMAGE_INDEXED
Image uses one byte per pixel:
@tallbullets
<ul><li>
Index: index of the color that we must use from the color-palette.
</ul>
In this imgtype, each pixel hasn't the color information, only has a
reference to the color-palette (from 0 to 255, 256 colors), so the
RGB information about the color is found in the color-palette and
not in the image.
The index=0 is the mask color.
@hnode IMAGE_BITMAP
An internal imgtype to handle masks, where a pixel is a bit, and 8
pixels are a byte. 1 means selected, 0 deselected.
@heading
Standard routines
@@double @MAX (double x, double y);
Returns the maximum value.
@@double @MIN (double x, double y);
Returns the minimum value.
@@double @MID (double x, double y, double z);
Limits the y value to x and z.
@@void @include (const char *filename);
@@void @dofile (const char *filename);
Process the script that is in the file with the given filename. It's
searched in the current and in the "data/scripts" directories.
@@void @print (const char *buf);
Prints a message in the console, this is useful mainly to debug
scripts or to show errors.
@@double @rand (double min, double max);
Returns a random number between min and max values.
@heading
String routines
@@const char *@_ (const char *msgid);
Tries to translate the string msgid to the current language, the
entry must exists in the .po file.
@@int @strcmp (const char *s1, const char *s2);
Compares the two strings s1 and s2. It returns an integer less than,
equal to, or greater than zero if s1 is found, respectively, to be
less than, to match, or be greater than s2.
@heading
Math routines
@hnode Constants
PI: the ratio of a circle's circumference to its diameter (3.141592...).
@hnode Routines
@@double @fabs (double x);
Return the absolute value of the number x.
@@double @ceil (double x);
@xref floor
This funtion rounds x up to the nearest integer.
@@double @floor (double x);
@xref ceil
This funtion rounds x down to the nearest integer.
@@double @exp (double x);
@xref log
Returns the value of e (the base of natural logarithms) raised to
the power of x.
@@double @log (double x);
@xref exp, log10
Returns the natural logarithm of x.
@@double @log10 (double x);
@xref log
Returns the base-10 logarithm of x.
@@double @pow (double x, double y);
@xref sqrt
Returns the value of x raised to the power of y.
@@double @sqrt (double x);
@xref hypot, pow
Returns the non-negative square root of x.
@@double @hypot (double x, double y);
@xref sqrt
Returns the sqrt(x*x + y*y). This is the length of the hypotenuse
of a right-angle triangle with sides of length x and y, or the
distance of the point (x, y) from the origin.
@@double @cos (double x);
@xref sin, tan, acos
Returns the cosine of x, where x is given in radians.
@@double @sin (double x);
@xref cos, tan, asin
Returns the sine of x, where x is given in radians.
@@double @tan (double x);
@xref cos, sin, atan
Returns the tangent of x, where x is given in radians.
@@double @acos (double x);
@xref cos
Returns the arc cosine in radians and the value is mathematically
defined to be between 0 and PI (inclusive).
@@double @asin (double x);
@xref sin
Returns the arc sine in radians and the value is mathematically
defined to be between -PI/2 and PI/2 (inclusive).
@@double @atan (double x);
@xref tan, atan2
Returns the arc tangent in radians and the value is mathematically
defined to be between -PI/2 and PI/2 (inclusive).
@@double @atan2 (double y, double x);
@xref atan
Returns the result in radians, which is between -PI and PI
(inclusive).
@@double @cosh (double x);
Returns the hyperbolic cosine of x, which is defined mathematically
as (exp(x) + exp(-x)) / 2.
@@double @sinh (double x);
Returns the hyperbolic sine of x, which is defined mathematically as
(exp(x) - exp(-x)) / 2.
@@double @tanh (double x);
Returns the hyperbolic tangent of x, which is defined mathematically
as sinh(x) / cosh(x).
@heading
File routines
@@bool @file_exists (const char *filename);
Checks whether a file matching the given name exists, returning true
if it does.
@@char *@get_filename (const char *filename);
When passed a completely specified file path, this returns a pointer
to the filename portion. Both <20>\<5C> and <20>/<2F> are recognized as directory
separators.
@heading
Objects
There are a special type of variables in Lua scripts: objects
(represented with user-data). Each object can be of some of these
types:
@tallbullets
<ul><li>
Graphics objects: Image, Frame, Layer, Mask, Path, Sprite, Stock, Undo.
<li>
Effect objects: Effect, ConvMatr, Curve, CurvePoint.
<li>
GUI objects: JEvent, JList, JRect, JRegion, JWidget.
</ul>
@heading
Image
An image, has width and height, an image-type (RGB, Grayscale, etc.),
and contains the image data (pixels, pixmap, or bitmap).
@hnode Image fields
<ul><li>
[number] image.imgtype<br>
See sprite.imgtype
<li>
[number] image.w<br>
[number] image.h<br>
The width and height (in pixels) of this image.
</ul>
@hnode Image methods
@@Image *@image_new (int imgtype, int w, int h);
Creates a new image
@@Image *@image_new_copy (Image *image);
@@void @image_free (Image *image);
@@int @image_getpixel (Image *image, int x, int y);
@@void @image_putpixel (Image *image, int x, int y, int color);
@@void @image_clear (Image *image, int color);
@@void @image_copy (Image *dst, Image *src, int x, int y);
@@void @image_merge (Image *dst, Image *src, int x, int y, int opacity, int blend_mode);
@@Image *@image_crop (Image *image, int x, int y, int w, int h);
@@void @image_hline (Image *image, int x1, int y, int x2, int color);
@@void @image_vline (Image *image, int x, int y1, int y2, int color);
@@void @image_rect (Image *image, int x1, int y1, int x2, int y2, int color);
@@void @image_rectfill (Image *image, int x1, int y1, int x2, int y2, int color);
@@void @image_line (Image *image, int x1, int y1, int x2, int y2, int color);
@@void @image_ellipse (Image *image, int x1, int y1, int x2, int y2, int color);
@@void @image_ellipsefill (Image *image, int x1, int y1, int x2, int y2, int color);
@@void @image_convert (Image *dst, Image *src);
@@int @image_count_diff (Image *i1, Image *i2);
@heading
Frame
A frame of animation, it contains the position, opacity and a reference
(by index) to some image in the image's stock of the layer where this
frame is. Remember this, a frame doesn't contain the image, only a
reference to it.
@@Frame *@frame_new (int frpos, int image, int x, int y, int opacity);
@@Frame *@frame_new_copy (Frame *frame);
@@void @frame_free (Frame *frame);
@@Frame *@frame_is_link (Frame *frame, Layer *layer);
@@void @frame_set_frpos (Frame *frame, int frpos);
@@void @frame_set_image (Frame *frame, int image);
@@void @frame_set_position (Frame *frame, int x, int y);
@@void @frame_set_opacity (Frame *frame, int opacity);
@heading
Layer
A layer can be two things: a normal layer (also called image layer),
or a layer set. A layer set is a group of child layers (like
"sprite.set"). A normal layer is a complete different thing.
A normal layer has a stock of images and a list of frames, each
frame has a reference to the image's stock, so each frame uses some
image of the stock. If two frames uses the same stock images, the
first frame is called the "original frame" and all other frames are
called "links".
@@Layer *@layer_new (int imgtype);
@@Layer *@layer_set_new (void);
@@Layer *@layer_new_copy (Layer *layer);
@\Layer *@layer_new_with_image (int imgtype, int x, int y, int w, int h,
@@ int frpos);
@@void @layer_free (Layer *layer);
@@bool @layer_is_image (Layer *layer);
@@bool @layer_is_set (Layer *layer);
@@Layer *@layer_get_prev (Layer *layer);
@@Layer *@layer_get_next (Layer *layer);
@@void @layer_set_name (Layer *layer, const char *name);
@@void @layer_set_blend_mode (Layer *layer, int blend_mode);
@@void @layer_add_frame (Layer *layer, Frame *frame);
@@void @layer_remove_frame (Layer *layer, Frame *frame);
@@Frame *@layer_get_frame (Layer *layer, int frpos);
@@void @layer_add_layer (Layer *set, Layer *layer);
@@void @layer_remove_layer (Layer *set, Layer *layer);
@@void @layer_move_layer (Layer *set, Layer *layer, Layer *after);
@@void @layer_render (Layer *layer, Image *image, int x, int y, int frpos);
@\Layer *@layer_flatten (Layer *layer, int imgtype, int x, int y, int w, int h,
@@ int frmin, int frmax);
@heading
Mask
@@Mask *@mask_new (void);
@@Mask *@mask_new_copy (Mask *mask);
@@void @mask_free (Mask *mask);
@@bool @mask_is_empty (Mask *mask);
@@void @mask_set_name (Mask *mask, const char *name);
@@void @mask_move (Mask *mask, int x, int y);
@@void @mask_none (Mask *mask);
@@void @mask_invert (Mask *mask);
@@void @mask_replace (Mask *mask, int x, int y, int w, int h);
@@void @mask_union (Mask *mask, int x, int y, int w, int h);
@@void @mask_subtract (Mask *mask, int x, int y, int w, int h);
@@void @mask_intersect (Mask *mask, int x, int y, int w, int h);
@@void @mask_merge (Mask *dst, Mask *src);
@@void @mask_by_color (Mask *mask, Image *image, int color, int fuzziness);
@@void @mask_crop (Mask *mask, Image *image);
@heading
Path
@@Path *@path_new (const char *name);
@@void @path_free (Path *path);
@@void @path_set_join (Path *path, int join);
@tallbullets
<ul><li>
PATH_JOIN_MITER<br>
<li>
PATH_JOIN_ROUND<br>
<li>
PATH_JOIN_BEVEL<br>
</ul>
@@void @path_set_cap (Path *path, int cap);
@tallbullets
<ul><li>
PATH_CAP_BUTT<br>
<li>
PATH_CAP_ROUND<br>
<li>
PATH_CAP_SQUARE<br>
</ul>
@@void @path_moveto (Path *path, double x, double y);
@@void @path_lineto (Path *path, double x, double y);
@@void @path_curveto (Path *path, double control_x1, double control_y1, double control_x2, double control_y2, double end_x, double end_y);
@@void @path_close (Path *path);
@@void @path_move (Path *path, double x, double y);
@@void @path_stroke (Path *path, Image *image, int color, double brush_size);
@@void @path_fill (Path *path, Image *image, int color);
@heading
Sprite
The sprite is the main object of ASE (remember Allegro "Sprite"
Editor), and it's the structure that contains all data: layers,
frames, stocks, images, masks, paths, and undo information are
inside the same sprite.
There are a global variable of Sprite type: current_sprite. This
could be "nil" if there aren't a selected sprite in the moment.
You should known about the difference between the "current_sprite"
in scripts and the sprite in the current editor. Because when you
select a sprite with "set_current_sprite", only the "current_sprite"
global pointer is set, but the sprite in the current editor is
maintain intact. So when ASE runs a script, the "current_sprite"
will be pointing to the sprite in the current editor, but if you
change the "current_sprite" (with "set_current_sprite" routine)
you'll not get that sprite in the editor (use "sprite_show" function
instead).
@@Sprite *@sprite_new (int imgtype, int w, int h);
@@Sprite *@sprite_new_copy (Sprite *sprite);
@@Sprite *@sprite_new_flatten_copy (Sprite *sprite);
@@Sprite *@sprite_new_with_layer (int imgtype, int w, int h);
@@void @sprite_free (Sprite *sprite);
@@void @sprite_lock (Sprite *sprite);
@@void @sprite_unlock (Sprite *sprite);
@@bool @sprite_is_locked (Sprite *sprite);
@@bool @sprite_is_modified (Sprite *sprite);
@@bool @sprite_is_associated_to_file (Sprite *sprite);
@@void @sprite_mark_as_saved (Sprite *sprite);
@@void @sprite_set_filename (Sprite *sprite, const char *filename);
@@void @sprite_set_size (Sprite *sprite, int w, int h);
@@void @sprite_set_frames (Sprite *sprite, int frames);
@@void @sprite_set_speed (Sprite *sprite, int speed);
@@void @sprite_set_path (Sprite *sprite, Path *path);
@@void @sprite_set_mask (Sprite *sprite, Mask *mask);
@@void @sprite_set_layer (Sprite *sprite, Layer *layer);
@@void @sprite_set_frpos (Sprite *sprite, int frpos);
@@void @sprite_set_imgtype (Sprite *sprite, int imgtype, int dithering_method);
@@void @sprite_add_path (Sprite *sprite, Path *path);
@@void @sprite_remove_path (Sprite *sprite, Path *path);
@@void @sprite_add_mask (Sprite *sprite, Mask *mask);
@@void @sprite_remove_mask (Sprite *sprite, Mask *mask);
@@Mask *@sprite_request_mask (Sprite *sprite, const char *name);
@@void @sprite_render (Sprite *sprite, Image *image, int x, int y);
@heading
Stock
Stock of images. Each image layer has its own image's stock to
provide images to its frames.
@@Stock *@stock_new (int imgtype);
@@Stock *@stock_new_copy (Stock *stock);
@@void @stock_free (Stock *stock);
@@int @stock_add_image (Stock *stock, Image *image);
@@void @stock_remove_image (Stock *stock, Image *image);
@@void @stock_replace_image (Stock *stock, int index, Image *image);
@@Image *@stock_get_image (Stock *stock, int index);
@heading
Undo
@@Undo *@undo_new (Sprite *sprite);
@@void @undo_free (Undo *undo);
@@void @undo_enable (Undo *undo);
@@void @undo_disable (Undo *undo);
@@bool @undo_is_enabled (Undo *undo);
@@bool @undo_is_disabled (Undo *undo);
@@bool @undo_can_undo (Undo *undo);
@@bool @undo_can_redo (Undo *undo);
@@void @undo_undo (Undo *undo);
@@void @undo_redo (Undo *undo);
@@void @undo_open (Undo *undo);
@@void @undo_close (Undo *undo);
@@void @undo_image (Undo *undo, Image *image, int x, int y, int w, int h);
@\void @undo_flip (Undo *undo, Image *image, int x1, int y1, int x2, int y2,
@@ int horz);
@@void @undo_add_image (Undo *undo, Stock *stock, Image *image);
@@void @undo_remove_image (Undo *undo, Stock *stock, Image *image);
@@void @undo_replace_image (Undo *undo, Stock *stock, int index);
@@void @undo_add_frame (Undo *undo, Layer *layer, Frame *frame);
@@void @undo_remove_frame (Undo *undo, Layer *layer, Frame *frame);
@@void @undo_add_layer (Undo *undo, Layer *set, Layer *layer);
@@void @undo_remove_layer (Undo *undo, Layer *layer);
@@void @undo_move_layer (Undo *undo, Layer *layer);
@@void @undo_set_layer (Undo *undo, Sprite *sprite);
@@void @undo_set_mask (Undo *undo, Sprite *sprite);
@heading
Effect
@@Effect *@effect_new (Sprite *sprite, const char *name);
@@void @effect_free (Effect *effect);
@@void @effect_load_target (Effect *effect);
@@void @effect_set_target (Effect *effect, bool r, bool g, bool b, bool k, bool a, bool index);
@@void @effect_set_target_rgb (Effect *effect, bool r, bool g, bool b, bool a);
@@void @effect_set_target_grayscale (Effect *effect, bool k, bool a);
@@void @effect_set_target_indexed (Effect *effect, bool r, bool g, bool b, bool index);
@@void @effect_begin (Effect *effect);
@@void @effect_begin_for_preview (Effect *effect);
@@int @effect_apply_step (Effect *effect);
@@void @effect_apply (Effect *effect);
@@void @effect_flush (Effect *effect);
@@void @effect_apply_to_image (Effect *effect, Image *image, int x, int y);
@@void @effect_apply_to_target (Effect *effect);
@heading
ConvMatr
@@ConvMatr *@convmatr_new (int w, int h);
@@ConvMatr *@convmatr_new_string (const char *format);
@@void @convmatr_free (ConvMatr *convmatr);
@hnode Convolution Matrix Effect
@@void @set_convmatr (ConvMatr *convmatr);
@@ConvMatr *@get_convmatr (void);
@@ConvMatr *@get_convmatr_by_name (const char *name);
@heading
Curve
Curve is a type to represent a function y=f(x). It's mainly used in
color-curve effect.
@@Curve *@curve_new (int type);
Creates a new curve, type can be CURVE_LINEAR or CURVE_SPLINE.
@@void @curve_free (Curve *curve);
@@void @curve_add_point (Curve *curve, CurvePoint *point);
@@void @curve_remove_point (Curve *curve, CurvePoint *point);
@hnode Color Curve Effect
@@void @set_color_curve (Curve *curve);
@heading
CurvePoint
@@CurvePoint *@curve_point_new (int x, int y);
@@void @curve_point_free (CurvePoint *point);
@heading
JEvent
@heading
JList
@heading
JRect
@hnode JRect fields
<ul><li>
[number] rect.x<br>
[number] rect.y<br>
Position of the upper-left corner of the rectangle.
<li>
[number] rect.w<br>
[number] rect.h<br>
Size of the rectangle (width and height).
</ul>
@heading
JRegion
@heading
JWidget
@!text
@$@ifinfo
@headingnocontent
Index
@index
@$@end ifinfo
@$@contents
@$@bye
@text