Bug 566443 – diagonal method guidelines for crop tool

2009-03-14  Sven Neumann  <sven@gimp.org>

	Bug 566443 – diagonal method guidelines for crop tool

	* app/tools/tools-enums.[ch]
	* app/tools/gimprectangletool.c 
(gimp_rectangle_tool_draw_guides):
	applied a slightly modified patch from Lukasz Hladowski, based 
on
	a patch from Tim Jedlicka. This adds diagonal guidelines as
	described by Edwin Westhoff to the rectangle tools.


svn path=/trunk/; revision=28156
This commit is contained in:
Sven Neumann 2009-03-14 12:59:34 +00:00 committed by Sven Neumann
parent b2dc32410d
commit 2e7c80384b
4 changed files with 89 additions and 35 deletions

View File

@ -1,3 +1,13 @@
2009-03-14 Sven Neumann <sven@gimp.org>
Bug 566443 diagonal method guidelines for crop tool
* app/tools/tools-enums.[ch]
* app/tools/gimprectangletool.c (gimp_rectangle_tool_draw_guides):
applied a slightly modified patch from Lukasz Hladowski, based on
a patch from Tim Jedlicka. This adds diagonal guidelines as
described by Edwin Westhoff to the rectangle tools.
2009-03-13 Sven Neumann <sven@gimp.org> 2009-03-13 Sven Neumann <sven@gimp.org>
Bug 574427 Stroke path with paint tool error Bug 574427 Stroke path with paint tool error

View File

