Invalidate the image preview after the projection is completely

2007-06-26  Michael Natterer  <mitch@gimp.org>

	Invalidate the image preview after the projection is
	completely constructed. Fixes bug #449141.

	* app/core/gimpmarshal.list: add VOID:BOOLEAN

	* app/core/gimpimage.[ch]: add boolean parameter
	invalidate_preview to the "flush" signal.

	* app/core/gimpprojection.[ch]: add boolean member
	invalidate_preview to the GimpProjection struct. Set it to TRUE if
	it was TRUE in the image's "flush" signal. When the projection is
	completely constructed after a flush, invalidate the image's
	preview.

	* app/display/gimpdisplay-handlers.c
	* app/widgets/gimpitemtreeview.c
	* app/widgets/gimpimagedock.c
	* app/widgets/gimpimageeditor.c: changed callback signatures
	accordingly.


svn path=/trunk/; revision=22840
This commit is contained in:
Michael Natterer 2007-06-26 21:39:51 +00:00 committed by Michael Natterer
parent 48738dbbdd
commit d8c632cb93
10 changed files with 70 additions and 7 deletions

View File

@ -1,3 +1,25 @@
2007-06-26 Michael Natterer <mitch@gimp.org>
Invalidate the image preview after the projection is
completely constructed. Fixes bug #449141.
* app/core/gimpmarshal.list: add VOID:BOOLEAN
* app/core/gimpimage.[ch]: add boolean parameter
invalidate_preview to the "flush" signal.
* app/core/gimpprojection.[ch]: add boolean member
invalidate_preview to the GimpProjection struct. Set it to TRUE if
it was TRUE in the image's "flush" signal. When the projection is
completely constructed after a flush, invalidate the image's
preview.
* app/display/gimpdisplay-handlers.c
* app/widgets/gimpitemtreeview.c
* app/widgets/gimpimagedock.c
* app/widgets/gimpimageeditor.c: changed callback signatures
accordingly.
2007-06-26 Sven Neumann <sven@gimp.org>
* app/widgets/gimpimageprofileview.c (gimp_image_profile_view_query):

View File

@ -150,7 +150,8 @@ static gchar * gimp_image_get_description (GimpViewable *viewable,
gchar **tooltip);
static void gimp_image_real_colormap_changed (GimpImage *image,
gint color_index);
static void gimp_image_real_flush (GimpImage *image);
static void gimp_image_real_flush (GimpImage *image,
gboolean invalidate_preview);
static void gimp_image_mask_update (GimpDrawable *drawable,
gint x,
@ -472,8 +473,9 @@ gimp_image_class_init (GimpImageClass *klass)
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GimpImageClass, flush),
NULL, NULL,
gimp_marshal_VOID__VOID,
G_TYPE_NONE, 0);
gimp_marshal_VOID__BOOLEAN,
G_TYPE_NONE, 1,
G_TYPE_BOOLEAN);
object_class->constructor = gimp_image_constructor;
object_class->set_property = gimp_image_set_property;
@ -1123,7 +1125,8 @@ gimp_image_real_colormap_changed (GimpImage *image,
}
static void
gimp_image_real_flush (GimpImage *image)
gimp_image_real_flush (GimpImage *image,
gboolean invalidate_preview)
{
if (image->flush_accum.alpha_changed)
{
@ -1139,7 +1142,9 @@ gimp_image_real_flush (GimpImage *image)
if (image->flush_accum.preview_invalidated)
{
gimp_viewable_invalidate_preview (GIMP_VIEWABLE (image));
/* don't invalidate the preview here, the projection does this when
* it is completely constructed.
*/
image->flush_accum.preview_invalidated = FALSE;
}
}
@ -1977,7 +1982,8 @@ gimp_image_flush (GimpImage *image)
{
g_return_if_fail (GIMP_IS_IMAGE (image));
g_signal_emit (image, gimp_image_signals[FLUSH], 0);
g_signal_emit (image, gimp_image_signals[FLUSH], 0,
image->flush_accum.preview_invalidated);
}

View File

@ -227,7 +227,8 @@ struct _GimpImageClass
GimpUndoEvent event,
GimpUndo *undo);
void (* flush) (GimpImage *image);
void (* flush) (GimpImage *image,
gboolean invalidate_preview);
};

View File

@ -27,6 +27,7 @@ BOOLEAN: ENUM, INT
BOOLEAN: OBJECT, POINTER
BOOLEAN: OBJECT, POINTER, STRING
VOID: BOOLEAN
VOID: BOOLEAN, INT, INT, INT, INT
VOID: BOXED
VOID: BOXED, ENUM

