app: add dashed canvas handle types
Add DASHED variants for GIMP_HANDLE_{SQUARE,CIRCLE,DIAMOND}.
This commit is contained in:
@ -150,10 +150,13 @@ gimp_handle_type_get_type (void)
|
||||
static const GEnumValue values[] =
|
||||
{
|
||||
{ GIMP_HANDLE_SQUARE, "GIMP_HANDLE_SQUARE", "square" },
|
||||
{ GIMP_HANDLE_DASHED_SQUARE, "GIMP_HANDLE_DASHED_SQUARE", "dashed-square" },
|
||||
{ GIMP_HANDLE_FILLED_SQUARE, "GIMP_HANDLE_FILLED_SQUARE", "filled-square" },
|
||||
{ GIMP_HANDLE_CIRCLE, "GIMP_HANDLE_CIRCLE", "circle" },
|
||||
{ GIMP_HANDLE_DASHED_CIRCLE, "GIMP_HANDLE_DASHED_CIRCLE", "dashed-circle" },
|
||||
{ GIMP_HANDLE_FILLED_CIRCLE, "GIMP_HANDLE_FILLED_CIRCLE", "filled-circle" },
|
||||
{ GIMP_HANDLE_DIAMOND, "GIMP_HANDLE_DIAMOND", "diamond" },
|
||||
{ GIMP_HANDLE_DASHED_DIAMOND, "GIMP_HANDLE_DASHED_DIAMOND", "dashed-diamond" },
|
||||
{ GIMP_HANDLE_FILLED_DIAMOND, "GIMP_HANDLE_FILLED_DIAMOND", "filled-diamond" },
|
||||
{ GIMP_HANDLE_CROSS, "GIMP_HANDLE_CROSS", "cross" },
|
||||
{ GIMP_HANDLE_CROSSHAIR, "GIMP_HANDLE_CROSSHAIR", "crosshair" },
|
||||
@ -163,10 +166,13 @@ gimp_handle_type_get_type (void)
|
||||
static const GimpEnumDesc descs[] =
|
||||
{
|
||||
{ GIMP_HANDLE_SQUARE, "GIMP_HANDLE_SQUARE", NULL },
|
||||
{ GIMP_HANDLE_DASHED_SQUARE, "GIMP_HANDLE_DASHED_SQUARE", NULL },
|
||||
{ GIMP_HANDLE_FILLED_SQUARE, "GIMP_HANDLE_FILLED_SQUARE", NULL },
|
||||
{ GIMP_HANDLE_CIRCLE, "GIMP_HANDLE_CIRCLE", NULL },
|
||||
{ GIMP_HANDLE_DASHED_CIRCLE, "GIMP_HANDLE_DASHED_CIRCLE", NULL },
|
||||
{ GIMP_HANDLE_FILLED_CIRCLE, "GIMP_HANDLE_FILLED_CIRCLE", NULL },
|
||||
{ GIMP_HANDLE_DIAMOND, "GIMP_HANDLE_DIAMOND", NULL },
|
||||
{ GIMP_HANDLE_DASHED_DIAMOND, "GIMP_HANDLE_DASHED_DIAMOND", NULL },
|
||||
{ GIMP_HANDLE_FILLED_DIAMOND, "GIMP_HANDLE_FILLED_DIAMOND", NULL },
|
||||
{ GIMP_HANDLE_CROSS, "GIMP_HANDLE_CROSS", NULL },
|
||||
{ GIMP_HANDLE_CROSSHAIR, "GIMP_HANDLE_CROSSHAIR", NULL },
|
||||
|
@ -80,10 +80,13 @@ GType gimp_handle_type_get_type (void) G_GNUC_CONST;
|
||||
typedef enum
|
||||
{
|
||||
GIMP_HANDLE_SQUARE,
|
||||
GIMP_HANDLE_DASHED_SQUARE,
|
||||
GIMP_HANDLE_FILLED_SQUARE,
|
||||
GIMP_HANDLE_CIRCLE,
|
||||
GIMP_HANDLE_DASHED_CIRCLE,
|
||||
GIMP_HANDLE_FILLED_CIRCLE,
|
||||
GIMP_HANDLE_DIAMOND,
|
||||
GIMP_HANDLE_DASHED_DIAMOND,
|
||||
GIMP_HANDLE_FILLED_DIAMOND,
|
||||
GIMP_HANDLE_CROSS,
|
||||
GIMP_HANDLE_CROSSHAIR
|
||||
|
@ -35,6 +35,11 @@
|
||||
#include "gimpdisplayshell.h"
|
||||
|
||||
|
||||
#define N_DASHES 8
|
||||
#define DASH_ON_RATIO 0.3
|
||||
#define DASH_OFF_RATIO 0.7
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
@ -261,6 +266,7 @@ gimp_canvas_handle_transform (GimpCanvasItem *item,
|
||||
switch (private->type)
|
||||
{
|
||||
case GIMP_HANDLE_SQUARE:
|
||||
case GIMP_HANDLE_DASHED_SQUARE:
|
||||
case GIMP_HANDLE_FILLED_SQUARE:
|
||||
gimp_canvas_item_shift_to_north_west (private->anchor,
|
||||
*x, *y,
|
||||
@ -270,10 +276,12 @@ gimp_canvas_handle_transform (GimpCanvasItem *item,
|
||||
break;
|
||||
|
||||
case GIMP_HANDLE_CIRCLE:
|
||||
case GIMP_HANDLE_DASHED_CIRCLE:
|
||||
case GIMP_HANDLE_FILLED_CIRCLE:
|
||||
case GIMP_HANDLE_CROSS:
|
||||
case GIMP_HANDLE_CROSSHAIR:
|
||||
case GIMP_HANDLE_DIAMOND:
|
||||
case GIMP_HANDLE_DASHED_DIAMOND:
|
||||
case GIMP_HANDLE_FILLED_DIAMOND:
|
||||
gimp_canvas_item_shift_to_center (private->anchor,
|
||||
*x, *y,
|
||||
@ -306,8 +314,10 @@ gimp_canvas_handle_draw (GimpCanvasItem *item,
|
||||
switch (private->type)
|
||||
{
|
||||
case GIMP_HANDLE_SQUARE:
|
||||
case GIMP_HANDLE_DASHED_SQUARE:
|
||||
case GIMP_HANDLE_FILLED_SQUARE:
|
||||
case GIMP_HANDLE_DIAMOND:
|
||||
case GIMP_HANDLE_DASHED_DIAMOND:
|
||||
case GIMP_HANDLE_FILLED_DIAMOND:
|
||||
case GIMP_HANDLE_CROSS:
|
||||
cairo_save (cr);
|
||||
@ -318,8 +328,27 @@ gimp_canvas_handle_draw (GimpCanvasItem *item,
|
||||
switch (private->type)
|
||||
{
|
||||
case GIMP_HANDLE_SQUARE:
|
||||
case GIMP_HANDLE_DASHED_SQUARE:
|
||||
if (private->type == GIMP_HANDLE_DASHED_SQUARE)
|
||||
{
|
||||
gdouble circ;
|
||||
gdouble dashes[2];
|
||||
|
||||
cairo_save (cr);
|
||||
|
||||
circ = 2.0 * ((private->width - 1.0) + (private->height - 1.0));
|
||||
|
||||
dashes[0] = (circ / N_DASHES) * DASH_ON_RATIO;
|
||||
dashes[1] = (circ / N_DASHES) * DASH_OFF_RATIO;
|
||||
|
||||
cairo_set_dash (cr, dashes, 2, dashes[0] / 2.0);
|
||||
}
|
||||
|
||||
cairo_rectangle (cr, x, y, private->width - 1.0, private->height - 1.0);
|
||||
_gimp_canvas_item_stroke (item, cr);
|
||||
|
||||
if (private->type == GIMP_HANDLE_DASHED_SQUARE)
|
||||
cairo_restore (cr);
|
||||
break;
|
||||
|
||||
case GIMP_HANDLE_FILLED_SQUARE:
|
||||
@ -328,16 +357,37 @@ gimp_canvas_handle_draw (GimpCanvasItem *item,
|
||||
break;
|
||||
|
||||
case GIMP_HANDLE_DIAMOND:
|
||||
case GIMP_HANDLE_DASHED_DIAMOND:
|
||||
case GIMP_HANDLE_FILLED_DIAMOND:
|
||||
if (private->type == GIMP_HANDLE_DASHED_DIAMOND)
|
||||
{
|
||||
gdouble circ;
|
||||
gdouble dashes[2];
|
||||
|
||||
cairo_save (cr);
|
||||
|
||||
circ = 4.0 * hypot ((gdouble) private->width / 2.0,
|
||||
(gdouble) private->height / 2.0);
|
||||
|
||||
dashes[0] = (circ / N_DASHES) * DASH_ON_RATIO;
|
||||
dashes[1] = (circ / N_DASHES) * DASH_OFF_RATIO;
|
||||
|
||||
cairo_set_dash (cr, dashes, 2, dashes[0] / 2.0);
|
||||
}
|
||||
|
||||
cairo_move_to (cr, x, y - (gdouble) private->height / 2.0);
|
||||
cairo_line_to (cr, x + (gdouble) private->width / 2.0, y);
|
||||
cairo_line_to (cr, x, y + (gdouble) private->height / 2.0);
|
||||
cairo_line_to (cr, x - (gdouble) private->width / 2.0, y);
|
||||
cairo_line_to (cr, x, y - (gdouble) private->height / 2.0);
|
||||
if (private->type == GIMP_HANDLE_DIAMOND)
|
||||
if (private->type == GIMP_HANDLE_DIAMOND ||
|
||||
private->type == GIMP_HANDLE_DASHED_DIAMOND)
|
||||
_gimp_canvas_item_stroke (item, cr);
|
||||
else
|
||||
_gimp_canvas_item_fill (item, cr);
|
||||
|
||||
if (private->type == GIMP_HANDLE_DASHED_SQUARE)
|
||||
cairo_restore (cr);
|
||||
break;
|
||||
|
||||
case GIMP_HANDLE_CROSS:
|
||||
@ -356,11 +406,30 @@ gimp_canvas_handle_draw (GimpCanvasItem *item,
|
||||
break;
|
||||
|
||||
case GIMP_HANDLE_CIRCLE:
|
||||
case GIMP_HANDLE_DASHED_CIRCLE:
|
||||
if (private->type == GIMP_HANDLE_DASHED_CIRCLE)
|
||||
{
|
||||
gdouble circ;
|
||||
gdouble dashes[2];
|
||||
|
||||
cairo_save (cr);
|
||||
|
||||
circ = 2.0 * G_PI * (private->width / 2);
|
||||
|
||||
dashes[0] = (circ / N_DASHES) * DASH_ON_RATIO;
|
||||
dashes[1] = (circ / N_DASHES) * DASH_OFF_RATIO;
|
||||
|
||||
cairo_set_dash (cr, dashes, 2, dashes[0] / 2.0);
|
||||
}
|
||||
|
||||
gimp_cairo_add_arc (cr, x, y, private->width / 2,
|
||||
private->start_angle,
|
||||
private->slice_angle);
|
||||
|
||||
_gimp_canvas_item_stroke (item, cr);
|
||||
|
||||
if (private->type == GIMP_HANDLE_DASHED_CIRCLE)
|
||||
cairo_restore (cr);
|
||||
break;
|
||||
|
||||
case GIMP_HANDLE_FILLED_CIRCLE:
|
||||
@ -407,6 +476,7 @@ gimp_canvas_handle_get_extents (GimpCanvasItem *item)
|
||||
switch (private->type)
|
||||
{
|
||||
case GIMP_HANDLE_SQUARE:
|
||||
case GIMP_HANDLE_DASHED_SQUARE:
|
||||
case GIMP_HANDLE_FILLED_SQUARE:
|
||||
w = private->width * (sqrt(2) - 1) / 2;
|
||||
h = private->height * (sqrt(2) - 1) / 2;
|
||||
@ -417,10 +487,12 @@ gimp_canvas_handle_get_extents (GimpCanvasItem *item)
|
||||
break;
|
||||
|
||||
case GIMP_HANDLE_CIRCLE:
|
||||
case GIMP_HANDLE_DASHED_CIRCLE:
|
||||
case GIMP_HANDLE_FILLED_CIRCLE:
|
||||
case GIMP_HANDLE_CROSS:
|
||||
case GIMP_HANDLE_CROSSHAIR:
|
||||
case GIMP_HANDLE_DIAMOND:
|
||||
case GIMP_HANDLE_DASHED_DIAMOND:
|
||||
case GIMP_HANDLE_FILLED_DIAMOND:
|
||||
rectangle.x = x - private->width / 2 - 2.0;
|
||||
rectangle.y = y - private->height / 2 - 2.0;
|
||||
@ -456,11 +528,13 @@ gimp_canvas_handle_hit (GimpCanvasItem *item,
|
||||
switch (private->type)
|
||||
{
|
||||
case GIMP_HANDLE_DIAMOND:
|
||||
case GIMP_HANDLE_DASHED_DIAMOND:
|
||||
case GIMP_HANDLE_FILLED_DIAMOND:
|
||||
angle -= G_PI / 4.0;
|
||||
diamond_offset_x = private->width / 2.0;
|
||||
diamond_offset_y = private->height / 2.0;
|
||||
case GIMP_HANDLE_SQUARE:
|
||||
case GIMP_HANDLE_DASHED_SQUARE:
|
||||
case GIMP_HANDLE_FILLED_SQUARE:
|
||||
gimp_canvas_item_transform_xy_f (item,
|
||||
private->x, private->y,
|
||||
@ -472,6 +546,7 @@ gimp_canvas_handle_hit (GimpCanvasItem *item,
|
||||
my > handle_ty && my < handle_ty + private->height;
|
||||
|
||||
case GIMP_HANDLE_CIRCLE:
|
||||
case GIMP_HANDLE_DASHED_CIRCLE:
|
||||
case GIMP_HANDLE_FILLED_CIRCLE:
|
||||
case GIMP_HANDLE_CROSS:
|
||||
case GIMP_HANDLE_CROSSHAIR:
|
||||
|
Reference in New Issue
Block a user