app: various fixes in GimpToolFocus

This commit is contained in:
Ell
2020-05-15 12:33:41 +03:00
parent 80f2d293f7
commit 2fcf667efd

View File

@ -44,6 +44,8 @@
#define HANDLE_SIZE 12.0 #define HANDLE_SIZE 12.0
#define SNAP_DISTANCE 12.0 #define SNAP_DISTANCE 12.0
#define EPSILON 1e-6
enum enum
{ {
@ -610,6 +612,20 @@ gimp_tool_focus_motion (GimpToolWidget *widget,
y = cy; y = cy;
} }
if (fabs (fabs (priv->aspect_ratio) - 1.0) <= EPSILON)
{
if (priv->radius <= EPSILON)
{
g_object_set (focus,
"aspect-ratio", 0.0,
NULL);
}
else
{
break;
}
}
radius = gimp_canvas_limit_boundary_radius (GIMP_CANVAS_LIMIT (limit), radius = gimp_canvas_limit_boundary_radius (GIMP_CANVAS_LIMIT (limit),
x, y); x, y);
@ -634,39 +650,63 @@ gimp_tool_focus_motion (GimpToolWidget *widget,
inner_radius = radius; inner_radius = radius;
if (extend) if (extend)
{
if (priv->inner_limit > EPSILON)
outer_radius = inner_radius / priv->inner_limit; outer_radius = inner_radius / priv->inner_limit;
else else
inner_radius = 0.0;
}
else
{
inner_radius = MIN (inner_radius, outer_radius); inner_radius = MIN (inner_radius, outer_radius);
} }
}
break; break;
case LIMIT_MIDDLE: case LIMIT_MIDDLE:
{ {
if (extend) if (extend)
{
if (priv->inner_limit > EPSILON || priv->midpoint > EPSILON)
{ {
outer_radius = radius / (priv->inner_limit + outer_radius = radius / (priv->inner_limit +
(1.0 - priv->inner_limit) * (1.0 - priv->inner_limit) *
priv->midpoint); priv->midpoint);
inner_radius = priv->inner_limit * outer_radius; inner_radius = priv->inner_limit * outer_radius;
} }
else
{
radius = 0.0;
}
}
else else
{ {
radius = CLAMP (radius, inner_radius, outer_radius); radius = CLAMP (radius, inner_radius, outer_radius);
} }
if (outer_radius > inner_radius)
{
g_object_set (focus, g_object_set (focus,
"midpoint", (radius - inner_radius) / "midpoint", MAX ((radius - inner_radius) /
(outer_radius - inner_radius), (outer_radius - inner_radius),
0.0),
NULL); NULL);
} }
}
break; break;
} }
g_object_set (focus, g_object_set (focus,
"radius", outer_radius, "radius", outer_radius,
NULL);
if (outer_radius > EPSILON)
{
g_object_set (focus,
"inner-limit", inner_radius / outer_radius, "inner-limit", inner_radius / outer_radius,
NULL); NULL);
} }
}
break; break;
case HOVER_HANDLE: case HOVER_HANDLE:
@ -705,6 +745,25 @@ gimp_tool_focus_motion (GimpToolWidget *widget,
gimp_vector2_mul (&p, r); gimp_vector2_mul (&p, r);
if (extend)
{
if (handle->orientation == GTK_ORIENTATION_HORIZONTAL)
{
if (rx <= EPSILON && ry > EPSILON)
break;
ry = r * (1.0 - priv->aspect_ratio);
}
else
{
if (ry <= EPSILON && rx > EPSILON)
break;
rx = r * (1.0 + priv->aspect_ratio);
}
}
else
{
if (gimp_canvas_item_transform_distance ( if (gimp_canvas_item_transform_distance (
priv->limits[priv->hover_limit].item, priv->limits[priv->hover_limit].item,
s.x, s.y, s.x, s.y,
@ -715,13 +774,6 @@ gimp_tool_focus_motion (GimpToolWidget *widget,
else else
r = rx; r = rx;
} }
if (extend)
{
if (handle->orientation == GTK_ORIENTATION_HORIZONTAL)
ry *= r / rx;
else
rx *= r / ry;
} }
if (handle->orientation == GTK_ORIENTATION_HORIZONTAL) if (handle->orientation == GTK_ORIENTATION_HORIZONTAL)
@ -736,8 +788,23 @@ gimp_tool_focus_motion (GimpToolWidget *widget,
g_object_set (focus, g_object_set (focus,
"radius", r, "radius", r,
"aspect-ratio", rx >= ry ? 1.0 - ry / rx : rx / ry - 1.0,
NULL); NULL);
if (! extend)
{
gdouble aspect_ratio;
if (fabs (rx - ry) <= EPSILON)
aspect_ratio = 0.0;
else if (rx > ry)
aspect_ratio = 1.0 - ry / rx;
else
aspect_ratio = rx / ry - 1.0;
g_object_set (focus,
"aspect-ratio", aspect_ratio,
NULL);
}
} }
break; break;