app: add crosshair drawing to GimpCanvasAnchor and use it in GimpPaintTool

instead of drawing the crosshair cursor manually.
This commit is contained in:
Michael Natterer 2014-11-18 23:06:43 +01:00
parent dd169a6a36
commit c17e8b0412
6 changed files with 44 additions and 33 deletions

View File

@ -92,6 +92,7 @@ gimp_handle_type_get_type (void)
{ GIMP_HANDLE_DIAMOND, "GIMP_HANDLE_DIAMOND", "diamond" }, { GIMP_HANDLE_DIAMOND, "GIMP_HANDLE_DIAMOND", "diamond" },
{ GIMP_HANDLE_FILLED_DIAMOND, "GIMP_HANDLE_FILLED_DIAMOND", "filled-diamond" }, { GIMP_HANDLE_FILLED_DIAMOND, "GIMP_HANDLE_FILLED_DIAMOND", "filled-diamond" },
{ GIMP_HANDLE_CROSS, "GIMP_HANDLE_CROSS", "cross" }, { GIMP_HANDLE_CROSS, "GIMP_HANDLE_CROSS", "cross" },
{ GIMP_HANDLE_CROSSHAIR, "GIMP_HANDLE_CROSSHAIR", "crosshair" },
{ 0, NULL, NULL } { 0, NULL, NULL }
}; };
@ -104,6 +105,7 @@ gimp_handle_type_get_type (void)
{ GIMP_HANDLE_DIAMOND, "GIMP_HANDLE_DIAMOND", NULL }, { GIMP_HANDLE_DIAMOND, "GIMP_HANDLE_DIAMOND", NULL },
{ GIMP_HANDLE_FILLED_DIAMOND, "GIMP_HANDLE_FILLED_DIAMOND", NULL }, { GIMP_HANDLE_FILLED_DIAMOND, "GIMP_HANDLE_FILLED_DIAMOND", NULL },
{ GIMP_HANDLE_CROSS, "GIMP_HANDLE_CROSS", NULL }, { GIMP_HANDLE_CROSS, "GIMP_HANDLE_CROSS", NULL },
{ GIMP_HANDLE_CROSSHAIR, "GIMP_HANDLE_CROSSHAIR", NULL },
{ 0, NULL, NULL } { 0, NULL, NULL }
}; };

View File

@ -60,7 +60,8 @@ typedef enum
GIMP_HANDLE_FILLED_CIRCLE, GIMP_HANDLE_FILLED_CIRCLE,
GIMP_HANDLE_DIAMOND, GIMP_HANDLE_DIAMOND,
GIMP_HANDLE_FILLED_DIAMOND, GIMP_HANDLE_FILLED_DIAMOND,
GIMP_HANDLE_CROSS GIMP_HANDLE_CROSS,
GIMP_HANDLE_CROSSHAIR
} GimpHandleType; } GimpHandleType;

View File

