[gimp] app: add GimpPickable::srgb_to_pixel()



commit 5b4d0219d8478f9798b29d463162b7ad9968c695
Author: Michael Natterer <mitch gimp org>
Date:   Mon May 23 01:25:35 2016 +0200

    app: add GimpPickable::srgb_to_pixel()
    
    which isn't really for "picking", but it just fits too nicely into
    GimpPickable to not put it there.
    
    Also add utility function gimp_pickable_srgb_to_image_color() which
    takes a "real" (sRGB) GimpRGB value, transforms it to the pickable's
    colorspace and puts it into an "image color" GimpRGB.

 app/core/gimpimage.c      |   15 +++++++
 app/core/gimplayer.c      |   16 +++++++
 app/core/gimppickable.c   |   42 +++++++++++++++++++
 app/core/gimppickable.h   |  101 +++++++++++++++++++++++++--------------------
 app/core/gimpprojection.c |   17 ++++++++
 5 files changed, 146 insertions(+), 45 deletions(-)
---
diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c
index 10b4975..3f1c77e 100644
--- a/app/core/gimpimage.c
+++ b/app/core/gimpimage.c
@@ -208,6 +208,10 @@ static void         gimp_image_pixel_to_srgb     (GimpPickable      *pickable,
                                                   const Babl        *format,
                                                   gpointer           pixel,
                                                   GimpRGB           *color);
+static void         gimp_image_srgb_to_pixel     (GimpPickable      *pickable,
+                                                  const GimpRGB     *color,
+                                                  const Babl        *format,
+                                                  gpointer           pixel);
 
 static void     gimp_image_mask_update           (GimpDrawable      *drawable,
                                                   gint               x,
@@ -673,6 +677,7 @@ gimp_pickable_iface_init (GimpPickableInterface *iface)
   iface->get_pixel_at          = gimp_image_get_pixel_at;
   iface->get_opacity_at        = gimp_image_get_opacity_at;
   iface->pixel_to_srgb         = gimp_image_pixel_to_srgb;
+  iface->srgb_to_pixel         = gimp_image_srgb_to_pixel;
 }
 
 static void
@@ -1587,6 +1592,16 @@ gimp_image_pixel_to_srgb (GimpPickable *pickable,
                                           format, pixel, color);
 }
 
+static void
+gimp_image_srgb_to_pixel (GimpPickable  *pickable,
+                          const GimpRGB *color,
+                          const Babl    *format,
+                          gpointer       pixel)
+{
+  gimp_image_color_profile_srgb_to_pixel (GIMP_IMAGE (pickable),
+                                          color, format, pixel);
+}
+
 static GeglNode *
 gimp_image_get_graph (GimpProjectable *projectable)
 {
diff --git a/app/core/gimplayer.c b/app/core/gimplayer.c
index 5abcbfa..2792ca8 100644
--- a/app/core/gimplayer.c
+++ b/app/core/gimplayer.c
@@ -196,6 +196,10 @@ static void    gimp_layer_pixel_to_srgb         (GimpPickable       *pickable,
                                                  const Babl         *format,
                                                  gpointer            pixel,
                                                  GimpRGB            *color);
+static void    gimp_layer_srgb_to_pixel         (GimpPickable       *pickable,
+                                                 const GimpRGB      *color,
+                                                 const Babl         *format,
+                                                 gpointer            pixel);
 
 static void       gimp_layer_layer_mask_update  (GimpDrawable       *layer_mask,
                                                  gint                x,
@@ -413,6 +417,7 @@ gimp_pickable_iface_init (GimpPickableInterface *iface)
 {
   iface->get_opacity_at = gimp_layer_get_opacity_at;
   iface->pixel_to_srgb  = gimp_layer_pixel_to_srgb;
+  iface->srgb_to_pixel  = gimp_layer_srgb_to_pixel;
 }
 
 static void
@@ -1267,6 +1272,17 @@ gimp_layer_pixel_to_srgb (GimpPickable *pickable,
 }
 
 static void
+gimp_layer_srgb_to_pixel (GimpPickable  *pickable,
+                          const GimpRGB *color,
+                          const Babl    *format,
+                          gpointer       pixel)
+{
+  GimpImage *image = gimp_item_get_image (GIMP_ITEM (pickable));
+
+  gimp_pickable_srgb_to_pixel (GIMP_PICKABLE (image), color, format, pixel);
+}
+
+static void
 gimp_layer_layer_mask_update (GimpDrawable *drawable,
                               gint          x,
                               gint          y,
diff --git a/app/core/gimppickable.c b/app/core/gimppickable.c
index 2ec722f..ffe91b7 100644
--- a/app/core/gimppickable.c
+++ b/app/core/gimppickable.c
@@ -245,6 +245,48 @@ gimp_pickable_pixel_to_srgb (GimpPickable *pickable,
     }
 }
 
+void
+gimp_pickable_srgb_to_pixel (GimpPickable  *pickable,
+                             const GimpRGB *color,
+                             const Babl    *format,
+                             gpointer       pixel)
+{
+  GimpPickableInterface *pickable_iface;
+
+  g_return_if_fail (GIMP_IS_PICKABLE (pickable));
+  g_return_if_fail (color != NULL);
+  g_return_if_fail (pixel != NULL);
+
+  if (! format)
+    format = gimp_pickable_get_format (pickable);
+
+  pickable_iface = GIMP_PICKABLE_GET_INTERFACE (pickable);
+
+  if (pickable_iface->srgb_to_pixel)
+    {
+      pickable_iface->srgb_to_pixel (pickable, color, format, pixel);
+    }
+  else
+    {
+      gimp_rgba_get_pixel (color, format, pixel);
+    }
+}
+
+void
+gimp_pickable_srgb_to_image_color (GimpPickable  *pickable,
+                                   const GimpRGB *color,
+                                   GimpRGB       *image_color)
+{
+  g_return_if_fail (GIMP_IS_PICKABLE (pickable));
+  g_return_if_fail (color != NULL);
+  g_return_if_fail (image_color != NULL);
+
+  gimp_pickable_srgb_to_pixel (pickable,
+                               color,
+                               babl_format ("R'G'B'A double"),
+                               image_color);
+}
+
 gboolean
 gimp_pickable_pick_color (GimpPickable *pickable,
                           gint          x,
diff --git a/app/core/gimppickable.h b/app/core/gimppickable.h
index 18f0587..5e52aa5 100644
--- a/app/core/gimppickable.h
+++ b/app/core/gimppickable.h
@@ -35,57 +35,68 @@ struct _GimpPickableInterface
   GTypeInterface base_iface;
 
   /*  virtual functions  */
-  void            (* flush)                 (GimpPickable *pickable);
-  GimpImage     * (* get_image)             (GimpPickable *pickable);
-  const Babl    * (* get_format)            (GimpPickable *pickable);
-  const Babl    * (* get_format_with_alpha) (GimpPickable *pickable);
-  GeglBuffer    * (* get_buffer)            (GimpPickable *pickable);
-  gboolean        (* get_pixel_at)          (GimpPickable *pickable,
-                                             gint          x,
-                                             gint          y,
-                                             const Babl   *format,
-                                             gpointer      pixel);
-  gdouble         (* get_opacity_at)        (GimpPickable *pickable,
-                                             gint          x,
-                                             gint          y);
-  void            (* pixel_to_srgb)         (GimpPickable *pickable,
-                                             const Babl   *format,
-                                             gpointer      pixel,
-                                             GimpRGB      *color);
+  void            (* flush)                 (GimpPickable  *pickable);
+  GimpImage     * (* get_image)             (GimpPickable  *pickable);
+  const Babl    * (* get_format)            (GimpPickable  *pickable);
+  const Babl    * (* get_format_with_alpha) (GimpPickable  *pickable);
+  GeglBuffer    * (* get_buffer)            (GimpPickable  *pickable);
+  gboolean        (* get_pixel_at)          (GimpPickable  *pickable,
+                                             gint           x,
+                                             gint           y,
+                                             const Babl    *format,
+                                             gpointer       pixel);
+  gdouble         (* get_opacity_at)        (GimpPickable  *pickable,
+                                             gint           x,
+                                             gint           y);
+  void            (* pixel_to_srgb)         (GimpPickable  *pickable,
+                                             const Babl    *format,
+                                             gpointer       pixel,
+                                             GimpRGB       *color);
+  void            (* srgb_to_pixel)         (GimpPickable  *pickable,
+                                             const GimpRGB *color,
+                                             const Babl    *format,
+                                             gpointer       pixel);
 };
 
 
 GType           gimp_pickable_interface_get_type    (void) G_GNUC_CONST;
 
-void            gimp_pickable_flush                 (GimpPickable *pickable);
-GimpImage     * gimp_pickable_get_image             (GimpPickable *pickable);
-const Babl    * gimp_pickable_get_format            (GimpPickable *pickable);
-const Babl    * gimp_pickable_get_format_with_alpha (GimpPickable *pickable);
-GeglBuffer    * gimp_pickable_get_buffer            (GimpPickable *pickable);
-gboolean        gimp_pickable_get_pixel_at          (GimpPickable *pickable,
-                                                     gint          x,
-                                                     gint          y,
-                                                     const Babl   *format,
-                                                     gpointer      pixel);
-gboolean        gimp_pickable_get_color_at          (GimpPickable *pickable,
-                                                     gint          x,
-                                                     gint          y,
-                                                     GimpRGB      *color);
-gdouble         gimp_pickable_get_opacity_at        (GimpPickable *pickable,
-                                                     gint          x,
-                                                     gint          y);
-void            gimp_pickable_pixel_to_srgb         (GimpPickable *pickable,
-                                                     const Babl   *format,
-                                                     gpointer      pixel,
-                                                     GimpRGB      *color);
+void            gimp_pickable_flush                 (GimpPickable  *pickable);
+GimpImage     * gimp_pickable_get_image             (GimpPickable  *pickable);
+const Babl    * gimp_pickable_get_format            (GimpPickable  *pickable);
+const Babl    * gimp_pickable_get_format_with_alpha (GimpPickable  *pickable);
+GeglBuffer    * gimp_pickable_get_buffer            (GimpPickable  *pickable);
+gboolean        gimp_pickable_get_pixel_at          (GimpPickable  *pickable,
+                                                     gint           x,
+                                                     gint           y,
+                                                     const Babl    *format,
+                                                     gpointer       pixel);
+gboolean        gimp_pickable_get_color_at          (GimpPickable  *pickable,
+                                                     gint           x,
+                                                     gint           y,
+                                                     GimpRGB       *color);
+gdouble         gimp_pickable_get_opacity_at        (GimpPickable  *pickable,
+                                                     gint           x,
+                                                     gint           y);
+void            gimp_pickable_pixel_to_srgb         (GimpPickable  *pickable,
+                                                     const Babl    *format,
+                                                     gpointer       pixel,
+                                                     GimpRGB       *color);
+void            gimp_pickable_srgb_to_pixel         (GimpPickable  *pickable,
+                                                     const GimpRGB *color,
+                                                     const Babl    *format,
+                                                     gpointer       pixel);
+void            gimp_pickable_srgb_to_image_color   (GimpPickable  *pickable,
+                                                     const GimpRGB *color,
+                                                     GimpRGB       *image_color);
 
-gboolean        gimp_pickable_pick_color            (GimpPickable *pickable,
-                                                     gint          x,
-                                                     gint          y,
-                                                     gboolean      sample_average,
-                                                     gdouble       average_radius,
-                                                     gpointer      pixel,
-                                                     GimpRGB      *color);
+gboolean        gimp_pickable_pick_color            (GimpPickable  *pickable,
+                                                     gint           x,
+                                                     gint           y,
+                                                     gboolean       sample_average,
+                                                     gdouble        average_radius,
+                                                     gpointer       pixel,
+                                                     GimpRGB       *color);
 
 
 #endif  /* __GIMP_PICKABLE_H__ */
diff --git a/app/core/gimpprojection.c b/app/core/gimpprojection.c
index 9a91f9a..58bb61b 100644
--- a/app/core/gimpprojection.c
+++ b/app/core/gimpprojection.c
@@ -132,6 +132,10 @@ static void        gimp_projection_pixel_to_srgb         (GimpPickable    *picka
                                                           const Babl      *format,
                                                           gpointer         pixel,
                                                           GimpRGB         *color);
+static void        gimp_projection_srgb_to_pixel         (GimpPickable    *pickable,
+                                                          const GimpRGB   *color,
+                                                          const Babl      *format,
+                                                          gpointer         pixel);
 
 static void        gimp_projection_free_buffer           (GimpProjection  *proj);
 static void        gimp_projection_add_update_area       (GimpProjection  *proj,
@@ -245,6 +249,7 @@ gimp_projection_pickable_iface_init (GimpPickableInterface *iface)
   iface->get_pixel_at          = gimp_projection_get_pixel_at;
   iface->get_opacity_at        = gimp_projection_get_opacity_at;
   iface->pixel_to_srgb         = gimp_projection_pixel_to_srgb;
+  iface->srgb_to_pixel         = gimp_projection_srgb_to_pixel;
 }
 
 static void
@@ -460,6 +465,18 @@ gimp_projection_pixel_to_srgb (GimpPickable *pickable,
   gimp_pickable_pixel_to_srgb (GIMP_PICKABLE (image), format, pixel, color);
 }
 
+static void
+gimp_projection_srgb_to_pixel (GimpPickable  *pickable,
+                               const GimpRGB *color,
+                               const Babl    *format,
+                               gpointer       pixel)
+{
+  GimpProjection *proj  = GIMP_PROJECTION (pickable);
+  GimpImage      *image = gimp_projectable_get_image (proj->priv->projectable);
+
+  gimp_pickable_srgb_to_pixel (GIMP_PICKABLE (image), color, format, pixel);
+}
+
 
 /*  public functions  */
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]