jpeg tag read/write cleanups

This commit is contained in:
John Cupitt 2012-11-22 09:15:02 +00:00
parent c3ef2be4ab
commit 20ce700e23
3 changed files with 92 additions and 175 deletions

View File

@ -317,7 +317,6 @@ show_values( ExifData *data )
#endif /*HAVE_EXIF*/ #endif /*HAVE_EXIF*/
#ifdef HAVE_EXIF #ifdef HAVE_EXIF
static int static int
vips_exif_get_int( ExifData *ed, vips_exif_get_int( ExifData *ed,
ExifEntry *entry, unsigned long component, int *out ) ExifEntry *entry, unsigned long component, int *out )
@ -499,7 +498,7 @@ get_entry_int( ExifData *ed, int ifd, ExifTag tag, int *out )
} }
static void static void
set_vips_resolution( VipsImage *im, ExifData *ed ) res_from_exif( VipsImage *im, ExifData *ed )
{ {
double xres, yres; double xres, yres;
int unit; int unit;
@ -516,7 +515,7 @@ set_vips_resolution( VipsImage *im, ExifData *ed )
} }
#ifdef DEBUG #ifdef DEBUG
printf( "set_vips_resolution: seen exif tags " printf( "res_from_exif: seen exif tags "
"xres = %g, yres = %g, unit = %d\n", xres, yres, unit ); "xres = %g, yres = %g, unit = %d\n", xres, yres, unit );
#endif /*DEBUG*/ #endif /*DEBUG*/
@ -546,7 +545,7 @@ set_vips_resolution( VipsImage *im, ExifData *ed )
} }
#ifdef DEBUG #ifdef DEBUG
printf( "set_vips_resolution: seen exif resolution %g, %g p/mm\n", printf( "res_from_exif: seen exif resolution %g, %g p/mm\n",
xres, yres ); xres, yres );
#endif /*DEBUG*/ #endif /*DEBUG*/
@ -572,32 +571,8 @@ attach_thumbnail( VipsImage *im, ExifData *ed )
#endif /*HAVE_EXIF*/ #endif /*HAVE_EXIF*/
static int static int
read_exif( VipsImage *im, void *data, int data_length ) parse_exif( VipsImage *im, void *data, int data_length )
{ {
char *data_copy;
/* Only use the first one.
*/
if( vips_image_get_typeof( im, VIPS_META_EXIF_NAME ) ) {
#ifdef DEBUG
printf( "read_exif: second EXIF block, ignoring\n" );
#endif /*DEBUG*/
return( 0 );
}
#ifdef DEBUG
printf( "read_exif: attaching %d bytes of exif\n", data_length );
#endif /*DEBUG*/
/* Always attach a copy of the unparsed exif data.
*/
if( !(data_copy = vips_malloc( NULL, data_length )) )
return( -1 );
memcpy( data_copy, data, data_length );
vips_image_set_blob( im, VIPS_META_EXIF_NAME,
(VipsCallbackFn) vips_free, data_copy, data_length );
#ifdef HAVE_EXIF #ifdef HAVE_EXIF
{ {
ExifData *ed; ExifData *ed;
@ -628,7 +603,7 @@ read_exif( VipsImage *im, void *data, int data_length )
/* Look for resolution fields and use them to set the VIPS /* Look for resolution fields and use them to set the VIPS
* xres/yres fields. * xres/yres fields.
*/ */
set_vips_resolution( im, ed ); res_from_exif( im, ed );
attach_thumbnail( im, ed ); attach_thumbnail( im, ed );
@ -640,22 +615,22 @@ read_exif( VipsImage *im, void *data, int data_length )
} }
static int static int
read_xmp( VipsImage *im, void *data, size_t data_length ) attach_blob( VipsImage *im, const char *field, void *data, int data_length )
{ {
char *data_copy; char *data_copy;
/* XMP sections start "http". Only use the first one. /* Only use the first one.
*/ */
if( vips_image_get_typeof( im, VIPS_META_XMP_NAME ) ) { if( vips_image_get_typeof( im, field ) ) {
#ifdef DEBUG #ifdef DEBUG
printf( "read_xmp: second XMP block, ignoring\n" ); printf( "attach_blob: second %s block, ignoring\n", field );
#endif /*DEBUG*/ #endif /*DEBUG*/
return( 0 ); return( 0 );
} }
#ifdef DEBUG #ifdef DEBUG
printf( "read_xmp: attaching %zd bytes of XMP\n", data_length ); printf( "attach_blob: attaching %d bytes of %s\n", data_length, field );
#endif /*DEBUG*/ #endif /*DEBUG*/
/* Always attach a copy of the unparsed exif data. /* Always attach a copy of the unparsed exif data.
@ -663,35 +638,7 @@ read_xmp( VipsImage *im, void *data, size_t data_length )
if( !(data_copy = vips_malloc( NULL, data_length )) ) if( !(data_copy = vips_malloc( NULL, data_length )) )
return( -1 ); return( -1 );
memcpy( data_copy, data, data_length ); memcpy( data_copy, data, data_length );
vips_image_set_blob( im, VIPS_META_XMP_NAME, vips_image_set_blob( im, field,
(VipsCallbackFn) vips_free, data_copy, data_length );
return( 0 );
}
static int
read_ipct( VipsImage *im, void *data, size_t data_length )
{
char *data_copy;
/* Only use the first one.
*/
if( vips_image_get_typeof( im, VIPS_META_IPCT_NAME ) ) {
#ifdef DEBUG
printf( "read_ipct: second IPCT block, ignoring\n" );
#endif /*DEBUG*/
return( 0 );
}
#ifdef DEBUG
printf( "read_ipct: attaching %zd bytes of IPCT\n", data_length );
#endif /*DEBUG*/
if( !(data_copy = vips_malloc( NULL, data_length )) )
return( -1 );
memcpy( data_copy, data, data_length );
vips_image_set_blob( im, VIPS_META_IPCT_NAME,
(VipsCallbackFn) vips_free, data_copy, data_length ); (VipsCallbackFn) vips_free, data_copy, data_length );
return( 0 ); return( 0 );
@ -826,19 +773,24 @@ read_jpeg_header( ReadJpeg *jpeg, VipsImage *out )
/* Possible EXIF or XMP data. /* Possible EXIF or XMP data.
*/ */
if( p->data_length > 4 && if( p->data_length > 4 &&
vips_isprefix( "Exif", (char *) p->data ) && vips_isprefix( "Exif", (char *) p->data ) ) {
read_exif( out, p->data, p->data_length ) ) if( parse_exif( out,
p->data, p->data_length ) ||
attach_blob( out, VIPS_META_EXIF_NAME,
p->data, p->data_length ) )
return( -1 ); return( -1 );
}
if( p->data_length > 4 && if( p->data_length > 4 &&
vips_isprefix( "http", (char *) p->data ) && vips_isprefix( "http", (char *) p->data ) &&
read_xmp( out, p->data, p->data_length ) ) attach_blob( out, VIPS_META_XMP_NAME,
p->data, p->data_length ) )
return( -1 ); return( -1 );
break; break;
case JPEG_APP0 + 2: case JPEG_APP0 + 2:
/* ICC profile. /* Possible ICC profile.
*/ */
if( p->data_length > 14 && if( p->data_length > 14 &&
vips_isprefix( "ICC_PROFILE", vips_isprefix( "ICC_PROFILE",
@ -862,7 +814,8 @@ read_jpeg_header( ReadJpeg *jpeg, VipsImage *out )
*/ */
if( p->data_length > 5 && if( p->data_length > 5 &&
vips_isprefix( "Photo", (char *) p->data ) && vips_isprefix( "Photo", (char *) p->data ) &&
read_ipct( out, p->data, p->data_length ) ) attach_blob( out, VIPS_META_IPCT_NAME,
p->data, p->data_length ) )
return( -1 ); return( -1 );
break; break;

View File

@ -607,17 +607,37 @@ vips_exif_update( ExifData *ed, VipsImage *image )
exif_data_foreach_content( ed, exif_data_foreach_content( ed,
(ExifDataForeachContentFunc) vips_exif_update_content, &ve ); (ExifDataForeachContentFunc) vips_exif_update_content, &ve );
} }
#endif /*HAVE_EXIF*/ #endif /*HAVE_EXIF*/
static int
write_blob( Write *write, const char *field, int app )
{
unsigned char *data;
size_t data_length;
if( vips_image_get_typeof( write->in, field ) ) {
if( vips_image_get_blob( write->in, field,
(void *) &data, &data_length ) )
return( -1 );
#ifdef DEBUG
printf( "write_blob: attaching %zd bytes of %s\n",
data_length, field );
#endif /*DEBUG*/
jpeg_write_marker( &write->cinfo, app, data, data_length );
}
return( 0 );
}
static int static int
write_exif( Write *write ) write_exif( Write *write )
{ {
#ifdef HAVE_EXIF
unsigned char *data; unsigned char *data;
size_t data_length; size_t data_length;
unsigned int idl; unsigned int idl;
#ifdef HAVE_EXIF
ExifData *ed; ExifData *ed;
/* Either parse from the embedded EXIF, or if there's none, make /* Either parse from the embedded EXIF, or if there's none, make
@ -683,70 +703,13 @@ write_exif( Write *write )
#else /*!HAVE_EXIF*/ #else /*!HAVE_EXIF*/
/* No libexif ... just copy the embedded EXIF over. /* No libexif ... just copy the embedded EXIF over.
*/ */
if( vips_image_get_typeof( write->in, VIPS_META_EXIF_NAME ) ) { if( write_blob( write, VIPS_META_EXIF_NAME, JPEG_APP0 + 1 ) )
if( vips_image_get_blob( write->in, VIPS_META_EXIF_NAME, return( -1 );
(void *) &data, &data_length ) )
return( -1 );
#ifdef DEBUG
printf( "write_exif: attaching %zd bytes of EXIF\n",
data_length );
#endif /*DEBUG*/
jpeg_write_marker( &write->cinfo, JPEG_APP0 + 1,
data, data_length );
}
#endif /*!HAVE_EXIF*/ #endif /*!HAVE_EXIF*/
return( 0 ); return( 0 );
} }
static int
write_xmp( Write *write )
{
unsigned char *data;
size_t data_length;
if( vips_image_get_typeof( write->in, VIPS_META_XMP_NAME ) ) {
if( vips_image_get_blob( write->in, VIPS_META_XMP_NAME,
(void *) &data, &data_length ) )
return( -1 );
#ifdef DEBUG
printf( "write_xmp: attaching %zd bytes of XMP\n",
data_length );
#endif /*DEBUG*/
jpeg_write_marker( &write->cinfo, JPEG_APP0 + 1,
data, data_length );
}
return( 0 );
}
static int
write_ipct( Write *write )
{
unsigned char *data;
size_t data_length;
if( vips_image_get_typeof( write->in, VIPS_META_IPCT_NAME ) ) {
if( vips_image_get_blob( write->in, VIPS_META_IPCT_NAME,
(void *) &data, &data_length ) )
return( -1 );
#ifdef DEBUG
printf( "write_ipct: attaching %zd bytes of IPCT\n",
data_length );
#endif /*DEBUG*/
jpeg_write_marker( &write->cinfo, JPEG_APP0 + 13,
data, data_length );
}
return( 0 );
}
/* ICC writer from lcms, slight tweaks. /* ICC writer from lcms, slight tweaks.
*/ */
@ -943,8 +906,8 @@ write_vips( Write *write, int qfac, const char *profile )
/* Write any APP markers we need. /* Write any APP markers we need.
*/ */
if( write_exif( write ) || if( write_exif( write ) ||
write_xmp( write ) || write_blob( write, VIPS_META_XMP_NAME, JPEG_APP0 + 1 ) ||
write_ipct( write ) ) write_blob( write, VIPS_META_IPCT_NAME, JPEG_APP0 + 13 ) )
return( -1 ); return( -1 );
/* A profile supplied as an argument overrides an embedded profile. /* A profile supplied as an argument overrides an embedded profile.

View File

@ -7,8 +7,9 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"POT-Creation-Date: 2012-11-16 21:34+0000\n" "product=glib&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-11-21 21:39+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -628,117 +629,117 @@ msgstr ""
msgid "calculate dE00" msgid "calculate dE00"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:194 ../libvips/colour/XYZ2sRGB.c:160 #: ../libvips/colour/icc_transform.c:193 ../libvips/colour/XYZ2sRGB.c:160
msgid "depth must be 8 or 16" msgid "depth must be 8 or 16"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:229 #: ../libvips/colour/icc_transform.c:228
#, c-format #, c-format
msgid "unimplemented input color space 0x%x" msgid "unimplemented input color space 0x%x"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:271 #: ../libvips/colour/icc_transform.c:270
#, c-format #, c-format
msgid "unimplemented output color space 0x%x" msgid "unimplemented output color space 0x%x"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:283 #: ../libvips/colour/icc_transform.c:282
msgid "no device profile" msgid "no device profile"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:314 #: ../libvips/colour/icc_transform.c:313
msgid "transform using ICC profiles" msgid "transform using ICC profiles"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:318 #: ../libvips/colour/icc_transform.c:317
msgid "Intent" msgid "Intent"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:319 #: ../libvips/colour/icc_transform.c:318
msgid "Rendering intent" msgid "Rendering intent"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:362 #: ../libvips/colour/icc_transform.c:361
#, c-format #, c-format
msgid "" msgid ""
"intent %d (%s) not supported by %s profile; falling back to default intent" "intent %d (%s) not supported by %s profile; falling back to default intent"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:366 ../libvips/iofuncs/operation.c:98 #: ../libvips/colour/icc_transform.c:365 ../libvips/iofuncs/operation.c:98
msgid "input" msgid "input"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:366 ../libvips/iofuncs/operation.c:98 #: ../libvips/colour/icc_transform.c:365 ../libvips/iofuncs/operation.c:98
msgid "output" msgid "output"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:400 ../libvips/colour/icc_transform.c:601 #: ../libvips/colour/icc_transform.c:399 ../libvips/colour/icc_transform.c:600
#: ../libvips/colour/icc_transform.c:812 #: ../libvips/colour/icc_transform.c:811
msgid "unable to load embedded profile" msgid "unable to load embedded profile"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:408 ../libvips/colour/icc_transform.c:609 #: ../libvips/colour/icc_transform.c:407 ../libvips/colour/icc_transform.c:608
#: ../libvips/colour/icc_transform.c:820 ../libvips/colour/icc_transform.c:834 #: ../libvips/colour/icc_transform.c:819 ../libvips/colour/icc_transform.c:833
#, c-format #, c-format
msgid "unable to open profile \"%s\"" msgid "unable to open profile \"%s\""
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:414 ../libvips/colour/icc_transform.c:826 #: ../libvips/colour/icc_transform.c:413 ../libvips/colour/icc_transform.c:825
msgid "no input profile" msgid "no input profile"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:498 #: ../libvips/colour/icc_transform.c:497
msgid "import from device with ICC profile" msgid "import from device with ICC profile"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:504 ../libvips/colour/icc_transform.c:896 #: ../libvips/colour/icc_transform.c:503 ../libvips/colour/icc_transform.c:895
msgid "Embedded" msgid "Embedded"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:505 ../libvips/colour/icc_transform.c:897 #: ../libvips/colour/icc_transform.c:504 ../libvips/colour/icc_transform.c:896
msgid "Use embedded input profile, if available" msgid "Use embedded input profile, if available"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:511 ../libvips/colour/icc_transform.c:903 #: ../libvips/colour/icc_transform.c:510 ../libvips/colour/icc_transform.c:902
msgid "Input profile" msgid "Input profile"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:512 ../libvips/colour/icc_transform.c:904 #: ../libvips/colour/icc_transform.c:511 ../libvips/colour/icc_transform.c:903
msgid "Filename to load input profile from" msgid "Filename to load input profile from"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:617 #: ../libvips/colour/icc_transform.c:616
msgid "no output profile" msgid "no output profile"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:711 #: ../libvips/colour/icc_transform.c:710
msgid "output to device with ICC profile" msgid "output to device with ICC profile"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:717 ../libvips/colour/icc_transform.c:889 #: ../libvips/colour/icc_transform.c:716 ../libvips/colour/icc_transform.c:888
msgid "Output profile" msgid "Output profile"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:718 ../libvips/colour/icc_transform.c:890 #: ../libvips/colour/icc_transform.c:717 ../libvips/colour/icc_transform.c:889
msgid "Filename to load output profile from" msgid "Filename to load output profile from"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:724 ../libvips/colour/icc_transform.c:910 #: ../libvips/colour/icc_transform.c:723 ../libvips/colour/icc_transform.c:909
#: ../libvips/colour/XYZ2sRGB.c:187 ../libvips/foreign/dzsave.c:1193 #: ../libvips/colour/XYZ2sRGB.c:187 ../libvips/foreign/dzsave.c:1193
msgid "Depth" msgid "Depth"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:725 ../libvips/colour/icc_transform.c:911 #: ../libvips/colour/icc_transform.c:724 ../libvips/colour/icc_transform.c:910
#: ../libvips/colour/XYZ2sRGB.c:188 #: ../libvips/colour/XYZ2sRGB.c:188
msgid "Output device space depth in bits" msgid "Output device space depth in bits"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:883 #: ../libvips/colour/icc_transform.c:882
msgid "transform between devices with ICC profiles" msgid "transform between devices with ICC profiles"
msgstr "" msgstr ""
#: ../libvips/colour/icc_transform.c:999 #: ../libvips/colour/icc_transform.c:998
#: ../libvips/colour/icc_transform.c:1013 #: ../libvips/colour/icc_transform.c:1012
msgid "unable to get media white point" msgid "unable to get media white point"
msgstr "" msgstr ""
@ -1409,20 +1410,20 @@ msgstr ""
msgid "parameters would result in zero size output image" msgid "parameters would result in zero size output image"
msgstr "" msgstr ""
#: ../libvips/foreign/jpeg2vips.c:171 #: ../libvips/foreign/jpeg2vips.c:174
#, c-format #, c-format
msgid "read gave %ld warnings" msgid "read gave %ld warnings"
msgstr "" msgstr ""
#: ../libvips/foreign/jpeg2vips.c:511 #: ../libvips/foreign/jpeg2vips.c:514
msgid "error reading resolution" msgid "error reading resolution"
msgstr "" msgstr ""
#: ../libvips/foreign/jpeg2vips.c:541 ../libvips/foreign/vips2jpeg.c:479 #: ../libvips/foreign/jpeg2vips.c:544 ../libvips/foreign/vips2jpeg.c:481
msgid "unknown EXIF resolution unit" msgid "unknown EXIF resolution unit"
msgstr "" msgstr ""
#: ../libvips/foreign/jpeg2vips.c:754 #: ../libvips/foreign/jpeg2vips.c:782
msgid "unknown JFIF resolution unit" msgid "unknown JFIF resolution unit"
msgstr "" msgstr ""
@ -1434,20 +1435,20 @@ msgstr ""
msgid "read error" msgid "read error"
msgstr "" msgstr ""
#: ../libvips/foreign/vips2jpeg.c:139 #: ../libvips/foreign/vips2jpeg.c:141
#, c-format #, c-format
msgid "%s" msgid "%s"
msgstr "" msgstr ""
#: ../libvips/foreign/vips2jpeg.c:493 #: ../libvips/foreign/vips2jpeg.c:495
msgid "error setting JPEG resolution" msgid "error setting JPEG resolution"
msgstr "" msgstr ""
#: ../libvips/foreign/vips2jpeg.c:513 #: ../libvips/foreign/vips2jpeg.c:515
msgid "error setting JPEG dimensions" msgid "error setting JPEG dimensions"
msgstr "" msgstr ""
#: ../libvips/foreign/vips2jpeg.c:668 #: ../libvips/foreign/vips2jpeg.c:670
msgid "error saving EXIF" msgid "error saving EXIF"
msgstr "" msgstr ""
@ -2184,21 +2185,21 @@ msgstr ""
msgid "unable to read pixels" msgid "unable to read pixels"
msgstr "" msgstr ""
#: ../libvips/foreign/magick2vips.c:658 #: ../libvips/foreign/magick2vips.c:662
#, c-format #, c-format
msgid "" msgid ""
"unable to read file \"%s\"\n" "unable to read file \"%s\"\n"
"libMagick error: %s %s" "libMagick error: %s %s"
msgstr "" msgstr ""
#: ../libvips/foreign/magick2vips.c:692 #: ../libvips/foreign/magick2vips.c:700
#, c-format #, c-format
msgid "" msgid ""
"unable to ping file \"%s\"\n" "unable to ping file \"%s\"\n"
"libMagick error: %s %s" "libMagick error: %s %s"
msgstr "" msgstr ""
#: ../libvips/foreign/magick2vips.c:703 #: ../libvips/foreign/magick2vips.c:711
msgid "bad image size" msgid "bad image size"
msgstr "" msgstr ""