View File

@ -95,6 +95,7 @@ static void gimp_projection_image_size_changed (GimpImage *image,
static void gimp_projection_image_mode_changed (GimpImage *image,
GimpProjection *proj);
static void gimp_projection_image_flush (GimpImage *image,
gboolean invalidate_preview,
GimpProjection *proj);
@ -474,6 +475,15 @@ gimp_projection_flush_whenever (GimpProjection *proj,
gimp_area_list_free (proj->update_areas);
proj->update_areas = NULL;
}
else if (! now && proj->invalidate_preview)
{
/* invalidate the preview here since it is constructed from
* the projection
*/
proj->invalidate_preview = FALSE;
gimp_viewable_invalidate_preview (GIMP_VIEWABLE (proj->image));
}
}
static void
@ -582,6 +592,16 @@ gimp_projection_idle_render_callback (gpointer data)
/* FINISHED */
proj->idle_render.idle_id = 0;
if (proj->invalidate_preview)
{
/* invalidate the preview here since it is constructed from
* the projection
*/
proj->invalidate_preview = FALSE;
gimp_viewable_invalidate_preview (GIMP_VIEWABLE (proj->image));
}
return FALSE;
}
}
@ -701,7 +721,11 @@ gimp_projection_image_mode_changed (GimpImage *image,
static void
gimp_projection_image_flush (GimpImage *image,
gboolean invalidate_preview,
GimpProjection *proj)
{
if (invalidate_preview)
proj->invalidate_preview = TRUE;
gimp_projection_flush (proj);
}

View File

@ -61,6 +61,7 @@ struct _GimpProjection
GimpProjectionIdleRender idle_render;
gboolean construct_flag;
gboolean invalidate_preview;
};
struct _GimpProjectionClass

View File

@ -45,6 +45,7 @@ static void gimp_display_update_handler (GimpProjection *projection,
gint h,
GimpDisplay *display);
static void gimp_display_flush_handler (GimpImage *image,
gboolean invalidate_preview,
GimpDisplay *display);
static void gimp_display_saved_handler (GimpImage *image,
const gchar *uri,
@ -137,6 +138,7 @@ gimp_display_update_handler (GimpProjection *projection,
static void
gimp_display_flush_handler (GimpImage *image,
gboolean invalidate_preview,
GimpDisplay *display)
{
gimp_display_flush (display);

View File

@ -47,6 +47,7 @@ static void gimp_image_dock_display_changed (GimpContext *context,
GimpObject *display,
GimpImageDock *dock);
static void gimp_image_dock_image_flush (GimpImage *image,
gboolean invalidate_preview,
GimpImageDock *dock);
static void gimp_image_dock_notify_transient (GimpConfig *config,
@ -167,6 +168,7 @@ gimp_image_dock_display_changed (GimpContext *context,
static void
gimp_image_dock_image_flush (GimpImage *image,
gboolean invalidate_preview,
GimpImageDock *dock)
{
if (image == gimp_context_get_image (GIMP_DOCK (dock)->context))

View File

@ -38,6 +38,7 @@ static void gimp_image_editor_destroy (GtkObject *object);
static void gimp_image_editor_real_set_image (GimpImageEditor *editor,
GimpImage *image);
static void gimp_image_editor_image_flush (GimpImage *image,
gboolean invalidate_preview,
GimpImageEditor *editor);
@ -161,6 +162,7 @@ gimp_image_editor_get_image (GimpImageEditor *editor)
static void
gimp_image_editor_image_flush (GimpImage *image,
gboolean invalidate_preview,
GimpImageEditor *editor)
{
if (GIMP_EDITOR (editor)->ui_manager)

View File

@ -75,6 +75,7 @@ static void gimp_item_tree_view_real_set_image (GimpItemTreeView *view,
GimpImage *image);
static void gimp_item_tree_view_image_flush (GimpImage *image,
gboolean invalidate_preview,
GimpItemTreeView *view);
static void gimp_item_tree_view_set_container (GimpContainerView *view,
@ -505,6 +506,7 @@ gimp_item_tree_view_real_set_image (GimpItemTreeView *view,
static void
gimp_item_tree_view_image_flush (GimpImage *image,
gboolean invalidate_preview,
GimpItemTreeView *view)
{
gimp_ui_manager_update (GIMP_EDITOR (view)->ui_manager, view);