@ -272,6 +272,7 @@ gimp_canvas_handle_transform (GimpCanvasItem *item,
case GIMP_HANDLE_CIRCLE: case GIMP_HANDLE_CIRCLE:
case GIMP_HANDLE_FILLED_CIRCLE: case GIMP_HANDLE_FILLED_CIRCLE:
case GIMP_HANDLE_CROSS: case GIMP_HANDLE_CROSS:
case GIMP_HANDLE_CROSSHAIR:
case GIMP_HANDLE_DIAMOND: case GIMP_HANDLE_DIAMOND:
case GIMP_HANDLE_FILLED_DIAMOND: case GIMP_HANDLE_FILLED_DIAMOND:
gimp_canvas_item_shift_to_center (private->anchor, gimp_canvas_item_shift_to_center (private->anchor,
@ -369,6 +370,22 @@ gimp_canvas_handle_draw (GimpCanvasItem *item,
_gimp_canvas_item_stroke (item, cr); _gimp_canvas_item_stroke (item, cr);
break; break;
case GIMP_HANDLE_CROSSHAIR:
cairo_move_to (cr, x - private->width / 2, y);
cairo_line_to (cr, x - private->width * 0.4, y);
cairo_move_to (cr, x + private->width / 2 - 0.5, y);
cairo_line_to (cr, x + private->width * 0.4, y);
cairo_move_to (cr, x, y - private->height / 2);
cairo_line_to (cr, x, y - private->height * 0.4 - 0.5);
cairo_move_to (cr, x, y + private->height / 2 - 0.5);
cairo_line_to (cr, x, y + private->height * 0.4 - 0.5);
_gimp_canvas_item_stroke (item, cr);
break;
default: default:
break; break;
} }
@ -399,6 +416,7 @@ gimp_canvas_handle_get_extents (GimpCanvasItem *item)
case GIMP_HANDLE_CIRCLE: case GIMP_HANDLE_CIRCLE:
case GIMP_HANDLE_FILLED_CIRCLE: case GIMP_HANDLE_FILLED_CIRCLE:
case GIMP_HANDLE_CROSS: case GIMP_HANDLE_CROSS:
case GIMP_HANDLE_CROSSHAIR:
case GIMP_HANDLE_DIAMOND: case GIMP_HANDLE_DIAMOND:
case GIMP_HANDLE_FILLED_DIAMOND: case GIMP_HANDLE_FILLED_DIAMOND:
rectangle.x = x - private->width / 2 - 2.0; rectangle.x = x - private->width / 2 - 2.0;
@ -453,6 +471,7 @@ gimp_canvas_handle_hit (GimpCanvasItem *item,
case GIMP_HANDLE_CIRCLE: case GIMP_HANDLE_CIRCLE:
case GIMP_HANDLE_FILLED_CIRCLE: case GIMP_HANDLE_FILLED_CIRCLE:
case GIMP_HANDLE_CROSS: case GIMP_HANDLE_CROSS:
case GIMP_HANDLE_CROSSHAIR:
{ {
gint width = private->width; gint width = private->width;

View File

@ -1033,6 +1033,7 @@ gimp_draw_tool_on_handle (GimpDrawTool *draw_tool,
case GIMP_HANDLE_SQUARE: case GIMP_HANDLE_SQUARE:
case GIMP_HANDLE_FILLED_SQUARE: case GIMP_HANDLE_FILLED_SQUARE:
case GIMP_HANDLE_CROSS: case GIMP_HANDLE_CROSS:
case GIMP_HANDLE_CROSSHAIR:
gimp_canvas_item_shift_to_north_west (anchor, gimp_canvas_item_shift_to_north_west (anchor,
handle_tx, handle_ty, handle_tx, handle_ty,
width, height, width, height,

View File

@ -24,6 +24,7 @@
#define GIMP_TOOL_HANDLE_SIZE_CIRCLE 13 #define GIMP_TOOL_HANDLE_SIZE_CIRCLE 13
#define GIMP_TOOL_HANDLE_SIZE_CROSS 15 #define GIMP_TOOL_HANDLE_SIZE_CROSS 15
#define GIMP_TOOL_HANDLE_SIZE_CROSSHAIR 43
#define GIMP_TOOL_HANDLE_SIZE_LARGE 25 #define GIMP_TOOL_HANDLE_SIZE_LARGE 25
#define GIMP_TOOL_HANDLE_SIZE_SMALL 7 #define GIMP_TOOL_HANDLE_SIZE_SMALL 7

View File

@ -795,39 +795,26 @@ gimp_paint_tool_draw (GimpDrawTool *draw_tool)
} }
else if (paint_tool->draw_circle) else if (paint_tool->draw_circle)
{ {
/** Lets make a sensible fallback cursor /* Lets make a sensible fallback cursor
* *
* Sensible cursor is * Sensible cursor is
* * crossed to indicate draw point * * crossed to indicate draw point
* * reactive to options alterations * * reactive to options alterations
* * not a full circle that would be in the way */ * * not a full circle that would be in the way
*/
/* size as it could be */
gint size = (gint) paint_tool->circle_radius; gint size = (gint) paint_tool->circle_radius;
gdouble view_scale = MAX (core->cur_coords.xscale, core->cur_coords.xscale);
gdouble cross_size = 25.0 / view_scale;
gdouble cross_gap = 18.0 / view_scale;
/* Cross to mark the spot */ /* Cross to mark the spot */
gimp_draw_tool_add_line (draw_tool, gimp_draw_tool_add_handle (draw_tool,
cur_x + cross_gap, cur_y, GIMP_HANDLE_CROSSHAIR,
cur_x + cross_size, cur_y); cur_x, cur_y,
GIMP_TOOL_HANDLE_SIZE_CROSSHAIR,
gimp_draw_tool_add_line (draw_tool, GIMP_TOOL_HANDLE_SIZE_CROSSHAIR,
cur_x - cross_size, cur_y, GIMP_HANDLE_ANCHOR_CENTER);
cur_x - cross_gap, cur_y);
gimp_draw_tool_add_line (draw_tool,
cur_x, cur_y - cross_size,
cur_x, cur_y - cross_gap);
gimp_draw_tool_add_line (draw_tool,
cur_x, cur_y + cross_gap,
cur_x, cur_y + cross_size);
#define TICKMARK_ANGLE 48 #define TICKMARK_ANGLE 48
#define ROTATION_ANGLE G_PI / 4 #define ROTATION_ANGLE G_PI / 4
/* marks for indicating full size */ /* marks for indicating full size */
gimp_draw_tool_add_arc (draw_tool, gimp_draw_tool_add_arc (draw_tool,
FALSE, FALSE,
@ -870,10 +857,10 @@ gimp_paint_tool_draw (GimpDrawTool *draw_tool)
*/ */
if (! line_drawn) if (! line_drawn)
gimp_draw_tool_add_handle (draw_tool, gimp_draw_tool_add_handle (draw_tool,
GIMP_HANDLE_CIRCLE, GIMP_HANDLE_CROSSHAIR,
cur_x, cur_y, cur_x, cur_y,
GIMP_TOOL_HANDLE_SIZE_SMALL, GIMP_TOOL_HANDLE_SIZE_CROSSHAIR,
GIMP_TOOL_HANDLE_SIZE_SMALL, GIMP_TOOL_HANDLE_SIZE_CROSSHAIR,
GIMP_HANDLE_ANCHOR_CENTER); GIMP_HANDLE_ANCHOR_CENTER);
} }
} }