more tests
This commit is contained in:
parent
f467924156
commit
33c2458233
@ -159,7 +159,10 @@ vips_cache_init( VipsCache *cache )
|
|||||||
* documentation for that operation for details.
|
* documentation for that operation for details.
|
||||||
*
|
*
|
||||||
* It uses a set of background threads to calculate pixels and the various
|
* It uses a set of background threads to calculate pixels and the various
|
||||||
* active cache operations coordinate so as not to overwhelm your system.
|
* active cache operations coordinate so as not to overwhelm your system. When
|
||||||
|
* a request is made for an area of pixels, the operation will block until all
|
||||||
|
* of those pixels have been calculated. Pixels are calculated with a set of
|
||||||
|
* threads.
|
||||||
*
|
*
|
||||||
* See also: vips_tilecache().
|
* See also: vips_tilecache().
|
||||||
*
|
*
|
||||||
|
@ -200,7 +200,8 @@ vips_copy_gen( VipsRegion *or, void *seq, void *a, void *b, gboolean *stop )
|
|||||||
if( vips_region_prepare( ir, r ) )
|
if( vips_region_prepare( ir, r ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
if( copy->swap && swap ) {
|
if( copy->swap &&
|
||||||
|
swap ) {
|
||||||
int y;
|
int y;
|
||||||
|
|
||||||
for( y = 0; y < r->height; y++ ) {
|
for( y = 0; y < r->height; y++ ) {
|
||||||
@ -239,9 +240,12 @@ static const char *vips_copy_names[] = {
|
|||||||
static int
|
static int
|
||||||
vips_copy_build( VipsObject *object )
|
vips_copy_build( VipsObject *object )
|
||||||
{
|
{
|
||||||
|
VipsObjectClass *class = VIPS_OBJECT_GET_CLASS( object );
|
||||||
VipsConversion *conversion = VIPS_CONVERSION( object );
|
VipsConversion *conversion = VIPS_CONVERSION( object );
|
||||||
VipsCopy *copy = (VipsCopy *) object;
|
VipsCopy *copy = (VipsCopy *) object;
|
||||||
|
|
||||||
|
guint64 image_size_before;
|
||||||
|
guint64 image_size_after;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if( VIPS_OBJECT_CLASS( vips_copy_parent_class )->build( object ) )
|
if( VIPS_OBJECT_CLASS( vips_copy_parent_class )->build( object ) )
|
||||||
@ -254,6 +258,11 @@ vips_copy_build( VipsObject *object )
|
|||||||
VIPS_DEMAND_STYLE_THINSTRIP, copy->in, NULL ) )
|
VIPS_DEMAND_STYLE_THINSTRIP, copy->in, NULL ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
|
/* We try to stop the worst crashes by at least ensuring that we don't
|
||||||
|
* increase the number of pixels which might be addressed.
|
||||||
|
*/
|
||||||
|
image_size_before = VIPS_IMAGE_SIZEOF_IMAGE( conversion->out );
|
||||||
|
|
||||||
/* Use props to adjust header fields.
|
/* Use props to adjust header fields.
|
||||||
*/
|
*/
|
||||||
for( i = 0; i < VIPS_NUMBER( vips_copy_names ); i++ ) {
|
for( i = 0; i < VIPS_NUMBER( vips_copy_names ); i++ ) {
|
||||||
@ -291,6 +300,13 @@ vips_copy_build( VipsObject *object )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
image_size_after = VIPS_IMAGE_SIZEOF_IMAGE( conversion->out );
|
||||||
|
if( image_size_after > image_size_before ) {
|
||||||
|
vips_error( class->nickname,
|
||||||
|
"%s", _( "image size too large" ) );
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
if( vips_image_generate( conversion->out,
|
if( vips_image_generate( conversion->out,
|
||||||
vips_start_one, vips_copy_gen, vips_stop_one,
|
vips_start_one, vips_copy_gen, vips_stop_one,
|
||||||
copy->in, copy ) )
|
copy->in, copy ) )
|
||||||
@ -439,7 +455,8 @@ vips_copy_init( VipsCopy *copy )
|
|||||||
* You can optionally set any or all header fields during the copy. Some
|
* You can optionally set any or all header fields during the copy. Some
|
||||||
* header fields, such as "xres", the horizontal resolution, are safe to
|
* header fields, such as "xres", the horizontal resolution, are safe to
|
||||||
* change in any way, others, such as "width" will cause immediate crashes if
|
* change in any way, others, such as "width" will cause immediate crashes if
|
||||||
* they are not set carefully.
|
* they are not set carefully. The operation will block changes which make the
|
||||||
|
* image size grow, see VIPS_IMAGE_SIZEOF_IMAGE().
|
||||||
*
|
*
|
||||||
* Setting @swap to %TRUE will make vips_copy() swap the byte ordering of
|
* Setting @swap to %TRUE will make vips_copy() swap the byte ordering of
|
||||||
* pixels according to the image's format.
|
* pixels according to the image's format.
|
||||||
|
@ -147,5 +147,36 @@ class TestConversion(unittest.TestCase):
|
|||||||
|
|
||||||
self.run_binary(self.all_images, bandrank, fmt = noncomplex_formats)
|
self.run_binary(self.all_images, bandrank, fmt = noncomplex_formats)
|
||||||
|
|
||||||
|
def test_cache(self):
|
||||||
|
def cache(x):
|
||||||
|
if isinstance(x, Vips.Image):
|
||||||
|
return x.cache()
|
||||||
|
else:
|
||||||
|
return x
|
||||||
|
|
||||||
|
self.run_unary(self.all_images, cache)
|
||||||
|
|
||||||
|
def test_copy(self):
|
||||||
|
x = self.colour.copy(interpretation = Vips.Interpretation.LAB)
|
||||||
|
self.assertEqual(x.interpretation, Vips.Interpretation.LAB)
|
||||||
|
x = self.colour.copy(xres = 42)
|
||||||
|
self.assertEqual(x.xres, 42)
|
||||||
|
x = self.colour.copy(yres = 42)
|
||||||
|
self.assertEqual(x.yres, 42)
|
||||||
|
x = self.colour.copy(xoffset = 42)
|
||||||
|
self.assertEqual(x.xoffset, 42)
|
||||||
|
x = self.colour.copy(yoffset = 42)
|
||||||
|
self.assertEqual(x.yoffset, 42)
|
||||||
|
x = self.colour.copy(bands = 1)
|
||||||
|
self.assertEqual(x.bands, 1)
|
||||||
|
x = self.colour.copy(format = Vips.BandFormat.USHORT, bands = 1)
|
||||||
|
self.assertEqual(x.format, Vips.BandFormat.USHORT)
|
||||||
|
x = self.colour.copy(coding = Vips.Coding.NONE)
|
||||||
|
self.assertEqual(x.coding, Vips.Coding.NONE)
|
||||||
|
x = self.colour.copy(width = 42)
|
||||||
|
self.assertEqual(x.width, 42)
|
||||||
|
x = self.colour.copy(height = 42)
|
||||||
|
self.assertEqual(x.height, 42)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
Loading…
Reference in New Issue
Block a user