aseprite/HACKING.txt

123 lines
4.9 KiB
Plaintext

======================================================================
ASE Hacking Notes
======================================================================
----------------------------------------------------------------------
Change the name of a command
----------------------------------------------------------------------
Rename the file "src/commands/cmd_OLD_NAME.cpp" to
"src/commands/cmd_NEW_NAME.cpp".
Update the file name in the COMMON_SOURCES variable inside
makefile.lst.
Update the command name in "src/commands/commands_list.h" file.
Find "get_command_by_name" in the whole source code, you have to
update the command id (anyway you will get a compiler error).
Change in the Command() constructor call, the name of the command.
E.g. MyCmd::MyCmd() : Command("new_name", ...) { }
----------------------------------------------------------------------
Add a new file to compile
----------------------------------------------------------------------
Remember that if you add a new file to compile, it should have a
different name of any other file name in the source code tree. Also,
you must add it in the COMMON_SOURCES or ASE_SOURCES variable of the
makefile.lst.
----------------------------------------------------------------------
Add a new load/save file type
----------------------------------------------------------------------
Look at the "src/file/" directory. You have two options to make a
new load/save routines:
- Use the sequence API (src/file/file.h);
- Use directly the sprite API (src/raster/sprite.h);
The sequence API should be used only for images that don't support
animation and that are plain images (don't have layers), like BMP,
PCX, TGA, or JPEG format. This is useful to handle sequences of
bitmaps like spr00.pcx, spr01.pcx, spr02.pcx automatically (you
don't worry about that, you just write the code to load/save one
file).
In the other hand, you should use directly the raster API
(src/raster/) if your format support animation or layers, like FLI,
or GIF formats.
----------------------------------------------------------------------
Hook palette's changes
----------------------------------------------------------------------
With the routines (from "src/modules/palette.c"):
void hook_palette_changes(void (*proc)(void));
void unhook_palette_changes(void (*proc)(void));
The hooks are installed in the tail (it's important see the order of
modules in "src/core/modules.c").
Then when you use "set_current_palette", the routine
"call_palette_hooks" will call the hooks from the first to the last
one.
----------------------------------------------------------------------
Update the icon of buttons when the bitmap is destroyed in palette changes
----------------------------------------------------------------------
NOTE: This is only for buttons with a BITMAP
from "get_gfx()" (src/modules/gfx.c).
When the palette changes, all graphics from "src/modules/gfx.c" are
regenerated. If one button was using one of these BITMAP, that will
be a problem, because that pointer is pointing to a freed memory
area.
To update this icon pointer, you can use this is routine:
void add_gfxicon_to_button(JWidget button, int gfx_id, int icon_align);
This routine save in "user_data[3]" of "button" the "gfx_id", and
when the palette changes, the icon will be restored making a:
jbutton_set_icon(button, get_gfx(gfx_id));
Also, the routine will hook the destroy signal to remove
automatically this button from the "list of buttons to fixup"
("icon_buttons" in "src/modules/gui.c").
----------------------------------------------------------------------
Reload the fonts
----------------------------------------------------------------------
The routine "reload_default_font" in "src/modules/gui.c" reloads the
font indicated in the configuration string "/options/default_font",
also if it doesn't exist, the routine will try to load the
"data/fonts/default.pcx" font (finally, ASE uses the Allegro font if
no one was found).
This routine uses the "_ji_set_font_of_all_widgets" to change the
"text_font" property of EVERY widget.
----------------------------------------------------------------------
Undo
----------------------------------------------------------------------
NOTE.1: Every undo action must be added in the "sprite.undo"
structure before to do the operation in the sprite. E.g:
undo_remove_layer(sprite.undo, sprite.layer);
layer_remove_layer(sprite.layer.parent, sprite.layer);
The only exception for this is "undo_add_image":
stock_add_image(stock, image);
undo_add_image(undo, stock, image);
----------------------------------------------------------------------
Copyright (C) 2001-2009 David Capello