[gimp] app: tag GimpBuffers with an ICC profile, if available
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: tag GimpBuffers with an ICC profile, if available
- Date: Tue, 16 Jun 2015 21:19:35 +0000 (UTC)
commit 26e2ccbdf3a0fd14ee1b929058b7c73e13430935
Author: Michael Natterer <mitch gimp org>
Date: Tue Jun 16 23:16:54 2015 +0200
app: tag GimpBuffers with an ICC profile, if available
Set the profile when the buffer is copied from a layer, and when it's
created from a GdkPixbuf from the clipboard. The profile is not yet
used for anything.
app/core/gimp-edit.c | 16 ++++++++++++-
app/core/gimpbuffer.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++
app/core/gimpbuffer.h | 9 +++++++
3 files changed, 82 insertions(+), 1 deletions(-)
---
diff --git a/app/core/gimp-edit.c b/app/core/gimp-edit.c
index 7caf6a1..7ff569a 100644
--- a/app/core/gimp-edit.c
+++ b/app/core/gimp-edit.c
@@ -591,7 +591,8 @@ gimp_edit_extract (GimpImage *image,
gint offset_y;
if (cut_pixels)
- gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_EDIT_CUT, C_("undo-type", "Cut"));
+ gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_EDIT_CUT,
+ C_("undo-type", "Cut"));
/* Cut/copy the mask portion from the image */
buffer = gimp_selection_extract (GIMP_SELECTION (gimp_image_get_mask (image)),
@@ -608,6 +609,19 @@ gimp_edit_extract (GimpImage *image,
offset_x, offset_y, FALSE);
g_object_unref (buffer);
+ if (GIMP_IS_LAYER (pickable))
+ {
+ const guint8 *icc_data;
+ gsize icc_len;
+
+ icc_data =
+ gimp_color_managed_get_icc_profile (GIMP_COLOR_MANAGED (image),
+ &icc_len);
+
+ if (icc_data)
+ gimp_buffer_set_icc_profile (gimp_buffer, icc_data, icc_len);
+ }
+
return gimp_buffer;
}
diff --git a/app/core/gimpbuffer.c b/app/core/gimpbuffer.c
index e805cd2..181e90d 100644
--- a/app/core/gimpbuffer.c
+++ b/app/core/gimpbuffer.c
@@ -101,6 +101,8 @@ gimp_buffer_finalize (GObject *object)
buffer->buffer = NULL;
}
+ gimp_buffer_set_icc_profile (buffer, NULL, 0);
+
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -112,6 +114,7 @@ gimp_buffer_get_memsize (GimpObject *object,
gint64 memsize = 0;
memsize += gimp_gegl_buffer_get_memsize (buffer->buffer);
+ memsize += buffer->icc_profile_len;
return memsize + GIMP_OBJECT_CLASS (parent_class)->get_memsize (object,
gui_size);
@@ -268,6 +271,7 @@ gimp_buffer_new_from_pixbuf (GdkPixbuf *pixbuf,
{
GimpBuffer *gimp_buffer;
GeglBuffer *buffer;
+ gchar *icc_base64 = NULL;
g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), NULL);
g_return_val_if_fail (name != NULL, NULL);
@@ -277,6 +281,23 @@ gimp_buffer_new_from_pixbuf (GdkPixbuf *pixbuf,
gimp_buffer = gimp_buffer_new (buffer, name,
offset_x, offset_y, FALSE);
+ g_object_get (pixbuf, "icc-profile", icc_base64, NULL);
+
+ if (icc_base64)
+ {
+ guint8 *icc_data;
+ gsize icc_len;
+
+ icc_data = g_base64_decode (icc_base64, &icc_len);
+ g_free (icc_base64);
+
+ if (icc_data)
+ {
+ gimp_buffer_set_icc_profile (gimp_buffer, icc_data, icc_len);
+ g_free (icc_data);
+ }
+ }
+
g_object_unref (buffer);
return gimp_buffer;
@@ -313,3 +334,40 @@ gimp_buffer_get_buffer (const GimpBuffer *buffer)
return buffer->buffer;
}
+
+void
+gimp_buffer_set_icc_profile (GimpBuffer *buffer,
+ const guint8 *data,
+ gsize length)
+{
+ g_return_if_fail (GIMP_IS_BUFFER (buffer));
+ g_return_if_fail (data == NULL || length != 0);
+
+ if (data != buffer->icc_profile)
+ {
+ if (buffer->icc_profile)
+ {
+ g_free (buffer->icc_profile);
+ buffer->icc_profile = NULL;
+ buffer->icc_profile_len = 0;
+ }
+
+ if (data)
+ {
+ buffer->icc_profile = g_memdup (data, length);
+ buffer->icc_profile_len = length;
+ }
+ }
+}
+
+const guint8 *
+gimp_buffer_get_icc_profile (const GimpBuffer *buffer,
+ gsize *length)
+{
+ g_return_val_if_fail (GIMP_IS_BUFFER (buffer), NULL);
+
+ if (length)
+ *length = buffer->icc_profile_len;
+
+ return buffer->icc_profile;
+}
diff --git a/app/core/gimpbuffer.h b/app/core/gimpbuffer.h
index 66c5c51..cc93eac 100644
--- a/app/core/gimpbuffer.h
+++ b/app/core/gimpbuffer.h
@@ -39,6 +39,9 @@ struct _GimpBuffer
GeglBuffer *buffer;
gint offset_x;
gint offset_y;
+
+ guint8 *icc_profile;
+ gsize icc_profile_len;
};
struct _GimpBufferClass
@@ -65,5 +68,11 @@ const Babl * gimp_buffer_get_format (const GimpBuffer *buffer);
GeglBuffer * gimp_buffer_get_buffer (const GimpBuffer *buffer);
+void gimp_buffer_set_icc_profile (GimpBuffer *buffer,
+ const guint8 *data,
+ gsize length);
+const guint8 * gimp_buffer_get_icc_profile (const GimpBuffer *buffer,
+ gsize *length);
+
#endif /* __GIMP_BUFFER_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]