Merge branch '8.10'
This commit is contained in:
commit
f116d0b8e2
@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
6/9/20 started 8.10.2
|
6/9/20 started 8.10.2
|
||||||
- update magicksave/load profile handling [kelilevi]
|
- update magicksave/load profile handling [kelilevi]
|
||||||
|
- better demand hint rules [kaas3000]
|
||||||
|
- in jpegsave, don't set JFIF resolution if we set EXIF resolution
|
||||||
|
|
||||||
9/8/20 started 8.10.1
|
9/8/20 started 8.10.1
|
||||||
- fix markdown -> xml conversion in doc generation
|
- fix markdown -> xml conversion in doc generation
|
||||||
|
@ -108,6 +108,8 @@
|
|||||||
* - revise for source IO
|
* - revise for source IO
|
||||||
* 5/5/20 angelmixu
|
* 5/5/20 angelmixu
|
||||||
* - better handling of JFIF res unit 0
|
* - better handling of JFIF res unit 0
|
||||||
|
* 13/9/20
|
||||||
|
* - set resolution unit from JFIF
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -506,6 +508,13 @@ read_jpeg_header( ReadJpeg *jpeg, VipsImage *out )
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
if( cinfo->saw_JFIF_marker )
|
||||||
|
printf( "read_jpeg_header: jfif _density %d, %d, unit %d\n",
|
||||||
|
cinfo->X_density, cinfo->Y_density,
|
||||||
|
cinfo->density_unit );
|
||||||
|
#endif /*DEBUG*/
|
||||||
|
|
||||||
/* Get the jfif resolution. exif may overwrite this later. Default to
|
/* Get the jfif resolution. exif may overwrite this later. Default to
|
||||||
* 72dpi (as EXIF does).
|
* 72dpi (as EXIF does).
|
||||||
*/
|
*/
|
||||||
@ -514,12 +523,6 @@ read_jpeg_header( ReadJpeg *jpeg, VipsImage *out )
|
|||||||
if( cinfo->saw_JFIF_marker &&
|
if( cinfo->saw_JFIF_marker &&
|
||||||
cinfo->X_density != 1U &&
|
cinfo->X_density != 1U &&
|
||||||
cinfo->Y_density != 1U ) {
|
cinfo->Y_density != 1U ) {
|
||||||
#ifdef DEBUG
|
|
||||||
printf( "read_jpeg_header: jfif _density %d, %d, unit %d\n",
|
|
||||||
cinfo->X_density, cinfo->Y_density,
|
|
||||||
cinfo->density_unit );
|
|
||||||
#endif /*DEBUG*/
|
|
||||||
|
|
||||||
switch( cinfo->density_unit ) {
|
switch( cinfo->density_unit ) {
|
||||||
case 0:
|
case 0:
|
||||||
/* X_density / Y_density gives the pixel aspect ratio.
|
/* X_density / Y_density gives the pixel aspect ratio.
|
||||||
@ -535,6 +538,8 @@ read_jpeg_header( ReadJpeg *jpeg, VipsImage *out )
|
|||||||
*/
|
*/
|
||||||
xres = cinfo->X_density / 25.4;
|
xres = cinfo->X_density / 25.4;
|
||||||
yres = cinfo->Y_density / 25.4;
|
yres = cinfo->Y_density / 25.4;
|
||||||
|
vips_image_set_string( out,
|
||||||
|
VIPS_META_RESOLUTION_UNIT, "in" );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
@ -542,6 +547,8 @@ read_jpeg_header( ReadJpeg *jpeg, VipsImage *out )
|
|||||||
*/
|
*/
|
||||||
xres = cinfo->X_density / 10.0;
|
xres = cinfo->X_density / 10.0;
|
||||||
yres = cinfo->Y_density / 10.0;
|
yres = cinfo->Y_density / 10.0;
|
||||||
|
vips_image_set_string( out,
|
||||||
|
VIPS_META_RESOLUTION_UNIT, "cm" );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -94,6 +94,8 @@
|
|||||||
* - revise for target IO
|
* - revise for target IO
|
||||||
* 18/2/20 Elad-Laufer
|
* 18/2/20 Elad-Laufer
|
||||||
* - add subsample_mode, deprecate no_subsample
|
* - add subsample_mode, deprecate no_subsample
|
||||||
|
* 13/9/20
|
||||||
|
* - only write JFIF resolution if we don't have EXIF
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -412,6 +414,59 @@ write_profile_data (j_compress_ptr cinfo,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef HAVE_EXIF
|
||||||
|
/* Set the JFIF resolution from the vips xres/yres tags.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
vips_jfif_resolution_from_image( struct jpeg_compress_struct *cinfo,
|
||||||
|
VipsImage *image )
|
||||||
|
{
|
||||||
|
int xres, yres;
|
||||||
|
const char *p;
|
||||||
|
int unit;
|
||||||
|
|
||||||
|
/* Default to inches, more progs support it.
|
||||||
|
*/
|
||||||
|
unit = 1;
|
||||||
|
if( vips_image_get_typeof( image, VIPS_META_RESOLUTION_UNIT ) &&
|
||||||
|
!vips_image_get_string( image,
|
||||||
|
VIPS_META_RESOLUTION_UNIT, &p ) ) {
|
||||||
|
if( vips_isprefix( "cm", p ) )
|
||||||
|
unit = 2;
|
||||||
|
else if( vips_isprefix( "none", p ) )
|
||||||
|
unit = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch( unit ) {
|
||||||
|
case 0:
|
||||||
|
xres = VIPS_RINT( image->Xres );
|
||||||
|
yres = VIPS_RINT( image->Yres );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
xres = VIPS_RINT( image->Xres * 25.4 );
|
||||||
|
yres = VIPS_RINT( image->Yres * 25.4 );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
xres = VIPS_RINT( image->Xres * 10.0 );
|
||||||
|
yres = VIPS_RINT( image->Yres * 10.0 );
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
g_assert_not_reached();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
VIPS_DEBUG_MSG( "vips_jfif_resolution_from_image: "
|
||||||
|
"setting xres = %d, yres = %d, unit = %d\n", xres, yres, unit );
|
||||||
|
|
||||||
|
cinfo->density_unit = unit;
|
||||||
|
cinfo->X_density = xres;
|
||||||
|
cinfo->Y_density = yres;
|
||||||
|
}
|
||||||
|
#endif /*HAVE_EXIF*/
|
||||||
|
|
||||||
/* Write an ICC Profile from a file into the JPEG stream.
|
/* Write an ICC Profile from a file into the JPEG stream.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
@ -643,18 +698,24 @@ write_vips( Write *write, int qfac, const char *profile,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't write the APP0 JFIF headers if we are stripping.
|
/* Only write the JFIF headers if we are not stripping and we have no
|
||||||
|
* EXIF. Some readers get confused if you set both.
|
||||||
*/
|
*/
|
||||||
if( strip )
|
write->cinfo.write_JFIF_header = FALSE;
|
||||||
write->cinfo.write_JFIF_header = FALSE;
|
#ifndef HAVE_EXIF
|
||||||
|
if( !strip ) {
|
||||||
|
vips_jfif_resolution_from_image( &write->cinfo, write->in );
|
||||||
|
write->cinfo.write_JFIF_header = TRUE;
|
||||||
|
}
|
||||||
|
#endif /*HAVE_EXIF*/
|
||||||
|
|
||||||
/* Build compress tables.
|
/* Write app0 and build compress tables.
|
||||||
*/
|
*/
|
||||||
jpeg_start_compress( &write->cinfo, TRUE );
|
jpeg_start_compress( &write->cinfo, TRUE );
|
||||||
|
|
||||||
/* Write any APP markers we need.
|
/* All the other APP chunks come next.
|
||||||
*/
|
*/
|
||||||
if( !strip ) {
|
if( !strip ) {
|
||||||
/* We need to rebuild the exif data block from any exif tags
|
/* We need to rebuild the exif data block from any exif tags
|
||||||
* on the image.
|
* on the image.
|
||||||
*/
|
*/
|
||||||
|
@ -297,25 +297,18 @@ vips__demand_hint_array( VipsImage *image,
|
|||||||
if( in[i]->dhint == VIPS_DEMAND_STYLE_ANY )
|
if( in[i]->dhint == VIPS_DEMAND_STYLE_ANY )
|
||||||
nany++;
|
nany++;
|
||||||
|
|
||||||
|
/* Find the most restrictive of all the hints available to us.
|
||||||
|
*
|
||||||
|
* We have tried to be smarter about this in the past -- for example,
|
||||||
|
* detecting all ANY inputs and ignoring the hint in this case, but
|
||||||
|
* there are inevitably odd cases which cause problems. For example,
|
||||||
|
* new_from_memory, resize, affine, write_to_memory would run with
|
||||||
|
* FATSTRIP.
|
||||||
|
*/
|
||||||
set_hint = hint;
|
set_hint = hint;
|
||||||
if( len == 0 )
|
for( i = 0; i < len; i++ )
|
||||||
/* No input images? Just set the requested hint. We don't
|
set_hint = (VipsDemandStyle) VIPS_MIN(
|
||||||
* force ANY, since the operation might be something like
|
(int) set_hint, (int) in[i]->dhint );
|
||||||
* tiled read of an EXR image, where we certainly don't want
|
|
||||||
* ANY.
|
|
||||||
*/
|
|
||||||
;
|
|
||||||
else if( nany == len )
|
|
||||||
/* Special case: if all the inputs are ANY, then output can
|
|
||||||
* be ANY regardless of what this function wants.
|
|
||||||
*/
|
|
||||||
set_hint = VIPS_DEMAND_STYLE_ANY;
|
|
||||||
else
|
|
||||||
/* Find the most restrictive of all the hints available to us.
|
|
||||||
*/
|
|
||||||
for( i = 0; i < len; i++ )
|
|
||||||
set_hint = (VipsDemandStyle) VIPS_MIN(
|
|
||||||
(int) set_hint, (int) in[i]->dhint );
|
|
||||||
|
|
||||||
image->dhint = set_hint;
|
image->dhint = set_hint;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user