file-jpeg: fix loading of photoshop path split across multiple segments
Some JPEGs contain large Photoshop path metadata split across multiple APP13 markers. Collect all APP13 payloads and skip the repeated "Photoshop 3.0\0" identifier for subsequent segments so the metadata can be parsed as a single stream.
This commit is contained in:
parent
5013aca0d4
commit
4576f5a2f1
2 changed files with 16 additions and 10 deletions
|
|
@ -78,8 +78,8 @@ load_image (GFile *file,
|
|||
GimpColorProfile *cmyk_profile = NULL;
|
||||
gint tile_height;
|
||||
gint i;
|
||||
guchar *photoshop_data = NULL;
|
||||
guint photoshop_len = 0;
|
||||
gchar *photoshop_data = NULL;
|
||||
gint32 photoshop_len = 0;
|
||||
gboolean support_12_bit = FALSE;
|
||||
|
||||
#if LIBJPEG_TURBO_VERSION_NUMBER >= 3000000
|
||||
|
|
@ -299,15 +299,22 @@ load_image (GFile *file,
|
|||
}
|
||||
else if (marker->marker == JPEG_APP0 + 13)
|
||||
{
|
||||
photoshop_data = g_new (guchar, len);
|
||||
photoshop_len = len;
|
||||
memcpy (photoshop_data, (guchar *) marker->data, len);
|
||||
photoshop_data = g_realloc (photoshop_data,
|
||||
(gsize) photoshop_len + len - sizeof (JPEG_APP_HEADER_PS));
|
||||
|
||||
*ps_metadata_loaded = TRUE;
|
||||
memcpy (photoshop_data + photoshop_len,
|
||||
data + sizeof (JPEG_APP_HEADER_PS),
|
||||
len - sizeof (JPEG_APP_HEADER_PS));
|
||||
|
||||
photoshop_len += len;
|
||||
photoshop_len -= sizeof (JPEG_APP_HEADER_PS);
|
||||
|
||||
if (ps_metadata_loaded)
|
||||
*ps_metadata_loaded = TRUE;
|
||||
|
||||
#ifdef GIMP_UNSTABLE
|
||||
g_print ("jpeg-load: found Photoshop block (%d bytes) %s\n",
|
||||
(gint) (len - sizeof (JPEG_APP_HEADER_EXIF)), data);
|
||||
(gint) (len - sizeof (JPEG_APP_HEADER_PS)), data);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
@ -574,9 +581,7 @@ load_image (GFile *file,
|
|||
g_strerror (errno));
|
||||
}
|
||||
|
||||
fwrite (photoshop_data + (sizeof (JPEG_APP_HEADER_EXIF) * 2),
|
||||
sizeof (guchar), photoshop_len - sizeof (JPEG_APP_HEADER_EXIF),
|
||||
fp);
|
||||
fwrite (photoshop_data, sizeof (guchar), photoshop_len, fp);
|
||||
fclose (fp);
|
||||
|
||||
g_free (photoshop_data);
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
/* headers used in some APPn markers */
|
||||
#define JPEG_APP_HEADER_EXIF "Exif\0\0"
|
||||
#define JPEG_APP_HEADER_XMP "http://ns.adobe.com/xap/1.0/"
|
||||
#define JPEG_APP_HEADER_PS "Photoshop 3.0"
|
||||
|
||||
typedef struct my_error_mgr
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue