mirror of https://github.com/GNOME/gimp.git
moved the code which manipulates gimage->layer_stack and the call to
2003-07-29 Michael Natterer <mitch@gimp.org> * app/core/gimpimage.c (gimp_image_set_active_layer): moved the code which manipulates gimage->layer_stack and the call to gimp_layer_invalidate_boundary() inside the if(layer != active_layer) branch so it is called less often. Fixes the slowness of bug #104440 for most cases since we don't need to recalculate the selection boundary in the next step. (gimp_image_set_active_channel): call gimp_layer_invalidate_boundary() before setting the active_layer to NULL. Fixes stale layer boundary when switching to a channel. * app/display/gimpdisplay.c (gimp_display_flush_whenever): when there are no updates, we still need to restart the selection. Fixes missing layer boundary when switching from a channel to a layer.
This commit is contained in:
parent
bd457be1c7
commit
6c0c7fda33
18
ChangeLog
18
ChangeLog
|
@ -1,3 +1,21 @@
|
|||
2003-07-29 Michael Natterer <mitch@gimp.org>
|
||||
|
||||
* app/core/gimpimage.c (gimp_image_set_active_layer): moved the
|
||||
code which manipulates gimage->layer_stack and the call to
|
||||
gimp_layer_invalidate_boundary() inside the if(layer != active_layer)
|
||||
branch so it is called less often. Fixes the slowness of bug #104440
|
||||
for most cases since we don't need to recalculate the selection
|
||||
boundary in the next step.
|
||||
|
||||
(gimp_image_set_active_channel): call
|
||||
gimp_layer_invalidate_boundary() before setting the active_layer
|
||||
to NULL. Fixes stale layer boundary when switching to a channel.
|
||||
|
||||
* app/display/gimpdisplay.c (gimp_display_flush_whenever): when
|
||||
there are no updates, we still need to restart the selection.
|
||||
Fixes missing layer boundary when switching from a channel to
|
||||
a layer.
|
||||
|
||||
2003-07-29 Michael Natterer <mitch@gimp.org>
|
||||
|
||||
* app/display/gimpdisplayshell-handlers.c
|
||||
|
|
|
@ -2180,18 +2180,18 @@ gimp_image_set_active_layer (GimpImage *gimage,
|
|||
if (! gimp_container_have (gimage->layers, GIMP_OBJECT (layer)))
|
||||
layer = (GimpLayer *) gimp_container_get_child_by_index (gimage->layers, 0);
|
||||
|
||||
if (layer)
|
||||
{
|
||||
/* Configure the layer stack to reflect this change */
|
||||
gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer);
|
||||
gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer);
|
||||
|
||||
/* invalidate the selection boundary because of a layer modification */
|
||||
gimp_layer_invalidate_boundary (layer);
|
||||
}
|
||||
|
||||
if (layer != gimage->active_layer)
|
||||
{
|
||||
if (layer)
|
||||
{
|
||||
/* Configure the layer stack to reflect this change */
|
||||
gimage->layer_stack = g_slist_remove (gimage->layer_stack, layer);
|
||||
gimage->layer_stack = g_slist_prepend (gimage->layer_stack, layer);
|
||||
|
||||
/* Don't cache selection info for the previous active layer */
|
||||
gimp_layer_invalidate_boundary (layer);
|
||||
}
|
||||
|
||||
gimage->active_layer = layer;
|
||||
|
||||
g_signal_emit (gimage, gimp_image_signals[ACTIVE_LAYER_CHANGED], 0);
|
||||
|
@ -2233,6 +2233,9 @@ gimp_image_set_active_channel (GimpImage *gimage,
|
|||
|
||||
if (gimage->active_layer)
|
||||
{
|
||||
/* Don't cache selection info for the previous active layer */
|
||||
gimp_layer_invalidate_boundary (gimage->active_layer);
|
||||
|
||||
gimage->active_layer = NULL;
|
||||
|
||||
g_signal_emit (gimage, gimp_image_signals[ACTIVE_LAYER_CHANGED], 0);
|
||||
|
|
|
@ -445,39 +445,48 @@ gimp_display_flush_whenever (GimpDisplay *gdisp,
|
|||
}
|
||||
|
||||
/* First the updates... */
|
||||
if (now)
|
||||
if (gdisp->update_areas)
|
||||
{
|
||||
/* Synchronous */
|
||||
if (now)
|
||||
{
|
||||
/* Synchronous */
|
||||
|
||||
GSList *list;
|
||||
GimpArea *area;
|
||||
GSList *list;
|
||||
GimpArea *area;
|
||||
|
||||
for (list = gdisp->update_areas; list; list = g_slist_next (list))
|
||||
{
|
||||
/* Paint the area specified by the GimpArea */
|
||||
area = (GimpArea *) list->data;
|
||||
for (list = gdisp->update_areas; list; list = g_slist_next (list))
|
||||
{
|
||||
/* Paint the area specified by the GimpArea */
|
||||
area = (GimpArea *) list->data;
|
||||
|
||||
if ((area->x1 != area->x2) && (area->y1 != area->y2))
|
||||
{
|
||||
gimp_display_paint_area (gdisp,
|
||||
area->x1,
|
||||
area->y1,
|
||||
(area->x2 - area->x1),
|
||||
(area->y2 - area->y1));
|
||||
}
|
||||
}
|
||||
if ((area->x1 != area->x2) && (area->y1 != area->y2))
|
||||
{
|
||||
gimp_display_paint_area (gdisp,
|
||||
area->x1,
|
||||
area->y1,
|
||||
(area->x2 - area->x1),
|
||||
(area->y2 - area->y1));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Asynchronous */
|
||||
|
||||
gimp_display_idlerender_init (gdisp);
|
||||
}
|
||||
|
||||
/* Free the update lists */
|
||||
gdisp->update_areas = gimp_display_area_list_free (gdisp->update_areas);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Asynchronous */
|
||||
|
||||
if (gdisp->update_areas)
|
||||
gimp_display_idlerender_init (gdisp);
|
||||
/* if there was nothing to update, we still need to start the
|
||||
* selection --mitch
|
||||
*/
|
||||
gimp_display_shell_selection_visibility (shell, GIMP_SELECTION_ON);
|
||||
}
|
||||
|
||||
/* Free the update lists */
|
||||
gdisp->update_areas = gimp_display_area_list_free (gdisp->update_areas);
|
||||
|
||||
/* Next the displays... */
|
||||
gimp_display_shell_flush (shell);
|
||||
|
||||
|
|
|
@ -445,39 +445,48 @@ gimp_display_flush_whenever (GimpDisplay *gdisp,
|
|||
}
|
||||
|
||||
/* First the updates... */
|
||||
if (now)
|
||||
if (gdisp->update_areas)
|
||||
{
|
||||
/* Synchronous */
|
||||
if (now)
|
||||
{
|
||||
/* Synchronous */
|
||||
|
||||
GSList *list;
|
||||
GimpArea *area;
|
||||
GSList *list;
|
||||
GimpArea *area;
|
||||
|
||||
for (list = gdisp->update_areas; list; list = g_slist_next (list))
|
||||
{
|
||||
/* Paint the area specified by the GimpArea */
|
||||
area = (GimpArea *) list->data;
|
||||
for (list = gdisp->update_areas; list; list = g_slist_next (list))
|
||||
{
|
||||
/* Paint the area specified by the GimpArea */
|
||||
area = (GimpArea *) list->data;
|
||||
|
||||
if ((area->x1 != area->x2) && (area->y1 != area->y2))
|
||||
{
|
||||
gimp_display_paint_area (gdisp,
|
||||
area->x1,
|
||||
area->y1,
|
||||
(area->x2 - area->x1),
|
||||
(area->y2 - area->y1));
|
||||
}
|
||||
}
|
||||
if ((area->x1 != area->x2) && (area->y1 != area->y2))
|
||||
{
|
||||
gimp_display_paint_area (gdisp,
|
||||
area->x1,
|
||||
area->y1,
|
||||
(area->x2 - area->x1),
|
||||
(area->y2 - area->y1));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Asynchronous */
|
||||
|
||||
gimp_display_idlerender_init (gdisp);
|
||||
}
|
||||
|
||||
/* Free the update lists */
|
||||
gdisp->update_areas = gimp_display_area_list_free (gdisp->update_areas);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Asynchronous */
|
||||
|
||||
if (gdisp->update_areas)
|
||||
gimp_display_idlerender_init (gdisp);
|
||||
/* if there was nothing to update, we still need to start the
|
||||
* selection --mitch
|
||||
*/
|
||||
gimp_display_shell_selection_visibility (shell, GIMP_SELECTION_ON);
|
||||
}
|
||||
|
||||
/* Free the update lists */
|
||||
gdisp->update_areas = gimp_display_area_list_free (gdisp->update_areas);
|
||||
|
||||
/* Next the displays... */
|
||||
gimp_display_shell_flush (shell);
|
||||
|
||||
|
|
Loading…
Reference in New Issue