[gimp] app: add GimpPickable::srgb_to_pixel()
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: add GimpPickable::srgb_to_pixel()
- Date: Sun, 22 May 2016 23:34:34 +0000 (UTC)
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]