Avoid double CM in saved WebPs
This commit is contained in:
		
							
								
								
									
										42
									
								
								fiv-io.c
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								fiv-io.c
									
									
									
									
									
								
							@@ -206,6 +206,24 @@ fiv_io_profile_new_from_bytes(GBytes *bytes)
 | 
			
		||||
	return fiv_io_profile_new(p, len);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GBytes *
 | 
			
		||||
fiv_io_profile_to_bytes(FivIoProfile profile)
 | 
			
		||||
{
 | 
			
		||||
#ifdef HAVE_LCMS2
 | 
			
		||||
	cmsUInt32Number len = 0;
 | 
			
		||||
	(void) cmsSaveProfileToMem(profile, NULL, &len);
 | 
			
		||||
	gchar *data = g_malloc0(len);
 | 
			
		||||
	if (!cmsSaveProfileToMem(profile, data, &len)) {
 | 
			
		||||
		g_free(data);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	return g_bytes_new_take(data, len);
 | 
			
		||||
#else
 | 
			
		||||
	(void) profile;
 | 
			
		||||
	return NULL;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
fiv_io_profile_free(FivIoProfile self)
 | 
			
		||||
{
 | 
			
		||||
@@ -2490,10 +2508,8 @@ encode_webp_animation(WebPMux *mux, cairo_surface_t *page)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
transfer_metadata(WebPMux *mux, const char *fourcc, cairo_surface_t *page,
 | 
			
		||||
	const cairo_user_data_key_t *kind)
 | 
			
		||||
set_metadata(WebPMux *mux, const char *fourcc, GBytes *data)
 | 
			
		||||
{
 | 
			
		||||
	GBytes *data = cairo_surface_get_user_data(page, kind);
 | 
			
		||||
	if (!data)
 | 
			
		||||
		return TRUE;
 | 
			
		||||
 | 
			
		||||
@@ -2504,8 +2520,8 @@ transfer_metadata(WebPMux *mux, const char *fourcc, cairo_surface_t *page,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
fiv_io_save(cairo_surface_t *page, cairo_surface_t *frame, const gchar *path,
 | 
			
		||||
	GError **error)
 | 
			
		||||
fiv_io_save(cairo_surface_t *page, cairo_surface_t *frame, FivIoProfile target,
 | 
			
		||||
	const gchar *path, GError **error)
 | 
			
		||||
{
 | 
			
		||||
	g_return_val_if_fail(page != NULL, FALSE);
 | 
			
		||||
	g_return_val_if_fail(path != NULL, FALSE);
 | 
			
		||||
@@ -2519,9 +2535,16 @@ fiv_io_save(cairo_surface_t *page, cairo_surface_t *frame, const gchar *path,
 | 
			
		||||
	else
 | 
			
		||||
		ok = encode_webp_animation(mux, page);
 | 
			
		||||
 | 
			
		||||
	ok = ok && transfer_metadata(mux, "EXIF", page, &fiv_io_key_exif);
 | 
			
		||||
	ok = ok && transfer_metadata(mux, "ICCP", page, &fiv_io_key_icc);
 | 
			
		||||
	ok = ok && transfer_metadata(mux, "XMP ", page, &fiv_io_key_xmp);
 | 
			
		||||
	ok = ok && set_metadata(mux, "EXIF",
 | 
			
		||||
		cairo_surface_get_user_data(page, &fiv_io_key_exif));
 | 
			
		||||
	ok = ok && set_metadata(mux, "ICCP",
 | 
			
		||||
		cairo_surface_get_user_data(page, &fiv_io_key_icc));
 | 
			
		||||
	ok = ok && set_metadata(mux, "XMP ",
 | 
			
		||||
		cairo_surface_get_user_data(page, &fiv_io_key_xmp));
 | 
			
		||||
 | 
			
		||||
	GBytes *iccp = NULL;
 | 
			
		||||
	if (ok && target && (iccp = fiv_io_profile_to_bytes(target)))
 | 
			
		||||
		ok = set_metadata(mux, "ICCP", iccp);
 | 
			
		||||
 | 
			
		||||
	WebPData assembled = {};
 | 
			
		||||
	WebPDataInit(&assembled);
 | 
			
		||||
@@ -2531,6 +2554,9 @@ fiv_io_save(cairo_surface_t *page, cairo_surface_t *frame, const gchar *path,
 | 
			
		||||
		ok = g_file_set_contents(
 | 
			
		||||
			path, (const gchar *) assembled.bytes, assembled.size, error);
 | 
			
		||||
 | 
			
		||||
	if (iccp)
 | 
			
		||||
		g_bytes_unref(iccp);
 | 
			
		||||
 | 
			
		||||
	WebPMuxDelete(mux);
 | 
			
		||||
	WebPDataClear(&assembled);
 | 
			
		||||
	return ok;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user