Merge branch '8.11'

This commit is contained in:
John Cupitt 2021-06-28 20:33:51 +01:00
commit ea5972055f
8 changed files with 61 additions and 42 deletions

View File

@ -7,6 +7,9 @@
- update libtool support in configure.ac
- more startup info if VIPS_INFO is set
- command-line programs set glib prgname (no longer set for you by VIPS_INIT)
- enable strip chopping for TIFF read [DavidStorm]
- disable modules by default for static builds [kleisauke]
- fix jpeg tiff pyramid save
14/8/20 started 8.11
- add vips_jpegload_source() and vips_svgload_source() to public C API

View File

@ -423,8 +423,15 @@ PKG_CHECK_MODULES(HAVE_CHECKED_MUL, glib-2.0 >= 2.48,
AC_MSG_CHECKING([whether to build dynamic modules])
# Disable modules by default when building static libraries
AS_IF([test x"$enable_static" = x"yes"],
[enable_modules_default=no],
[enable_modules_default=yes])
AC_ARG_ENABLE([modules],
AS_HELP_STRING([--disable-modules], [disable dynamic modules (default: enabled)]))
AS_HELP_STRING([--disable-modules], [disable dynamic modules (default: test)]),
[enable_modules="$enableval"],
[enable_modules="$enable_modules_default"])
gmodule_supported_bool=false
gmodule_supported_flag=no

View File

