Issue 473: Fix mouse droppings in Brush rotate tool when you hold Shift

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@2012 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Yves Rizoud 2012-09-26 23:13:04 +00:00
parent d8fd3d33a4
commit effde4aee2
2 changed files with 33 additions and 19 deletions

View File

@ -952,24 +952,27 @@ void Rotate_brush_1_5(void)
short prev_state; short prev_state;
float angle; float angle;
int dx,dy; int dx,dy;
short cursor_x,cursor_y;
Operation_pop(&prev_state); Operation_pop(&prev_state);
Operation_pop(&old_y); Operation_pop(&old_y);
Operation_pop(&old_x); Operation_pop(&old_x);
// On corrige les coordonnées de la ligne si la touche shift est appuyée... // On corrige les coordonnées de la ligne si la touche shift est appuyée...
cursor_x = Paintbrush_X;
cursor_y = Paintbrush_Y;
if(SDL_GetModState() & KMOD_SHIFT) if(SDL_GetModState() & KMOD_SHIFT)
Clamp_coordinates_regular_angle(Brush_rotation_center_X,Brush_rotation_center_Y,&Paintbrush_X,&Paintbrush_Y); Clamp_coordinates_regular_angle(Brush_rotation_center_X,Brush_rotation_center_Y,&cursor_x,&cursor_y);
if ( (Paintbrush_X!=old_x) || (Paintbrush_Y!=old_y) || (prev_state!=2) ) if ( (cursor_x!=old_x) || (cursor_y!=old_y) || (prev_state!=2) )
{ {
if ( (Brush_rotation_center_X==Paintbrush_X) if ( (Brush_rotation_center_X==cursor_x)
&& (Brush_rotation_center_Y==Paintbrush_Y) ) && (Brush_rotation_center_Y==cursor_y) )
angle=0.0; angle=0.0;
else else
{ {
dx=Paintbrush_X-Brush_rotation_center_X; dx=cursor_x-Brush_rotation_center_X;
dy=Paintbrush_Y-Brush_rotation_center_Y; dy=cursor_y-Brush_rotation_center_Y;
angle=M_2PI-atan2(dy,dx); angle=M_2PI-atan2(dy,dx);
} }
@ -989,12 +992,13 @@ void Rotate_brush_1_5(void)
Display_cursor(); Display_cursor();
Operation_stack_size-=2; Operation_stack_size-=2;
Operation_push(Paintbrush_X); Operation_push(cursor_x);
Operation_push(Paintbrush_Y); Operation_push(cursor_y);
} }
Operation_push(Paintbrush_X); Operation_push(cursor_x);
Operation_push(Paintbrush_Y); Operation_push(cursor_y);
Operation_push(2); Operation_push(2);
} }
@ -1018,24 +1022,29 @@ void Rotate_brush_0_5(void)
short prev_state; short prev_state;
float angle=0.0; float angle=0.0;
int dx,dy; int dx,dy;
short cursor_x, cursor_y;
Operation_pop(&prev_state); Operation_pop(&prev_state);
Operation_pop(&old_y); Operation_pop(&old_y);
Operation_pop(&old_x); Operation_pop(&old_x);
// On corrige les coordonnées de la ligne si la touche shift est appuyée... // On corrige les coordonnées de la ligne si la touche shift est appuyée...
cursor_x = Paintbrush_X;
cursor_y = Paintbrush_Y;
if(SDL_GetModState() & KMOD_SHIFT) if(SDL_GetModState() & KMOD_SHIFT)
Clamp_coordinates_regular_angle(Brush_rotation_center_X,Brush_rotation_center_Y,&Paintbrush_X,&Paintbrush_Y); Clamp_coordinates_regular_angle(Brush_rotation_center_X,Brush_rotation_center_Y,&cursor_x,&cursor_y);
if ((Paintbrush_X!=old_x) || (Paintbrush_Y!=old_y) || (prev_state!=3)) if ((cursor_x!=old_x) || (cursor_y!=old_y) || (prev_state!=3))
{ {
if ( (Brush_rotation_center_X==Paintbrush_X) Hide_cursor();
&& (Brush_rotation_center_Y==Paintbrush_Y) ) if ( (Brush_rotation_center_X==cursor_x)
&& (Brush_rotation_center_Y==cursor_y) )
angle=0.0; angle=0.0;
else else
{ {
dx=Paintbrush_X-Brush_rotation_center_X; dx=cursor_x-Brush_rotation_center_X;
dy=Paintbrush_Y-Brush_rotation_center_Y; dy=cursor_y-Brush_rotation_center_Y;
angle=acos(((float)dx)/sqrt((dx*dx)+(dy*dy))); angle=acos(((float)dx)/sqrt((dx*dx)+(dy*dy)));
if (dy>0) angle=M_2PI-angle; if (dy>0) angle=M_2PI-angle;
} }
@ -1050,6 +1059,7 @@ void Rotate_brush_0_5(void)
else else
Print_coordinates(); Print_coordinates();
} }
Display_cursor();
} }
// Utilise Key_ANSI au lieu de Key, car Get_input() met ce dernier // Utilise Key_ANSI au lieu de Key, car Get_input() met ce dernier
@ -1089,8 +1099,8 @@ void Rotate_brush_0_5(void)
Operation_push(computed_y); Operation_push(computed_y);
} }
Operation_push(Paintbrush_X); Operation_push(cursor_x);
Operation_push(Paintbrush_Y); Operation_push(cursor_y);
Operation_push(3); Operation_push(3);
} }

View File

@ -1781,7 +1781,11 @@ void Draw_line_preview(short start_x,short start_y,short end_x,short end_y,byte
void Draw_line_preview_xor(short start_x,short start_y,short end_x,short end_y,byte color) void Draw_line_preview_xor(short start_x,short start_y,short end_x,short end_y,byte color)
{ {
int w, h; int w, h;
Pixel_figure=Pixel_figure_preview_xor;
Pixel_figure=(Func_pixel)Pixel_figure_preview_xor;
// Needed a cast because this function supports signed shorts,
// (it's usually in image space), while this time it's in screen space
// and some line endpoints can be out of screen.
Draw_line_general(start_x,start_y,end_x,end_y,color); Draw_line_general(start_x,start_y,end_x,end_y,color);
if (start_x<Limit_left) if (start_x<Limit_left)