diff --git a/docs/CHANGES.txt b/docs/CHANGES.txt index 6f4bee972..6cbcdaee7 100644 --- a/docs/CHANGES.txt +++ b/docs/CHANGES.txt @@ -8,7 +8,7 @@ http://www.tuxpaint.org/ $Id$ -2020.August.14 (0.9.25) +2020.August.15 (0.9.25) * New Features ------------ * Export drawings: @@ -27,7 +27,7 @@ $Id$ * The "--exportdir" option can be used to override the default location (but a "TuxPaint" subdir. will NOT be placed there). - * Shape controls: -- WORK IN PROGRESS + * Shape controls: * Draw shapes from the center (as in previous versions of Tux Paint) or from a corner (similar to the default mode of most other graphics tools). diff --git a/docs/en/README.txt b/docs/en/README.txt index c12eab84f..e79eb6c91 100644 --- a/docs/en/README.txt +++ b/docs/en/README.txt @@ -6,7 +6,7 @@ Copyright 2002-2020 by various contributors; see AUTHORS.txt http://www.tuxpaint.org/ - June 14, 2002 - July 27, 2020 + June 14, 2002 - August 15, 2020 ---------------------------------------------------------------------- @@ -285,10 +285,31 @@ Available Tools Select a shape from the selector on the right (circle, square, oval, etc.). + Use the options at the bottom right to choose the shape + tool's behavior: + + Shapes from center + The shape will expand from where you initially + clicked, and will be centered around that + position. (This was Tux Paint's only behavior + through version 0.9.24.) + + Shapes from corner + The shape will extend with one corner starting + from where you initially clicked. This is the + default method of most other traditional + drawing software. (This option was added + starting with Tux Paint version 0.9.25.) + + Note: If shape controls are disabled (e.g., with the + "--noshapecontrols" option), the controls will not be + presented, and the "shapes from center" method will be used. + In the canvas, click the mouse and hold it to stretch the shape out from where you clicked. Some shapes can change - proportion (e.g., rectangle and oval), others cannot (e.g., - square and circle). + proportion (e.g., rectangle and oval may be wider than tall, + or taller than wide), others cannot (e.g., square and + circle). Let go of the mouse when you're done stretching. diff --git a/docs/en/html/README.html b/docs/en/html/README.html index 79c053ae3..ee5a67d5c 100644 --- a/docs/en/html/README.html +++ b/docs/en/html/README.html @@ -35,7 +35,7 @@

- June 14, 2002 - July 27, 2020 + June 14, 2002 - August 15, 2020

@@ -707,11 +707,47 @@ (circle, square, oval, etc.).

+

+ Use the options at the bottom right to choose + the shape tool's behavior: +

+ +
+
+ Shapes from center +
+
+ The shape will expand from where you initially + clicked, and will be centered around that position. + (This was Tux Paint's only behavior through + version 0.9.24.) +
+ +
+ Shapes from corner +
+
+ The shape will extend with one corner starting + from where you initially clicked. This is the + default method of most other traditional drawing + software. (This option was added starting with + Tux Paint version 0.9.25.) +
+
+ +

+ Note: If shape controls are disabled (e.g., with the + "--noshapecontrols" option), the controls + will not be presented, and the "shapes from center" + method will be used. +

+

In the canvas, click the mouse and hold it to stretch the shape out from where you clicked. Some shapes can change proportion (e.g., rectangle and - oval), others cannot (e.g., square and circle). + oval may be wider than tall, or taller than wide), + others cannot (e.g., square and circle).

diff --git a/src/tuxpaint.c b/src/tuxpaint.c index ce7ee851a..894df2602 100644 --- a/src/tuxpaint.c +++ b/src/tuxpaint.c @@ -12825,7 +12825,7 @@ static void do_shape(int sx, int sy, int nx, int ny, int rotn, int use_brush) { int side, angle_skip, init_ang, rx, ry, rmax, x1, y1, x2, y2, xp, yp, xv, yv, old_brush, step; float a1, a2, rotn_rad; - int xx, yy, offx, offy; + int xx, yy, offx, offy, max_x, max_y; /* Determine radius/shape of the shape to draw: */ @@ -12882,6 +12882,38 @@ static void do_shape(int sx, int sy, int nx, int ny, int rotn, int use_brush) init_ang = shape_init_ang[cur_shape]; + if (shape_mode == SHAPEMODE_CORNER) + { + /* Get extent of shape based on it's vertices, + and scale up if we need to + (e.g., square's points are at 45, 135, 225 & 315 degrees, + which do not extend to the full radius). + + This works well for square and rectangle; it mostly + works for triangle and 5-pointed star, but it seems + sufficient. -bjk 2020.08.15 */ + max_x = 0; + max_y = 0; + for (side = 0; side < shape_sides[cur_shape]; side++) + { + a1 = (angle_skip * side + init_ang) * M_PI / 180; + a2 = (angle_skip * (side + 1) + init_ang) * M_PI / 180; + x1 = (int)(cos(a1) * rx); + y1 = (int)(-sin(a1) * ry); + + if (abs(x1) > max_x) + max_x = abs(x1); + if (abs(y1) > max_y) + max_y = abs(y1); + } + + if (max_x < rx) + rx = (rx * rx) / max_x; + if (max_y < ry) + ry = (ry * ry) / max_y; + } + + step = 1; if (dont_do_xor && !use_brush)