mirror of https://github.com/GNOME/gimp.git
app: add gimp_image_pick_vectors(), remove gimp_draw_tool_on_vectors()
This commit is contained in:
parent
523b73ff04
commit
96b8023091
|
@ -34,6 +34,9 @@
|
||||||
|
|
||||||
#include "text/gimptextlayer.h"
|
#include "text/gimptextlayer.h"
|
||||||
|
|
||||||
|
#include "vectors/gimpstroke.h"
|
||||||
|
#include "vectors/gimpvectors.h"
|
||||||
|
|
||||||
|
|
||||||
GimpLayer *
|
GimpLayer *
|
||||||
gimp_image_pick_layer (GimpImage *image,
|
gimp_image_pick_layer (GimpImage *image,
|
||||||
|
@ -156,6 +159,56 @@ gimp_image_pick_text_layer (GimpImage *image,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GimpVectors *
|
||||||
|
gimp_image_pick_vectors (GimpImage *image,
|
||||||
|
gdouble x,
|
||||||
|
gdouble y,
|
||||||
|
gdouble epsilon_x,
|
||||||
|
gdouble epsilon_y)
|
||||||
|
{
|
||||||
|
GimpVectors *ret = NULL;
|
||||||
|
GList *all_vectors;
|
||||||
|
GList *list;
|
||||||
|
gdouble mindist = G_MAXDOUBLE;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
|
||||||
|
|
||||||
|
all_vectors = gimp_image_get_vectors_list (image);
|
||||||
|
|
||||||
|
for (list = all_vectors; list; list = g_list_next (list))
|
||||||
|
{
|
||||||
|
GimpVectors *vectors = list->data;
|
||||||
|
|
||||||
|
if (gimp_item_is_visible (GIMP_ITEM (vectors)))
|
||||||
|
{
|
||||||
|
GimpStroke *stroke = NULL;
|
||||||
|
GimpCoords coords = GIMP_COORDS_DEFAULT_VALUES;
|
||||||
|
|
||||||
|
while ((stroke = gimp_vectors_stroke_get_next (vectors, stroke)))
|
||||||
|
{
|
||||||
|
gdouble dist;
|
||||||
|
|
||||||
|
coords.x = x;
|
||||||
|
coords.y = y;
|
||||||
|
|
||||||
|
dist = gimp_stroke_nearest_point_get (stroke, &coords, 1.0,
|
||||||
|
NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
if (dist >= 0.0 &&
|
||||||
|
dist < MIN (epsilon_y, mindist))
|
||||||
|
{
|
||||||
|
mindist = dist;
|
||||||
|
ret = vectors;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_list_free (all_vectors);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
GimpGuide *
|
GimpGuide *
|
||||||
gimp_image_pick_guide (GimpImage *image,
|
gimp_image_pick_guide (GimpImage *image,
|
||||||
gdouble x,
|
gdouble x,
|
||||||
|
|
|
@ -29,6 +29,12 @@ GimpTextLayer * gimp_image_pick_text_layer (GimpImage *image,
|
||||||
gint x,
|
gint x,
|
||||||
gint y);
|
gint y);
|
||||||
|
|
||||||
|
GimpVectors * gimp_image_pick_vectors (GimpImage *image,
|
||||||
|
gdouble x,
|
||||||
|
gdouble y,
|
||||||
|
gdouble epsilon_x,
|
||||||
|
gdouble epsilon_y);
|
||||||
|
|
||||||
GimpGuide * gimp_image_pick_guide (GimpImage *image,
|
GimpGuide * gimp_image_pick_guide (GimpImage *image,
|
||||||
gdouble x,
|
gdouble x,
|
||||||
gdouble y,
|
gdouble y,
|
||||||
|
|
|
@ -283,10 +283,10 @@ gimp_align_tool_button_release (GimpTool *tool,
|
||||||
GimpLayer *layer;
|
GimpLayer *layer;
|
||||||
gint snap_distance = display->config->snap_distance;
|
gint snap_distance = display->config->snap_distance;
|
||||||
|
|
||||||
vectors = gimp_draw_tool_on_vectors (GIMP_DRAW_TOOL (tool), display,
|
if ((vectors = gimp_image_pick_vectors (image,
|
||||||
coords,
|
coords->x, coords->y,
|
||||||
snap_distance, snap_distance);
|
FUNSCALEX (shell, snap_distance),
|
||||||
if (vectors)
|
FUNSCALEY (shell, snap_distance))))
|
||||||
{
|
{
|
||||||
object = G_OBJECT (vectors);
|
object = G_OBJECT (vectors);
|
||||||
}
|
}
|
||||||
|
@ -298,13 +298,10 @@ gimp_align_tool_button_release (GimpTool *tool,
|
||||||
{
|
{
|
||||||
object = G_OBJECT (guide);
|
object = G_OBJECT (guide);
|
||||||
}
|
}
|
||||||
else
|
else if ((layer = gimp_image_pick_layer_by_bounds (image,
|
||||||
|
coords->x, coords->y)))
|
||||||
{
|
{
|
||||||
if ((layer = gimp_image_pick_layer_by_bounds (image,
|
object = G_OBJECT (layer);
|
||||||
coords->x, coords->y)))
|
|
||||||
{
|
|
||||||
object = G_OBJECT (layer);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (object)
|
if (object)
|
||||||
|
@ -433,8 +430,10 @@ gimp_align_tool_oper_update (GimpTool *tool,
|
||||||
add = ((state & gimp_get_extend_selection_mask ()) &&
|
add = ((state & gimp_get_extend_selection_mask ()) &&
|
||||||
align_tool->selected_objects);
|
align_tool->selected_objects);
|
||||||
|
|
||||||
if (gimp_draw_tool_on_vectors (GIMP_DRAW_TOOL (tool), display,
|
if (gimp_image_pick_vectors (image,
|
||||||
coords, snap_distance, snap_distance))
|
coords->x, coords->y,
|
||||||
|
FUNSCALEX (shell, snap_distance),
|
||||||
|
FUNSCALEY (shell, snap_distance)))
|
||||||
{
|
{
|
||||||
if (add)
|
if (add)
|
||||||
align_tool->function = ALIGN_TOOL_ADD_PATH;
|
align_tool->function = ALIGN_TOOL_ADD_PATH;
|
||||||
|
@ -452,23 +451,16 @@ gimp_align_tool_oper_update (GimpTool *tool,
|
||||||
else
|
else
|
||||||
align_tool->function = ALIGN_TOOL_PICK_GUIDE;
|
align_tool->function = ALIGN_TOOL_PICK_GUIDE;
|
||||||
}
|
}
|
||||||
|
else if (gimp_image_pick_layer_by_bounds (image, coords->x, coords->y))
|
||||||
|
{
|
||||||
|
if (add)
|
||||||
|
align_tool->function = ALIGN_TOOL_ADD_LAYER;
|
||||||
|
else
|
||||||
|
align_tool->function = ALIGN_TOOL_PICK_LAYER;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GimpLayer *layer;
|
align_tool->function = ALIGN_TOOL_IDLE;
|
||||||
|
|
||||||
layer = gimp_image_pick_layer_by_bounds (image, coords->x, coords->y);
|
|
||||||
|
|
||||||
if (layer)
|
|
||||||
{
|
|
||||||
if (add)
|
|
||||||
align_tool->function = ALIGN_TOOL_ADD_LAYER;
|
|
||||||
else
|
|
||||||
align_tool->function = ALIGN_TOOL_PICK_LAYER;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
align_tool->function = ALIGN_TOOL_IDLE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gimp_align_tool_status_update (tool, display, state, proximity);
|
gimp_align_tool_status_update (tool, display, state, proximity);
|
||||||
|
|
|
@ -29,10 +29,6 @@
|
||||||
#include "core/gimpdrawable.h"
|
#include "core/gimpdrawable.h"
|
||||||
#include "core/gimpimage.h"
|
#include "core/gimpimage.h"
|
||||||
|
|
||||||
#include "vectors/gimpanchor.h"
|
|
||||||
#include "vectors/gimpstroke.h"
|
|
||||||
#include "vectors/gimpvectors.h"
|
|
||||||
|
|
||||||
#include "display/gimpcanvas.h"
|
#include "display/gimpcanvas.h"
|
||||||
#include "display/gimpcanvasarc.h"
|
#include "display/gimpcanvasarc.h"
|
||||||
#include "display/gimpcanvasboundary.h"
|
#include "display/gimpcanvasboundary.h"
|
||||||
|
@ -1021,87 +1017,3 @@ gimp_draw_tool_on_handle (GimpDrawTool *draw_tool,
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gimp_draw_tool_on_vectors_curve (GimpDrawTool *draw_tool,
|
|
||||||
GimpDisplay *display,
|
|
||||||
GimpVectors *vectors,
|
|
||||||
const GimpCoords *coords,
|
|
||||||
gint width,
|
|
||||||
gint height)
|
|
||||||
{
|
|
||||||
GimpStroke *stroke = NULL;
|
|
||||||
GimpCoords min_coords = GIMP_COORDS_DEFAULT_VALUES;
|
|
||||||
GimpCoords cur_coords;
|
|
||||||
gdouble min_dist = -1;
|
|
||||||
gdouble cur_dist;
|
|
||||||
gdouble cur_pos;
|
|
||||||
|
|
||||||
while ((stroke = gimp_vectors_stroke_get_next (vectors, stroke)))
|
|
||||||
{
|
|
||||||
cur_dist = gimp_stroke_nearest_point_get (stroke, coords, 1.0,
|
|
||||||
&cur_coords,
|
|
||||||
NULL, NULL,
|
|
||||||
&cur_pos);
|
|
||||||
|
|
||||||
if (cur_dist >= 0.0 && (min_dist < 0.0 || cur_dist < min_dist))
|
|
||||||
{
|
|
||||||
min_dist = cur_dist;
|
|
||||||
min_coords = cur_coords;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (min_dist >= 0 &&
|
|
||||||
gimp_draw_tool_on_handle (draw_tool, display,
|
|
||||||
coords->x,
|
|
||||||
coords->y,
|
|
||||||
GIMP_HANDLE_CIRCLE,
|
|
||||||
min_coords.x,
|
|
||||||
min_coords.y,
|
|
||||||
width, height,
|
|
||||||
GIMP_HANDLE_ANCHOR_CENTER))
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
GimpVectors *
|
|
||||||
gimp_draw_tool_on_vectors (GimpDrawTool *draw_tool,
|
|
||||||
GimpDisplay *display,
|
|
||||||
const GimpCoords *coords,
|
|
||||||
gint width,
|
|
||||||
gint height)
|
|
||||||
{
|
|
||||||
GList *all_vectors;
|
|
||||||
GList *list;
|
|
||||||
|
|
||||||
g_return_val_if_fail (GIMP_IS_DRAW_TOOL (draw_tool), NULL);
|
|
||||||
g_return_val_if_fail (GIMP_IS_DISPLAY (display), NULL);
|
|
||||||
g_return_val_if_fail (coords != NULL, NULL);
|
|
||||||
|
|
||||||
all_vectors = gimp_image_get_vectors_list (gimp_display_get_image (display));
|
|
||||||
|
|
||||||
for (list = all_vectors; list; list = g_list_next (list))
|
|
||||||
{
|
|
||||||
GimpVectors *vectors = list->data;
|
|
||||||
|
|
||||||
if (! gimp_item_get_visible (GIMP_ITEM (vectors)))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (gimp_draw_tool_on_vectors_curve (draw_tool,
|
|
||||||
display,
|
|
||||||
vectors, coords,
|
|
||||||
width, height))
|
|
||||||
{
|
|
||||||
g_list_free (all_vectors);
|
|
||||||
|
|
||||||
return vectors;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
g_list_free (all_vectors);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
|
@ -211,11 +211,5 @@ gboolean gimp_draw_tool_on_handle (GimpDrawTool *draw_too
|
||||||
gint height,
|
gint height,
|
||||||
GimpHandleAnchor anchor);
|
GimpHandleAnchor anchor);
|
||||||
|
|
||||||
GimpVectors * gimp_draw_tool_on_vectors (GimpDrawTool *draw_tool,
|
|
||||||
GimpDisplay *display,
|
|
||||||
const GimpCoords *coord,
|
|
||||||
gint width,
|
|
||||||
gint height);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __GIMP_DRAW_TOOL_H__ */
|
#endif /* __GIMP_DRAW_TOOL_H__ */
|
||||||
|
|
|
@ -175,12 +175,16 @@ gimp_move_tool_button_press (GimpTool *tool,
|
||||||
|
|
||||||
if (! options->move_current)
|
if (! options->move_current)
|
||||||
{
|
{
|
||||||
|
const gint snap_distance = display->config->snap_distance;
|
||||||
|
|
||||||
if (options->move_type == GIMP_TRANSFORM_TYPE_PATH)
|
if (options->move_type == GIMP_TRANSFORM_TYPE_PATH)
|
||||||
{
|
{
|
||||||
GimpVectors *vectors;
|
GimpVectors *vectors;
|
||||||
|
|
||||||
vectors = gimp_draw_tool_on_vectors (GIMP_DRAW_TOOL (tool), display,
|
vectors = gimp_image_pick_vectors (image,
|
||||||
coords, 7, 7);
|
coords->x, coords->y,
|
||||||
|
FUNSCALEX (shell, snap_distance),
|
||||||
|
FUNSCALEY (shell, snap_distance));
|
||||||
if (vectors)
|
if (vectors)
|
||||||
{
|
{
|
||||||
move->old_active_vectors =
|
move->old_active_vectors =
|
||||||
|
@ -198,7 +202,6 @@ gimp_move_tool_button_press (GimpTool *tool,
|
||||||
{
|
{
|
||||||
GimpGuide *guide;
|
GimpGuide *guide;
|
||||||
GimpLayer *layer;
|
GimpLayer *layer;
|
||||||
const gint snap_distance = display->config->snap_distance;
|
|
||||||
|
|
||||||
if (gimp_display_shell_get_show_guides (shell) &&
|
if (gimp_display_shell_get_show_guides (shell) &&
|
||||||
(guide = gimp_image_pick_guide (image,
|
(guide = gimp_image_pick_guide (image,
|
||||||
|
@ -516,12 +519,13 @@ gimp_move_tool_cursor_update (GimpTool *tool,
|
||||||
GdkModifierType state,
|
GdkModifierType state,
|
||||||
GimpDisplay *display)
|
GimpDisplay *display)
|
||||||
{
|
{
|
||||||
GimpMoveOptions *options = GIMP_MOVE_TOOL_GET_OPTIONS (tool);
|
GimpMoveOptions *options = GIMP_MOVE_TOOL_GET_OPTIONS (tool);
|
||||||
GimpDisplayShell *shell = gimp_display_get_shell (display);
|
GimpDisplayShell *shell = gimp_display_get_shell (display);
|
||||||
GimpImage *image = gimp_display_get_image (display);
|
GimpImage *image = gimp_display_get_image (display);
|
||||||
GimpCursorType cursor = GIMP_CURSOR_MOUSE;
|
GimpCursorType cursor = GIMP_CURSOR_MOUSE;
|
||||||
GimpToolCursorType tool_cursor = GIMP_TOOL_CURSOR_MOVE;
|
GimpToolCursorType tool_cursor = GIMP_TOOL_CURSOR_MOVE;
|
||||||
GimpCursorModifier modifier = GIMP_CURSOR_MODIFIER_NONE;
|
GimpCursorModifier modifier = GIMP_CURSOR_MODIFIER_NONE;
|
||||||
|
gint snap_distance = display->config->snap_distance;
|
||||||
|
|
||||||
if (options->move_type == GIMP_TRANSFORM_TYPE_PATH)
|
if (options->move_type == GIMP_TRANSFORM_TYPE_PATH)
|
||||||
{
|
{
|
||||||
|
@ -537,8 +541,10 @@ gimp_move_tool_cursor_update (GimpTool *tool,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (gimp_draw_tool_on_vectors (GIMP_DRAW_TOOL (tool), display,
|
if (gimp_image_pick_vectors (image,
|
||||||
coords, 7, 7))
|
coords->x, coords->y,
|
||||||
|
FUNSCALEX (shell, snap_distance),
|
||||||
|
FUNSCALEY (shell, snap_distance)))
|
||||||
{
|
{
|
||||||
tool_cursor = GIMP_TOOL_CURSOR_HAND;
|
tool_cursor = GIMP_TOOL_CURSOR_HAND;
|
||||||
}
|
}
|
||||||
|
@ -566,7 +572,6 @@ gimp_move_tool_cursor_update (GimpTool *tool,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GimpLayer *layer;
|
GimpLayer *layer;
|
||||||
const gint snap_distance = display->config->snap_distance;
|
|
||||||
|
|
||||||
if (gimp_display_shell_get_show_guides (shell) &&
|
if (gimp_display_shell_get_show_guides (shell) &&
|
||||||
gimp_image_pick_guide (image, coords->x, coords->y,
|
gimp_image_pick_guide (image, coords->x, coords->y,
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
|
|
||||||
#include "core/gimp.h"
|
#include "core/gimp.h"
|
||||||
#include "core/gimpimage.h"
|
#include "core/gimpimage.h"
|
||||||
|
#include "core/gimpimage-pick-item.h"
|
||||||
#include "core/gimpimage-undo.h"
|
#include "core/gimpimage-undo.h"
|
||||||
#include "core/gimpimage-undo-push.h"
|
#include "core/gimpimage-undo-push.h"
|
||||||
#include "core/gimptoolinfo.h"
|
#include "core/gimptoolinfo.h"
|
||||||
|
@ -403,6 +404,7 @@ gimp_vector_tool_cursor_update (GimpTool *tool,
|
||||||
GimpDisplay *display)
|
GimpDisplay *display)
|
||||||
{
|
{
|
||||||
GimpVectorTool *vector_tool = GIMP_VECTOR_TOOL (tool);
|
GimpVectorTool *vector_tool = GIMP_VECTOR_TOOL (tool);
|
||||||
|
GimpDisplayShell *shell = gimp_display_get_shell (display);
|
||||||
GimpToolCursorType tool_cursor = GIMP_TOOL_CURSOR_PATHS;
|
GimpToolCursorType tool_cursor = GIMP_TOOL_CURSOR_PATHS;
|
||||||
GimpCursorModifier modifier = GIMP_CURSOR_MODIFIER_NONE;
|
GimpCursorModifier modifier = GIMP_CURSOR_MODIFIER_NONE;
|
||||||
|
|
||||||
|
@ -412,10 +414,12 @@ gimp_vector_tool_cursor_update (GimpTool *tool,
|
||||||
coords, state,
|
coords, state,
|
||||||
NULL, &tool_cursor, &modifier);
|
NULL, &tool_cursor, &modifier);
|
||||||
}
|
}
|
||||||
else if (gimp_draw_tool_on_vectors (GIMP_DRAW_TOOL (tool), display,
|
else if (gimp_image_pick_vectors (gimp_display_get_image (display),
|
||||||
coords,
|
coords->x, coords->y,
|
||||||
GIMP_TOOL_HANDLE_SIZE_CIRCLE,
|
FUNSCALEX (shell,
|
||||||
GIMP_TOOL_HANDLE_SIZE_CIRCLE))
|
GIMP_TOOL_HANDLE_SIZE_CIRCLE / 2),
|
||||||
|
FUNSCALEY (shell,
|
||||||
|
GIMP_TOOL_HANDLE_SIZE_CIRCLE / 2)))
|
||||||
{
|
{
|
||||||
tool_cursor = GIMP_TOOL_CURSOR_HAND;
|
tool_cursor = GIMP_TOOL_CURSOR_HAND;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue