app: use the GimpImageMap as it's meant to be used

Have an incremental live preview of the rendering and actually use the
rendering instead of throwing it away and doing it all over again on
commit. gimp_cage_tool_process() is therefore currently unused but I
left it there for Alexia to fix the tool for layers with masks.
This commit is contained in:
Michael Natterer 2010-11-05 19:10:03 +01:00
parent 4a4994f4db
commit 2028d547a2
2 changed files with 28 additions and 53 deletions

View File

@ -116,9 +116,10 @@ static void gimp_cage_tool_process (GimpCageTool *ct,
static void gimp_cage_tool_process_drawable (GimpCageTool *ct,
GimpDrawable *drawable,
GimpProgress *progress);
static void gimp_cage_tool_prepare_preview (GimpCageTool *ct,
static void gimp_cage_tool_create_image_map (GimpCageTool *ct,
GimpDisplay *display);
static gboolean gimp_cage_tool_update_preview (GimpTool *tool);
static void gimp_cage_tool_image_map_flush (GimpImageMap *image_map,
GimpTool *tool);
static GeglNode * gimp_cage_tool_get_render_node (GimpCageTool *ct,
GeglNode *parent);
@ -178,8 +179,6 @@ gimp_cage_tool_init (GimpCageTool *self)
self->coef = NULL;
self->image_map = NULL;
self->node_preview = NULL;
self->idle_id = 0;
}
static void
@ -271,16 +270,17 @@ gimp_cage_tool_key_press (GimpTool *tool,
case GDK_ISO_Enter:
if (ct->cage_complete)
{
gimp_image_map_abort (ct->image_map);
gimp_tool_control_set_preserve (tool->control, TRUE);
gimp_image_map_commit (ct->image_map);
g_object_unref (ct->image_map);
ct->image_map = NULL;
if (ct->idle_id)
{
g_source_remove (ct->idle_id);
ct->idle_id = 0;
}
gimp_cage_tool_process (ct, display);
gimp_tool_control_set_preserve (tool->control, FALSE);
gimp_image_flush (gimp_display_get_image (display));
gimp_cage_tool_halt (ct);
}
return TRUE;
@ -385,10 +385,9 @@ gimp_cage_tool_button_press (GimpTool *tool,
coords->x,
coords->y,
HANDLE_SIZE);
if (ct->handle_moved > 0 && ct->idle_id > 0)
if (ct->handle_moved > 0 && ct->image_map)
{
g_source_remove(ct->idle_id);
ct->idle_id = 0; /*Stop preview update for now*/
gimp_image_map_abort (ct->image_map);
}
}
@ -409,7 +408,7 @@ gimp_cage_tool_button_press (GimpTool *tool,
gimp_cage_config_reverse_cage_if_needed (config);
gimp_cage_tool_compute_coef (ct, display);
gimp_cage_tool_prepare_preview (ct, display);
gimp_cage_tool_create_image_map (ct, display);
}
}
@ -449,14 +448,7 @@ gimp_cage_tool_button_release (GimpTool *tool,
visible.x -= off_x;
visible.y -= off_y;
gimp_draw_tool_pause (GIMP_DRAW_TOOL (ct));
gimp_image_map_apply (ct->image_map, &visible);
ct->idle_id = g_idle_add ((GSourceFunc) gimp_cage_tool_update_preview,
tool);
gimp_draw_tool_resume (GIMP_DRAW_TOOL (ct));
}
ct->handle_moved = -1;
@ -735,12 +727,13 @@ gimp_cage_tool_get_render_node (GimpCageTool *ct,
gegl_node_connect_to (render, "output",
output, "input");
return node;
}
static void
gimp_cage_tool_prepare_preview (GimpCageTool *ct,
GimpDisplay *display)
gimp_cage_tool_create_image_map (GimpCageTool *ct,
GimpDisplay *display)
{
GimpImage *image = gimp_display_get_image (display);
GimpDrawable *drawable = gimp_image_get_active_drawable (image);
@ -752,7 +745,7 @@ gimp_cage_tool_prepare_preview (GimpCageTool *ct,
ct->node_preview = NULL;
}
ct->node_preview = gegl_node_new ();
ct->node_preview = gegl_node_new ();
node = gimp_cage_tool_get_render_node (ct, ct->node_preview);
@ -761,30 +754,20 @@ gimp_cage_tool_prepare_preview (GimpCageTool *ct,
node,
NULL,
NULL);
g_signal_connect (ct->image_map, "flush",
G_CALLBACK (gimp_cage_tool_image_map_flush),
ct);
}
static gboolean
gimp_cage_tool_update_preview (GimpTool *tool)
static void
gimp_cage_tool_image_map_flush (GimpImageMap *image_map,
GimpTool *tool)
{
GimpCageTool *ct = GIMP_CAGE_TOOL (tool);
GimpImage *image = gimp_display_get_image (tool->display);
GimpImage *image = gimp_display_get_image (tool->display);
if (! ct->image_map)
{
/*Destroyed, bailing out*/
ct->idle_id = 0;
return FALSE;
}
if (! gimp_image_map_is_busy (ct->image_map))
{
ct->idle_id = 0;
gimp_projection_flush_now (gimp_image_get_projection (image));
gimp_display_flush_now (tool->display);
return FALSE;
}
return TRUE;
gimp_projection_flush_now (gimp_image_get_projection (image));
gimp_display_flush_now (tool->display);
}
static void
@ -930,12 +913,6 @@ gimp_cage_tool_halt (GimpCageTool *ct)
if (ct->image_map)
{
if (ct->idle_id > 0)
{
g_source_remove (ct->idle_id);
ct->idle_id = 0;
}
gimp_tool_control_set_preserve (tool->control, TRUE);
gimp_image_map_abort (ct->image_map);

View File

@ -53,8 +53,6 @@ struct _GimpCageTool
GimpImageMap *image_map;
GeglNode *node_preview;
guint idle_id;
};
struct _GimpCageToolClass