fix up foreignflags

This commit is contained in:
John Cupitt 2011-12-01 21:59:21 +00:00
parent 878edcf4ea
commit 89a65c81d2
6 changed files with 23 additions and 24 deletions

4
TODO
View File

@ -1,6 +1,4 @@
- test vips_foreign_load_vips_get_flags(), sense inverted? - test load/save jpeg buffer
test load/save jpeg buffer
leaktest leaktest

View File

@ -145,7 +145,7 @@ vips_copy_swap2( PEL *in, PEL *out, int width, VipsImage *im )
int x; int x;
for( x = 0; x < sz; x++ ) for( x = 0; x < sz; x++ )
out[x] = GUINT16_SWAP_LE_BE( in[x] ); q[x] = GUINT16_SWAP_LE_BE( p[x] );
} }
/* Swap 4- of bytes. /* Swap 4- of bytes.
@ -160,7 +160,7 @@ vips_copy_swap4( PEL *in, PEL *out, int width, VipsImage *im )
int x; int x;
for( x = 0; x < sz; x++ ) for( x = 0; x < sz; x++ )
out[x] = GUINT32_SWAP_LE_BE( in[x] ); q[x] = GUINT32_SWAP_LE_BE( p[x] );
} }
/* Swap 8- of bytes. /* Swap 8- of bytes.
@ -175,7 +175,7 @@ vips_copy_swap8( PEL *in, PEL *out, int width, VipsImage *im )
int x; int x;
for( x = 0; x < sz; x++ ) for( x = 0; x < sz; x++ )
out[x] = GUINT64_SWAP_LE_BE( in[x] ); q[x] = GUINT64_SWAP_LE_BE( p[x] );
} }
typedef void (*SwapFn)( PEL *in, PEL *out, int width, VipsImage *im ); typedef void (*SwapFn)( PEL *in, PEL *out, int width, VipsImage *im );

View File

@ -528,9 +528,12 @@ vips_foreign_load_build( VipsObject *object )
VipsForeignLoad *load = VIPS_FOREIGN_LOAD( object ); VipsForeignLoad *load = VIPS_FOREIGN_LOAD( object );
VipsForeignLoadClass *class = VIPS_FOREIGN_LOAD_GET_CLASS( object ); VipsForeignLoadClass *class = VIPS_FOREIGN_LOAD_GET_CLASS( object );
if( class->get_flags && VipsForeignFlags flags;
class->get_flags( load ) )
return( -1 ); flags = 0;
if( class->get_flags )
flags |= class->get_flags( load );
g_object_set( load, "flags", flags, NULL );
if( VIPS_OBJECT_CLASS( vips_foreign_load_parent_class )-> if( VIPS_OBJECT_CLASS( vips_foreign_load_parent_class )->
build( object ) ) build( object ) )
@ -605,7 +608,6 @@ vips_foreign_load_class_init( VipsForeignLoadClass *class )
VIPS_ARGUMENT_OPTIONAL_INPUT, VIPS_ARGUMENT_OPTIONAL_INPUT,
G_STRUCT_OFFSET( VipsForeignLoad, disc ), G_STRUCT_OFFSET( VipsForeignLoad, disc ),
TRUE ); TRUE );
} }
static void static void

View File

@ -62,21 +62,18 @@ vips_foreign_load_vips_is_a( const char *filename )
return( vips__file_magic( filename ) ); return( vips__file_magic( filename ) );
} }
static int static VipsForeignFlags
vips_foreign_load_vips_get_flags( VipsForeignLoad *load ) vips_foreign_load_vips_get_flags( VipsForeignLoad *load )
{ {
VipsForeignLoadVips *vips = (VipsForeignLoadVips *) load; VipsForeignLoadVips *vips = (VipsForeignLoadVips *) load;
VipsForeignFlags flags;
load->flags = VIPS_FOREIGN_PARTIAL; flags = VIPS_FOREIGN_PARTIAL;
if( vips__file_magic( vips->filename ) == VIPS_MAGIC_INTEL ) { if( vips__file_magic( vips->filename ) == VIPS_MAGIC_SPARC )
printf( "vips_foreign_load_vips_get_flags: " flags |= VIPS_FOREIGN_BIGENDIAN;
"%s is intel, setting bigendian\n",
vips->filename );
load->flags |= VIPS_FOREIGN_BIGENDIAN;
}
return( 0 ); return( flags );
} }
static int static int

View File

@ -88,7 +88,8 @@ void *vips_foreign_map( const char *base,
typedef enum { typedef enum {
VIPS_FOREIGN_NONE = 0, /* No flags set */ VIPS_FOREIGN_NONE = 0, /* No flags set */
VIPS_FOREIGN_PARTIAL = 1, /* Lazy read OK (eg. tiled tiff) */ VIPS_FOREIGN_PARTIAL = 1, /* Lazy read OK (eg. tiled tiff) */
VIPS_FOREIGN_BIGENDIAN = 2 /* Most-significant byte first */ VIPS_FOREIGN_BIGENDIAN = 2, /* Most-significant byte first */
VIPS_FOREIGN_ALL = 3 /* All flags set */
} VipsForeignFlags; } VipsForeignFlags;
#define VIPS_TYPE_FOREIGN_LOAD (vips_foreign_load_get_type()) #define VIPS_TYPE_FOREIGN_LOAD (vips_foreign_load_get_type())
@ -134,15 +135,15 @@ typedef struct _VipsForeignLoadClass {
/*< public >*/ /*< public >*/
/* Is a foreign in this format. /* Is a file in this format.
*/ */
gboolean (*is_a)( const char * ); gboolean (*is_a)( const char * );
/* Get the flags for this foreign. /* Get the flags for this file.
*/ */
int (*get_flags)( VipsForeignLoad * ); VipsForeignFlags (*get_flags)( VipsForeignLoad * );
/* Set the header fields in @out from @foreignname. If you can read the /* Set the header fields in @out from @filename. If you can read the
* whole image as well with no performance cost (as with vipsload), * whole image as well with no performance cost (as with vipsload),
* leave ->load() NULL and only @header will be used. * leave ->load() NULL and only @header will be used.
*/ */

View File

@ -15,6 +15,7 @@ vips_foreign_flags_get_type( void )
{VIPS_FOREIGN_NONE, "VIPS_FOREIGN_NONE", "none"}, {VIPS_FOREIGN_NONE, "VIPS_FOREIGN_NONE", "none"},
{VIPS_FOREIGN_PARTIAL, "VIPS_FOREIGN_PARTIAL", "partial"}, {VIPS_FOREIGN_PARTIAL, "VIPS_FOREIGN_PARTIAL", "partial"},
{VIPS_FOREIGN_BIGENDIAN, "VIPS_FOREIGN_BIGENDIAN", "bigendian"}, {VIPS_FOREIGN_BIGENDIAN, "VIPS_FOREIGN_BIGENDIAN", "bigendian"},
{VIPS_FOREIGN_ALL, "VIPS_FOREIGN_ALL", "all"},
{0, NULL, NULL} {0, NULL, NULL}
}; };