Issue #3164: HEIC doesnt have color profile.
Since this requires libheif 1.4.0, released end of February 2019, this commit should not go into the gimp-2-10 branch right now.
This commit is contained in:
@ -65,7 +65,7 @@ m4_define([harfbuzz_required_version], [0.9.19])
|
|||||||
m4_define([intltool_required_version], [0.40.1])
|
m4_define([intltool_required_version], [0.40.1])
|
||||||
m4_define([lcms_required_version], [2.8])
|
m4_define([lcms_required_version], [2.8])
|
||||||
m4_define([libgudev_required_version], [167])
|
m4_define([libgudev_required_version], [167])
|
||||||
m4_define([libheif_required_version], [1.1.0])
|
m4_define([libheif_required_version], [1.4.0])
|
||||||
m4_define([liblzma_required_version], [5.0.0])
|
m4_define([liblzma_required_version], [5.0.0])
|
||||||
m4_define([libmypaint_required_version], [1.3.0])
|
m4_define([libmypaint_required_version], [1.3.0])
|
||||||
m4_define([libpng_required_version], [1.6.25])
|
m4_define([libpng_required_version], [1.6.25])
|
||||||
|
@ -337,6 +337,7 @@ load_image (GFile *file,
|
|||||||
struct heif_error err;
|
struct heif_error err;
|
||||||
struct heif_image_handle *handle = NULL;
|
struct heif_image_handle *handle = NULL;
|
||||||
struct heif_image *img = NULL;
|
struct heif_image *img = NULL;
|
||||||
|
GimpColorProfile *profile = NULL;
|
||||||
gint n_images;
|
gint n_images;
|
||||||
heif_item_id primary;
|
heif_item_id primary;
|
||||||
heif_item_id selected_image;
|
heif_item_id selected_image;
|
||||||
@ -478,6 +479,42 @@ load_image (GFile *file,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (heif_image_handle_get_color_profile_type (handle))
|
||||||
|
{
|
||||||
|
case heif_color_profile_type_not_present:
|
||||||
|
break;
|
||||||
|
case heif_color_profile_type_rICC:
|
||||||
|
case heif_color_profile_type_prof:
|
||||||
|
/* I am unsure, but it looks like both these types represent an
|
||||||
|
* ICC color profile. XXX
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
void *profile_data;
|
||||||
|
size_t profile_size;
|
||||||
|
|
||||||
|
profile_size = heif_image_handle_get_raw_color_profile_size (handle);
|
||||||
|
profile_data = g_malloc0 (profile_size);
|
||||||
|
err = heif_image_handle_get_raw_color_profile (handle, profile_data);
|
||||||
|
|
||||||
|
if (err.code)
|
||||||
|
g_warning ("%s: color profile loading failed and discarded.",
|
||||||
|
G_STRFUNC);
|
||||||
|
else
|
||||||
|
profile = gimp_color_profile_new_from_icc_profile ((guint8 *) profile_data,
|
||||||
|
profile_size, NULL);
|
||||||
|
|
||||||
|
g_free (profile_data);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* heif_color_profile_type_nclx (what is that?) and any future
|
||||||
|
* profile type which we don't support in GIMP (yet).
|
||||||
|
*/
|
||||||
|
g_warning ("%s: unknown color profile type has been discarded.",
|
||||||
|
G_STRFUNC);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
gimp_progress_update (0.75);
|
gimp_progress_update (0.75);
|
||||||
|
|
||||||
width = heif_image_get_width (img, heif_channel_interleaved);
|
width = heif_image_get_width (img, heif_channel_interleaved);
|
||||||
@ -490,6 +527,12 @@ load_image (GFile *file,
|
|||||||
image_ID = gimp_image_new (width, height, GIMP_RGB);
|
image_ID = gimp_image_new (width, height, GIMP_RGB);
|
||||||
gimp_image_set_filename (image_ID, g_file_get_uri (file));
|
gimp_image_set_filename (image_ID, g_file_get_uri (file));
|
||||||
|
|
||||||
|
if (profile)
|
||||||
|
{
|
||||||
|
gimp_image_set_color_profile (image_ID, profile);
|
||||||
|
g_object_unref (profile);
|
||||||
|
}
|
||||||
|
|
||||||
layer_ID = gimp_layer_new (image_ID,
|
layer_ID = gimp_layer_new (image_ID,
|
||||||
_("image content"),
|
_("image content"),
|
||||||
width, height,
|
width, height,
|
||||||
@ -622,6 +665,7 @@ save_image (GFile *file,
|
|||||||
struct heif_image_handle *handle;
|
struct heif_image_handle *handle;
|
||||||
struct heif_writer writer;
|
struct heif_writer writer;
|
||||||
struct heif_error err;
|
struct heif_error err;
|
||||||
|
GimpColorProfile *profile = NULL;
|
||||||
GOutputStream *output;
|
GOutputStream *output;
|
||||||
GeglBuffer *buffer;
|
GeglBuffer *buffer;
|
||||||
const Babl *format;
|
const Babl *format;
|
||||||
@ -634,6 +678,7 @@ save_image (GFile *file,
|
|||||||
gimp_progress_init_printf (_("Exporting '%s'"),
|
gimp_progress_init_printf (_("Exporting '%s'"),
|
||||||
g_file_get_parse_name (file));
|
g_file_get_parse_name (file));
|
||||||
|
|
||||||
|
profile = gimp_image_get_effective_color_profile (image_ID);
|
||||||
width = gimp_drawable_width (drawable_ID);
|
width = gimp_drawable_width (drawable_ID);
|
||||||
height = gimp_drawable_height (drawable_ID);
|
height = gimp_drawable_height (drawable_ID);
|
||||||
|
|
||||||
@ -646,6 +691,16 @@ save_image (GFile *file,
|
|||||||
heif_chroma_interleaved_24bit,
|
heif_chroma_interleaved_24bit,
|
||||||
&image);
|
&image);
|
||||||
|
|
||||||
|
if (profile)
|
||||||
|
{
|
||||||
|
const guint8 *icc_data;
|
||||||
|
gsize icc_length;
|
||||||
|
|
||||||
|
icc_data = gimp_color_profile_get_icc_profile (profile, &icc_length);
|
||||||
|
heif_image_set_raw_color_profile (image, "prof", icc_data, icc_length);
|
||||||
|
g_object_unref (profile);
|
||||||
|
}
|
||||||
|
|
||||||
heif_image_add_plane (image, heif_channel_interleaved,
|
heif_image_add_plane (image, heif_channel_interleaved,
|
||||||
width, height, has_alpha ? 32 : 24);
|
width, height, has_alpha ? 32 : 24);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user