From effde4aee2038ec98dd3a4ffd366f061e5a38251 Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Wed, 26 Sep 2012 23:13:04 +0000 Subject: [PATCH] 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 --- src/brush_ops.c | 46 ++++++++++++++++++++++++++++------------------ src/graph.c | 6 +++++- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/brush_ops.c b/src/brush_ops.c index c9e343a9..7b1e75e1 100644 --- a/src/brush_ops.c +++ b/src/brush_ops.c @@ -952,24 +952,27 @@ void Rotate_brush_1_5(void) short prev_state; float angle; int dx,dy; + short cursor_x,cursor_y; Operation_pop(&prev_state); Operation_pop(&old_y); Operation_pop(&old_x); // 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) - 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) - && (Brush_rotation_center_Y==Paintbrush_Y) ) + if ( (Brush_rotation_center_X==cursor_x) + && (Brush_rotation_center_Y==cursor_y) ) angle=0.0; else { - dx=Paintbrush_X-Brush_rotation_center_X; - dy=Paintbrush_Y-Brush_rotation_center_Y; + dx=cursor_x-Brush_rotation_center_X; + dy=cursor_y-Brush_rotation_center_Y; angle=M_2PI-atan2(dy,dx); } @@ -989,12 +992,13 @@ void Rotate_brush_1_5(void) Display_cursor(); Operation_stack_size-=2; - Operation_push(Paintbrush_X); - Operation_push(Paintbrush_Y); + Operation_push(cursor_x); + Operation_push(cursor_y); } + - Operation_push(Paintbrush_X); - Operation_push(Paintbrush_Y); + Operation_push(cursor_x); + Operation_push(cursor_y); Operation_push(2); } @@ -1018,24 +1022,29 @@ void Rotate_brush_0_5(void) short prev_state; float angle=0.0; int dx,dy; + short cursor_x, cursor_y; + Operation_pop(&prev_state); Operation_pop(&old_y); Operation_pop(&old_x); // 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) - 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) - && (Brush_rotation_center_Y==Paintbrush_Y) ) + Hide_cursor(); + if ( (Brush_rotation_center_X==cursor_x) + && (Brush_rotation_center_Y==cursor_y) ) angle=0.0; else { - dx=Paintbrush_X-Brush_rotation_center_X; - dy=Paintbrush_Y-Brush_rotation_center_Y; + dx=cursor_x-Brush_rotation_center_X; + dy=cursor_y-Brush_rotation_center_Y; angle=acos(((float)dx)/sqrt((dx*dx)+(dy*dy))); if (dy>0) angle=M_2PI-angle; } @@ -1050,6 +1059,7 @@ void Rotate_brush_0_5(void) else Print_coordinates(); } + Display_cursor(); } // 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(Paintbrush_X); - Operation_push(Paintbrush_Y); + Operation_push(cursor_x); + Operation_push(cursor_y); Operation_push(3); } diff --git a/src/graph.c b/src/graph.c index 15935a6c..7bab467e 100644 --- a/src/graph.c +++ b/src/graph.c @@ -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) { 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); if (start_x