mirror of
https://github.com/aseprite/aseprite.git
synced 2025-02-11 09:40:42 +00:00
Added support to lock lines in special angles with Shift key (feature request #1961397).
Fixed 'Curve' tool when click with the right mouse button (added 'editor_click_continue' routine for this).
This commit is contained in:
parent
8911db458a
commit
4026754881
11
ChangeLog
11
ChangeLog
@ -1,3 +1,14 @@
|
|||||||
|
2008-09-28 David A. Capello <davidcapello@gmail.com>
|
||||||
|
|
||||||
|
* src/modules/tools.c: Added new Curve tool.
|
||||||
|
(control_tool): Added support to lock lines in more
|
||||||
|
angles (feature request #1961397).
|
||||||
|
|
||||||
|
2008-09-27 David A. Capello <davidcapello@gmail.com>
|
||||||
|
|
||||||
|
* src/widgets/colbar.c: Added support to drag & drop
|
||||||
|
colors (feature request #2109224).
|
||||||
|
|
||||||
2008-05-06 David A. Capello <davidcapello@gmail.com>
|
2008-05-06 David A. Capello <davidcapello@gmail.com>
|
||||||
|
|
||||||
* Version 0.6b2 released.
|
* Version 0.6b2 released.
|
||||||
|
10
NEWS.txt
10
NEWS.txt
@ -5,6 +5,16 @@ NEWS
|
|||||||
0.6
|
0.6
|
||||||
---
|
---
|
||||||
|
|
||||||
|
+ Added 'Curve' tool (bezier-spline).
|
||||||
|
+ Added support to drag and drop colors in color-bar (feature request
|
||||||
|
feature #2109224).
|
||||||
|
+ Added support to lock lines in special angles with the Shift key,
|
||||||
|
useful to draw in isometric views (feature request #1961397).
|
||||||
|
+ Fixed bugs #1958760 and #1958932.
|
||||||
|
|
||||||
|
0.6b2
|
||||||
|
-----
|
||||||
|
|
||||||
+ Added the `Background' layer.
|
+ Added the `Background' layer.
|
||||||
+ Added support to load and save PNG files (through 'libpng').
|
+ Added support to load and save PNG files (through 'libpng').
|
||||||
+ Transparent cel handling for the end-user (you can move a cel and
|
+ Transparent cel handling for the end-user (you can move a cel and
|
||||||
|
@ -79,8 +79,10 @@
|
|||||||
<key tool="spray" shortcut="S" />
|
<key tool="spray" shortcut="S" />
|
||||||
<key tool="paint_bucket" shortcut="G" />
|
<key tool="paint_bucket" shortcut="G" />
|
||||||
<key tool="line" shortcut="L" />
|
<key tool="line" shortcut="L" />
|
||||||
|
<key tool="curve" shortcut="V" />
|
||||||
<key tool="curve" shortcut="L" />
|
<key tool="curve" shortcut="L" />
|
||||||
<key tool="rectangle" shortcut="U" />
|
<key tool="rectangle" shortcut="U" />
|
||||||
|
<key tool="ellipse" shortcut="O" />
|
||||||
<key tool="ellipse" shortcut="U" />
|
<key tool="ellipse" shortcut="U" />
|
||||||
<key tool="blur" shortcut="R" />
|
<key tool="blur" shortcut="R" />
|
||||||
<key tool="jumble" shortcut="J" />
|
<key tool="jumble" shortcut="J" />
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
\palette ase.pcx
|
\palette ase.pcx
|
||||||
\image ase.pcx
|
\image ase.pcx
|
||||||
|
|
||||||
Welcome to ASE 0.6 BETA 2
|
Welcome to ASE 0.6
|
||||||
|
|
||||||
READ THIS!
|
READ THIS!
|
||||||
|
|
||||||
|
@ -82,27 +82,9 @@ static void gen_gfx(void *data)
|
|||||||
|
|
||||||
int init_module_graphics(void)
|
int init_module_graphics(void)
|
||||||
{
|
{
|
||||||
/* DIRS *dirs, *dir; */
|
|
||||||
/* PALETTE pal; */
|
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
/* dirs = filename_in_datadir("icons.pcx"); */
|
for (c=0; c<GFX_BITMAP_COUNT; c++)
|
||||||
/* for (dir=dirs; dir; dir=dir->next) { */
|
|
||||||
/* set_color_conversion(COLORCONV_NONE); */
|
|
||||||
/* icons_pcx = load_bitmap(dir->path, pal); */
|
|
||||||
/* set_color_conversion(COLORCONV_TOTAL); */
|
|
||||||
|
|
||||||
/* if (icons_pcx) */
|
|
||||||
/* break; */
|
|
||||||
/* } */
|
|
||||||
/* dirs_free(dirs); */
|
|
||||||
|
|
||||||
/* if (!icons_pcx) { */
|
|
||||||
/* user_printf("Error loading icons.pcx"); */
|
|
||||||
/* return -1; */
|
|
||||||
/* } */
|
|
||||||
|
|
||||||
for(c=0; c<GFX_BITMAP_COUNT; c++)
|
|
||||||
gfx_bmps[c] = NULL;
|
gfx_bmps[c] = NULL;
|
||||||
|
|
||||||
app_add_hook(APP_PALETTE_CHANGE, gen_gfx, NULL);
|
app_add_hook(APP_PALETTE_CHANGE, gen_gfx, NULL);
|
||||||
@ -113,63 +95,17 @@ void exit_module_graphics(void)
|
|||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
for(c=0; c<GFX_BITMAP_COUNT; c++)
|
for (c=0; c<GFX_BITMAP_COUNT; c++)
|
||||||
if(gfx_bmps[c]) {
|
if (gfx_bmps[c]) {
|
||||||
destroy_bitmap(gfx_bmps[c]);
|
destroy_bitmap(gfx_bmps[c]);
|
||||||
gfx_bmps[c] = NULL;
|
gfx_bmps[c] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if (icons_pcx) */
|
|
||||||
/* destroy_bitmap(icons_pcx); */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BITMAP *get_gfx(int id)
|
BITMAP *get_gfx(int id)
|
||||||
{
|
{
|
||||||
if (!gfx_bmps[id]) {
|
if (!gfx_bmps[id])
|
||||||
/* if (id == GFX_TOOL_MARKER) { */
|
|
||||||
/* gfx_bmps[id] = create_bitmap(9, 9); */
|
|
||||||
/* blit(icons_pcx, gfx_bmps[id], 9*1, 9*0, 0, 0, 9, 9); */
|
|
||||||
/* } */
|
|
||||||
/* else if (id == GFX_TOOL_DOTS) { */
|
|
||||||
/* gfx_bmps[id] = create_bitmap(9, 9); */
|
|
||||||
/* blit(icons_pcx, gfx_bmps[id], 9*1, 9*1, 0, 0, 9, 9); */
|
|
||||||
/* } */
|
|
||||||
/* else if (id == GFX_TOOL_PENCIL) { */
|
|
||||||
/* gfx_bmps[id] = create_bitmap(9, 9); */
|
|
||||||
/* blit(icons_pcx, gfx_bmps[id], 9*1, 9*2, 0, 0, 9, 9); */
|
|
||||||
/* } */
|
|
||||||
/* else if (id == GFX_TOOL_BRUSH) { */
|
|
||||||
/* gfx_bmps[id] = create_bitmap(9, 9); */
|
|
||||||
/* blit(icons_pcx, gfx_bmps[id], 9*1, 9*3, 0, 0, 9, 9); */
|
|
||||||
/* } */
|
|
||||||
/* else if (id == GFX_TOOL_FLOODFILL) { */
|
|
||||||
/* gfx_bmps[id] = create_bitmap(9, 9); */
|
|
||||||
/* blit(icons_pcx, gfx_bmps[id], 9*1, 9*4, 0, 0, 9, 9); */
|
|
||||||
/* } */
|
|
||||||
/* else if (id == GFX_TOOL_SPRAY) { */
|
|
||||||
/* gfx_bmps[id] = create_bitmap(9, 9); */
|
|
||||||
/* blit(icons_pcx, gfx_bmps[id], 9*1, 9*5, 0, 0, 9, 9); */
|
|
||||||
/* } */
|
|
||||||
/* else if (id == GFX_TOOL_LINE) { */
|
|
||||||
/* gfx_bmps[id] = create_bitmap(9, 9); */
|
|
||||||
/* blit(icons_pcx, gfx_bmps[id], 9*1, 9*6, 0, 0, 9, 9); */
|
|
||||||
/* } */
|
|
||||||
/* else if (id == GFX_TOOL_RECTANGLE) { */
|
|
||||||
/* gfx_bmps[id] = create_bitmap(9, 9); */
|
|
||||||
/* blit(icons_pcx, gfx_bmps[id], 9*1, 9*7, 0, 0, 9, 9); */
|
|
||||||
/* } */
|
|
||||||
/* else if (id == GFX_TOOL_ELLIPSE) { */
|
|
||||||
/* gfx_bmps[id] = create_bitmap(9, 9); */
|
|
||||||
/* blit(icons_pcx, gfx_bmps[id], 9*1, 9*8, 0, 0, 9, 9); */
|
|
||||||
/* } */
|
|
||||||
/* else if (id == GFX_TOOL_CONFIGURATION) { */
|
|
||||||
/* gfx_bmps[id] = create_bitmap(9, 9); */
|
|
||||||
/* blit(icons_pcx, gfx_bmps[id], 9*1, 9*9, 0, 0, 9, 9); */
|
|
||||||
/* } */
|
|
||||||
/* else { */
|
|
||||||
convert_data_to_bitmap(&gfx_data[id], &gfx_bmps[id]);
|
convert_data_to_bitmap(&gfx_data[id], &gfx_bmps[id]);
|
||||||
/* } */
|
|
||||||
}
|
|
||||||
|
|
||||||
return gfx_bmps[id];
|
return gfx_bmps[id];
|
||||||
}
|
}
|
||||||
@ -309,10 +245,9 @@ void simple_dotted_mode(BITMAP *bmp, int fg, int bg)
|
|||||||
drawing_mode(DRAW_MODE_COPY_PATTERN, pattern, 0, 0);
|
drawing_mode(DRAW_MODE_COPY_PATTERN, pattern, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
/* Set/Restore sub-clip regions */
|
/* Set/Restore sub-clip regions */
|
||||||
|
|
||||||
typedef struct CLIP_DATA
|
typedef struct CLIP_DATA
|
||||||
{
|
{
|
||||||
BITMAP *bmp;
|
BITMAP *bmp;
|
||||||
|
@ -1025,14 +1025,14 @@ void control_tool(JWidget widget, Tool *tool,
|
|||||||
spray_time = ji_clock;
|
spray_time = ji_clock;
|
||||||
old_x1 = old_y1 = old_x2 = old_y2 = 0;
|
old_x1 = old_y1 = old_x2 = old_y2 = 0;
|
||||||
|
|
||||||
next_pts:;
|
|
||||||
|
|
||||||
/* start click */
|
/* start click */
|
||||||
editor_click_start(widget,
|
editor_click_start(widget,
|
||||||
click2 ? MODE_CLICKANDCLICK:
|
click2 ? MODE_CLICKANDCLICK:
|
||||||
MODE_CLICKANDRELEASE,
|
MODE_CLICKANDRELEASE,
|
||||||
&start_x, &start_y, &start_b);
|
&start_x, &start_y, &start_b);
|
||||||
|
|
||||||
|
next_pts:;
|
||||||
|
|
||||||
for (c=0; c<4; c++) {
|
for (c=0; c<4; c++) {
|
||||||
mouse_x[c] = start_x;
|
mouse_x[c] = start_x;
|
||||||
mouse_y[c] = start_y;
|
mouse_y[c] = start_y;
|
||||||
@ -1086,22 +1086,41 @@ next_pts:;
|
|||||||
if (old_key_shifts & KB_SHIFT_FLAG) {
|
if (old_key_shifts & KB_SHIFT_FLAG) {
|
||||||
int dx = x2 - x1;
|
int dx = x2 - x1;
|
||||||
int dy = y2 - y1;
|
int dy = y2 - y1;
|
||||||
int size;
|
int minsize = MIN(ABS(dx), ABS(dy));
|
||||||
|
int maxsize = MAX(ABS(dx), ABS(dy));
|
||||||
if (tool->flags & TOOL_SNAP_ANGLES)
|
|
||||||
size = MAX(ABS(dx), ABS(dy));
|
|
||||||
else
|
|
||||||
size = MIN(ABS(dx), ABS(dy));
|
|
||||||
|
|
||||||
x2 = x1 + SGN(dx) * size;
|
|
||||||
y2 = y1 + SGN(dy) * size;
|
|
||||||
|
|
||||||
if (tool->flags & TOOL_SNAP_ANGLES) {
|
if (tool->flags & TOOL_SNAP_ANGLES) {
|
||||||
if (ABS(dx) <= ABS(dy)/2)
|
double angle = 180.0 * atan((double)-dy / (double)dx) / M_PI;
|
||||||
x2 = x1;
|
angle = ABS(angle);
|
||||||
else if (ABS(dy) <= ABS(dx)/2)
|
|
||||||
|
/* snap horizontally */
|
||||||
|
if (angle < 18.0) {
|
||||||
y2 = y1;
|
y2 = y1;
|
||||||
}
|
}
|
||||||
|
/* snap at 26.565 */
|
||||||
|
else if (angle < 36.0) {
|
||||||
|
x2 = x1 + SGN(dx)*maxsize;
|
||||||
|
y2 = y1 + SGN(dy)*maxsize/2;
|
||||||
|
}
|
||||||
|
/* snap at 45 */
|
||||||
|
else if (angle < 54.0) {
|
||||||
|
x2 = x1 + SGN(dx)*minsize;
|
||||||
|
y2 = y1 + SGN(dy)*minsize;
|
||||||
|
}
|
||||||
|
/* snap at 63.435 */
|
||||||
|
else if (angle < 72.0) {
|
||||||
|
x2 = x1 + SGN(dx)*maxsize/2;
|
||||||
|
y2 = y1 + SGN(dy)*maxsize;
|
||||||
|
}
|
||||||
|
/* snap vertically */
|
||||||
|
else {
|
||||||
|
x2 = x1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
x2 = x1 + SGN(dx)*minsize;
|
||||||
|
y2 = y1 + SGN(dy)*minsize;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* center */
|
/* center */
|
||||||
@ -1182,8 +1201,8 @@ next_pts:;
|
|||||||
pts[3] = pts[5] = pts[7] = y1;
|
pts[3] = pts[5] = pts[7] = y1;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
pts[2] = x1;
|
pts[2] = pts[4] = x1;
|
||||||
pts[3] = y1;
|
pts[3] = pts[5] = y1;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
pts[4] = x1;
|
pts[4] = x1;
|
||||||
@ -1408,28 +1427,40 @@ next_pts:;
|
|||||||
/* update the state-bar */
|
/* update the state-bar */
|
||||||
if (jwidget_is_visible(statusbar)) {
|
if (jwidget_is_visible(statusbar)) {
|
||||||
if (tool->flags & TOOL_UPDATE_BOX) {
|
if (tool->flags & TOOL_UPDATE_BOX) {
|
||||||
char mode[256] = "";
|
char extra[256] = "";
|
||||||
|
|
||||||
if (current_tool == tools_list[TOOL_MARKER]) {
|
if (current_tool == tools_list[TOOL_MARKER]) {
|
||||||
if (start_b & 1) {
|
if (start_b & 1) {
|
||||||
if (key_shifts & KB_ALT_FLAG)
|
if (key_shifts & KB_ALT_FLAG)
|
||||||
strcat(mode, _("Replace"));
|
strcat(extra, _("Replace"));
|
||||||
else
|
else
|
||||||
strcat(mode, _("Union"));
|
strcat(extra, _("Union"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (key_shifts & KB_ALT_FLAG)
|
if (key_shifts & KB_ALT_FLAG)
|
||||||
strcat(mode, _("Intersect"));
|
strcat(extra, _("Intersect"));
|
||||||
else
|
else
|
||||||
strcat(mode, _("Subtract"));
|
strcat(extra, _("Subtract"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (current_tool == tools_list[TOOL_LINE]) {
|
||||||
|
usprintf(extra, "%s %.1f",
|
||||||
|
_("Angle"),
|
||||||
|
180.0 * atan2(y1-y2, x2-x1) / M_PI);
|
||||||
|
}
|
||||||
|
|
||||||
statusbar_set_text(statusbar, 0,
|
statusbar_set_text(statusbar, 0,
|
||||||
"%s %3d %3d %s %3d %3d (%s %3d %3d) %s",
|
"%s %3d %3d %s %3d %3d (%s %3d %3d) %s",
|
||||||
_start, x1, y1,
|
_start, x1, y1,
|
||||||
_end, x2, y2,
|
_end, x2, y2,
|
||||||
_size, ABS(x2-x1)+1, ABS(y2-y1)+1, mode);
|
_size, ABS(x2-x1)+1, ABS(y2-y1)+1, extra);
|
||||||
|
}
|
||||||
|
else if (tool->flags & TOOL_4FIRST2LAST) {
|
||||||
|
statusbar_set_text(statusbar, 0, "%s %3d %3d %s %3d %3d (%3d %3d - %3d %3d)",
|
||||||
|
_start, pts[0], pts[1],
|
||||||
|
_end, pts[6], pts[7],
|
||||||
|
pts[2], pts[3],
|
||||||
|
pts[4], pts[5]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
statusbar_set_text(statusbar, 0, "%s %3d %3d", _pos, x1, y1);
|
statusbar_set_text(statusbar, 0, "%s %3d %3d", _pos, x1, y1);
|
||||||
@ -1479,7 +1510,8 @@ next_pts:;
|
|||||||
if ((tool->flags & TOOL_4FIRST2LAST) &&
|
if ((tool->flags & TOOL_4FIRST2LAST) &&
|
||||||
(curve_pts < 3)) {
|
(curve_pts < 3)) {
|
||||||
++curve_pts;
|
++curve_pts;
|
||||||
click2 = MODE_CLICKANDCLICK;
|
editor_click_continue(widget, MODE_CLICKANDCLICK,
|
||||||
|
&start_x, &start_y);
|
||||||
goto next_pts;
|
goto next_pts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,6 +121,7 @@ enum {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void editor_click_start(JWidget editor, int mode, int *x, int *y, int *b);
|
void editor_click_start(JWidget editor, int mode, int *x, int *y, int *b);
|
||||||
|
void editor_click_continue(JWidget editor, int mode, int *x, int *y);
|
||||||
void editor_click_done(JWidget editor);
|
void editor_click_done(JWidget editor);
|
||||||
int editor_click(JWidget editor, int *x, int *y, int *update,
|
int editor_click(JWidget editor, int *x, int *y, int *update,
|
||||||
void (*scroll_callback) (int before_change));
|
void (*scroll_callback) (int before_change));
|
||||||
|
@ -65,6 +65,18 @@ void editor_click_start(JWidget widget, int mode, int *x, int *y, int *b)
|
|||||||
jwidget_capture_mouse(widget);
|
jwidget_capture_mouse(widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void editor_click_continue(JWidget widget, int mode, int *x, int *y)
|
||||||
|
{
|
||||||
|
click_mode = mode;
|
||||||
|
click_first = TRUE;
|
||||||
|
|
||||||
|
click_start_x = click_last_x = jmouse_x(0);
|
||||||
|
click_start_y = click_last_y = jmouse_y(0);
|
||||||
|
click_start_b = click_last_b = click_prev_last_b;
|
||||||
|
|
||||||
|
screen_to_editor(widget, click_start_x, click_start_y, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
void editor_click_done(JWidget widget)
|
void editor_click_done(JWidget widget)
|
||||||
{
|
{
|
||||||
jwidget_release_mouse(widget);
|
jwidget_release_mouse(widget);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user