From 7c95676f88217bedf16eca846943600cf4347bcb Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Thu, 3 Sep 2015 00:19:05 +0200 Subject: [PATCH] app: implement the GimpColorManaged interface in GimpLayer and change GimpImage and GimpItemStack to emit the "profile-changed" signal when the image's profile changed. Also connect GimpViewRenderer to "profile-changed" if the viewable is a GimpColorManaged and invalidate the preview. --- app/core/gimpimage.c | 2 +- app/core/gimpitemstack.c | 29 +++++++++++++++++++-- app/core/gimpitemstack.h | 1 + app/core/gimplayer.c | 47 +++++++++++++++++++++++++++++++--- app/widgets/gimpviewrenderer.c | 22 ++++++++++++++++ 5 files changed, 95 insertions(+), 6 deletions(-) diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c index 4677062905..d46de3d576 100644 --- a/app/core/gimpimage.c +++ b/app/core/gimpimage.c @@ -1403,7 +1403,7 @@ gimp_image_color_managed_profile_changed (GimpColorManaged *managed) GimpItemStack *layers = GIMP_ITEM_STACK (gimp_image_get_layers (image)); gimp_viewable_invalidate_preview (GIMP_VIEWABLE (image)); - gimp_item_stack_invalidate_previews (layers); + gimp_item_stack_profile_changed (layers); } static void diff --git a/app/core/gimpitemstack.c b/app/core/gimpitemstack.c index 1de9c1eb21..0045bf3a56 100644 --- a/app/core/gimpitemstack.c +++ b/app/core/gimpitemstack.c @@ -22,9 +22,12 @@ #include +#include #include #include +#include "libgimpcolor/gimpcolor.h" + #include "core-types.h" #include "gimpitem.h" @@ -302,7 +305,7 @@ gimp_item_stack_get_parent_by_path (GimpItemStack *stack, } static void -gimp_item_stack_invalidate_preview (GimpViewable *viewable) +gimp_item_stack_viewable_invalidate_previews (GimpViewable *viewable) { GimpContainer *children = gimp_viewable_get_children (viewable); @@ -318,6 +321,28 @@ gimp_item_stack_invalidate_previews (GimpItemStack *stack) g_return_if_fail (GIMP_IS_ITEM_STACK (stack)); gimp_container_foreach (GIMP_CONTAINER (stack), - (GFunc) gimp_item_stack_invalidate_preview, + (GFunc) gimp_item_stack_viewable_invalidate_previews, + NULL); +} + +static void +gimp_item_stack_viewable_profile_changed (GimpViewable *viewable) +{ + GimpContainer *children = gimp_viewable_get_children (viewable); + + if (children) + gimp_item_stack_profile_changed (GIMP_ITEM_STACK (children)); + + if (GIMP_IS_COLOR_MANAGED (viewable)) + gimp_color_managed_profile_changed (GIMP_COLOR_MANAGED (viewable)); +} + +void +gimp_item_stack_profile_changed (GimpItemStack *stack) +{ + g_return_if_fail (GIMP_IS_ITEM_STACK (stack)); + + gimp_container_foreach (GIMP_CONTAINER (stack), + (GFunc) gimp_item_stack_viewable_profile_changed, NULL); } diff --git a/app/core/gimpitemstack.h b/app/core/gimpitemstack.h index 09dd92e855..c2d143c9ca 100644 --- a/app/core/gimpitemstack.h +++ b/app/core/gimpitemstack.h @@ -60,6 +60,7 @@ GimpItem * gimp_item_stack_get_parent_by_path (GimpItemStack *stack, gint *index); void gimp_item_stack_invalidate_previews (GimpItemStack *stack); +void gimp_item_stack_profile_changed (GimpItemStack *stack); #endif /* __GIMP_ITEM_STACK_H__ */ diff --git a/app/core/gimplayer.c b/app/core/gimplayer.c index d60441cc2f..aa307415ef 100644 --- a/app/core/gimplayer.c +++ b/app/core/gimplayer.c @@ -78,7 +78,8 @@ enum }; -static void gimp_layer_pickable_iface_init (GimpPickableInterface *iface); +static void gimp_color_managed_iface_init (GimpColorManagedInterface *iface); +static void gimp_pickable_iface_init (GimpPickableInterface *iface); static void gimp_layer_set_property (GObject *object, guint property_id, @@ -183,6 +184,13 @@ static void gimp_layer_set_buffer (GimpDrawable *drawable, gint offset_x, gint offset_y); +static const guint8 * + gimp_layer_get_icc_profile (GimpColorManaged *managed, + gsize *len); +static GimpColorProfile * + gimp_layer_get_color_profile (GimpColorManaged *managed); +static void gimp_layer_profile_changed (GimpColorManaged *managed); + static gdouble gimp_layer_get_opacity_at (GimpPickable *pickable, gint x, gint y); @@ -196,8 +204,10 @@ static void gimp_layer_layer_mask_update (GimpDrawable *layer_mask, G_DEFINE_TYPE_WITH_CODE (GimpLayer, gimp_layer, GIMP_TYPE_DRAWABLE, + G_IMPLEMENT_INTERFACE (GIMP_TYPE_COLOR_MANAGED, + gimp_color_managed_iface_init) G_IMPLEMENT_INTERFACE (GIMP_TYPE_PICKABLE, - gimp_layer_pickable_iface_init)) + gimp_pickable_iface_init)) #define parent_class gimp_layer_parent_class @@ -390,7 +400,15 @@ gimp_layer_init (GimpLayer *layer) } static void -gimp_layer_pickable_iface_init (GimpPickableInterface *iface) +gimp_color_managed_iface_init (GimpColorManagedInterface *iface) +{ + iface->get_icc_profile = gimp_layer_get_icc_profile; + iface->get_color_profile = gimp_layer_get_color_profile; + iface->profile_changed = gimp_layer_profile_changed; +} + +static void +gimp_pickable_iface_init (GimpPickableInterface *iface) { iface->get_opacity_at = gimp_layer_get_opacity_at; } @@ -1186,6 +1204,29 @@ gimp_layer_set_buffer (GimpDrawable *drawable, } } +static const guint8 * +gimp_layer_get_icc_profile (GimpColorManaged *managed, + gsize *len) +{ + GimpImage *image = gimp_item_get_image (GIMP_ITEM (managed)); + + return gimp_color_managed_get_icc_profile (GIMP_COLOR_MANAGED (image), len); +} + +static GimpColorProfile * +gimp_layer_get_color_profile (GimpColorManaged *managed) +{ + GimpImage *image = gimp_item_get_image (GIMP_ITEM (managed)); + + return gimp_color_managed_get_color_profile (GIMP_COLOR_MANAGED (image)); +} + +static void +gimp_layer_profile_changed (GimpColorManaged *managed) +{ + gimp_viewable_invalidate_preview (GIMP_VIEWABLE (managed)); +} + static gdouble gimp_layer_get_opacity_at (GimpPickable *pickable, gint x, diff --git a/app/widgets/gimpviewrenderer.c b/app/widgets/gimpviewrenderer.c index 22c4e4545a..603b0aa774 100644 --- a/app/widgets/gimpviewrenderer.c +++ b/app/widgets/gimpviewrenderer.c @@ -70,6 +70,8 @@ static void gimp_view_renderer_real_render (GimpViewRenderer *rende static void gimp_view_renderer_size_changed (GimpViewRenderer *renderer, GimpViewable *viewable); +static void gimp_view_renderer_profile_changed (GimpViewRenderer *renderer, + GimpViewable *viewable); static void gimp_view_render_temp_buf_to_surface (GimpViewRenderer *renderer, GtkWidget *widget, @@ -351,6 +353,11 @@ gimp_view_renderer_set_viewable (GimpViewRenderer *renderer, g_signal_handlers_disconnect_by_func (renderer->viewable, G_CALLBACK (gimp_view_renderer_size_changed), renderer); + + if (GIMP_IS_COLOR_MANAGED (renderer->viewable)) + g_signal_handlers_disconnect_by_func (renderer->viewable, + G_CALLBACK (gimp_view_renderer_profile_changed), + renderer); } renderer->viewable = viewable; @@ -371,6 +378,12 @@ gimp_view_renderer_set_viewable (GimpViewRenderer *renderer, G_CALLBACK (gimp_view_renderer_size_changed), renderer); + if (GIMP_IS_COLOR_MANAGED (renderer->viewable)) + g_signal_connect_swapped (renderer->viewable, + "profile-changed", + G_CALLBACK (gimp_view_renderer_profile_changed), + renderer); + if (renderer->size != -1) gimp_view_renderer_set_size (renderer, renderer->size, renderer->border_width); @@ -791,6 +804,15 @@ gimp_view_renderer_size_changed (GimpViewRenderer *renderer, gimp_view_renderer_invalidate (renderer); } +static void +gimp_view_renderer_profile_changed (GimpViewRenderer *renderer, + GimpViewable *viewable) +{ + /* FIXME: kill cached color transform */ + + gimp_view_renderer_invalidate (renderer); +} + /* protected functions */