Bug 675994 - Opening image with a saved selection breaks histogram updating

In fact, it broke much more than that because the way XCF loading
replaced the image's mask prevented the image's "mask-changed" signal
from ever being emitted. Add private API gimp_image_take_mask() which
properly sets the mask and use it for image construction and the XCF
selection loading hack.
This commit is contained in:
Michael Natterer
2012-05-14 01:44:41 +02:00
parent c4142d0574
commit ab4c613a70
4 changed files with 35 additions and 15 deletions

View File

@ -112,5 +112,8 @@ struct _GimpImagePrivate
GIMP_TYPE_IMAGE, \
GimpImagePrivate)
void gimp_image_take_mask (GimpImage *image,
GimpChannel *mask);
#endif /* __GIMP_IMAGE_PRIVATE_H__ */

View File

@ -760,6 +760,7 @@ gimp_image_constructed (GObject *object)
{
GimpImage *image = GIMP_IMAGE (object);
GimpImagePrivate *private = GIMP_IMAGE_GET_PRIVATE (image);
GimpChannel *selection;
GimpCoreConfig *config;
GimpTemplate *template;
@ -785,15 +786,10 @@ gimp_image_constructed (GObject *object)
if (private->base_type == GIMP_INDEXED)
gimp_image_colormap_init (image);
/* create the selection mask */
private->selection_mask = gimp_selection_new (image,
gimp_image_get_width (image),
gimp_image_get_height (image));
g_object_ref_sink (private->selection_mask);
g_signal_connect (private->selection_mask, "update",
G_CALLBACK (gimp_image_mask_update),
image);
selection = gimp_selection_new (image,
gimp_image_get_width (image),
gimp_image_get_height (image));
gimp_image_take_mask (image, selection);
g_signal_connect_object (config, "notify::transparency-type",
G_CALLBACK (gimp_item_stack_invalidate_previews),
@ -2095,6 +2091,27 @@ gimp_image_mask_changed (GimpImage *image)
g_signal_emit (image, gimp_image_signals[MASK_CHANGED], 0);
}
void
gimp_image_take_mask (GimpImage *image,
GimpChannel *mask)
{
GimpImagePrivate *private;
g_return_if_fail (GIMP_IS_IMAGE (image));
g_return_if_fail (GIMP_IS_SELECTION (mask));
private = GIMP_IMAGE_GET_PRIVATE (image);
if (private->selection_mask)
g_object_unref (private->selection_mask);
private->selection_mask = g_object_ref_sink (mask);
g_signal_connect (private->selection_mask, "update",
G_CALLBACK (gimp_image_mask_update),
image);
}
/* image components */

View File

@ -249,6 +249,9 @@ gimp_histogram_editor_set_image (GimpImageEditor *image_editor,
editor->idle_id = 0;
}
g_signal_handlers_disconnect_by_func (image_editor->image,
gimp_histogram_editor_update,
editor);
g_signal_handlers_disconnect_by_func (image_editor->image,
gimp_histogram_editor_layer_changed,
editor);

View File

@ -939,16 +939,13 @@ xcf_load_channel_props (XcfInfo *info,
case PROP_SELECTION:
{
GimpImagePrivate *private = GIMP_IMAGE_GET_PRIVATE (image);
GimpChannel *mask;
GimpChannel *mask;
g_object_unref (gimp_image_get_mask (image));
mask = private->selection_mask =
mask =
gimp_selection_new (image,
gimp_item_get_width (GIMP_ITEM (*channel)),
gimp_item_get_height (GIMP_ITEM (*channel)));
g_object_ref_sink (mask);
gimp_image_take_mask (image, mask);
g_object_unref (GIMP_DRAWABLE (mask)->private->buffer);
GIMP_DRAWABLE (mask)->private->buffer =