diff --git a/docs/CHANGES.txt b/docs/CHANGES.txt index b393176bd..ad6582ce5 100644 --- a/docs/CHANGES.txt +++ b/docs/CHANGES.txt @@ -8,7 +8,7 @@ http://www.tuxpaint.org/ $Id$ -2009.August.11 (0.9.22) +2009.August.13 (0.9.22) * New Magic Tools: ---------------- * Blinds - Close window blinds over your picture. @@ -29,8 +29,19 @@ $Id$ with some prompts, in some locales. (SF.net bug #2834461) + * Shape Tool now locks rotation into 15 or 5 degree steps, when the + radius of the shape is very small or small, respectively. + (SF.net bug #2837177) + + * Shape Tool tries to avoid glitches where lines connect, when shape is + rotated. (Rotation of fixed-aspect shapes like Square and Octagon + stays within the angle of the corners. i.e., rotating a square 140 deg. + actually only rotates it 30 deg., since it looks identical, + sans glitches.) + (SF.net bug #2837177) + * New Starters: - ------------- + ------------- * Elephant * Hat * Old Soviet Car diff --git a/src/tuxpaint.c b/src/tuxpaint.c index 78b34c43f..f65aa4c3e 100644 --- a/src/tuxpaint.c +++ b/src/tuxpaint.c @@ -886,6 +886,8 @@ static int starter_mirrored, starter_flipped, starter_personal; static Uint8 canvas_color_r, canvas_color_g, canvas_color_b; Uint8 * touched; +int shape_radius; + /* Magic tools API and tool handles: */ @@ -3730,6 +3732,8 @@ static void mainloop(void) if (!simple_shapes && !shape_no_rotate[cur_shape]) { shape_tool_mode = SHAPE_TOOL_MODE_ROTATE; + + shape_radius = sqrt((shape_ctr_x - shape_outer_x) * (shape_ctr_x - shape_outer_x) + (shape_ctr_y - shape_outer_y) * (shape_ctr_y - shape_outer_y)); SDL_WarpMouse(shape_outer_x + 96, shape_ctr_y); do_setcursor(cursor_rotate); @@ -3737,7 +3741,9 @@ static void mainloop(void) /* Erase stretchy XOR: */ - do_shape(shape_ctr_x, shape_ctr_y, old_x, old_y, 0, 0); + if (abs(shape_ctr_x - shape_outer_x) > 15 || + abs(shape_ctr_y - shape_outer_y) > 15) + do_shape(shape_ctr_x, shape_ctr_y, old_x, old_y, 0, 0); /* Make an initial rotation XOR to be erased: */ @@ -12625,7 +12631,24 @@ static void do_shape(int cx, int cy, int ox, int oy, int rotn, int use_brush) static int rotation(int ctr_x, int ctr_y, int ox, int oy) { - return (atan2(oy - ctr_y, ox - ctr_x) * 180 / M_PI); + int deg; + + + deg = (atan2(oy - ctr_y, ox - ctr_x) * 180 / M_PI); + + if (shape_radius < 50) + deg = ((deg - 15) / 30) * 30; + else if (shape_radius < 100) + deg = ((deg - 7) / 15) * 15; + + if (shape_locked[cur_shape]) + { + int angle_skip; + angle_skip = 360 / shape_sides[cur_shape]; + deg = deg % angle_skip; + } + + return(deg); }