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:
@ -112,5 +112,8 @@ struct _GimpImagePrivate
|
||||
GIMP_TYPE_IMAGE, \
|
||||
GimpImagePrivate)
|
||||
|
||||
void gimp_image_take_mask (GimpImage *image,
|
||||
GimpChannel *mask);
|
||||
|
||||
|
||||
#endif /* __GIMP_IMAGE_PRIVATE_H__ */
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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 =
|
||||
|
Reference in New Issue
Block a user