fits isn't quite working still
This commit is contained in:
parent
c464503510
commit
0231b512b4
@ -25,7 +25,7 @@
|
|||||||
- add compute reordering, plus some new API to support it:
|
- add compute reordering, plus some new API to support it:
|
||||||
vips_reorder_margin_hint() and vips_reorder_prepare_many(), thanks
|
vips_reorder_margin_hint() and vips_reorder_prepare_many(), thanks
|
||||||
aferrero2707
|
aferrero2707
|
||||||
- kick load operations from cache on read error, thanks gaillard
|
- kick jpg, tif, png load operations from cache on read error, thanks gaillard
|
||||||
|
|
||||||
8/12/16 started 8.4.5
|
8/12/16 started 8.4.5
|
||||||
- allow libgsf-1.14.26 to help centos, thanks tdiprima
|
- allow libgsf-1.14.26 to help centos, thanks tdiprima
|
||||||
|
@ -26,6 +26,8 @@
|
|||||||
* 4/1/17
|
* 4/1/17
|
||||||
* - load to equivalent data type, not raw image data type ... improves
|
* - load to equivalent data type, not raw image data type ... improves
|
||||||
* support for BSCALE / BZERO settings
|
* support for BSCALE / BZERO settings
|
||||||
|
* 17/1/17
|
||||||
|
* - invalidate operation on read error
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -360,6 +362,25 @@ vips__fits_read_header( const char *filename, VipsImage *out )
|
|||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
vips_fits_read_subset( VipsFits *fits,
|
||||||
|
long fpixel[MAX_DIMENSIONS], long lpixel[MAX_DIMENSIONS],
|
||||||
|
long inc[MAX_DIMENSIONS], VipsPel *q )
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
if( fits_read_subset( fits->fptr, fits->datatype,
|
||||||
|
fpixel, lpixel, inc,
|
||||||
|
NULL, q, NULL, &status ) ) {
|
||||||
|
vips_fits_error( status );
|
||||||
|
vips_foreign_load_invalidate( fits->image );
|
||||||
|
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
fits2vips_generate( VipsRegion *out,
|
fits2vips_generate( VipsRegion *out,
|
||||||
void *seq, void *a, void *b, gboolean *stop )
|
void *seq, void *a, void *b, gboolean *stop )
|
||||||
@ -369,14 +390,11 @@ fits2vips_generate( VipsRegion *out,
|
|||||||
|
|
||||||
VipsPel *q;
|
VipsPel *q;
|
||||||
int z;
|
int z;
|
||||||
int status;
|
|
||||||
|
|
||||||
long fpixel[MAX_DIMENSIONS];
|
long fpixel[MAX_DIMENSIONS];
|
||||||
long lpixel[MAX_DIMENSIONS];
|
long lpixel[MAX_DIMENSIONS];
|
||||||
long inc[MAX_DIMENSIONS];
|
long inc[MAX_DIMENSIONS];
|
||||||
|
|
||||||
status = 0;
|
|
||||||
|
|
||||||
VIPS_DEBUG_MSG( "fits2vips_generate: "
|
VIPS_DEBUG_MSG( "fits2vips_generate: "
|
||||||
"generating left = %d, top = %d, width = %d, height = %d\n",
|
"generating left = %d, top = %d, width = %d, height = %d\n",
|
||||||
r->left, r->top, r->width, r->height );
|
r->left, r->top, r->width, r->height );
|
||||||
@ -407,10 +425,7 @@ fits2vips_generate( VipsRegion *out,
|
|||||||
/* Break on ffgsv() for this call.
|
/* Break on ffgsv() for this call.
|
||||||
*/
|
*/
|
||||||
g_mutex_lock( fits->lock );
|
g_mutex_lock( fits->lock );
|
||||||
if( fits_read_subset( fits->fptr, fits->datatype,
|
if( vips_fits_read_subset( fits, fpixel, lpixel, inc, q ) ) {
|
||||||
fpixel, lpixel, inc,
|
|
||||||
NULL, q, NULL, &status ) ) {
|
|
||||||
vips_fits_error( status );
|
|
||||||
g_mutex_unlock( fits->lock );
|
g_mutex_unlock( fits->lock );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
@ -440,10 +455,8 @@ fits2vips_generate( VipsRegion *out,
|
|||||||
/* Break on ffgsv() for this call.
|
/* Break on ffgsv() for this call.
|
||||||
*/
|
*/
|
||||||
g_mutex_lock( fits->lock );
|
g_mutex_lock( fits->lock );
|
||||||
if( fits_read_subset( fits->fptr, fits->datatype,
|
if( vips_fits_read_subset( fits,
|
||||||
fpixel, lpixel, inc,
|
fpixel, lpixel, inc, q ) ) {
|
||||||
NULL, q, NULL, &status ) ) {
|
|
||||||
vips_fits_error( status );
|
|
||||||
g_mutex_unlock( fits->lock );
|
g_mutex_unlock( fits->lock );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
@ -1021,12 +1021,12 @@ vips_foreign_load_init( VipsForeignLoad *load )
|
|||||||
*
|
*
|
||||||
* Loaders can call this on the image they are making if they see a read error
|
* Loaders can call this on the image they are making if they see a read error
|
||||||
* from the load library. It signals "invalidate" on the load operation and
|
* from the load library. It signals "invalidate" on the load operation and
|
||||||
* will cause it for be dropped from ache.
|
* will cause it for be dropped from cache.
|
||||||
*
|
*
|
||||||
* If we know a file will cause a read error, we don't want to cache the error
|
* If we know a file will cause a read error, we don't want to cache the
|
||||||
* operation, we want to make sure the image will really be opened again if our
|
* failing operation, we want to make sure the image will really be opened
|
||||||
* caller tries again. For example, a broken file might be replaced by a
|
* again if our caller tries again. For example, a broken file might be
|
||||||
* working one.
|
* replaced by a working one.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
vips_foreign_load_invalidate( VipsImage *image )
|
vips_foreign_load_invalidate( VipsImage *image )
|
||||||
|
@ -77,15 +77,14 @@
|
|||||||
* 11/7/16
|
* 11/7/16
|
||||||
* - new --fail handling
|
* - new --fail handling
|
||||||
* 07/09/16
|
* 07/09/16
|
||||||
* - Don't use the exif resolution if x_resolution / y_resolution /
|
* - don't use the exif resolution if x_resolution / y_resolution /
|
||||||
* resolution_unit is missing
|
* resolution_unit is missing
|
||||||
<<<<<<< HEAD
|
|
||||||
* 7/11/16
|
* 7/11/16
|
||||||
* - exif handling moved out to exif.c
|
* - exif handling moved out to exif.c
|
||||||
=======
|
|
||||||
* 4/1/17
|
* 4/1/17
|
||||||
* - Don't warn for missing exif res, since we fall back to jfif now
|
* - don't warn for missing exif res, since we fall back to jfif now
|
||||||
>>>>>>> master
|
* 17/1/17
|
||||||
|
* - invalidate operation on read error
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -169,6 +169,8 @@
|
|||||||
* - add autorotate support
|
* - add autorotate support
|
||||||
* 17/11/16
|
* 17/11/16
|
||||||
* - add multi-page read
|
* - add multi-page read
|
||||||
|
* 17/1/17
|
||||||
|
* - invalidate operation on read error
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -437,16 +439,17 @@ get_orientation( TIFF *tiff )
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
strip_read( TIFF *tiff, int strip, tdata_t buf )
|
rtiff_strip_read( Rtiff *rtiff, int strip, tdata_t buf )
|
||||||
{
|
{
|
||||||
tsize_t length;
|
tsize_t length;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf( "strip_read: reading strip %d\n", strip );
|
printf( "rtiff_strip_read: reading strip %d\n", strip );
|
||||||
#endif /*DEBUG*/
|
#endif /*DEBUG*/
|
||||||
|
|
||||||
length = TIFFReadEncodedStrip( tiff, strip, buf, (tsize_t) -1 );
|
length = TIFFReadEncodedStrip( rtiff->tiff, strip, buf, (tsize_t) -1 );
|
||||||
if( length == -1 ) {
|
if( length == -1 ) {
|
||||||
|
vips_foreign_load_invalidate( rtiff->out );
|
||||||
vips_error( "tiff2vips", "%s", _( "read error" ) );
|
vips_error( "tiff2vips", "%s", _( "read error" ) );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
@ -1344,6 +1347,17 @@ rtiff_seq_start( VipsImage *out, void *a, void *b )
|
|||||||
return( (void *) buf );
|
return( (void *) buf );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
rtiff_read_tile( Rtiff *rtiff, tdata_t *buf, int x, int y )
|
||||||
|
{
|
||||||
|
if( TIFFReadTile( rtiff->tiff, buf, x, y, 0, 0 ) < 0 ) {
|
||||||
|
vips_foreign_load_invalidate( rtiff->out );
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
/* Paint a tile from the file. This is a
|
/* Paint a tile from the file. This is a
|
||||||
* special-case for when a region is exactly a tiff tile, and pixels need no
|
* special-case for when a region is exactly a tiff tile, and pixels need no
|
||||||
* conversion. In this case, libtiff can read tiles directly to our output
|
* conversion. In this case, libtiff can read tiles directly to our output
|
||||||
@ -1370,9 +1384,9 @@ rtiff_fill_region_aligned( VipsRegion *out, void *seq, void *a, void *b )
|
|||||||
|
|
||||||
/* Read that tile directly into the vips tile.
|
/* Read that tile directly into the vips tile.
|
||||||
*/
|
*/
|
||||||
if( TIFFReadTile( rtiff->tiff,
|
if( rtiff_read_tile( rtiff,
|
||||||
VIPS_REGION_ADDR( out, r->left, r->top ),
|
(tdata_t *) VIPS_REGION_ADDR( out, r->left, r->top ),
|
||||||
r->left, r->top, 0, 0 ) < 0 ) {
|
r->left, r->top ) ) {
|
||||||
VIPS_GATE_STOP( "rtiff_fill_region_aligned: work" );
|
VIPS_GATE_STOP( "rtiff_fill_region_aligned: work" );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
@ -1436,8 +1450,7 @@ rtiff_fill_region( VipsRegion *out, void *seq, void *a, void *b, gboolean *stop
|
|||||||
int ys = (page_y / tile_height) * tile_height;
|
int ys = (page_y / tile_height) * tile_height;
|
||||||
|
|
||||||
if( rtiff_set_page( rtiff, page_no ) ||
|
if( rtiff_set_page( rtiff, page_no ) ||
|
||||||
TIFFReadTile( rtiff->tiff,
|
rtiff_read_tile( rtiff, buf, xs, ys ) ) {
|
||||||
buf, xs, ys, 0, 0 ) < 0 ) {
|
|
||||||
VIPS_GATE_STOP( "rtiff_fill_region: work" );
|
VIPS_GATE_STOP( "rtiff_fill_region: work" );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
@ -1640,7 +1653,7 @@ rtiff_strip_read_interleaved( Rtiff *rtiff, tstrip_t strip, tdata_t buf )
|
|||||||
VipsPel *p;
|
VipsPel *p;
|
||||||
VipsPel *q;
|
VipsPel *q;
|
||||||
|
|
||||||
if( strip_read( rtiff->tiff,
|
if( rtiff_strip_read( rtiff,
|
||||||
strips_per_plane * i + strip,
|
strips_per_plane * i + strip,
|
||||||
rtiff->plane_buf ) )
|
rtiff->plane_buf ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
@ -1657,7 +1670,7 @@ rtiff_strip_read_interleaved( Rtiff *rtiff, tstrip_t strip, tdata_t buf )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if( strip_read( rtiff->tiff, strip, buf ) )
|
if( rtiff_strip_read( rtiff, strip, buf ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,7 +57,8 @@
|
|||||||
* fd during file read, handy for large numbers of input images
|
* fd during file read, handy for large numbers of input images
|
||||||
* 31/7/16
|
* 31/7/16
|
||||||
* - support --strip option
|
* - support --strip option
|
||||||
*
|
* 17/1/17
|
||||||
|
* - invalidate operation on read error
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -512,6 +513,11 @@ png2vips_generate( VipsRegion *or,
|
|||||||
if( !setjmp( png_jmpbuf( read->pPng ) ) )
|
if( !setjmp( png_jmpbuf( read->pPng ) ) )
|
||||||
png_read_row( read->pPng, q, NULL );
|
png_read_row( read->pPng, q, NULL );
|
||||||
else {
|
else {
|
||||||
|
/* We've failed to read some pixels. Knock this
|
||||||
|
* operation out of cache.
|
||||||
|
*/
|
||||||
|
vips_foreign_load_invalidate( read->out );
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf( "png2vips_generate: png_read_row() failed, "
|
printf( "png2vips_generate: png_read_row() failed, "
|
||||||
"line %d\n", r->top + y );
|
"line %d\n", r->top + y );
|
||||||
|
Loading…
Reference in New Issue
Block a user