@ -1826,66 +1826,106 @@ gimp_rectangle_tool_draw (GimpDrawTool *draw_tool)
static void static void
gimp_rectangle_tool_draw_guides (GimpDrawTool *draw_tool) gimp_rectangle_tool_draw_guides (GimpDrawTool *draw_tool)
{ {
GimpTool *tool = GIMP_TOOL (draw_tool); GimpTool *tool = GIMP_TOOL (draw_tool);
GimpRectangleToolPrivate *private = GIMP_RECTANGLE_TOOL_GET_PRIVATE (tool); gdouble x1, y1;
gdouble pub_x1, pub_y1, pub_x2, pub_y2; gdouble x2, y2;
gimp_rectangle_tool_get_public_rect (GIMP_RECTANGLE_TOOL (draw_tool), gimp_rectangle_tool_get_public_rect (GIMP_RECTANGLE_TOOL (draw_tool),
&pub_x1, &pub_y1, &pub_x2, &pub_y2); &x1, &y1, &x2, &y2);
switch (private->guide) switch (GIMP_RECTANGLE_TOOL_GET_PRIVATE (tool)->guide)
{ {
case GIMP_RECTANGLE_GUIDE_NONE: case GIMP_RECTANGLE_GUIDE_NONE:
break; break;
case GIMP_RECTANGLE_GUIDE_CENTER_LINES: case GIMP_RECTANGLE_GUIDE_CENTER_LINES:
gimp_draw_tool_draw_line (draw_tool, gimp_draw_tool_draw_line (draw_tool,
pub_x1, (pub_y1 + pub_y2) / 2, x1, (y1 + y2) / 2,
pub_x2, (pub_y1 + pub_y2) / 2, FALSE); x2, (y1 + y2) / 2, FALSE);
gimp_draw_tool_draw_line (draw_tool, gimp_draw_tool_draw_line (draw_tool,
(pub_x1 + pub_x2) / 2, pub_y1, (x1 + x2) / 2, y1,
(pub_x1 + pub_x2) / 2, pub_y2, FALSE); (x1 + x2) / 2, y2, FALSE);
break; break;
case GIMP_RECTANGLE_GUIDE_THIRDS: case GIMP_RECTANGLE_GUIDE_THIRDS:
gimp_draw_tool_draw_line (draw_tool, gimp_draw_tool_draw_line (draw_tool,
pub_x1, (2 * pub_y1 + pub_y2) / 3, x1, (2 * y1 + y2) / 3,
pub_x2, (2 * pub_y1 + pub_y2) / 3, FALSE); x2, (2 * y1 + y2) / 3, FALSE);
gimp_draw_tool_draw_line (draw_tool, gimp_draw_tool_draw_line (draw_tool,
pub_x1, (pub_y1 + 2 * pub_y2) / 3, x1, (y1 + 2 * y2) / 3,
pub_x2, (pub_y1 + 2 * pub_y2) / 3, FALSE); x2, (y1 + 2 * y2) / 3, FALSE);
gimp_draw_tool_draw_line (draw_tool, gimp_draw_tool_draw_line (draw_tool,
(2 * pub_x1 + pub_x2) / 3, pub_y1, (2 * x1 + x2) / 3, y1,
(2 * pub_x1 + pub_x2) / 3, pub_y2, FALSE); (2 * x1 + x2) / 3, y2, FALSE);
gimp_draw_tool_draw_line (draw_tool, gimp_draw_tool_draw_line (draw_tool,
(pub_x1 + 2 * pub_x2) / 3, pub_y1, (x1 + 2 * x2) / 3, y1,
(pub_x1 + 2 * pub_x2) / 3, pub_y2, FALSE); (x1 + 2 * x2) / 3, y2, FALSE);
break; break;
case GIMP_RECTANGLE_GUIDE_GOLDEN: case GIMP_RECTANGLE_GUIDE_GOLDEN:
gimp_draw_tool_draw_line (draw_tool, gimp_draw_tool_draw_line (draw_tool,
pub_x1, x1,
(2 * pub_y1 + (1 + SQRT5) * pub_y2) / (3 + SQRT5), (2 * y1 + (1 + SQRT5) * y2) / (3 + SQRT5),
pub_x2, x2,
(2 * pub_y1 + (1 + SQRT5) * pub_y2) / (3 + SQRT5), (2 * y1 + (1 + SQRT5) * y2) / (3 + SQRT5),
FALSE); FALSE);
gimp_draw_tool_draw_line (draw_tool, gimp_draw_tool_draw_line (draw_tool,
pub_x1, x1,
((1 + SQRT5) * pub_y1 + 2 * pub_y2) / (3 + SQRT5), ((1 + SQRT5) * y1 + 2 * y2) / (3 + SQRT5),
pub_x2, x2,
((1 + SQRT5) * pub_y1 + 2 * pub_y2) / (3 + SQRT5), ((1 + SQRT5) * y1 + 2 * y2) / (3 + SQRT5),
FALSE); FALSE);
gimp_draw_tool_draw_line (draw_tool, gimp_draw_tool_draw_line (draw_tool,
(2 * pub_x1 + (1 + SQRT5) * pub_x2) / (3 + SQRT5), (2 * x1 + (1 + SQRT5) * x2) / (3 + SQRT5),
pub_y1, y1,
(2 * pub_x1 + (1 + SQRT5) * pub_x2) / (3 + SQRT5), (2 * x1 + (1 + SQRT5) * x2) / (3 + SQRT5),
pub_y2, y2,
FALSE); FALSE);
gimp_draw_tool_draw_line (draw_tool, gimp_draw_tool_draw_line (draw_tool,
((1 + SQRT5) * pub_x1 + 2 * pub_x2) / (3 + SQRT5), ((1 + SQRT5) * x1 + 2 * x2) / (3 + SQRT5),
pub_y1, y1,
((1 + SQRT5) * pub_x1 + 2 * pub_x2) / (3 + SQRT5), ((1 + SQRT5) * x1 + 2 * x2) / (3 + SQRT5),
pub_y2, FALSE); y2, FALSE);
break;
/* This code implements the method of diagonals discovered by
* Edwin Westhoff - see http://www.diagonalmethod.info/
*/
case GIMP_RECTANGLE_GUIDE_DIAGONALS:
{
/* the side of the largest square that can be
* fitted in whole into the rectangle (x1, y1), (x2, y2)
*/
const gdouble square_side = MIN (x2 - x1, y2 - y1);
/* diagonal from the top-left edge */
gimp_draw_tool_draw_line (draw_tool,
x1, y1,
x1 + square_side, y1 + square_side,
FALSE);
/* diagonal from the top-right edge */
gimp_draw_tool_draw_line (draw_tool,
x2, y1,
x2 - square_side, y1 + square_side,
FALSE);
/* If user selected a square, we cannot draw from bottom points
* as we would erase the guides drawn from the top points
*/
if ((x1 + square_side != x2) || (y1 + square_side != y2))
{
/* diagonal from the bottom-left edge */
gimp_draw_tool_draw_line (draw_tool,
x1, y2,
x1 + square_side, y2 - square_side,
FALSE);
/* diagonal from the bottom-right edge */
gimp_draw_tool_draw_line (draw_tool,
x2, y2,
x2 - square_side, y2 - square_side,
FALSE);
}
}
break; break;
} }
} }
@ -1900,7 +1940,8 @@ gimp_rectangle_tool_update_handle_sizes (GimpRectangleTool *rect_tool)
gint visible_rectangle_height; gint visible_rectangle_height;
gint rectangle_width; gint rectangle_width;
gint rectangle_height; gint rectangle_height;
gdouble pub_x1, pub_y1, pub_x2, pub_y2; gdouble pub_x1, pub_y1;
gdouble pub_x2, pub_y2;
tool = GIMP_TOOL (rect_tool); tool = GIMP_TOOL (rect_tool);
private = GIMP_RECTANGLE_TOOL_GET_PRIVATE (tool); private = GIMP_RECTANGLE_TOOL_GET_PRIVATE (tool);

View File

@ -51,6 +51,7 @@ gimp_rectangle_guide_get_type (void)
{ GIMP_RECTANGLE_GUIDE_CENTER_LINES, "GIMP_RECTANGLE_GUIDE_CENTER_LINES", "center-lines" }, { GIMP_RECTANGLE_GUIDE_CENTER_LINES, "GIMP_RECTANGLE_GUIDE_CENTER_LINES", "center-lines" },
{ GIMP_RECTANGLE_GUIDE_THIRDS, "GIMP_RECTANGLE_GUIDE_THIRDS", "thirds" }, { GIMP_RECTANGLE_GUIDE_THIRDS, "GIMP_RECTANGLE_GUIDE_THIRDS", "thirds" },
{ GIMP_RECTANGLE_GUIDE_GOLDEN, "GIMP_RECTANGLE_GUIDE_GOLDEN", "golden" }, { GIMP_RECTANGLE_GUIDE_GOLDEN, "GIMP_RECTANGLE_GUIDE_GOLDEN", "golden" },
{ GIMP_RECTANGLE_GUIDE_DIAGONALS, "GIMP_RECTANGLE_GUIDE_DIAGONALS", "diagonals" },
{ 0, NULL, NULL } { 0, NULL, NULL }
}; };
@ -60,6 +61,7 @@ gimp_rectangle_guide_get_type (void)
{ GIMP_RECTANGLE_GUIDE_CENTER_LINES, NC_("rectangle-guide", "Center lines"), NULL }, { GIMP_RECTANGLE_GUIDE_CENTER_LINES, NC_("rectangle-guide", "Center lines"), NULL },
{ GIMP_RECTANGLE_GUIDE_THIRDS, NC_("rectangle-guide", "Rule of thirds"), NULL }, { GIMP_RECTANGLE_GUIDE_THIRDS, NC_("rectangle-guide", "Rule of thirds"), NULL },
{ GIMP_RECTANGLE_GUIDE_GOLDEN, NC_("rectangle-guide", "Golden sections"), NULL }, { GIMP_RECTANGLE_GUIDE_GOLDEN, NC_("rectangle-guide", "Golden sections"), NULL },
{ GIMP_RECTANGLE_GUIDE_DIAGONALS, NC_("rectangle-guide", "Diagonal lines"), NULL },
{ 0, NULL, NULL } { 0, NULL, NULL }
}; };

View File

@ -44,7 +44,8 @@ typedef enum
GIMP_RECTANGLE_GUIDE_NONE, /*< desc="No guides" >*/ GIMP_RECTANGLE_GUIDE_NONE, /*< desc="No guides" >*/
GIMP_RECTANGLE_GUIDE_CENTER_LINES, /*< desc="Center lines" >*/ GIMP_RECTANGLE_GUIDE_CENTER_LINES, /*< desc="Center lines" >*/
GIMP_RECTANGLE_GUIDE_THIRDS, /*< desc="Rule of thirds" >*/ GIMP_RECTANGLE_GUIDE_THIRDS, /*< desc="Rule of thirds" >*/
GIMP_RECTANGLE_GUIDE_GOLDEN /*< desc="Golden sections" >*/ GIMP_RECTANGLE_GUIDE_GOLDEN, /*< desc="Golden sections" >*/
GIMP_RECTANGLE_GUIDE_DIAGONALS /*< desc="Diagonal lines" >*/
} GimpRectangleGuide; } GimpRectangleGuide;