sequential mode for radiance read
This commit is contained in:
parent
ad94488734
commit
079c9775aa
@ -12,6 +12,7 @@
|
|||||||
- add @point subsample mode to vips_subsample()
|
- add @point subsample mode to vips_subsample()
|
||||||
- im_contrast_surface() deprecated: it was slower than calling conv a few
|
- im_contrast_surface() deprecated: it was slower than calling conv a few
|
||||||
times
|
times
|
||||||
|
- radiance load supports sequential read
|
||||||
|
|
||||||
18/10/13 started 7.36.3
|
18/10/13 started 7.36.3
|
||||||
- fix compiler warnings in ubuntu 13.10
|
- fix compiler warnings in ubuntu 13.10
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
* - reworked as some fns ready for new-style classes
|
* - reworked as some fns ready for new-style classes
|
||||||
* 13/12/12
|
* 13/12/12
|
||||||
* - tag RGB rad images as scRGB
|
* - tag RGB rad images as scRGB
|
||||||
|
* 4/11/13
|
||||||
|
* - support sequential read
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -772,8 +774,6 @@ typedef struct {
|
|||||||
double aspect;
|
double aspect;
|
||||||
RGBPRIMS prims;
|
RGBPRIMS prims;
|
||||||
RESOLU rs;
|
RESOLU rs;
|
||||||
|
|
||||||
COLR *buf;
|
|
||||||
} Read;
|
} Read;
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -797,13 +797,10 @@ vips__rad_israd( const char *filename )
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
read_destroy( Read *read )
|
read_destroy( VipsObject *object, Read *read )
|
||||||
{
|
{
|
||||||
VIPS_FREE( read->filename );
|
VIPS_FREE( read->filename );
|
||||||
VIPS_FREEF( fclose, read->fin );
|
VIPS_FREEF( fclose, read->fin );
|
||||||
VIPS_FREE( read->buf );
|
|
||||||
|
|
||||||
vips_free( read );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Read *
|
static Read *
|
||||||
@ -812,7 +809,7 @@ read_new( const char *filename, VipsImage *out )
|
|||||||
Read *read;
|
Read *read;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if( !(read = VIPS_NEW( NULL, Read )) )
|
if( !(read = VIPS_NEW( out, Read )) )
|
||||||
return( NULL );
|
return( NULL );
|
||||||
|
|
||||||
read->filename = vips_strdup( NULL, filename );
|
read->filename = vips_strdup( NULL, filename );
|
||||||
@ -831,12 +828,12 @@ read_new( const char *filename, VipsImage *out )
|
|||||||
read->prims[2][1] = CIE_y_b;
|
read->prims[2][1] = CIE_y_b;
|
||||||
read->prims[3][0] = CIE_x_w;
|
read->prims[3][0] = CIE_x_w;
|
||||||
read->prims[3][1] = CIE_y_w;
|
read->prims[3][1] = CIE_y_w;
|
||||||
read->buf = NULL;
|
|
||||||
|
|
||||||
if( !(read->fin = vips__file_open_read( filename, NULL, FALSE )) ) {
|
g_signal_connect( out, "close",
|
||||||
read_destroy( read );
|
G_CALLBACK( read_destroy ), read );
|
||||||
|
|
||||||
|
if( !(read->fin = vips__file_open_read( filename, NULL, FALSE )) )
|
||||||
return( NULL );
|
return( NULL );
|
||||||
}
|
|
||||||
|
|
||||||
return( read );
|
return( read );
|
||||||
}
|
}
|
||||||
@ -883,36 +880,35 @@ static const char *colcor_name[3] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
rad2vips_get_header( Read *read, FILE *fin, VipsImage *out )
|
rad2vips_get_header( Read *read, VipsImage *out )
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
|
VipsInterpretation interpretation;
|
||||||
|
|
||||||
if( getheader( fin, (gethfunc *) rad2vips_process_line, read ) ||
|
if( getheader( read->fin, (gethfunc *) rad2vips_process_line, read ) ||
|
||||||
!fgetsresolu( &read->rs, fin ) ) {
|
!fgetsresolu( &read->rs, read->fin ) ) {
|
||||||
vips_error( "rad2vips", "%s",
|
vips_error( "rad2vips", "%s",
|
||||||
_( "error reading radiance header" ) );
|
_( "error reading radiance header" ) );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
out->Xsize = scanlen( &read->rs );
|
|
||||||
out->Ysize = numscans( &read->rs );
|
|
||||||
|
|
||||||
out->Bands = 4;
|
|
||||||
out->BandFmt = VIPS_FORMAT_UCHAR;
|
|
||||||
|
|
||||||
out->Coding = VIPS_CODING_RAD;
|
|
||||||
out->Xres = 1.0;
|
|
||||||
out->Yres = read->aspect;
|
|
||||||
out->Xoffset = 0.0;
|
|
||||||
out->Yoffset = 0.0;
|
|
||||||
|
|
||||||
vips_image_set_string( out, "rad-format", read->format );
|
|
||||||
|
|
||||||
if( strcmp( read->format, COLRFMT ) == 0 )
|
if( strcmp( read->format, COLRFMT ) == 0 )
|
||||||
out->Type = VIPS_INTERPRETATION_scRGB;
|
interpretation = VIPS_INTERPRETATION_scRGB;
|
||||||
else if( strcmp( read->format, CIEFMT ) == 0 )
|
else if( strcmp( read->format, CIEFMT ) == 0 )
|
||||||
out->Type = VIPS_INTERPRETATION_XYZ;
|
interpretation = VIPS_INTERPRETATION_XYZ;
|
||||||
else
|
else
|
||||||
out->Type = VIPS_INTERPRETATION_MULTIBAND;
|
interpretation = VIPS_INTERPRETATION_MULTIBAND;
|
||||||
|
|
||||||
|
vips_image_init_fields( out,
|
||||||
|
scanlen( &read->rs ), numscans( &read->rs ),
|
||||||
|
4,
|
||||||
|
VIPS_FORMAT_UCHAR, VIPS_CODING_RAD,
|
||||||
|
interpretation,
|
||||||
|
1, read->aspect );
|
||||||
|
|
||||||
|
vips_image_pipelinev( out, VIPS_DEMAND_STYLE_THINSTRIP, NULL );
|
||||||
|
|
||||||
|
vips_image_set_string( out, "rad-format", read->format );
|
||||||
|
|
||||||
vips_image_set_double( out, "rad-expos", read->expos );
|
vips_image_set_double( out, "rad-expos", read->expos );
|
||||||
|
|
||||||
@ -941,42 +937,44 @@ vips__rad_header( const char *filename, VipsImage *out )
|
|||||||
|
|
||||||
if( !(read = read_new( filename, out )) )
|
if( !(read = read_new( filename, out )) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
if( rad2vips_get_header( read, read->fin, read->out ) ) {
|
if( rad2vips_get_header( read, read->out ) )
|
||||||
read_destroy( read );
|
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
|
||||||
read_destroy( read );
|
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
rad2vips_get_data( Read *read, FILE *fin, VipsImage *im )
|
rad2vips_generate( VipsRegion *or,
|
||||||
|
void *seq, void *a, void *b, gboolean *stop )
|
||||||
{
|
{
|
||||||
|
VipsRect *r = &or->valid;
|
||||||
|
Read *read = (Read *) a;
|
||||||
|
|
||||||
int y;
|
int y;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf( "rad2vips_get_data\n" );
|
printf( "rad2vips_get_data\n" );
|
||||||
#endif /*DEBUG*/
|
#endif /*DEBUG*/
|
||||||
|
|
||||||
if( !(read->buf = VIPS_ARRAY( NULL, im->Xsize, COLR )) )
|
for( y = 0; y < r->height; y++ ) {
|
||||||
return( -1 );
|
COLR *buf = (COLR *)
|
||||||
|
VIPS_REGION_ADDR( or, 0, r->top + y );
|
||||||
|
|
||||||
for( y = 0; y < im->Ysize; y++ ) {
|
if( freadcolrs( buf, or->im->Xsize, read->fin ) ) {
|
||||||
if( freadcolrs( read->buf, im->Xsize, fin ) ) {
|
|
||||||
vips_error( "rad2vips", "%s", _( "read error" ) );
|
vips_error( "rad2vips", "%s", _( "read error" ) );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
if( vips_image_write_line( im, y, (void *) read->buf ) )
|
|
||||||
return( -1 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
vips__rad_load( const char *filename, VipsImage *out )
|
vips__rad_load( const char *filename, VipsImage *out, gboolean readbehind )
|
||||||
{
|
{
|
||||||
|
VipsImage **t = (VipsImage **)
|
||||||
|
vips_object_local_array( VIPS_OBJECT( out ), 3 );
|
||||||
|
|
||||||
Read *read;
|
Read *read;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -985,17 +983,27 @@ vips__rad_load( const char *filename, VipsImage *out )
|
|||||||
|
|
||||||
if( !(read = read_new( filename, out )) )
|
if( !(read = read_new( filename, out )) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
if( rad2vips_get_header( read, read->fin, read->out ) ||
|
|
||||||
rad2vips_get_data( read, read->fin, read->out ) ) {
|
t[0] = vips_image_new();
|
||||||
read_destroy( read );
|
if( rad2vips_get_header( read, t[0] ) )
|
||||||
|
return( -1 );
|
||||||
|
|
||||||
|
if( vips_image_generate( t[0],
|
||||||
|
NULL, rad2vips_generate, NULL,
|
||||||
|
read, NULL ) ||
|
||||||
|
vips_sequential( t[0], &t[1],
|
||||||
|
"tile_height", 8,
|
||||||
|
"access", readbehind ?
|
||||||
|
VIPS_ACCESS_SEQUENTIAL :
|
||||||
|
VIPS_ACCESS_SEQUENTIAL_UNBUFFERED,
|
||||||
|
NULL ) ||
|
||||||
|
vips_image_write( t[1], out ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
|
||||||
read_destroy( read );
|
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* What we track during an radiance-file write.
|
/* What we track during a radiance file write.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
VipsImage *in;
|
VipsImage *in;
|
||||||
|
@ -37,7 +37,7 @@ extern "C" {
|
|||||||
|
|
||||||
int vips__rad_israd( const char *filename );
|
int vips__rad_israd( const char *filename );
|
||||||
int vips__rad_header( const char *filename, VipsImage *out );
|
int vips__rad_header( const char *filename, VipsImage *out );
|
||||||
int vips__rad_load( const char *filename, VipsImage *out );
|
int vips__rad_load( const char *filename, VipsImage *out, gboolean readbehind );
|
||||||
|
|
||||||
int vips__rad_save( VipsImage *in, const char *filename );
|
int vips__rad_save( VipsImage *in, const char *filename );
|
||||||
|
|
||||||
|
@ -67,7 +67,9 @@ G_DEFINE_TYPE( VipsForeignLoadRad, vips_foreign_load_rad,
|
|||||||
static VipsForeignFlags
|
static VipsForeignFlags
|
||||||
vips_foreign_load_rad_get_flags_filename( const char *filename )
|
vips_foreign_load_rad_get_flags_filename( const char *filename )
|
||||||
{
|
{
|
||||||
return( 0 );
|
/* The rad reader supports sequential read.
|
||||||
|
*/
|
||||||
|
return( VIPS_FOREIGN_SEQUENTIAL );
|
||||||
}
|
}
|
||||||
|
|
||||||
static VipsForeignFlags
|
static VipsForeignFlags
|
||||||
@ -94,7 +96,8 @@ vips_foreign_load_rad_load( VipsForeignLoad *load )
|
|||||||
{
|
{
|
||||||
VipsForeignLoadRad *rad = (VipsForeignLoadRad *) load;
|
VipsForeignLoadRad *rad = (VipsForeignLoadRad *) load;
|
||||||
|
|
||||||
if( vips__rad_load( rad->filename, load->real ) )
|
if( vips__rad_load( rad->filename, load->real,
|
||||||
|
load->access == VIPS_ACCESS_SEQUENTIAL ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
|
Loading…
Reference in New Issue
Block a user