app/tools/gimpvectortool.[ch] Fixed crashes and weird problems when the
2003-03-20 Simon Budig <simon@gimp.org> * app/tools/gimpvectortool.[ch] Fixed crashes and weird problems when the tool changed images or images got closed. Fixes Bug #108318. * app/vectors/vectors-types.h: More sane names for the GimpAnchorType enum. * app/vectors/gimpbezierstroke.c * app/vectors/gimpstroke.c: changed accordingly.
This commit is contained in:
12
ChangeLog
12
ChangeLog
@ -1,3 +1,15 @@
|
|||||||
|
2003-03-20 Simon Budig <simon@gimp.org>
|
||||||
|
|
||||||
|
* app/tools/gimpvectortool.[ch]
|
||||||
|
Fixed crashes and weird problems when the tool changed images or
|
||||||
|
images got closed. Fixes Bug #108318.
|
||||||
|
|
||||||
|
* app/vectors/vectors-types.h: More sane names for the
|
||||||
|
GimpAnchorType enum.
|
||||||
|
|
||||||
|
* app/vectors/gimpbezierstroke.c
|
||||||
|
* app/vectors/gimpstroke.c: changed accordingly.
|
||||||
|
|
||||||
2003-03-19 Michael Natterer <mitch@gimp.org>
|
2003-03-19 Michael Natterer <mitch@gimp.org>
|
||||||
|
|
||||||
* app/core/core-enums.[ch]: added GIMP_UNDO_GROUP_MASK.
|
* app/core/core-enums.[ch]: added GIMP_UNDO_GROUP_MASK.
|
||||||
|
@ -184,7 +184,11 @@ gimp_vector_tool_finalize (GObject *object)
|
|||||||
GimpVectorTool *vector_tool = GIMP_VECTOR_TOOL (object);
|
GimpVectorTool *vector_tool = GIMP_VECTOR_TOOL (object);
|
||||||
|
|
||||||
if (vector_tool->vectors)
|
if (vector_tool->vectors)
|
||||||
g_object_unref (vector_tool->vectors);
|
{
|
||||||
|
g_signal_handlers_disconnect_by_func (vector_tool->vectors,
|
||||||
|
gimp_vector_tool_clear_vectors,
|
||||||
|
vector_tool);
|
||||||
|
}
|
||||||
|
|
||||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
@ -240,7 +244,12 @@ gimp_vector_tool_button_press (GimpTool *tool,
|
|||||||
gimp_tool_pop_status (tool);
|
gimp_tool_pop_status (tool);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gimp_tool_control_is_active (tool->control) && gdisp == tool->gdisp)
|
if (vector_tool->vectors &&
|
||||||
|
gdisp->gimage != GIMP_ITEM (vector_tool->vectors)->gimage)
|
||||||
|
gimp_vector_tool_clear_vectors (vector_tool);
|
||||||
|
|
||||||
|
if (vector_tool->vectors &&
|
||||||
|
gimp_tool_control_is_active (tool->control) && gdisp == tool->gdisp)
|
||||||
{
|
{
|
||||||
/* if the cursor is in one of the handles,
|
/* if the cursor is in one of the handles,
|
||||||
* the new function will be moving or adding a new point or guide
|
* the new function will be moving or adding a new point or guide
|
||||||
@ -261,7 +270,7 @@ gimp_vector_tool_button_press (GimpTool *tool,
|
|||||||
{
|
{
|
||||||
gimp_draw_tool_pause (GIMP_DRAW_TOOL (vector_tool));
|
gimp_draw_tool_pause (GIMP_DRAW_TOOL (vector_tool));
|
||||||
|
|
||||||
if (anchor->type == ANCHOR_HANDLE)
|
if (anchor->type == GIMP_HANDLE_ANCHOR)
|
||||||
gimp_stroke_anchor_select (stroke, anchor, TRUE);
|
gimp_stroke_anchor_select (stroke, anchor, TRUE);
|
||||||
|
|
||||||
/* doublecheck if there are control handles at this anchor */
|
/* doublecheck if there are control handles at this anchor */
|
||||||
@ -276,7 +285,7 @@ gimp_vector_tool_button_press (GimpTool *tool,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vector_tool->function == VECTORS_CREATING)
|
if (!vector_tool->vectors || vector_tool->function == VECTORS_CREATING)
|
||||||
{
|
{
|
||||||
if (gimp_tool_control_is_active (tool->control))
|
if (gimp_tool_control_is_active (tool->control))
|
||||||
{
|
{
|
||||||
@ -292,7 +301,12 @@ gimp_vector_tool_button_press (GimpTool *tool,
|
|||||||
|
|
||||||
gimp_image_add_vectors (gdisp->gimage, vectors, -1);
|
gimp_image_add_vectors (gdisp->gimage, vectors, -1);
|
||||||
|
|
||||||
vector_tool->vectors = g_object_ref (vectors);
|
vector_tool->vectors = vectors;
|
||||||
|
|
||||||
|
g_signal_connect_object (vectors, "removed",
|
||||||
|
G_CALLBACK (gimp_vector_tool_clear_vectors),
|
||||||
|
vector_tool,
|
||||||
|
G_CONNECT_SWAPPED);
|
||||||
}
|
}
|
||||||
|
|
||||||
stroke = gimp_bezier_stroke_new (coords);
|
stroke = gimp_bezier_stroke_new (coords);
|
||||||
@ -362,8 +376,11 @@ gimp_vector_tool_button_release (GimpTool *tool,
|
|||||||
vector_tool->function = VECTORS_ADDING;
|
vector_tool->function = VECTORS_ADDING;
|
||||||
|
|
||||||
/* THIS DOES NOT BELONG HERE! */
|
/* THIS DOES NOT BELONG HERE! */
|
||||||
viewable = GIMP_VIEWABLE (vector_tool->vectors);
|
if (vector_tool->vectors)
|
||||||
gimp_viewable_invalidate_preview (viewable);
|
{
|
||||||
|
viewable = GIMP_VIEWABLE (vector_tool->vectors);
|
||||||
|
gimp_viewable_invalidate_preview (viewable);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -416,7 +433,8 @@ gimp_vector_tool_cursor_update (GimpTool *tool,
|
|||||||
|
|
||||||
vector_tool = GIMP_VECTOR_TOOL (tool);
|
vector_tool = GIMP_VECTOR_TOOL (tool);
|
||||||
|
|
||||||
if (gimp_tool_control_is_active (tool->control) && tool->gdisp == gdisp)
|
if (vector_tool->vectors &&
|
||||||
|
gimp_tool_control_is_active (tool->control) && tool->gdisp == gdisp)
|
||||||
{
|
{
|
||||||
anchor = gimp_vectors_anchor_get (vector_tool->vectors, coords, NULL);
|
anchor = gimp_vectors_anchor_get (vector_tool->vectors, coords, NULL);
|
||||||
|
|
||||||
@ -459,6 +477,9 @@ gimp_vector_tool_draw (GimpDrawTool *draw_tool)
|
|||||||
|
|
||||||
vectors = vector_tool->vectors;
|
vectors = vector_tool->vectors;
|
||||||
|
|
||||||
|
if (!vectors)
|
||||||
|
return;
|
||||||
|
|
||||||
while ((cur_stroke = gimp_vectors_stroke_get_next (vectors, cur_stroke)))
|
while ((cur_stroke = gimp_vectors_stroke_get_next (vectors, cur_stroke)))
|
||||||
{
|
{
|
||||||
/* anchor handles */
|
/* anchor handles */
|
||||||
@ -470,7 +491,7 @@ gimp_vector_tool_draw (GimpDrawTool *draw_tool)
|
|||||||
{
|
{
|
||||||
cur_anchor = (GimpAnchor *) ptr->data;
|
cur_anchor = (GimpAnchor *) ptr->data;
|
||||||
|
|
||||||
if (cur_anchor->type == ANCHOR_HANDLE)
|
if (cur_anchor->type == GIMP_HANDLE_ANCHOR)
|
||||||
{
|
{
|
||||||
gimp_draw_tool_draw_handle (draw_tool,
|
gimp_draw_tool_draw_handle (draw_tool,
|
||||||
cur_anchor->selected ?
|
cur_anchor->selected ?
|
||||||
@ -534,6 +555,15 @@ gimp_vector_tool_draw (GimpDrawTool *draw_tool)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
gimp_vector_tool_clear_vectors (GimpVectorTool *vector_tool)
|
||||||
|
{
|
||||||
|
g_return_if_fail (GIMP_IS_VECTOR_TOOL (vector_tool));
|
||||||
|
gimp_vector_tool_set_vectors (vector_tool, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
gimp_vector_tool_set_vectors (GimpVectorTool *vector_tool,
|
gimp_vector_tool_set_vectors (GimpVectorTool *vector_tool,
|
||||||
GimpVectors *vectors)
|
GimpVectors *vectors)
|
||||||
@ -543,22 +573,29 @@ gimp_vector_tool_set_vectors (GimpVectorTool *vector_tool,
|
|||||||
GimpItem *item;
|
GimpItem *item;
|
||||||
|
|
||||||
g_return_if_fail (GIMP_IS_VECTOR_TOOL (vector_tool));
|
g_return_if_fail (GIMP_IS_VECTOR_TOOL (vector_tool));
|
||||||
g_return_if_fail (GIMP_IS_VECTORS (vectors));
|
g_return_if_fail (vectors == NULL || GIMP_IS_VECTORS (vectors));
|
||||||
|
|
||||||
draw_tool = GIMP_DRAW_TOOL (vector_tool);
|
draw_tool = GIMP_DRAW_TOOL (vector_tool);
|
||||||
tool = GIMP_TOOL (vector_tool);
|
tool = GIMP_TOOL (vector_tool);
|
||||||
item = GIMP_ITEM (vectors);
|
item = GIMP_ITEM (vectors);
|
||||||
|
|
||||||
|
if (vectors == vector_tool->vectors)
|
||||||
|
return;
|
||||||
|
|
||||||
if (draw_tool->gdisp)
|
if (draw_tool->gdisp)
|
||||||
{
|
{
|
||||||
if (draw_tool->gdisp->gimage == item->gimage)
|
if (item && draw_tool->gdisp->gimage == item->gimage)
|
||||||
gimp_draw_tool_pause (draw_tool);
|
gimp_draw_tool_pause (draw_tool);
|
||||||
else
|
else
|
||||||
gimp_draw_tool_stop (draw_tool);
|
gimp_draw_tool_stop (draw_tool);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vector_tool->vectors)
|
if (vector_tool->vectors)
|
||||||
g_object_unref (vector_tool->vectors);
|
{
|
||||||
|
g_signal_handlers_disconnect_by_func (vector_tool->vectors,
|
||||||
|
gimp_vector_tool_clear_vectors,
|
||||||
|
vector_tool);
|
||||||
|
}
|
||||||
|
|
||||||
vector_tool->vectors = vectors;
|
vector_tool->vectors = vectors;
|
||||||
vector_tool->cur_stroke = NULL;
|
vector_tool->cur_stroke = NULL;
|
||||||
@ -567,13 +604,18 @@ gimp_vector_tool_set_vectors (GimpVectorTool *vector_tool,
|
|||||||
vector_tool->function = VECTORS_CREATING;
|
vector_tool->function = VECTORS_CREATING;
|
||||||
|
|
||||||
if (vector_tool->vectors)
|
if (vector_tool->vectors)
|
||||||
g_object_ref (vector_tool->vectors);
|
{
|
||||||
|
g_signal_connect_object (vectors, "removed",
|
||||||
|
G_CALLBACK (gimp_vector_tool_clear_vectors),
|
||||||
|
vector_tool,
|
||||||
|
G_CONNECT_SWAPPED);
|
||||||
|
}
|
||||||
|
|
||||||
if (draw_tool->gdisp && draw_tool->gdisp->gimage == item->gimage)
|
if (item && draw_tool->gdisp && draw_tool->gdisp->gimage == item->gimage)
|
||||||
{
|
{
|
||||||
gimp_draw_tool_resume (draw_tool);
|
gimp_draw_tool_resume (draw_tool);
|
||||||
}
|
}
|
||||||
else if (tool->gdisp && tool->gdisp->gimage == item->gimage)
|
else if (item && tool->gdisp && tool->gdisp->gimage == item->gimage)
|
||||||
{
|
{
|
||||||
gimp_draw_tool_start (draw_tool, tool->gdisp);
|
gimp_draw_tool_start (draw_tool, tool->gdisp);
|
||||||
}
|
}
|
||||||
@ -586,7 +628,7 @@ gimp_vector_tool_set_vectors (GimpVectorTool *vector_tool,
|
|||||||
|
|
||||||
gdisp = gimp_context_get_display (context);
|
gdisp = gimp_context_get_display (context);
|
||||||
|
|
||||||
if (gdisp->gimage != item->gimage)
|
if (item && gdisp->gimage != item->gimage)
|
||||||
{
|
{
|
||||||
GList *list;
|
GList *list;
|
||||||
|
|
||||||
|
@ -75,5 +75,7 @@ GType gimp_vector_tool_get_type (void) G_GNUC_CONST;
|
|||||||
void gimp_vector_tool_set_vectors (GimpVectorTool *vector_tool,
|
void gimp_vector_tool_set_vectors (GimpVectorTool *vector_tool,
|
||||||
GimpVectors *vectors);
|
GimpVectors *vectors);
|
||||||
|
|
||||||
|
void gimp_vector_tool_clear_vectors (GimpVectorTool *vector_tool);
|
||||||
|
|
||||||
|
|
||||||
#endif /* __GIMP_VECTOR_TOOL_H__ */
|
#endif /* __GIMP_VECTOR_TOOL_H__ */
|
||||||
|
@ -171,7 +171,7 @@ gimp_bezier_stroke_new (const GimpCoords *start)
|
|||||||
|
|
||||||
g_printerr ("Adding at %f, %f\n", start->x, start->y);
|
g_printerr ("Adding at %f, %f\n", start->x, start->y);
|
||||||
|
|
||||||
anchor->type = ANCHOR_HANDLE;
|
anchor->type = GIMP_HANDLE_ANCHOR;
|
||||||
anchor->selected = TRUE;
|
anchor->selected = TRUE;
|
||||||
|
|
||||||
stroke->anchors = g_list_append (stroke->anchors, anchor);
|
stroke->anchors = g_list_append (stroke->anchors, anchor);
|
||||||
@ -253,7 +253,7 @@ gimp_bezier_stroke_extend (GimpBezierStroke *bezier_stroke,
|
|||||||
if (loose_end == 1)
|
if (loose_end == 1)
|
||||||
{
|
{
|
||||||
while (listneighbor &&
|
while (listneighbor &&
|
||||||
((GimpAnchor *) listneighbor->data)->type == CONTROL_HANDLE)
|
((GimpAnchor *) listneighbor->data)->type == GIMP_HANDLE_CONTROL)
|
||||||
{
|
{
|
||||||
control_count++;
|
control_count++;
|
||||||
listneighbor = listneighbor->prev;
|
listneighbor = listneighbor->prev;
|
||||||
@ -262,7 +262,7 @@ gimp_bezier_stroke_extend (GimpBezierStroke *bezier_stroke,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
while (listneighbor &&
|
while (listneighbor &&
|
||||||
((GimpAnchor *) listneighbor->data)->type == CONTROL_HANDLE)
|
((GimpAnchor *) listneighbor->data)->type == GIMP_HANDLE_CONTROL)
|
||||||
{
|
{
|
||||||
control_count++;
|
control_count++;
|
||||||
listneighbor = listneighbor->next;
|
listneighbor = listneighbor->next;
|
||||||
@ -286,10 +286,10 @@ gimp_bezier_stroke_extend (GimpBezierStroke *bezier_stroke,
|
|||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
case 1:
|
case 1:
|
||||||
anchor->type = CONTROL_HANDLE;
|
anchor->type = GIMP_HANDLE_CONTROL;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
anchor->type = ANCHOR_HANDLE;
|
anchor->type = GIMP_HANDLE_ANCHOR;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g_printerr ("inconsistent bezier curve: "
|
g_printerr ("inconsistent bezier curve: "
|
||||||
@ -364,7 +364,7 @@ gimp_bezier_stroke_interpolate (const GimpStroke *stroke,
|
|||||||
count = 0;
|
count = 0;
|
||||||
|
|
||||||
for (anchorlist = stroke->anchors;
|
for (anchorlist = stroke->anchors;
|
||||||
anchorlist && ((GimpAnchor *) anchorlist->data)->type != ANCHOR_HANDLE;
|
anchorlist && ((GimpAnchor *) anchorlist->data)->type != GIMP_HANDLE_ANCHOR;
|
||||||
anchorlist = g_list_next (anchorlist));
|
anchorlist = g_list_next (anchorlist));
|
||||||
|
|
||||||
for ( ; anchorlist; anchorlist = g_list_next (anchorlist))
|
for ( ; anchorlist; anchorlist = g_list_next (anchorlist))
|
||||||
|
@ -517,7 +517,7 @@ gimp_stroke_get_draw_anchors (const GimpStroke *stroke)
|
|||||||
|
|
||||||
while (cur_ptr)
|
while (cur_ptr)
|
||||||
{
|
{
|
||||||
if (((GimpAnchor *) cur_ptr->data)->type == ANCHOR_HANDLE)
|
if (((GimpAnchor *) cur_ptr->data)->type == GIMP_HANDLE_ANCHOR)
|
||||||
ret_list = g_list_append (ret_list, cur_ptr->data);
|
ret_list = g_list_append (ret_list, cur_ptr->data);
|
||||||
cur_ptr = g_list_next (cur_ptr);
|
cur_ptr = g_list_next (cur_ptr);
|
||||||
}
|
}
|
||||||
@ -547,14 +547,14 @@ gimp_stroke_get_draw_controls (const GimpStroke *stroke)
|
|||||||
|
|
||||||
while (cur_ptr)
|
while (cur_ptr)
|
||||||
{
|
{
|
||||||
if (((GimpAnchor *) cur_ptr->data)->type == CONTROL_HANDLE)
|
if (((GimpAnchor *) cur_ptr->data)->type == GIMP_HANDLE_CONTROL)
|
||||||
{
|
{
|
||||||
if (cur_ptr->next &&
|
if (cur_ptr->next &&
|
||||||
((GimpAnchor *) cur_ptr->next->data)->type == ANCHOR_HANDLE &&
|
((GimpAnchor *) cur_ptr->next->data)->type == GIMP_HANDLE_ANCHOR &&
|
||||||
((GimpAnchor *) cur_ptr->next->data)->selected)
|
((GimpAnchor *) cur_ptr->next->data)->selected)
|
||||||
ret_list = g_list_append (ret_list, cur_ptr->data);
|
ret_list = g_list_append (ret_list, cur_ptr->data);
|
||||||
else if (cur_ptr->prev &&
|
else if (cur_ptr->prev &&
|
||||||
((GimpAnchor *) cur_ptr->prev->data)->type == ANCHOR_HANDLE &&
|
((GimpAnchor *) cur_ptr->prev->data)->type == GIMP_HANDLE_ANCHOR &&
|
||||||
((GimpAnchor *) cur_ptr->prev->data)->selected)
|
((GimpAnchor *) cur_ptr->prev->data)->selected)
|
||||||
ret_list = g_list_append (ret_list, cur_ptr->data);
|
ret_list = g_list_append (ret_list, cur_ptr->data);
|
||||||
}
|
}
|
||||||
@ -587,7 +587,7 @@ gimp_stroke_get_draw_lines (const GimpStroke *stroke)
|
|||||||
|
|
||||||
while (cur_ptr)
|
while (cur_ptr)
|
||||||
{
|
{
|
||||||
if (((GimpAnchor *) cur_ptr->data)->type == ANCHOR_HANDLE &&
|
if (((GimpAnchor *) cur_ptr->data)->type == GIMP_HANDLE_ANCHOR &&
|
||||||
((GimpAnchor *) cur_ptr->data)->selected)
|
((GimpAnchor *) cur_ptr->data)->selected)
|
||||||
{
|
{
|
||||||
if (cur_ptr->next)
|
if (cur_ptr->next)
|
||||||
|
@ -29,8 +29,8 @@ typedef struct _GimpAnchor GimpAnchor;
|
|||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
ANCHOR_HANDLE,
|
GIMP_HANDLE_ANCHOR,
|
||||||
CONTROL_HANDLE,
|
GIMP_HANDLE_CONTROL,
|
||||||
} GimpAnchorType;
|
} GimpAnchorType;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
|
Reference in New Issue
Block a user