@ -245,9 +245,11 @@ vips_foreign_load_svg_get_flags( VipsForeignLoad *load )
return( VIPS_FOREIGN_SEQUENTIAL );
}
static void
static int
vips_foreign_load_svg_parse( VipsForeignLoadSvg *svg, VipsImage *out )
{
VipsObjectClass *class = VIPS_OBJECT_GET_CLASS( svg );
RsvgDimensionData dimensions;
int width;
int height;
@ -261,6 +263,11 @@ vips_foreign_load_svg_parse( VipsForeignLoadSvg *svg, VipsImage *out )
width = dimensions.width;
height = dimensions.height;
if( width <= 0 || height <= 0 ) {
vips_error( class->nickname, "%s", _( "bad dimensions" ) );
return( -1 );
}
/* Calculate dimensions at required dpi/scale.
*/
scale = svg->scale * svg->dpi / 72.0;
@ -300,6 +307,7 @@ vips_foreign_load_svg_parse( VipsForeignLoadSvg *svg, VipsImage *out )
*/
vips_image_pipelinev( out, VIPS_DEMAND_STYLE_FATSTRIP, NULL );
return( 0 );
}
static int
@ -307,9 +315,7 @@ vips_foreign_load_svg_header( VipsForeignLoad *load )
{
VipsForeignLoadSvg *svg = (VipsForeignLoadSvg *) load;
vips_foreign_load_svg_parse( svg, load->out );
return( 0 );
return vips_foreign_load_svg_parse( svg, load->out );
}
static int
@ -386,9 +392,9 @@ vips_foreign_load_svg_load( VipsForeignLoad *load )
* Make tiles 2000 pixels high to limit overcomputation.
*/
t[0] = vips_image_new();
vips_foreign_load_svg_parse( svg, t[0] );
if( vips_image_generate( t[0],
NULL, vips_foreign_load_svg_generate, NULL, svg, NULL ) ||
if( vips_foreign_load_svg_parse( svg, t[0] ) ||
vips_image_generate( t[0], NULL,
vips_foreign_load_svg_generate, NULL, svg, NULL ) ||
vips_tilecache( t[0], &t[1],
"tile_width", VIPS_MIN( t[0]->Xsize, RSVG_MAX_WIDTH ),
"tile_height", 2000,

View File

@ -212,7 +212,14 @@ vips__tiff_openin_source( VipsSource *source )
if( vips_source_rewind( source ) )
return( NULL );
if( !(tiff = TIFFClientOpen( "source input", "rm",
/* Disable memory mapped input -- it chews up VM and the performance
* gain is very small.
*
* C enables strip chopping: very large uncompressed strips are
* chopped into c. 8kb chunks. This can reduce peak memory use for
* this type of file.
*/
if( !(tiff = TIFFClientOpen( "source input", "rmC",
(thandle_t) source,
openin_source_read,
openin_source_write,

View File

@ -327,7 +327,7 @@ typedef struct _RtiffHeader {
*/
double stonits;
/* Number of subifds, if any.
/* Number of subifds, 0 for none.
*/
int subifd_count;
@ -684,7 +684,7 @@ rtiff_set_page( Rtiff *rtiff, int page )
}
if( rtiff->subifd >= 0 ) {
int subifd_count;
uint16 subifd_count;
toff_t *subifd_offsets;
if( !TIFFGetField( rtiff->tiff, TIFFTAG_SUBIFD,
@ -694,8 +694,7 @@ rtiff_set_page( Rtiff *rtiff, int page )
return( -1 );
}
if( subifd_count <= 0 ||
rtiff->subifd >= subifd_count ) {
if( rtiff->subifd >= subifd_count ) {
vips_error( "tiff2vips",
_( "subifd %d out of range, "
"only 0-%d available" ),
@ -2437,6 +2436,7 @@ rtiff_header_read( Rtiff *rtiff, RtiffHeader *header )
int i;
uint16 extra_samples_count;
uint16 *extra_samples_types;
uint16 subifd_count;
toff_t *subifd_offsets;
char *image_description;
@ -2545,10 +2545,11 @@ rtiff_header_read( Rtiff *rtiff, RtiffHeader *header )
header->separate = TRUE;
}
/* Stays zero if there's no SUBIFD.
/* TIFFGetField needs a uint16 to write count to.
*/
TIFFGetField( rtiff->tiff, TIFFTAG_SUBIFD,
&header->subifd_count, &subifd_offsets );
if( TIFFGetField( rtiff->tiff, TIFFTAG_SUBIFD,
&subifd_count, &subifd_offsets ) )
header->subifd_count = subifd_count;
/* IMAGEDESCRIPTION often has useful metadata. libtiff makes sure
* that data is null-terminated and contains no embedded null

View File

@ -384,11 +384,6 @@ struct _Wtiff {
* and we must compress ourselves.
*/
gboolean we_compress;
/* If we are copying, we need a buffer to read the compressed tile to.
*/
tdata_t compressed_buf;
tsize_t compressed_buf_length;
};
/* Write an ICC Profile from a file into the JPEG stream.
@ -959,20 +954,6 @@ wtiff_allocate_layers( Wtiff *wtiff )
return( -1 );
}
/* If we will be copying layers we need a buffer large enough to hold
* the largest compressed tile in any page.
*
* Allocate a buffer 2x the uncompressed tile size ... much simpler
* than searching every page for the largest tile with
* TIFFTAG_TILEBYTECOUNTS.
*/
if( wtiff->pyramid ) {
wtiff->compressed_buf_length = 2 * wtiff->tls * wtiff->tileh;
if( !(wtiff->compressed_buf = vips_malloc( NULL,
wtiff->compressed_buf_length )) )
return( -1 );
}
return( 0 );
}
@ -1032,7 +1013,6 @@ wtiff_free( Wtiff *wtiff )
VIPS_FREE( wtiff->tbuf );
VIPS_FREEF( layer_free_all, wtiff->layer );
VIPS_FREE( wtiff->filename );
VIPS_FREE( wtiff->compressed_buf );
VIPS_FREE( wtiff );
}
@ -2029,12 +2009,17 @@ wtiff_copy_tiff( Wtiff *wtiff, TIFF *out, TIFF *in )
for( tile_no = 0; tile_no < n; tile_no++ ) {
tsize_t len;
len = TIFFReadRawTile( in, tile_no,
wtiff->compressed_buf, wtiff->compressed_buf_length );
if( len <= 0 ||
TIFFWriteRawTile( out, tile_no,
wtiff->compressed_buf, len ) < 0 )
/* TIFFReadRawTile()/TIFFWriteRawTile() would save us
* decompress/recompress, but they won't work for
* JPEG-compressed tiles since they won't copy the
* JPEG quant tables we need.
*/
len = TIFFReadEncodedTile( in, tile_no, buf, -1 );
if( len < 0 ||
TIFFWriteEncodedTile( out, tile_no, buf, len ) < 0 ) {
g_free( buf );
return( -1 );
}
}
g_free( buf );

View File

@ -1161,7 +1161,7 @@ vips_guess_prefix( const char *argv0, const char *env_name )
/* Already set?
*/
if( (prefix = g_getenv( env_name )) )
if( (prefix = g_getenv( env_name )) )
return( prefix );
#ifdef G_OS_WIN32

View File

@ -415,6 +415,12 @@ class TestForeign:
im = pyvips.Image.new_from_file(TIF4_FILE)
self.save_load_file(".tif", "[bitdepth=4]", im)
filename = temp_filename(self.tempdir, '.tif')
self.colour.write_to_file(filename, pyramid=True, compression="jpeg")
x = pyvips.Image.new_from_file(filename, page=2)
assert x.width == 72
assert abs(x.avg() - 117.3) < 1
filename = temp_filename(self.tempdir, '.tif')
x = pyvips.Image.new_from_file(TIF_FILE)
x = x.copy()
@ -895,6 +901,10 @@ class TestForeign:
assert abs(im.width * 2 - x.width) < 2
assert abs(im.height * 2 - x.height) < 2
with pytest.raises(pyvips.error.Error):
svg = b'<svg viewBox="0 0 0 0"></svg>'
im = pyvips.Image.new_from_buffer(svg, "")
def test_csv(self):
self.save_load("%s.csv", self.mono)