int vips__openslide_read_associated( const char *filename, VipsImage *out, const char *associated ) { ReadSlide *rslide; VipsImage *raw; const char *error; VIPS_DEBUG_MSG( "vips__openslide_read_associated: %s %s\n", filename, associated ); /* Memory buffer. Get associated directly to this, then copy to out. */ raw = vips_image_new_buffer(); vips_object_local( out, raw ); if( !(rslide = readslide_new( filename, raw, 0, associated )) || vips_image_write_prepare( raw ) ) return( -1 ); openslide_read_associated_image( rslide->osr, rslide->associated, (uint32_t *) VIPS_IMAGE_ADDR( raw, 0, 0 ) ); error = openslide_get_error( rslide->osr ); if( error ) { vips_error( "openslide2vips", _( "reading associated image: %s" ), error ); return( -1 ); } if( vips_image_write( raw, out ) ) return( -1 ); return( 0 ); }
int vips__openslide_read_header( const char *filename, VipsImage *out, int level, gboolean autocrop, char *associated ) { if( !readslide_new( filename, out, level, autocrop, associated ) ) return( -1 ); return( 0 ); }
int vips__openslide_read_header( const char *filename, VipsImage *out, int layer, char *associated ) { ReadSlide *rslide; if( !(rslide = readslide_new( filename, out, layer, associated )) ) return( -1 ); return( 0 ); }
int vips__openslide_read( const char *filename, VipsImage *out, int layer ) { ReadSlide *rslide; VipsImage *raw; VipsImage *t; VIPS_DEBUG_MSG( "vips__openslide_read: %s %d\n", filename, layer ); /* Tile cache: keep enough for two complete rows of tiles. OpenSlide * has its own tile cache, but it's not large enough for a complete * scan line. */ raw = vips_image_new(); vips_object_local( out, raw ); if( !(rslide = readslide_new( filename, raw, layer, NULL )) ) return( -1 ); if( vips_image_generate( raw, NULL, vips__openslide_generate, NULL, rslide, NULL ) ) return( -1 ); /* Copy to out, adding a cache. Enough tiles for a complete row, plus * 50%. */ if( vips_tilecache( raw, &t, "tile_width", TILE_WIDTH, "tile_height", TILE_WIDTH, "max_tiles", (int) (1.5 * (1 + raw->Xsize / TILE_WIDTH)), NULL ) ) return( -1 ); if( vips_image_write( t, out ) ) { g_object_unref( t ); return( -1 ); } g_object_unref( t ); return( 0 ); }