sequential can now skip ahead
vips_sequential() no longer bans all non-seq access, it just bans rewinding --- if you ask for something some way ahead, it reads and throws away pixels this means VipsExtract and VipsInsert can now be seq: they will read and throw away any stuff they don't need
This commit is contained in:
parent
5b43d4dd44
commit
73f8263286
@ -18,6 +18,7 @@
|
|||||||
- vips8 command-line interface uses this to turn sequential mode on
|
- vips8 command-line interface uses this to turn sequential mode on
|
||||||
automatically when possible
|
automatically when possible
|
||||||
- better handling of input files in vips7 command-line interface
|
- better handling of input files in vips7 command-line interface
|
||||||
|
- sequential can skip ahead, so extract / insert are now seq
|
||||||
|
|
||||||
18/6/12 started 7.28.9
|
18/6/12 started 7.28.9
|
||||||
- slightly more memory debugging output
|
- slightly more memory debugging output
|
||||||
|
@ -180,6 +180,7 @@ vips_extract_area_class_init( VipsExtractAreaClass *class )
|
|||||||
{
|
{
|
||||||
GObjectClass *gobject_class = G_OBJECT_CLASS( class );
|
GObjectClass *gobject_class = G_OBJECT_CLASS( class );
|
||||||
VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS( class );
|
VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS( class );
|
||||||
|
VipsOperationClass *operation_class = VIPS_OPERATION_CLASS( class );
|
||||||
|
|
||||||
VIPS_DEBUG_MSG( "vips_extract_area_class_init\n" );
|
VIPS_DEBUG_MSG( "vips_extract_area_class_init\n" );
|
||||||
|
|
||||||
@ -190,8 +191,7 @@ vips_extract_area_class_init( VipsExtractAreaClass *class )
|
|||||||
vobject_class->description = _( "extract an area from an image" );
|
vobject_class->description = _( "extract an area from an image" );
|
||||||
vobject_class->build = vips_extract_area_build;
|
vobject_class->build = vips_extract_area_build;
|
||||||
|
|
||||||
/* Not sequential, since we skip the top and bottom of the image.
|
operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
|
||||||
*/
|
|
||||||
|
|
||||||
VIPS_ARG_IMAGE( class, "input", 0,
|
VIPS_ARG_IMAGE( class, "input", 0,
|
||||||
_( "Input" ),
|
_( "Input" ),
|
||||||
|
@ -339,6 +339,7 @@ vips_insert_class_init( VipsInsertClass *class )
|
|||||||
{
|
{
|
||||||
GObjectClass *gobject_class = G_OBJECT_CLASS( class );
|
GObjectClass *gobject_class = G_OBJECT_CLASS( class );
|
||||||
VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS( class );
|
VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS( class );
|
||||||
|
VipsOperationClass *operation_class = VIPS_OPERATION_CLASS( class );
|
||||||
|
|
||||||
VIPS_DEBUG_MSG( "vips_insert_class_init\n" );
|
VIPS_DEBUG_MSG( "vips_insert_class_init\n" );
|
||||||
|
|
||||||
@ -349,9 +350,7 @@ vips_insert_class_init( VipsInsertClass *class )
|
|||||||
vobject_class->description = _( "insert an image" );
|
vobject_class->description = _( "insert an image" );
|
||||||
vobject_class->build = vips_insert_build;
|
vobject_class->build = vips_insert_build;
|
||||||
|
|
||||||
/* Not sequential, since the image being inserted may be clipped and
|
operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
|
||||||
* we may need to skip the top or bottom.
|
|
||||||
*/
|
|
||||||
|
|
||||||
VIPS_ARG_IMAGE( class, "main", -1,
|
VIPS_ARG_IMAGE( class, "main", -1,
|
||||||
_( "Main" ),
|
_( "Main" ),
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
*
|
*
|
||||||
* 15/2/12
|
* 15/2/12
|
||||||
* - from VipsForeignLoad
|
* - from VipsForeignLoad
|
||||||
|
* 14/7/12
|
||||||
|
* - support skip forwards as well, so we can do extract/insert
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -74,14 +76,9 @@ vips_sequential_generate( VipsRegion *or,
|
|||||||
|
|
||||||
VIPS_DEBUG_MSG( "vips_sequential_generate %d\n", r->top );
|
VIPS_DEBUG_MSG( "vips_sequential_generate %d\n", r->top );
|
||||||
|
|
||||||
/* The y pos of the request must be the same as our current file
|
/* We can't go backwards, but we can skip forwards.
|
||||||
* position.
|
|
||||||
*/
|
*/
|
||||||
if( r->top != sequential->y_pos ) {
|
if( r->top < sequential->y_pos ) {
|
||||||
printf( "vips_sequential_generate: error -- "
|
|
||||||
"at position %d in file, but position %d requested\n",
|
|
||||||
sequential->y_pos, r->top );
|
|
||||||
|
|
||||||
vips_error( "VipsSequential",
|
vips_error( "VipsSequential",
|
||||||
_( "non-sequential read --- "
|
_( "non-sequential read --- "
|
||||||
"at position %d in file, but position %d requested" ),
|
"at position %d in file, but position %d requested" ),
|
||||||
@ -96,6 +93,24 @@ vips_sequential_generate( VipsRegion *or,
|
|||||||
g_assert( r->width == or->im->Xsize );
|
g_assert( r->width == or->im->Xsize );
|
||||||
g_assert( VIPS_RECT_BOTTOM( r ) <= or->im->Ysize );
|
g_assert( VIPS_RECT_BOTTOM( r ) <= or->im->Ysize );
|
||||||
|
|
||||||
|
/* Skip forwards, if necessary.
|
||||||
|
*/
|
||||||
|
while( sequential->y_pos < r->top ) {
|
||||||
|
VipsRect rect;
|
||||||
|
|
||||||
|
rect.top = sequential->y_pos;
|
||||||
|
rect.left = 0;
|
||||||
|
rect.width = or->im->Xsize;
|
||||||
|
rect.height = VIPS_MIN( r->top - sequential->y_pos,
|
||||||
|
VIPS__FATSTRIP_HEIGHT );
|
||||||
|
if( vips_region_prepare( ir, &rect ) )
|
||||||
|
return( -1 );
|
||||||
|
|
||||||
|
sequential->y_pos += rect.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_assert( sequential->y_pos == r->top );
|
||||||
|
|
||||||
/* Pointer copy.
|
/* Pointer copy.
|
||||||
*/
|
*/
|
||||||
if( vips_region_prepare( ir, r ) ||
|
if( vips_region_prepare( ir, r ) ||
|
||||||
|
Loading…
Reference in New Issue
Block a user