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*/
#ifdef HAVE_EXIF
static int
vips_exif_get_int( ExifData *ed,
ExifEntry *entry, unsigned long component, int *out )
@ -499,7 +498,7 @@ get_entry_int( ExifData *ed, int ifd, ExifTag tag, int *out )
}
static void
set_vips_resolution( VipsImage *im, ExifData *ed )
res_from_exif( VipsImage *im, ExifData *ed )
{
double xres, yres;
int unit;
@ -516,7 +515,7 @@ set_vips_resolution( VipsImage *im, ExifData *ed )
}
#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 );
#endif /*DEBUG*/
@ -546,7 +545,7 @@ set_vips_resolution( VipsImage *im, ExifData *ed )
}
#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 );
#endif /*DEBUG*/
@ -572,32 +571,8 @@ attach_thumbnail( VipsImage *im, ExifData *ed )
#endif /*HAVE_EXIF*/
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
{
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
* xres/yres fields.
*/
set_vips_resolution( im, ed );
res_from_exif( im, ed );
attach_thumbnail( im, ed );
@ -640,22 +615,22 @@ read_exif( VipsImage *im, void *data, int data_length )
}
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;
/* 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
printf( "read_xmp: second XMP block, ignoring\n" );
printf( "attach_blob: second %s block, ignoring\n", field );
#endif /*DEBUG*/
return( 0 );
}
#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*/
/* 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 )) )
return( -1 );
memcpy( data_copy, data, data_length );
vips_image_set_blob( im, VIPS_META_XMP_NAME,
(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,
vips_image_set_blob( im, field,
(VipsCallbackFn) vips_free, data_copy, data_length );
return( 0 );
@ -826,19 +773,24 @@ read_jpeg_header( ReadJpeg *jpeg, VipsImage *out )
/* Possible EXIF or XMP data.
*/
if( p->data_length > 4 &&
vips_isprefix( "Exif", (char *) p->data ) &&
read_exif( out, p->data, p->data_length ) )
vips_isprefix( "Exif", (char *) p->data ) ) {
if( parse_exif( out,
p->data, p->data_length ) ||
attach_blob( out, VIPS_META_EXIF_NAME,
p->data, p->data_length ) )
return( -1 );
}
if( p->data_length > 4 &&
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 );
break;
case JPEG_APP0 + 2:
/* ICC profile.
/* Possible ICC profile.
*/
if( p->data_length > 14 &&
vips_isprefix( "ICC_PROFILE",
@ -862,7 +814,8 @@ read_jpeg_header( ReadJpeg *jpeg, VipsImage *out )
*/
if( p->data_length > 5 &&
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 );
break;

View File

@ -607,17 +607,37 @@ vips_exif_update( ExifData *ed, VipsImage *image )
exif_data_foreach_content( ed,
(ExifDataForeachContentFunc) vips_exif_update_content, &ve );
}
#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
write_exif( Write *write )
{
#ifdef HAVE_EXIF
unsigned char *data;
size_t data_length;
unsigned int idl;
#ifdef HAVE_EXIF
ExifData *ed;
/* Either parse from the embedded EXIF, or if there's none, make
@ -683,70 +703,13 @@ write_exif( Write *write )
#else /*!HAVE_EXIF*/
/* No libexif ... just copy the embedded EXIF over.
*/
if( vips_image_get_typeof( write->in, VIPS_META_EXIF_NAME ) ) {
if( vips_image_get_blob( write->in, VIPS_META_EXIF_NAME,
(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 );
}
if( write_blob( write, VIPS_META_EXIF_NAME, JPEG_APP0 + 1 ) )
return( -1 );
#endif /*!HAVE_EXIF*/
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.
*/
@ -943,8 +906,8 @@ write_vips( Write *write, int qfac, const char *profile )
/* Write any APP markers we need.
*/
if( write_exif( write ) ||
write_xmp( write ) ||
write_ipct( write ) )
write_blob( write, VIPS_META_XMP_NAME, JPEG_APP0 + 1 ) ||
write_blob( write, VIPS_META_IPCT_NAME, JPEG_APP0 + 13 ) )
return( -1 );
/* A profile supplied as an argument overrides an embedded profile.

View File

@ -7,8 +7,9 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-11-16 21:34+0000\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -628,117 +629,117 @@ msgstr ""
msgid "calculate dE00"
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"
msgstr ""
#: ../libvips/colour/icc_transform.c:229
#: ../libvips/colour/icc_transform.c:228
#, c-format
msgid "unimplemented input color space 0x%x"
msgstr ""
#: ../libvips/colour/icc_transform.c:271
#: ../libvips/colour/icc_transform.c:270
#, c-format
msgid "unimplemented output color space 0x%x"
msgstr ""
#: ../libvips/colour/icc_transform.c:283
#: ../libvips/colour/icc_transform.c:282
msgid "no device profile"
msgstr ""
#: ../libvips/colour/icc_transform.c:314
#: ../libvips/colour/icc_transform.c:313
msgid "transform using ICC profiles"
msgstr ""
#: ../libvips/colour/icc_transform.c:318
#: ../libvips/colour/icc_transform.c:317
msgid "Intent"
msgstr ""
#: ../libvips/colour/icc_transform.c:319
#: ../libvips/colour/icc_transform.c:318
msgid "Rendering intent"
msgstr ""
#: ../libvips/colour/icc_transform.c:362
#: ../libvips/colour/icc_transform.c:361
#, c-format
msgid ""
"intent %d (%s) not supported by %s profile; falling back to default intent"
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"
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"
msgstr ""
#: ../libvips/colour/icc_transform.c:400 ../libvips/colour/icc_transform.c:601
#: ../libvips/colour/icc_transform.c:812
#: ../libvips/colour/icc_transform.c:399 ../libvips/colour/icc_transform.c:600
#: ../libvips/colour/icc_transform.c:811
msgid "unable to load embedded profile"
msgstr ""
#: ../libvips/colour/icc_transform.c:408 ../libvips/colour/icc_transform.c:609
#: ../libvips/colour/icc_transform.c:820 ../libvips/colour/icc_transform.c:834
#: ../libvips/colour/icc_transform.c:407 ../libvips/colour/icc_transform.c:608
#: ../libvips/colour/icc_transform.c:819 ../libvips/colour/icc_transform.c:833
#, c-format
msgid "unable to open profile \"%s\""
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"
msgstr ""
#: ../libvips/colour/icc_transform.c:498
#: ../libvips/colour/icc_transform.c:497
msgid "import from device with ICC profile"
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"
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"
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"
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"
msgstr ""
#: ../libvips/colour/icc_transform.c:617
#: ../libvips/colour/icc_transform.c:616
msgid "no output profile"
msgstr ""
#: ../libvips/colour/icc_transform.c:711
#: ../libvips/colour/icc_transform.c:710
msgid "output to device with ICC profile"
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"
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"
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
msgid "Depth"
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
msgid "Output device space depth in bits"
msgstr ""
#: ../libvips/colour/icc_transform.c:883
#: ../libvips/colour/icc_transform.c:882
msgid "transform between devices with ICC profiles"
msgstr ""
#: ../libvips/colour/icc_transform.c:999
#: ../libvips/colour/icc_transform.c:1013
#: ../libvips/colour/icc_transform.c:998
#: ../libvips/colour/icc_transform.c:1012
msgid "unable to get media white point"
msgstr ""
@ -1409,20 +1410,20 @@ msgstr ""
msgid "parameters would result in zero size output image"
msgstr ""
#: ../libvips/foreign/jpeg2vips.c:171
#: ../libvips/foreign/jpeg2vips.c:174
#, c-format
msgid "read gave %ld warnings"
msgstr ""
#: ../libvips/foreign/jpeg2vips.c:511
#: ../libvips/foreign/jpeg2vips.c:514
msgid "error reading resolution"
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"
msgstr ""
#: ../libvips/foreign/jpeg2vips.c:754
#: ../libvips/foreign/jpeg2vips.c:782
msgid "unknown JFIF resolution unit"
msgstr ""
@ -1434,20 +1435,20 @@ msgstr ""
msgid "read error"
msgstr ""
#: ../libvips/foreign/vips2jpeg.c:139
#: ../libvips/foreign/vips2jpeg.c:141
#, c-format
msgid "%s"
msgstr ""
#: ../libvips/foreign/vips2jpeg.c:493
#: ../libvips/foreign/vips2jpeg.c:495
msgid "error setting JPEG resolution"
msgstr ""
#: ../libvips/foreign/vips2jpeg.c:513
#: ../libvips/foreign/vips2jpeg.c:515
msgid "error setting JPEG dimensions"
msgstr ""
#: ../libvips/foreign/vips2jpeg.c:668
#: ../libvips/foreign/vips2jpeg.c:670
msgid "error saving EXIF"
msgstr ""
@ -2184,21 +2185,21 @@ msgstr ""
msgid "unable to read pixels"
msgstr ""
#: ../libvips/foreign/magick2vips.c:658
#: ../libvips/foreign/magick2vips.c:662
#, c-format
msgid ""
"unable to read file \"%s\"\n"
"libMagick error: %s %s"
msgstr ""
#: ../libvips/foreign/magick2vips.c:692
#: ../libvips/foreign/magick2vips.c:700
#, c-format
msgid ""
"unable to ping file \"%s\"\n"
"libMagick error: %s %s"
msgstr ""
#: ../libvips/foreign/magick2vips.c:703
#: ../libvips/foreign/magick2vips.c:711
msgid "bad image size"
msgstr ""