save framework done

This commit is contained in:
John Cupitt 2018-07-06 11:53:35 +01:00
parent 76eef8912e
commit 34bb1fc83c
2 changed files with 48 additions and 0 deletions

View File

@ -41,6 +41,8 @@
* - for uncompressed images, we could do direct mapping of the input * - for uncompressed images, we could do direct mapping of the input
* - perhaps we could stream compressed images? but only if ext is defined at * - perhaps we could stream compressed images? but only if ext is defined at
* the start of the file * the start of the file
* (yes, file format is magic number, 348-byte header, extension data,
* pixel data, then all gz'd)
* - we could use the much faster byteswap in glib? * - we could use the much faster byteswap in glib?
* - I have not been able to test the ext stuff :( * - I have not been able to test the ext stuff :(
* *

View File

@ -58,6 +58,8 @@ typedef struct _VipsForeignSaveNifti {
*/ */
char *filename; char *filename;
nifti_image *nim;
} VipsForeignSaveNifti; } VipsForeignSaveNifti;
typedef VipsForeignSaveClass VipsForeignSaveNiftiClass; typedef VipsForeignSaveClass VipsForeignSaveNiftiClass;
@ -65,6 +67,26 @@ typedef VipsForeignSaveClass VipsForeignSaveNiftiClass;
G_DEFINE_TYPE( VipsForeignSaveNifti, vips_foreign_save_nifti, G_DEFINE_TYPE( VipsForeignSaveNifti, vips_foreign_save_nifti,
VIPS_TYPE_FOREIGN_SAVE ); VIPS_TYPE_FOREIGN_SAVE );
static void
vips_foreign_save_nifti_dispose( GObject *gobject )
{
VipsForeignLoadNifti *nifti = (VipsForeignLoadNifti *) gobject;
VIPS_FREEF( nifti_image_free, nifti->nim );
G_OBJECT_CLASS( vips_foreign_load_nifti_parent_class )->
dispose( gobject );
}
static int
vips_foreign_save_nifti_make_header( VipsForeignSaveNifti *nifti,
struct nifti_1_header *nhdr )
{
return( 0 );
}
static int static int
vips_foreign_save_nifti_build( VipsObject *object ) vips_foreign_save_nifti_build( VipsObject *object )
{ {
@ -73,10 +95,33 @@ vips_foreign_save_nifti_build( VipsObject *object )
VipsImage **t = (VipsImage **) VipsImage **t = (VipsImage **)
vips_object_local_array( VIPS_OBJECT( nifti ), 2 ); vips_object_local_array( VIPS_OBJECT( nifti ), 2 );
struct nifti_1_header nhdr;
if( VIPS_OBJECT_CLASS( vips_foreign_save_nifti_parent_class )-> if( VIPS_OBJECT_CLASS( vips_foreign_save_nifti_parent_class )->
build( object ) ) build( object ) )
return( -1 ); return( -1 );
if( vips_foreign_save_nifti_make_header( nifti, &nhdr ) )
return( -1 );
if( !(nifti->nim = nifti_convert_nhdr2nim( nhdr, nifti->filename )) )
return( -1 );
/* set ext, plus other stuff
*/
if( !(nim->data = vips_image_write_memory( save->ready, NULL )) )
return( -1 );
/* No return code!??!?!!
*/
nifti_image_write( nifti->nim );
/* We must free and NULL the pointer or nifti will try to free it for
* us.
*/
VIPS_FREE( nim->data );
return( 0 ); return( 0 );
} }
@ -106,6 +151,7 @@ vips_foreign_save_nifti_class_init( VipsForeignSaveNiftiClass *class )
VipsForeignClass *foreign_class = (VipsForeignClass *) class; VipsForeignClass *foreign_class = (VipsForeignClass *) class;
VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class; VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class;
gobject_class->dispose = vips_foreign_save_nifti_dispose;
gobject_class->set_property = vips_object_set_property; gobject_class->set_property = vips_object_set_property;
gobject_class->get_property = vips_object_get_property; gobject_class->get_property = vips_object_get_property;