diff --git a/TODO b/TODO index 39807042..5ea76bf3 100644 --- a/TODO +++ b/TODO @@ -1,41 +1,127 @@ -- how do we set up the inheritance? - we have +- argh this is horrible - operation - file (filename, priority, suffs) - save (in, ready, saveable, format_table) - jpeg (Q, profile) + how about adding a property 'fileloader' ... define this and your object + will be tested by vips_foreign_find_load() - of that system we need the same args, except without suffs and filename ... - we do want priority + or! put is_a etc. in VipsForeign but only set them for classes which support + it and leave NULL otherwise - perhaps reorganse as + consider just properties ... at the moment we have: - operation - format (priority) - save (in, ready, saveable, format_table) - jpeg (Q, profile) - file (filename, suffs) + VipsForeign (filename) + VipsForeignLoad (disc, flags) + VipsForeignLoadJpeg (shrink, fail) + VipsForeignLoadVips + VipsForeignSave (in) + VipsForeignSaveJpeg (Q, profile) + VipsForeignSaveVips - operation - format (priority) - save (in, ready, saveable, format_table) - jpeg (Q, profile) - buffer (buff) + how about: - operation - format (priority) - save (in, ready, saveable, format_table) - tiff (Q, profile, filename, suffs) + VipsForeign + VipsForeignLoad (disc, flags) + VipsForeignLoadJpeg (shrink, fail) + VipsForeignLoadJpegBuffer (buffer) + VipsForeignLoadJpegFile (filename) + VipsForeignLoadVips (source-filename) + VipsForeignLoadTiff (source-filename, page) + VipsForeignSave (in) + VipsForeignSaveJpeg (Q, profile) + VipsForeignSaveJpegFile (filename) + VipsForeignSaveJpegBuffer (buffer) + VipsForeignSaveVips (dest-filename) + VipsForeignSaveTiff (dest-filename, pyramid, comp, etc.) - means when we search for a format to save with, not all subclasses of format - will have a suffs field, we'd need to test + so all we do is nmove the filename prop of the load/save subclasses, not too + bad + + +- we can make the interfaces we need much simpler if we use properties for all + data members ... eg. fetch "flags" property if we can + + put 'priority' in VipsForeignClass + + interfaces become + + interface load (header, load) + interface load-from-file (is_a) + interface load-from-buffer (buffer) + + interface save (ready, saveable, format_table) + interface save-to-file (filename, suffs) + interface save-to-buffer (buffer) + + classes are + + VipsForeign (priority) + VipsForeignLoad (disc, flags, out, real, get_flags, header, load) + VipsForeignLoadJpeg (shrink, fail) + VipsForeignLoadJpegFile (filename, is_a) + VipsForeignLoadJpegBuffer (buffer) + VipsForeignSave (in, ready, saveable, format_table) + VipsForeignSaveJpeg (Q, profile) + VipsForeignSaveJpegFile (filename, suffs) + VipsForeignSaveJpegBuffer (buffer) +- at the moment we have: -- add classes to read and write jpeg buffers + VipsFile (filename) + VipsFileLoad (disc, flags) + VipsFileLoadJpeg (shrink, fail) + VipsFileSave (in) + VipsFileSaveJpeg (Q, profile) + + we want jpeg*_buffer to have everything jpeg* has, except filename and + suffs + + reorganise as + + VipsForeign (priority) + VipsForeignLoad (disc, flags, out, real, get_flags, header, load) + VipsForeignLoadJpeg (shrink, fail) + VipsForeignLoadJpegFile (filename, is_a) + VipsForeignLoadJpegBuffer (buffer) + VipsForeignSave (in, ready, saveable, format_table) + VipsForeignSaveJpeg (Q, profile) + VipsForeignSaveJpegFile (filename, suffs) + VipsForeignSaveJpegBuffer (buffer) + + how do we do 'pick a loader by filename'? we need to find all subclasses of + VipsForeign which implement suffs? + + we're going to need to register loaders and savers on a separate list + somewhere :-( + + or have load-from-file as an interface? + + interface load (priority, disc, flags, out, get_flags, header, load) + interface load-from-file (filename, is_a) + interface load-from-buffer (buffer) + + interface save (priority, in, ready, saveable, format_table) + interface save-to-file (filename, suffs) + interface save-to-buffer (buffer) + + then walk VipsForeign and test whether each class implements load-from-file + + can interfaces have data members? + + read up on gobject interfaces + + + +- test vips_foreign_load_vips_get_flags(), sense inverted? + + we have various printf()s left in the byteswap codepath + + test this, if we can .. perhaps add a swap-magic flag to edvips? + + + +- add classes for read and write jpeg buffers make compat wrappers for old im_jpeg2vips() and im_vips2jpeg() diff --git a/configure.in b/configure.in index 2fba6c00..d51edd22 100644 --- a/configure.in +++ b/configure.in @@ -635,7 +635,7 @@ AC_OUTPUT([ libvips/convolution/Makefile libvips/deprecated/Makefile libvips/format/Makefile - libvips/file/Makefile + libvips/foreign/Makefile libvips/freq_filt/Makefile libvips/histograms_lut/Makefile libvips/inplace/Makefile diff --git a/libvips/Makefile.am b/libvips/Makefile.am index 3999b2be..62304d2e 100644 --- a/libvips/Makefile.am +++ b/libvips/Makefile.am @@ -10,7 +10,7 @@ C_LIB = endif SUBDIRS = \ - file \ + foreign \ include \ arithmetic \ resample \ @@ -53,7 +53,7 @@ libvips_la_LIBADD = \ deprecated/libdeprecated.la \ $(C_LIB) \ format/libformat.la \ - file/libfile.la \ + foreign/libforeign.la \ freq_filt/libfreq_filt.la \ histograms_lut/libhistograms_lut.la \ inplace/libinplace.la \ diff --git a/libvips/file/Makefile.am b/libvips/foreign/Makefile.am similarity index 70% rename from libvips/file/Makefile.am rename to libvips/foreign/Makefile.am index 50cc385d..4cf0a521 100644 --- a/libvips/file/Makefile.am +++ b/libvips/foreign/Makefile.am @@ -1,6 +1,6 @@ -noinst_LTLIBRARIES = libfile.la +noinst_LTLIBRARIES = libforeign.la -libfile_la_SOURCES = \ +libforeign_la_SOURCES = \ vips2jpeg.c \ jpeg2vips.c \ jpeg.h \ @@ -8,6 +8,6 @@ libfile_la_SOURCES = \ jpegsave.c \ vipssave.c \ vipsload.c \ - file.c + foreign.c INCLUDES = -I${top_srcdir}/libvips/include @VIPS_CFLAGS@ @VIPS_INCLUDES@ diff --git a/libvips/file/file.c b/libvips/foreign/foreign.c similarity index 72% rename from libvips/file/file.c rename to libvips/foreign/foreign.c index 4057f98c..e55fdfca 100644 --- a/libvips/file/file.c +++ b/libvips/foreign/foreign.c @@ -56,48 +56,48 @@ * * If you define a new file, support for * it automatically appears in all VIPS user-interfaces. It will also be - * transparently supported by vips_image_new_from_file() and friends. + * transparently supported by vips_image_new_from_foreign() and friends. * - * VIPS comes with VipsFile for TIFF, JPEG, PNG, Analyze, PPM, OpenEXR, CSV, + * VIPS comes with VipsForeign for TIFF, JPEG, PNG, Analyze, PPM, OpenEXR, CSV, * Matlab, Radiance, RAW, VIPS and one that wraps libMagick. */ /** - * VipsFileFlags: - * @VIPS_FILE_NONE: no flags set - * @VIPS_FILE_PARTIAL: the image may be read lazilly - * @VIPS_FILE_BIGENDIAN: image pixels are most-significant byte first + * VipsForeignFlags: + * @VIPS_FOREIGN_NONE: no flags set + * @VIPS_FOREIGN_PARTIAL: the image may be read lazilly + * @VIPS_FOREIGN_BIGENDIAN: image pixels are most-significant byte first * * Some hints about the image loader. * - * @VIPS_FILE_PARTIAL means that the image can be read directly from the + * @VIPS_FOREIGN_PARTIAL means that the image can be read directly from the * file without needing to be unpacked to a temporary image first. * - * @VIPS_FILE_BIGENDIAN means that image pixels are most-significant byte + * @VIPS_FOREIGN_BIGENDIAN means that image pixels are most-significant byte * first. Depending on the native byte order of the host machine, you may * need to swap bytes. See copy_swap(). */ /** - * VipsFile: + * VipsForeign: * - * #VipsFile has these virtual methods: + * #VipsForeign has these virtual methods: * * |[ - * typedef struct _VipsFileClass { + * typedef struct _VipsForeignClass { * VipsObjectClass parent_class; * * gboolean (*is_a)( const char *filename ); * int (*header)( const char *filename, VipsImage *out ); * int (*load)( const char *filename, VipsImage *out ); * int (*save)( VipsImage *in, const char *filename ); - * VipsFileFlags (*get_flags)( const char *filename ); + * VipsForeignFlags (*get_flags)( const char *filename ); * int priority; * const char **suffs; - * } VipsFileClass; + * } VipsForeignClass; * ]| * - * Add a new file to VIPS by subclassing VipsFile. Subclasses need to + * Add a new file to VIPS by subclassing VipsForeign. Subclasses need to * implement at least load() or save(). * * These members are: @@ -179,7 +179,7 @@ * At the command-line, use: * * |[ - * vips --list classes | grep File + * vips --list classes | grep Foreign * ]| * * To see a list of all the supported files. @@ -187,14 +187,14 @@ * For example, the TIFF file is defined like this: * |[ -typedef VipsFile VipsFileTiff; -typedef VipsFileClass VipsFileTiffClass; +typedef VipsForeign VipsForeignTiff; +typedef VipsForeignClass VipsForeignTiffClass; static void -vips_file_tiff_class_init( VipsFileTiffClass *class ) +vips_foreign_tiff_class_init( VipsForeignTiffClass *class ) { VipsObjectClass *object_class = (VipsObjectClass *) class; - VipsFileClass *file_class = (VipsFileClass *) class; + VipsForeignClass *file_class = (VipsForeignClass *) class; object_class->nickname = "tiff"; object_class->description = _( "TIFF" ); @@ -208,14 +208,14 @@ vips_file_tiff_class_init( VipsFileTiffClass *class ) } static void -vips_file_tiff_init( VipsFileTiff *object ) +vips_foreign_tiff_init( VipsForeignTiff *object ) { } -G_DEFINE_TYPE( VipsFileTiff, vips_file_tiff, VIPS_TYPE_FILE ); +G_DEFINE_TYPE( VipsForeignTiff, vips_foreign_tiff, VIPS_TYPE_FOREIGN ); ]| * - * Then call vips_file_tiff_get_type() somewhere in your init code to link + * Then call vips_foreign_tiff_get_type() somewhere in your init code to link * the file into VIPS (though of course the tiff file is linked in for you * already). * @@ -224,15 +224,15 @@ G_DEFINE_TYPE( VipsFileTiff, vips_file_tiff, VIPS_TYPE_FILE ); /* Abstract base class for image files. */ -G_DEFINE_ABSTRACT_TYPE( VipsFile, vips_file, VIPS_TYPE_OPERATION ); +G_DEFINE_ABSTRACT_TYPE( VipsForeign, vips_foreign, VIPS_TYPE_OPERATION ); static void -vips_file_print_class( VipsObjectClass *object_class, VipsBuf *buf ) +vips_foreign_print_class( VipsObjectClass *object_class, VipsBuf *buf ) { - VipsFileClass *class = VIPS_FILE_CLASS( object_class ); + VipsForeignClass *class = VIPS_FOREIGN_CLASS( object_class ); const char **p; - VIPS_OBJECT_CLASS( vips_file_parent_class )-> + VIPS_OBJECT_CLASS( vips_foreign_parent_class )-> print_class( object_class, buf ); vips_buf_appends( buf, " " ); @@ -251,7 +251,7 @@ vips_file_print_class( VipsObjectClass *object_class, VipsBuf *buf ) } static void -vips_file_class_init( VipsFileClass *class ) +vips_foreign_class_init( VipsForeignClass *class ) { GObjectClass *gobject_class = G_OBJECT_CLASS( class ); VipsObjectClass *object_class = (VipsObjectClass *) class; @@ -261,27 +261,27 @@ vips_file_class_init( VipsFileClass *class ) object_class->nickname = "file"; object_class->description = _( "load and save image files" ); - object_class->print_class = vips_file_print_class; + object_class->print_class = vips_foreign_print_class; VIPS_ARG_STRING( class, "filename", 1, _( "Filename" ), - _( "File filename" ), + _( "Foreign filename" ), VIPS_ARGUMENT_REQUIRED_INPUT, - G_STRUCT_OFFSET( VipsFile, filename ), + G_STRUCT_OFFSET( VipsForeign, filename ), NULL ); } static void -vips_file_init( VipsFile *object ) +vips_foreign_init( VipsForeign *object ) { } /* To iterate over supported files we build a temp list of subclasses of - * VipsFile, sort by priority, iterate, and free. + * VipsForeign, sort by priority, iterate, and free. */ static void * -file_add_class( VipsFileClass *file, GSList **files ) +file_add_class( VipsForeignClass *file, GSList **files ) { /* Append so we don't reverse the list of files. */ @@ -291,19 +291,19 @@ file_add_class( VipsFileClass *file, GSList **files ) } static gint -file_compare( VipsFileClass *a, VipsFileClass *b ) +file_compare( VipsForeignClass *a, VipsForeignClass *b ) { return( b->priority - a->priority ); } /** - * vips_file_map: - * @base: base class to search below (eg. "VipsFileLoad") - * @fn: function to apply to each #VipsFileClass + * vips_foreign_map: + * @base: base class to search below (eg. "VipsForeignLoad") + * @fn: function to apply to each #VipsForeignClass * @a: user data * @b: user data * - * Apply a function to every #VipsFileClass that VIPS knows about. Files + * Apply a function to every #VipsForeignClass that VIPS knows about. Foreigns * are presented to the function in priority order. * * Like all VIPS map functions, if @fn returns %NULL, iteration continues. If @@ -315,7 +315,7 @@ file_compare( VipsFileClass *a, VipsFileClass *b ) * Returns: the result of iteration */ void * -vips_file_map( const char *base, VipsSListMap2Fn fn, void *a, void *b ) +vips_foreign_map( const char *base, VipsSListMap2Fn fn, void *a, void *b ) { GSList *files; void *result; @@ -334,24 +334,24 @@ vips_file_map( const char *base, VipsSListMap2Fn fn, void *a, void *b ) /* Abstract base class for image load. */ -G_DEFINE_ABSTRACT_TYPE( VipsFileLoad, vips_file_load, VIPS_TYPE_FILE ); +G_DEFINE_ABSTRACT_TYPE( VipsForeignLoad, vips_foreign_load, VIPS_TYPE_FOREIGN ); static void -vips_file_load_dispose( GObject *gobject ) +vips_foreign_load_dispose( GObject *gobject ) { - VipsFileLoad *load = VIPS_FILE_LOAD( gobject ); + VipsForeignLoad *load = VIPS_FOREIGN_LOAD( gobject ); VIPS_UNREF( load->real ); - G_OBJECT_CLASS( vips_file_load_parent_class )->dispose( gobject ); + G_OBJECT_CLASS( vips_foreign_load_parent_class )->dispose( gobject ); } static void -vips_file_load_print_class( VipsObjectClass *object_class, VipsBuf *buf ) +vips_foreign_load_print_class( VipsObjectClass *object_class, VipsBuf *buf ) { - VipsFileLoadClass *class = VIPS_FILE_LOAD_CLASS( object_class ); + VipsForeignLoadClass *class = VIPS_FOREIGN_LOAD_CLASS( object_class ); - VIPS_OBJECT_CLASS( vips_file_load_parent_class )-> + VIPS_OBJECT_CLASS( vips_foreign_load_parent_class )-> print_class( object_class, buf ); if( class->is_a ) @@ -364,13 +364,13 @@ vips_file_load_print_class( VipsObjectClass *object_class, VipsBuf *buf ) vips_buf_appends( buf, ", load" ); } -/* Can this VipsFile open this file? +/* Can this VipsForeign open this file? */ static void * -vips_file_load_new_from_file_sub( VipsFileLoadClass *load_class, +vips_foreign_load_new_from_foreign_sub( VipsForeignLoadClass *load_class, const char *filename ) { - VipsFileClass *class = VIPS_FILE_CLASS( load_class ); + VipsForeignClass *class = VIPS_FOREIGN_CLASS( load_class ); if( load_class->is_a ) { if( load_class->is_a( filename ) ) @@ -383,31 +383,31 @@ vips_file_load_new_from_file_sub( VipsFileLoadClass *load_class, } /** - * vips_file_find_load: + * vips_foreign_find_load: * @filename: file to find a file for * * Searches for an operation you could use to load a file. * - * See also: vips_file_read(). + * See also: vips_foreign_read(). * * Returns: the nmae of an operation on success, %NULL on error */ const char * -vips_file_find_load( const char *filename ) +vips_foreign_find_load( const char *filename ) { - VipsFileLoadClass *load_class; + VipsForeignLoadClass *load_class; if( !vips_existsf( "%s", filename ) ) { - vips_error( "VipsFileLoad", + vips_error( "VipsForeignLoad", _( "file \"%s\" not found" ), filename ); return( NULL ); } - if( !(load_class = (VipsFileLoadClass *) vips_file_map( - "VipsFileLoad", - (VipsSListMap2Fn) vips_file_load_new_from_file_sub, + if( !(load_class = (VipsForeignLoadClass *) vips_foreign_map( + "VipsForeignLoad", + (VipsSListMap2Fn) vips_foreign_load_new_from_foreign_sub, (void *) filename, NULL )) ) { - vips_error( "VipsFileLoad", + vips_error( "VipsForeignLoad", _( "file \"%s\" not a known file" ), filename ); return( NULL ); } @@ -416,18 +416,18 @@ vips_file_find_load( const char *filename ) } static VipsObject * -vips_file_load_new_from_string( const char *string ) +vips_foreign_load_new_from_string( const char *string ) { const char *file_op; GType type; - VipsFileLoad *load; + VipsForeignLoad *load; - if( !(file_op = vips_file_find_load( string )) ) + if( !(file_op = vips_foreign_find_load( string )) ) return( NULL ); type = g_type_from_name( file_op ); g_assert( type ); - load = VIPS_FILE_LOAD( g_object_new( type, NULL ) ); + load = VIPS_FOREIGN_LOAD( g_object_new( type, NULL ) ); g_object_set( load, "filename", string, NULL ); @@ -467,10 +467,10 @@ vips_get_disc_threshold( void ) * on the new image. */ static void * -vips_file_load_start_cb( VipsImage *out, void *a, void *dummy ) +vips_foreign_load_start_cb( VipsImage *out, void *a, void *dummy ) { - VipsFileLoad *load = VIPS_FILE_LOAD( a ); - VipsFileLoadClass *class = VIPS_FILE_LOAD_GET_CLASS( a ); + VipsForeignLoad *load = VIPS_FOREIGN_LOAD( a ); + VipsForeignLoadClass *class = VIPS_FOREIGN_LOAD_GET_CLASS( a ); if( !load->real ) { const size_t disc_threshold = vips_get_disc_threshold(); @@ -485,7 +485,7 @@ vips_file_load_start_cb( VipsImage *out, void *a, void *dummy ) */ if( load->disc && disc_threshold && - (load->flags & VIPS_FILE_PARTIAL) && + (load->flags & VIPS_FOREIGN_PARTIAL) && image_size > disc_threshold ) if( !(load->real = vips_image_new_disc_temp( "%s.v" )) ) return( NULL ); @@ -511,7 +511,7 @@ vips_file_load_start_cb( VipsImage *out, void *a, void *dummy ) /* Just pointer-copy. */ static int -vips_file_load_generate_cb( VipsRegion *or, +vips_foreign_load_generate_cb( VipsRegion *or, void *seq, void *a, void *b, gboolean *stop ) { VipsRegion *ir = (VipsRegion *) seq; @@ -532,10 +532,10 @@ vips_file_load_generate_cb( VipsRegion *or, } static int -vips_file_load_build( VipsObject *object ) +vips_foreign_load_build( VipsObject *object ) { - VipsFileLoad *load = VIPS_FILE_LOAD( object ); - VipsFileLoadClass *class = VIPS_FILE_LOAD_GET_CLASS( object ); + VipsForeignLoad *load = VIPS_FOREIGN_LOAD( object ); + VipsForeignLoadClass *class = VIPS_FOREIGN_LOAD_GET_CLASS( object ); g_object_set( object, "out", vips_image_new(), NULL ); @@ -543,7 +543,7 @@ vips_file_load_build( VipsObject *object ) class->get_flags( load ) ) return( -1 ); - if( VIPS_OBJECT_CLASS( vips_file_load_parent_class )-> + if( VIPS_OBJECT_CLASS( vips_foreign_load_parent_class )-> build( object ) ) return( -1 ); @@ -569,8 +569,8 @@ vips_file_load_build( VipsObject *object ) * pixels for @out from @real on demand. */ if( vips_image_generate( load->out, - vips_file_load_start_cb, - vips_file_load_generate_cb, + vips_foreign_load_start_cb, + vips_foreign_load_generate_cb, vips_stop_one, load, NULL ) ) return( -1 ); @@ -580,18 +580,18 @@ vips_file_load_build( VipsObject *object ) } static void -vips_file_load_class_init( VipsFileLoadClass *class ) +vips_foreign_load_class_init( VipsForeignLoadClass *class ) { GObjectClass *gobject_class = G_OBJECT_CLASS( class ); VipsObjectClass *object_class = (VipsObjectClass *) class; - gobject_class->dispose = vips_file_load_dispose; + gobject_class->dispose = vips_foreign_load_dispose; gobject_class->set_property = vips_object_set_property; gobject_class->get_property = vips_object_get_property; - object_class->build = vips_file_load_build; - object_class->print_class = vips_file_load_print_class; - object_class->new_from_string = vips_file_load_new_from_string; + object_class->build = vips_foreign_load_build; + object_class->print_class = vips_foreign_load_print_class; + object_class->new_from_string = vips_foreign_load_new_from_string; object_class->nickname = "fileload"; object_class->description = _( "file loaders" ); @@ -599,26 +599,26 @@ vips_file_load_class_init( VipsFileLoadClass *class ) _( "Output" ), _( "Output image" ), VIPS_ARGUMENT_REQUIRED_OUTPUT, - G_STRUCT_OFFSET( VipsFileLoad, out ) ); + G_STRUCT_OFFSET( VipsForeignLoad, out ) ); VIPS_ARG_ENUM( class, "flags", 6, _( "Flags" ), _( "Flags for this file" ), VIPS_ARGUMENT_OPTIONAL_OUTPUT, - G_STRUCT_OFFSET( VipsFileLoad, flags ), - VIPS_TYPE_FILE_FLAGS, VIPS_FILE_NONE ); + G_STRUCT_OFFSET( VipsForeignLoad, flags ), + VIPS_TYPE_FOREIGN_FLAGS, VIPS_FOREIGN_NONE ); VIPS_ARG_BOOL( class, "disc", 7, _( "Disc" ), _( "Open to disc" ), VIPS_ARGUMENT_OPTIONAL_INPUT, - G_STRUCT_OFFSET( VipsFileLoad, disc ), + G_STRUCT_OFFSET( VipsForeignLoad, disc ), TRUE ); } static void -vips_file_load_init( VipsFileLoad *load ) +vips_foreign_load_init( VipsForeignLoad *load ) { load->disc = TRUE; } @@ -626,24 +626,24 @@ vips_file_load_init( VipsFileLoad *load ) /* Abstract base class for image savers. */ -G_DEFINE_ABSTRACT_TYPE( VipsFileSave, vips_file_save, VIPS_TYPE_FILE ); +G_DEFINE_ABSTRACT_TYPE( VipsForeignSave, vips_foreign_save, VIPS_TYPE_FOREIGN ); static void -vips_file_save_dispose( GObject *gobject ) +vips_foreign_save_dispose( GObject *gobject ) { - VipsFileSave *save = VIPS_FILE_SAVE( gobject ); + VipsForeignSave *save = VIPS_FOREIGN_SAVE( gobject ); VIPS_UNREF( save->ready ); - G_OBJECT_CLASS( vips_file_save_parent_class )->dispose( gobject ); + G_OBJECT_CLASS( vips_foreign_save_parent_class )->dispose( gobject ); } static void -vips_file_save_print_class( VipsObjectClass *object_class, VipsBuf *buf ) +vips_foreign_save_print_class( VipsObjectClass *object_class, VipsBuf *buf ) { - VipsFileSaveClass *class = VIPS_FILE_SAVE_CLASS( object_class ); + VipsForeignSaveClass *class = VIPS_FOREIGN_SAVE_CLASS( object_class ); - VIPS_OBJECT_CLASS( vips_file_save_parent_class )-> + VIPS_OBJECT_CLASS( vips_foreign_save_parent_class )-> print_class( object_class, buf ); vips_buf_appendf( buf, ", %s", @@ -653,10 +653,10 @@ vips_file_save_print_class( VipsObjectClass *object_class, VipsBuf *buf ) /* Can we write this filename with this file? */ static void * -vips_file_save_new_from_filename_sub( VipsFileSaveClass *save_class, +vips_foreign_save_new_from_foreignname_sub( VipsForeignSaveClass *save_class, const char *filename ) { - VipsFileClass *class = VIPS_FILE_CLASS( save_class ); + VipsForeignClass *class = VIPS_FOREIGN_CLASS( save_class ); if( vips_filename_suffix_match( filename, class->suffs ) ) return( save_class ); @@ -665,25 +665,25 @@ vips_file_save_new_from_filename_sub( VipsFileSaveClass *save_class, } /** - * vips_file_find_save: + * vips_foreign_find_save: * @filename: name to find a file for * * Searches for an operation you could use to save a file. * - * See also: vips_file_write(). + * See also: vips_foreign_write(). * * Returns: the name of an operation on success, %NULL on error */ const char * -vips_file_find_save( const char *filename ) +vips_foreign_find_save( const char *filename ) { - VipsFileSaveClass *save_class; + VipsForeignSaveClass *save_class; - if( !(save_class = (VipsFileSaveClass *) vips_file_map( - "VipsFileSave", - (VipsSListMap2Fn) vips_file_save_new_from_filename_sub, + if( !(save_class = (VipsForeignSaveClass *) vips_foreign_map( + "VipsForeignSave", + (VipsSListMap2Fn) vips_foreign_save_new_from_foreignname_sub, (void *) filename, NULL )) ) { - vips_error( "VipsFileSave", + vips_error( "VipsForeignSave", _( "\"%s\" is not a supported image file." ), filename ); @@ -694,18 +694,18 @@ vips_file_find_save( const char *filename ) } static VipsObject * -vips_file_save_new_from_string( const char *string ) +vips_foreign_save_new_from_string( const char *string ) { const char *file_op; GType type; - VipsFileSave *save; + VipsForeignSave *save; - if( !(file_op = vips_file_find_save( string )) ) + if( !(file_op = vips_foreign_find_save( string )) ) return( NULL ); type = g_type_from_name( file_op ); g_assert( type ); - save = VIPS_FILE_SAVE( g_object_new( type, NULL ) ); + save = VIPS_FOREIGN_SAVE( g_object_new( type, NULL ) ); g_object_set( save, "filename", string, NULL ); @@ -716,9 +716,9 @@ vips_file_save_new_from_string( const char *string ) /* Generate the saveable image. */ static int -vips_file_convert_saveable( VipsFileSave *save ) +vips_foreign_convert_saveable( VipsForeignSave *save ) { - VipsFileSaveClass *class = VIPS_FILE_SAVE_GET_CLASS( save ); + VipsForeignSaveClass *class = VIPS_FOREIGN_SAVE_GET_CLASS( save ); VipsImage *in = save->in; /* in holds a reference to the output of our chain as we build it. @@ -910,14 +910,14 @@ vips_file_convert_saveable( VipsFileSave *save ) } static int -vips_file_save_build( VipsObject *object ) +vips_foreign_save_build( VipsObject *object ) { - VipsFileSave *save = VIPS_FILE_SAVE( object ); + VipsForeignSave *save = VIPS_FOREIGN_SAVE( object ); - if( vips_file_convert_saveable( save ) ) + if( vips_foreign_convert_saveable( save ) ) return( -1 ); - if( VIPS_OBJECT_CLASS( vips_file_save_parent_class )-> + if( VIPS_OBJECT_CLASS( vips_foreign_save_parent_class )-> build( object ) ) return( -1 ); @@ -925,18 +925,18 @@ vips_file_save_build( VipsObject *object ) } static void -vips_file_save_class_init( VipsFileSaveClass *class ) +vips_foreign_save_class_init( VipsForeignSaveClass *class ) { GObjectClass *gobject_class = G_OBJECT_CLASS( class ); VipsObjectClass *object_class = (VipsObjectClass *) class; - gobject_class->dispose = vips_file_save_dispose; + gobject_class->dispose = vips_foreign_save_dispose; gobject_class->set_property = vips_object_set_property; gobject_class->get_property = vips_object_get_property; - object_class->build = vips_file_save_build; - object_class->print_class = vips_file_save_print_class; - object_class->new_from_string = vips_file_save_new_from_string; + object_class->build = vips_foreign_save_build; + object_class->print_class = vips_foreign_save_print_class; + object_class->new_from_string = vips_foreign_save_new_from_string; object_class->nickname = "filesave"; object_class->description = _( "file savers" ); @@ -944,35 +944,35 @@ vips_file_save_class_init( VipsFileSaveClass *class ) _( "Input" ), _( "Image to save" ), VIPS_ARGUMENT_REQUIRED_INPUT, - G_STRUCT_OFFSET( VipsFileSave, in ) ); + G_STRUCT_OFFSET( VipsForeignSave, in ) ); } static void -vips_file_save_init( VipsFileSave *object ) +vips_foreign_save_init( VipsForeignSave *object ) { } /** - * vips_file_read: + * vips_foreign_read: * @filename: file to load * @out: output image * @...: %NULL-terminated list of optional named arguments * * Loads @filename into @out using the loader recommended by - * vips_file_find_load(). + * vips_foreign_find_load(). * - * See also: vips_file_write(). + * See also: vips_foreign_write(). * * Returns: 0 on success, -1 on error */ int -vips_file_read( const char *filename, VipsImage **out, ... ) +vips_foreign_read( const char *filename, VipsImage **out, ... ) { const char *operation; va_list ap; int result; - if( !(operation = vips_file_find_load( filename )) ) + if( !(operation = vips_foreign_find_load( filename )) ) return( -1 ); va_start( ap, out ); @@ -983,25 +983,25 @@ vips_file_read( const char *filename, VipsImage **out, ... ) } /** - * vips_file_write: + * vips_foreign_write: * @in: image to write * @filename: file to write to * * Saves @in to @filename using the saver recommended by - * vips_file_find_save(). + * vips_foreign_find_save(). * - * See also: vips_file_read(). + * See also: vips_foreign_read(). * * Returns: 0 on success, -1 on error */ int -vips_file_write( VipsImage *in, const char *filename, ... ) +vips_foreign_write( VipsImage *in, const char *filename, ... ) { const char *operation; va_list ap; int result; - if( !(operation = vips_file_find_save( filename )) ) + if( !(operation = vips_foreign_find_save( filename )) ) return( -1 ); va_start( ap, filename ); @@ -1015,17 +1015,17 @@ vips_file_write( VipsImage *in, const char *filename, ... ) * instead? */ void -vips_file_operation_init( void ) +vips_foreign_operation_init( void ) { - extern GType vips_file_load_jpeg_get_type( void ); - extern GType vips_file_save_jpeg_get_type( void ); - extern GType vips_file_load_vips_get_type( void ); - extern GType vips_file_save_vips_get_type( void ); + extern GType vips_foreign_load_jpeg_get_type( void ); + extern GType vips_foreign_save_jpeg_get_type( void ); + extern GType vips_foreign_load_vips_get_type( void ); + extern GType vips_foreign_save_vips_get_type( void ); #ifdef HAVE_JPEG - vips_file_load_jpeg_get_type(); - vips_file_save_jpeg_get_type(); + vips_foreign_load_jpeg_get_type(); + vips_foreign_save_jpeg_get_type(); #endif /*HAVE_JPEG*/ - vips_file_load_vips_get_type(); - vips_file_save_vips_get_type(); + vips_foreign_load_vips_get_type(); + vips_foreign_save_vips_get_type(); } diff --git a/libvips/file/jpeg.h b/libvips/foreign/jpeg.h similarity index 100% rename from libvips/file/jpeg.h rename to libvips/foreign/jpeg.h diff --git a/libvips/file/jpeg2vips.c b/libvips/foreign/jpeg2vips.c similarity index 91% rename from libvips/file/jpeg2vips.c rename to libvips/foreign/jpeg2vips.c index 84913ea5..ce1c8ddf 100644 --- a/libvips/file/jpeg2vips.c +++ b/libvips/foreign/jpeg2vips.c @@ -303,7 +303,7 @@ attach_exif_entry( ExifEntry *entry, VipsExif *ve ) /* Can't do anything sensible with the error return. */ - (void) im_meta_set_string( ve->image, + (void) vips_image_set_string( ve->image, vips_buf_all( &name ), vips_buf_all( &value ) ); } @@ -366,7 +366,7 @@ set_vips_resolution( IMAGE *im, ExifData *ed ) if( get_entry_rational( ed, EXIF_TAG_X_RESOLUTION, &xres ) || get_entry_rational( ed, EXIF_TAG_Y_RESOLUTION, &yres ) || get_entry_short( ed, EXIF_TAG_RESOLUTION_UNIT, &unit ) ) { - im_warn( "im_jpeg2vips", + vips_warn( "VipsJpeg", "%s", _( "error reading resolution" ) ); return; } @@ -387,7 +387,7 @@ set_vips_resolution( IMAGE *im, ExifData *ed ) break; default: - im_warn( "im_jpeg2vips", "%s", _( "bad resolution unit" ) ); + vips_warn( "VipsJpeg", "%s", _( "bad resolution unit" ) ); return; } @@ -401,14 +401,11 @@ attach_thumbnail( IMAGE *im, ExifData *ed ) if( ed->size > 0 ) { char *thumb_copy; - thumb_copy = im_malloc( NULL, ed->size ); + thumb_copy = g_malloc( ed->size ); memcpy( thumb_copy, ed->data, ed->size ); - if( im_meta_set_blob( im, "jpeg-thumbnail-data", - (im_callback_fn) im_free, thumb_copy, ed->size ) ) { - im_free( thumb_copy ); - return( -1 ); - } + vips_image_set_blob( im, "jpeg-thumbnail-data", + (VipsCallbackFn) g_free, thumb_copy, ed->size ); } return( 0 ); @@ -422,7 +419,7 @@ read_exif( IMAGE *im, void *data, int data_length ) /* Only use the first one. */ - if( im_header_get_typeof( im, IM_META_EXIF_NAME ) ) { + if( vips_image_get_typeof( im, VIPS_META_EXIF_NAME ) ) { #ifdef DEBUG printf( "read_exif: second EXIF block, ignoring\n" ); #endif /*DEBUG*/ @@ -436,14 +433,11 @@ read_exif( IMAGE *im, void *data, int data_length ) /* Always attach a copy of the unparsed exif data. */ - if( !(data_copy = im_malloc( NULL, data_length )) ) + if( !(data_copy = vips_malloc( NULL, data_length )) ) return( -1 ); memcpy( data_copy, data, data_length ); - if( im_meta_set_blob( im, IM_META_EXIF_NAME, - (im_callback_fn) im_free, data_copy, data_length ) ) { - im_free( data_copy ); - return( -1 ); - } + vips_image_set_blob( im, VIPS_META_EXIF_NAME, + (VipsCallbackFn) vips_free, data_copy, data_length ); #ifdef HAVE_EXIF { @@ -490,13 +484,13 @@ read_exif( IMAGE *im, void *data, int data_length ) } static int -read_xmp( IMAGE *im, void *data, int data_length ) +read_xmp( IMAGE *im, void *data, size_t data_length ) { char *data_copy; /* XMP sections start "http". Only use the first one. */ - if( im_header_get_typeof( im, VIPS_META_XMP_NAME ) ) { + if( vips_image_get_typeof( im, VIPS_META_XMP_NAME ) ) { #ifdef DEBUG printf( "read_xmp: second XMP block, ignoring\n" ); #endif /*DEBUG*/ @@ -510,14 +504,11 @@ read_xmp( IMAGE *im, void *data, int data_length ) /* Always attach a copy of the unparsed exif data. */ - if( !(data_copy = im_malloc( NULL, data_length )) ) + if( !(data_copy = vips_malloc( NULL, data_length )) ) return( -1 ); memcpy( data_copy, data, data_length ); - if( im_meta_set_blob( im, VIPS_META_XMP_NAME, - (im_callback_fn) im_free, data_copy, data_length ) ) { - im_free( data_copy ); - return( -1 ); - } + vips_image_set_blob( im, VIPS_META_XMP_NAME, + (VipsCallbackFn) vips_free, data_copy, data_length ); return( 0 ); } @@ -535,13 +526,13 @@ read_jpeg_header( struct jpeg_decompress_struct *cinfo, IMAGE *out, gboolean *invert_pels, int shrink ) { jpeg_saved_marker_ptr p; - int type; + VipsInterpretation interpretation; /* Capture app2 sections here for assembly. */ void *app2_data[MAX_APP2_SECTIONS] = { 0 }; - int app2_data_length[MAX_APP2_SECTIONS] = { 0 }; - int data_length; + size_t app2_data_length[MAX_APP2_SECTIONS] = { 0 }; + size_t data_length; int i; /* Read JPEG header. libjpeg will set out_color_space sanely for us @@ -555,11 +546,11 @@ read_jpeg_header( struct jpeg_decompress_struct *cinfo, *invert_pels = FALSE; switch( cinfo->out_color_space ) { case JCS_GRAYSCALE: - type = IM_TYPE_B_W; + interpretation = VIPS_INTERPRETATION_B_W; break; case JCS_CMYK: - type = IM_TYPE_CMYK; + interpretation = VIPS_INTERPRETATION_CMYK; /* Photoshop writes CMYK JPEG inverted :-( Maybe this is a * way to spot photoshop CMYK JPGs. */ @@ -569,22 +560,23 @@ read_jpeg_header( struct jpeg_decompress_struct *cinfo, case JCS_RGB: default: - type = IM_TYPE_sRGB; + interpretation = VIPS_INTERPRETATION_sRGB; break; } /* Set VIPS header. */ - im_initdesc( out, - cinfo->output_width, cinfo->output_height, - cinfo->output_components, - IM_BBITS_BYTE, IM_BANDFMT_UCHAR, IM_CODING_NONE, type, - 1.0, 1.0, 0, 0 ); + vips_image_init_fields( out, + cinfo->output_width, cinfo->output_height, + cinfo->output_components, + VIPS_FORMAT_UCHAR, VIPS_CODING_NONE, + interpretation, + 1.0, 1.0 ); /* Interlaced jpegs need lots of memory to read, so our caller needs * to know. */ - (void) im_meta_set_int( out, "jpeg-multiscan", + (void) vips_image_set_int( out, "jpeg-multiscan", jpeg_has_multiple_scans( cinfo ) ); /* Look for EXIF and ICC profile. @@ -609,12 +601,12 @@ read_jpeg_header( struct jpeg_decompress_struct *cinfo, /* Possible EXIF or XMP data. */ if( p->data_length > 4 && - im_isprefix( "Exif", (char *) p->data ) && + vips_isprefix( "Exif", (char *) p->data ) && read_exif( out, p->data, p->data_length ) ) return( -1 ); if( p->data_length > 4 && - im_isprefix( "http", (char *) p->data ) && + vips_isprefix( "http", (char *) p->data ) && read_xmp( out, p->data, p->data_length ) ) return( -1 ); @@ -624,7 +616,7 @@ read_jpeg_header( struct jpeg_decompress_struct *cinfo, /* ICC profile. */ if( p->data_length > 14 && - im_isprefix( "ICC_PROFILE", + vips_isprefix( "ICC_PROFILE", (char *) p->data ) ) { /* cur_marker numbers from 1, according to * spec. @@ -659,7 +651,7 @@ read_jpeg_header( struct jpeg_decompress_struct *cinfo, data_length ); #endif /*DEBUG*/ - if( !(data = im_malloc( NULL, data_length )) ) + if( !(data = vips_malloc( NULL, data_length )) ) return( -1 ); p = 0; @@ -668,11 +660,8 @@ read_jpeg_header( struct jpeg_decompress_struct *cinfo, p += app2_data_length[i]; } - if( im_meta_set_blob( out, IM_META_ICC_NAME, - (im_callback_fn) im_free, data, data_length ) ) { - im_free( data ); - return( -1 ); - } + vips_image_set_blob( out, VIPS_META_ICC_NAME, + (VipsCallbackFn) vips_free, data, data_length ); } return( 0 ); @@ -689,7 +678,7 @@ read_jpeg_image( struct jpeg_decompress_struct *cinfo, IMAGE *out, /* Check VIPS. */ - if( im_outcheck( out ) || im_setupout( out ) ) + if( vips_image_wio_output( out ) ) return( -1 ); /* Get size of output line and make a buffer. @@ -714,7 +703,7 @@ read_jpeg_image( struct jpeg_decompress_struct *cinfo, IMAGE *out, for( x = 0; x < sz; x++ ) row_pointer[0][x] = 255 - row_pointer[0][x]; } - if( im_writeline( y, out, row_pointer[0] ) ) + if( vips_image_write_line( out, y, row_pointer[0] ) ) return( -1 ); } @@ -728,8 +717,8 @@ read_jpeg_image( struct jpeg_decompress_struct *cinfo, IMAGE *out, /* Read a JPEG file into a VIPS image. */ int -vips__jpeg_read_file( const char *name, VipsImage *out, gboolean header_only, - int shrink, gboolean fail ) +vips__jpeg_read_file( const char *filename, VipsImage *out, + gboolean header_only, int shrink, gboolean fail ) { struct jpeg_decompress_struct cinfo; ErrorManager eman; @@ -754,7 +743,7 @@ vips__jpeg_read_file( const char *name, VipsImage *out, gboolean header_only, /* Make input. */ - if( !(fp = im__file_open_read( name, NULL, FALSE )) ) + if( !(fp = vips__file_open_read( filename, NULL, FALSE )) ) return( -1 ); eman.fp = fp; jpeg_stdio_src( &cinfo, fp ); @@ -778,13 +767,14 @@ vips__jpeg_read_file( const char *name, VipsImage *out, gboolean header_only, if( eman.pub.num_warnings != 0 ) { if( fail ) { - im_error( "im_jpeg2vips", "%s", im_error_buffer() ); + vips_error( "VipsJpeg", "%s", vips_error_buffer() ); result = -1; } else { - im_warn( "im_jpeg2vips", _( "read gave %ld warnings" ), + vips_warn( "VipsJpeg", + _( "read gave %ld warnings" ), eman.pub.num_warnings ); - im_warn( "im_jpeg2vips", "%s", im_error_buffer() ); + vips_warn( "VipsJpeg", "%s", vips_error_buffer() ); } } @@ -965,8 +955,7 @@ buf_source (j_decompress_ptr cinfo, void *buf, size_t len) int vips__jpeg_read_buffer( void *buf, size_t len, VipsImage *out, - gboolean header_only, - int shrink, int fail ) + gboolean header_only, int shrink, int fail ) { struct jpeg_decompress_struct cinfo; ErrorManager eman; diff --git a/libvips/file/jpegload.c b/libvips/foreign/jpegload.c similarity index 50% rename from libvips/file/jpegload.c rename to libvips/foreign/jpegload.c index 49a293be..b6f07354 100644 --- a/libvips/file/jpegload.c +++ b/libvips/foreign/jpegload.c @@ -1,7 +1,46 @@ -/* save to jpeg +/* load jpeg from a file * + * 28/11/03 JC + * - better no-overshoot on tile loop + * 12/11/04 + * - better demand size choice for eval + * 30/6/05 JC + * - update im_error()/im_warn() + * - now loads and saves exif data + * 30/7/05 + * - now loads ICC profiles + * - now saves ICC profiles from the VIPS header + * 24/8/05 + * - jpeg load sets vips xres/yres from exif, if possible + * - jpeg save sets exif xres/yres from vips, if possible + * 29/8/05 + * - cut from old vips_jpeg.c + * 13/10/06 + * - add shrink != 1 && jpeg->shrink != 2 && @@ -106,22 +150,28 @@ vips_file_load_jpeg_build( VipsObject *object ) return( -1 ); } - if( VIPS_OBJECT_CLASS( vips_file_load_jpeg_parent_class )-> + if( VIPS_OBJECT_CLASS( vips_foreign_load_jpeg_parent_class )-> build( object ) ) return( -1 ); return( 0 ); } +static gboolean +vips_foreign_load_jpeg_is_a( const char *filename ) +{ + return( vips__isjpeg( filename ) ); +} + /* Read just the image header into ->out. */ static int -vips_file_load_jpeg_header( VipsFileLoad *load ) +vips_foreign_load_jpeg_header( VipsForeignLoad *load ) { - VipsFile *file = VIPS_FILE( load ); - VipsFileLoadJpeg *jpeg = (VipsFileLoadJpeg *) load; + VipsForeign *foreign = VIPS_FOREIGN( load ); + VipsForeignLoadJpeg *jpeg = (VipsForeignLoadJpeg *) load; - if( vips__jpeg_read_file( file->filename, load->out, + if( vips__jpeg_read_file( foreign->filename, load->out, TRUE, jpeg->shrink, jpeg->fail ) ) return( -1 ); @@ -129,56 +179,58 @@ vips_file_load_jpeg_header( VipsFileLoad *load ) } static int -vips_file_load_jpeg_load( VipsFileLoad *load ) +vips_foreign_load_jpeg_load( VipsForeignLoad *load ) { - VipsFile *file = VIPS_FILE( load ); - VipsFileLoadJpeg *jpeg = (VipsFileLoadJpeg *) load; + VipsForeign *foreign = VIPS_FOREIGN( load ); + VipsForeignLoadJpeg *jpeg = (VipsForeignLoadJpeg *) load; - if( vips__jpeg_read_file( file->filename, load->real, + if( vips__jpeg_read_file( foreign->filename, load->real, FALSE, jpeg->shrink, jpeg->fail ) ) return( -1 ); return( 0 ); } +static const char *jpeg_suffs[] = { ".jpg", ".jpeg", ".jpe", NULL }; + static void -vips_file_load_jpeg_class_init( VipsFileLoadJpegClass *class ) +vips_foreign_load_jpeg_class_init( VipsForeignLoadJpegClass *class ) { GObjectClass *gobject_class = G_OBJECT_CLASS( class ); VipsObjectClass *object_class = (VipsObjectClass *) class; - VipsFileClass *file_class = (VipsFileClass *) class; - VipsFileLoadClass *load_class = (VipsFileLoadClass *) class; + VipsForeignClass *foreign_class = (VipsForeignClass *) class; + VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class; gobject_class->set_property = vips_object_set_property; gobject_class->get_property = vips_object_get_property; object_class->nickname = "jpegload"; object_class->description = _( "load jpeg from file" ); - object_class->build = vips_file_load_jpeg_build; + object_class->build = vips_foreign_load_jpeg_build; - file_class->suffs = vips__jpeg_suffs; + foreign_class->suffs = jpeg_suffs; - load_class->is_a = vips__isjpeg; - load_class->header = vips_file_load_jpeg_header; - load_class->load = vips_file_load_jpeg_load; + load_class->is_a = vips_foreign_load_jpeg_is_a; + load_class->header = vips_foreign_load_jpeg_header; + load_class->load = vips_foreign_load_jpeg_load; VIPS_ARG_INT( class, "shrink", 10, _( "Shrink" ), _( "Shrink factor on load" ), VIPS_ARGUMENT_OPTIONAL_INPUT, - G_STRUCT_OFFSET( VipsFileLoadJpeg, shrink ), + G_STRUCT_OFFSET( VipsForeignLoadJpeg, shrink ), 1, 16, 1 ); VIPS_ARG_BOOL( class, "fail", 11, _( "Fail" ), _( "Fail on first warning" ), VIPS_ARGUMENT_OPTIONAL_INPUT, - G_STRUCT_OFFSET( VipsFileLoadJpeg, fail ), + G_STRUCT_OFFSET( VipsForeignLoadJpeg, fail ), FALSE ); } static void -vips_file_load_jpeg_init( VipsFileLoadJpeg *jpeg ) +vips_foreign_load_jpeg_init( VipsForeignLoadJpeg *jpeg ) { jpeg->shrink = 1; } diff --git a/libvips/file/jpegsave.c b/libvips/foreign/jpegsave.c similarity index 74% rename from libvips/file/jpegsave.c rename to libvips/foreign/jpegsave.c index 5d21fa3b..1532b27a 100644 --- a/libvips/file/jpegsave.c +++ b/libvips/foreign/jpegsave.c @@ -75,8 +75,8 @@ #include "jpeg.h" -typedef struct _VipsFileSaveJpeg { - VipsFileSave parent_object; +typedef struct _VipsForeignSaveJpeg { + VipsForeignSave parent_object; /* Quality factor. */ @@ -86,25 +86,24 @@ typedef struct _VipsFileSaveJpeg { */ char *profile; -} VipsFileSaveJpeg; +} VipsForeignSaveJpeg; -typedef VipsFileSaveClass VipsFileSaveJpegClass; +typedef VipsForeignSaveClass VipsForeignSaveJpegClass; -G_DEFINE_TYPE( VipsFileSaveJpeg, vips_file_save_jpeg, VIPS_TYPE_FILE_SAVE ); +G_DEFINE_TYPE( VipsForeignSaveJpeg, vips_foreign_save_jpeg, VIPS_TYPE_FOREIGN_SAVE ); static int -vips_file_save_jpeg_build( VipsObject *object ) +vips_foreign_save_jpeg_build( VipsObject *object ) { - VipsFile *file = (VipsFile *) object; - VipsFileSave *save = (VipsFileSave *) object; - VipsFileSaveJpeg *jpeg = (VipsFileSaveJpeg *) object; + VipsForeign *foreign = (VipsForeign *) object; + VipsForeignSave *save = (VipsForeignSave *) object; + VipsForeignSaveJpeg *jpeg = (VipsForeignSaveJpeg *) object; - if( VIPS_OBJECT_CLASS( vips_file_save_jpeg_parent_class )-> + if( VIPS_OBJECT_CLASS( vips_foreign_save_jpeg_parent_class )-> build( object ) ) return( -1 ); - // ->ready loses a ref suring the write?? - if( vips__jpeg_write_file( save->ready, file->filename, + if( vips__jpeg_write_file( save->ready, foreign->filename, jpeg->Q, jpeg->profile ) ) return( -1 ); @@ -121,21 +120,21 @@ static int bandfmt_jpeg[10] = { }; static void -vips_file_save_jpeg_class_init( VipsFileSaveJpegClass *class ) +vips_foreign_save_jpeg_class_init( VipsForeignSaveJpegClass *class ) { GObjectClass *gobject_class = G_OBJECT_CLASS( class ); VipsObjectClass *object_class = (VipsObjectClass *) class; - VipsFileClass *file_class = (VipsFileClass *) class; - VipsFileSaveClass *save_class = (VipsFileSaveClass *) class; + VipsForeignClass *foreign_class = (VipsForeignClass *) class; + VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class; gobject_class->set_property = vips_object_set_property; gobject_class->get_property = vips_object_get_property; object_class->nickname = "jpegsave"; object_class->description = _( "save image to jpeg file" ); - object_class->build = vips_file_save_jpeg_build; + object_class->build = vips_foreign_save_jpeg_build; - file_class->suffs = vips__jpeg_suffs; + foreign_class->suffs = vips__jpeg_suffs; save_class->saveable = VIPS_SAVEABLE_RGB_CMYK; save_class->format_table = bandfmt_jpeg; @@ -144,19 +143,19 @@ vips_file_save_jpeg_class_init( VipsFileSaveJpegClass *class ) _( "Q" ), _( "Q factor" ), VIPS_ARGUMENT_OPTIONAL_INPUT, - G_STRUCT_OFFSET( VipsFileSaveJpeg, Q ), + G_STRUCT_OFFSET( VipsForeignSaveJpeg, Q ), 1, 100, 75 ); VIPS_ARG_STRING( class, "profile", 11, _( "profile" ), _( "ICC profile to embed" ), VIPS_ARGUMENT_OPTIONAL_INPUT, - G_STRUCT_OFFSET( VipsFileSaveJpeg, profile ), + G_STRUCT_OFFSET( VipsForeignSaveJpeg, profile ), NULL ); } static void -vips_file_save_jpeg_init( VipsFileSaveJpeg *jpeg ) +vips_foreign_save_jpeg_init( VipsForeignSaveJpeg *jpeg ) { jpeg->Q = 75; } diff --git a/libvips/file/vips2jpeg.c b/libvips/foreign/vips2jpeg.c similarity index 99% rename from libvips/file/vips2jpeg.c rename to libvips/foreign/vips2jpeg.c index a57d5b62..34cb8e3d 100644 --- a/libvips/file/vips2jpeg.c +++ b/libvips/foreign/vips2jpeg.c @@ -851,8 +851,8 @@ typedef struct _Block { struct _Block *next; JOCTET *data; /* Allocated area */ - int size; /* Max size */ - int used; /* How much has been used */ + size_t size; /* Max size */ + size_t used; /* How much has been used */ } Block; static Block * @@ -897,10 +897,10 @@ block_append( Block *block ) return( new ); } -static int +static size_t block_length( Block *block ) { - int len; + size_t len; len = 0; for( block = block->first; block; block = block->next ) diff --git a/libvips/file/vipsload.c b/libvips/foreign/vipsload.c similarity index 60% rename from libvips/file/vipsload.c rename to libvips/foreign/vipsload.c index ed123649..6cb34161 100644 --- a/libvips/file/vipsload.c +++ b/libvips/foreign/vipsload.c @@ -44,42 +44,42 @@ #include #include -typedef VipsFileLoad VipsFileLoadVips; -typedef VipsFileLoadClass VipsFileLoadVipsClass; +typedef VipsForeignLoad VipsForeignLoadVips; +typedef VipsForeignLoadClass VipsForeignLoadVipsClass; -G_DEFINE_TYPE( VipsFileLoadVips, vips_file_load_vips, VIPS_TYPE_FILE_LOAD ); +G_DEFINE_TYPE( VipsForeignLoadVips, vips_foreign_load_vips, VIPS_TYPE_FOREIGN_LOAD ); static gboolean -vips_file_load_vips_is_a( const char *filename ) +vips_foreign_load_vips_is_a( const char *filename ) { return( vips__file_magic( filename ) ); } static int -vips_file_load_vips_get_flags( VipsFileLoad *load ) +vips_foreign_load_vips_get_flags( VipsForeignLoad *load ) { - VipsFile *file = VIPS_FILE( load ); + VipsForeign *foreign = VIPS_FOREIGN( load ); - load->flags = VIPS_FILE_PARTIAL; + load->flags = VIPS_FOREIGN_PARTIAL; - if( vips__file_magic( file->filename ) == VIPS_MAGIC_INTEL ) { - printf( "vips_file_load_vips_get_flags: " + if( vips__file_magic( foreign->filename ) == VIPS_MAGIC_INTEL ) { + printf( "vips_foreign_load_vips_get_flags: " "%s is intel, setting bigendian\n", - file->filename ); - load->flags |= VIPS_FILE_BIGENDIAN; + foreign->filename ); + load->flags |= VIPS_FOREIGN_BIGENDIAN; } return( 0 ); } static int -vips_file_load_vips_header( VipsFileLoad *load ) +vips_foreign_load_vips_header( VipsForeignLoad *load ) { - VipsFile *file = VIPS_FILE( load ); + VipsForeign *foreign = VIPS_FOREIGN( load ); VipsImage *out; VipsImage *out2; - if( !(out2 = vips_image_new_from_file( file->filename )) ) + if( !(out2 = vips_image_new_from_file( foreign->filename )) ) return( -1 ); /* Remove the @out that's there now. @@ -96,25 +96,25 @@ vips_file_load_vips_header( VipsFileLoad *load ) static const char *vips_suffs[] = { ".v", NULL }; static void -vips_file_load_vips_class_init( VipsFileLoadVipsClass *class ) +vips_foreign_load_vips_class_init( VipsForeignLoadVipsClass *class ) { VipsObjectClass *object_class = (VipsObjectClass *) class; - VipsFileClass *file_class = (VipsFileClass *) class; - VipsFileLoadClass *load_class = (VipsFileLoadClass *) class; + VipsForeignClass *foreign_class = (VipsForeignClass *) class; + VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class; object_class->nickname = "vipsload"; object_class->description = _( "load vips from file" ); - file_class->suffs = vips_suffs; + foreign_class->suffs = vips_suffs; - load_class->is_a = vips_file_load_vips_is_a; - load_class->get_flags = vips_file_load_vips_get_flags; - load_class->header = vips_file_load_vips_header; + load_class->is_a = vips_foreign_load_vips_is_a; + load_class->get_flags = vips_foreign_load_vips_get_flags; + load_class->header = vips_foreign_load_vips_header; load_class->load = NULL; } static void -vips_file_load_vips_init( VipsFileLoadVips *vips ) +vips_foreign_load_vips_init( VipsForeignLoadVips *vips ) { } diff --git a/libvips/file/vipssave.c b/libvips/foreign/vipssave.c similarity index 72% rename from libvips/file/vipssave.c rename to libvips/foreign/vipssave.c index 57080ea1..49b25c27 100644 --- a/libvips/file/vipssave.c +++ b/libvips/foreign/vipssave.c @@ -46,22 +46,23 @@ #include -typedef VipsFileSave VipsFileSaveVips; -typedef VipsFileSaveClass VipsFileSaveVipsClass; +typedef VipsForeignSave VipsForeignSaveVips; +typedef VipsForeignSaveClass VipsForeignSaveVipsClass; -G_DEFINE_TYPE( VipsFileSaveVips, vips_file_save_vips, VIPS_TYPE_FILE_SAVE ); +G_DEFINE_TYPE( VipsForeignSaveVips, vips_foreign_save_vips, + VIPS_TYPE_FOREIGN_SAVE ); static int -vips_file_save_vips_build( VipsObject *object ) +vips_foreign_save_vips_build( VipsObject *object ) { - VipsFile *file = (VipsFile *) object; - VipsFileSave *save = (VipsFileSave *) object; + VipsForeign *foreign = (VipsForeign *) object; + VipsForeignSave *save = (VipsForeignSave *) object; - if( VIPS_OBJECT_CLASS( vips_file_save_vips_parent_class )-> + if( VIPS_OBJECT_CLASS( vips_foreign_save_vips_parent_class )-> build( object ) ) return( -1 ); - if( vips_image_write_to_file( save->ready, file->filename ) ) + if( vips_image_write_to_file( save->ready, foreign->filename ) ) return( -1 ); return( 0 ); @@ -91,24 +92,24 @@ static int vips_bandfmt_vips[10] = { static const char *vips_suffs[] = { ".v", NULL }; static void -vips_file_save_vips_class_init( VipsFileSaveVipsClass *class ) +vips_foreign_save_vips_class_init( VipsForeignSaveVipsClass *class ) { VipsObjectClass *object_class = (VipsObjectClass *) class; - VipsFileClass *file_class = (VipsFileClass *) class; - VipsFileSaveClass *save_class = (VipsFileSaveClass *) class; + VipsForeignClass *foreign_class = (VipsForeignClass *) class; + VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class; object_class->nickname = "vipssave"; object_class->description = _( "save image to vips file" ); - object_class->build = vips_file_save_vips_build; + object_class->build = vips_foreign_save_vips_build; - file_class->suffs = vips_suffs; + foreign_class->suffs = vips_suffs; save_class->saveable = VIPS_SAVEABLE_ANY; save_class->format_table = vips_bandfmt_vips; } static void -vips_file_save_vips_init( VipsFileSaveVips *vips ) +vips_foreign_save_vips_init( VipsForeignSaveVips *vips ) { } diff --git a/libvips/include/vips/Makefile.am b/libvips/include/vips/Makefile.am index 8ff58f75..e8a54ef9 100644 --- a/libvips/include/vips/Makefile.am +++ b/libvips/include/vips/Makefile.am @@ -14,7 +14,7 @@ pkginclude_HEADERS = \ error.h \ operation.h \ format.h \ - file.h \ + foreign.h \ inplace.h \ generate.h \ header.h \ @@ -57,7 +57,7 @@ EXTRA_DIST = version.h.in internal.h enumtemplate # well vips_scan_headers = \ ${top_srcdir}/libvips/include/vips/memory.h \ - ${top_srcdir}/libvips/include/vips/file.h \ + ${top_srcdir}/libvips/include/vips/foreign.h \ ${top_srcdir}/libvips/include/vips/arithmetic.h \ ${top_srcdir}/libvips/include/vips/conversion.h \ ${top_srcdir}/libvips/include/vips/util.h \ diff --git a/libvips/include/vips/enumtypes.h b/libvips/include/vips/enumtypes.h index 27ab323c..da662b48 100644 --- a/libvips/include/vips/enumtypes.h +++ b/libvips/include/vips/enumtypes.h @@ -6,9 +6,9 @@ G_BEGIN_DECLS -/* enumerations from "../../../libvips/include/vips/file.h" */ -GType vips_file_flags_get_type (void) G_GNUC_CONST; -#define VIPS_TYPE_FILE_FLAGS (vips_file_flags_get_type()) +/* enumerations from "../../../libvips/include/vips/foreign.h" */ +GType vips_foreign_flags_get_type (void) G_GNUC_CONST; +#define VIPS_TYPE_FOREIGN_FLAGS (vips_foreign_flags_get_type()) GType vips_saveable_get_type (void) G_GNUC_CONST; #define VIPS_TYPE_SAVEABLE (vips_saveable_get_type()) /* enumerations from "../../../libvips/include/vips/arithmetic.h" */ diff --git a/libvips/include/vips/file.h b/libvips/include/vips/file.h deleted file mode 100644 index 4f12cfc2..00000000 --- a/libvips/include/vips/file.h +++ /dev/null @@ -1,239 +0,0 @@ -/* Base type for supported image files. Subclass this to add a new - * file. - */ - -/* - - This file is part of VIPS. - - VIPS is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - */ - -/* - - These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk - - */ - -#ifndef VIPS_FILE_H -#define VIPS_FILE_H - -#ifdef __cplusplus -extern "C" { -#endif /*__cplusplus*/ - -#define VIPS_TYPE_FILE (vips_file_get_type()) -#define VIPS_FILE( obj ) \ - (G_TYPE_CHECK_INSTANCE_CAST( (obj), \ - VIPS_TYPE_FILE, VipsFile )) -#define VIPS_FILE_CLASS( klass ) \ - (G_TYPE_CHECK_CLASS_CAST( (klass), \ - VIPS_TYPE_FILE, VipsFileClass)) -#define VIPS_IS_FILE( obj ) \ - (G_TYPE_CHECK_INSTANCE_TYPE( (obj), VIPS_TYPE_FILE )) -#define VIPS_IS_FILE_CLASS( klass ) \ - (G_TYPE_CHECK_CLASS_TYPE( (klass), VIPS_TYPE_FILE )) -#define VIPS_FILE_GET_CLASS( obj ) \ - (G_TYPE_INSTANCE_GET_CLASS( (obj), \ - VIPS_TYPE_FILE, VipsFileClass )) - -typedef struct _VipsFile { - VipsOperation parent_object; - /*< public >*/ - - /* Filename for load or save. - */ - char *filename; - -} VipsFile; - -typedef struct _VipsFileClass { - VipsOperationClass parent_class; - - /*< public >*/ - - /* Loop over files in this order, default 0. We need this because - * some files can be read by several loaders (eg. tiff can be read - * by the libMagick loader as well as by the tiff loader), and we want - * to make sure the better loader comes first. - */ - int priority; - - /* Null-terminated list of recommended suffixes, eg. ".tif", ".tiff". - * This can be used by both load and save, so it's in the base class. - */ - const char **suffs; - -} VipsFileClass; - -GType vips_file_get_type( void ); - -/* Map over and find files. This uses type introspection to loop over - * subclasses of VipsFile. - */ -void *vips_file_map( const char *base, VipsSListMap2Fn fn, void *a, void *b ); - -#define VIPS_TYPE_FILE_LOAD (vips_file_load_get_type()) -#define VIPS_FILE_LOAD( obj ) \ - (G_TYPE_CHECK_INSTANCE_CAST( (obj), \ - VIPS_TYPE_FILE_LOAD, VipsFileLoad )) -#define VIPS_FILE_LOAD_CLASS( klass ) \ - (G_TYPE_CHECK_CLASS_CAST( (klass), \ - VIPS_TYPE_FILE_LOAD, VipsFileLoadClass)) -#define VIPS_IS_FILE_LOAD( obj ) \ - (G_TYPE_CHECK_INSTANCE_TYPE( (obj), VIPS_TYPE_FILE_LOAD )) -#define VIPS_IS_FILE_LOAD_CLASS( klass ) \ - (G_TYPE_CHECK_CLASS_TYPE( (klass), VIPS_TYPE_FILE_LOAD )) -#define VIPS_FILE_LOAD_GET_CLASS( obj ) \ - (G_TYPE_INSTANCE_GET_CLASS( (obj), \ - VIPS_TYPE_FILE_LOAD, VipsFileLoadClass )) - -/* Image file properties. - */ -typedef enum { - VIPS_FILE_NONE = 0, /* No flags set */ - VIPS_FILE_PARTIAL = 1, /* Lazy read OK (eg. tiled tiff) */ - VIPS_FILE_BIGENDIAN = 2 /* Most-significant byte first */ -} VipsFileFlags; - -typedef struct _VipsFileLoad { - VipsFile parent_object; - /*< public >*/ - - /* Open to disc (default is to open to memory). - */ - gboolean disc; - - /* Flags read from the file. - */ - VipsFileFlags flags; - - /* The image we generate. - */ - VipsImage *out; - - /* The behind-the-scenes real image we decompress to. This can be a - * disc file or a memory buffer. - */ - VipsImage *real; - -} VipsFileLoad; - -typedef struct _VipsFileLoadClass { - VipsFileClass parent_class; - - /*< public >*/ - - /* Is a file in this format. - */ - gboolean (*is_a)( const char * ); - - /* Get the flags for this file. NULL means 0, ie. no flags. - */ - int (*get_flags)( VipsFileLoad * ); - - /* Set the header fields in @out from @filename. If you can read the - * whole image as well with no performance cost (as with vipsload), - * leave ->load() NULL and only @header will be used. - */ - int (*header)( VipsFileLoad * ); - - /* Read the whole image into @real. It gets copied to @out later. - */ - int (*load)( VipsFileLoad * ); - -} VipsFileLoadClass; - -GType vips_file_load_get_type( void ); - -const char *vips_file_find_load( const char *filename ); - -#define VIPS_TYPE_FILE_SAVE (vips_file_save_get_type()) -#define VIPS_FILE_SAVE( obj ) \ - (G_TYPE_CHECK_INSTANCE_CAST( (obj), \ - VIPS_TYPE_FILE_SAVE, VipsFileSave )) -#define VIPS_FILE_SAVE_CLASS( klass ) \ - (G_TYPE_CHECK_CLASS_CAST( (klass), \ - VIPS_TYPE_FILE_SAVE, VipsFileSaveClass)) -#define VIPS_IS_FILE_SAVE( obj ) \ - (G_TYPE_CHECK_INSTANCE_TYPE( (obj), VIPS_TYPE_FILE_SAVE )) -#define VIPS_IS_FILE_SAVE_CLASS( klass ) \ - (G_TYPE_CHECK_CLASS_TYPE( (klass), VIPS_TYPE_FILE_SAVE )) -#define VIPS_FILE_SAVE_GET_CLASS( obj ) \ - (G_TYPE_INSTANCE_GET_CLASS( (obj), \ - VIPS_TYPE_FILE_SAVE, VipsFileSaveClass )) - -/** - * VipsSaveable: - * @VIPS_SAVEABLE_RGB: 1 or 3 bands (eg. PPM) - * @VIPS_SAVEABLE_RGBA: 1, 2, 3 or 4 bands (eg. PNG) - * @VIPS_SAVEABLE_RGB_CMYK: 1, 3 or 4 bands (eg. JPEG) - * @VIPS_SAVEABLE_ANY: any number of bands (eg. TIFF) - * - * See also: #VipsFileSave. - */ -typedef enum { - VIPS_SAVEABLE_RGB, - VIPS_SAVEABLE_RGBA, - VIPS_SAVEABLE_RGB_CMYK, - VIPS_SAVEABLE_ANY, - VIPS_SAVEABLE_LAST -} VipsSaveable; - -typedef struct _VipsFileSave { - VipsFile parent_object; - /*< public >*/ - - /* The image we are to save. - */ - VipsImage *in; - - /* The image converted to a saveable format (eg. 8-bit RGB). - */ - VipsImage *ready; - -} VipsFileSave; - -typedef struct _VipsFileSaveClass { - VipsFileClass parent_class; - - /*< public >*/ - - /* How this format treats bands. - */ - VipsSaveable saveable; - - /* How this format treats band formats. - */ - VipsBandFormat *format_table; -} VipsFileSaveClass; - -GType vips_file_save_get_type( void ); - -const char *vips_file_find_save( const char *filename ); - -/* Read/write an image convenience functions. - */ -int vips_file_read( const char *filename, VipsImage **out, ... ); -int vips_file_write( VipsImage *in, const char *filename, ... ); - -void vips_file_operation_init( void ); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ - -#endif /*VIPS_FILE_H*/ diff --git a/libvips/include/vips/foreign.h b/libvips/include/vips/foreign.h new file mode 100644 index 00000000..931ccd5c --- /dev/null +++ b/libvips/include/vips/foreign.h @@ -0,0 +1,240 @@ +/* Base type for supported image foreigns. Subclass this to add a new + * foreign. + */ + +/* + + This foreign is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + */ + +/* + + These foreigns are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifndef VIPS_FOREIGN_H +#define VIPS_FOREIGN_H + +#ifdef __cplusplus +extern "C" { +#endif /*__cplusplus*/ + +/* Image file load properties. + */ +typedef enum { + VIPS_FOREIGN_NONE = 0, /* No flags set */ + VIPS_FOREIGN_PARTIAL = 1, /* Lazy read OK (eg. tiled tiff) */ + VIPS_FOREIGN_BIGENDIAN = 2 /* Most-significant byte first */ +} VipsForeignFlags; + +#define VIPS_TYPE_FOREIGN (vips_foreign_get_type()) +#define VIPS_FOREIGN( obj ) \ + (G_TYPE_CHECK_INSTANCE_CAST( (obj), \ + VIPS_TYPE_FOREIGN, VipsForeign )) +#define VIPS_FOREIGN_CLASS( klass ) \ + (G_TYPE_CHECK_CLASS_CAST( (klass), \ + VIPS_TYPE_FOREIGN, VipsForeignClass)) +#define VIPS_IS_FOREIGN( obj ) \ + (G_TYPE_CHECK_INSTANCE_TYPE( (obj), VIPS_TYPE_FOREIGN )) +#define VIPS_IS_FOREIGN_CLASS( klass ) \ + (G_TYPE_CHECK_CLASS_TYPE( (klass), VIPS_TYPE_FOREIGN )) +#define VIPS_FOREIGN_GET_CLASS( obj ) \ + (G_TYPE_INSTANCE_GET_CLASS( (obj), \ + VIPS_TYPE_FOREIGN, VipsForeignClass )) + +typedef struct _VipsForeign { + VipsOperation parent_object; + /*< public >*/ + + /* Filename for load or save. + */ + char *filename; + +} VipsForeign; + +typedef struct _VipsForeignClass { + VipsOperationClass parent_class; + + /*< public >*/ + + /* Loop over formats in this order, default 0. We need this because + * some formats can be read by several loaders (eg. tiff can be read + * by the libMagick loader as well as by the tiff loader), and we want + * to make sure the better loader comes first. + */ + int priority; + + /* Null-terminated list of recommended suffixes, eg. ".tif", ".tiff". + * This can be used by both load and save, so it's in the base class. + */ + const char **suffs; + +} VipsForeignClass; + +GType vips_foreign_get_type( void ); + +/* Map over and find formats. This uses type introspection to loop over + * subclasses of VipsForeign. + */ +void *vips_foreign_map( const char *base, + VipsSListMap2Fn fn, void *a, void *b ); + +#define VIPS_TYPE_FOREIGN_LOAD (vips_foreign_load_get_type()) +#define VIPS_FOREIGN_LOAD( obj ) \ + (G_TYPE_CHECK_INSTANCE_CAST( (obj), \ + VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoad )) +#define VIPS_FOREIGN_LOAD_CLASS( klass ) \ + (G_TYPE_CHECK_CLASS_CAST( (klass), \ + VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoadClass)) +#define VIPS_IS_FOREIGN_LOAD( obj ) \ + (G_TYPE_CHECK_INSTANCE_TYPE( (obj), VIPS_TYPE_FOREIGN_LOAD )) +#define VIPS_IS_FOREIGN_LOAD_CLASS( klass ) \ + (G_TYPE_CHECK_CLASS_TYPE( (klass), VIPS_TYPE_FOREIGN_LOAD )) +#define VIPS_FOREIGN_LOAD_GET_CLASS( obj ) \ + (G_TYPE_INSTANCE_GET_CLASS( (obj), \ + VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoadClass )) + +typedef struct _VipsForeignLoad { + VipsForeign parent_object; + /*< public >*/ + + /* Open to disc (default is to open to memory). + */ + gboolean disc; + + /* Flags read from the foreign. + */ + VipsForeignFlags flags; + + /* The image we generate. + */ + VipsImage *out; + + /* The behind-the-scenes real image we decompress to. This can be a + * disc foreign or a memory buffer. + */ + VipsImage *real; + +} VipsForeignLoad; + +typedef struct _VipsForeignLoadClass { + VipsForeignClass parent_class; + + /*< public >*/ + + /* Is a foreign in this format. + */ + gboolean (*is_a)( const char * ); + + /* Get the flags for this foreign. + */ + int (*get_flags)( VipsForeignLoad * ); + + /* Set the header fields in @out from @foreignname. If you can read the + * whole image as well with no performance cost (as with vipsload), + * leave ->load() NULL and only @header will be used. + */ + int (*header)( VipsForeignLoad * ); + + /* Read the whole image into @real. It gets copied to @out later. + */ + int (*load)( VipsForeignLoad * ); + +} VipsForeignLoadClass; + +GType vips_foreign_load_get_type( void ); + +const char *vips_foreign_find_load( const char *foreignname ); + +#define VIPS_TYPE_FOREIGN_SAVE (vips_foreign_save_get_type()) +#define VIPS_FOREIGN_SAVE( obj ) \ + (G_TYPE_CHECK_INSTANCE_CAST( (obj), \ + VIPS_TYPE_FOREIGN_SAVE, VipsForeignSave )) +#define VIPS_FOREIGN_SAVE_CLASS( klass ) \ + (G_TYPE_CHECK_CLASS_CAST( (klass), \ + VIPS_TYPE_FOREIGN_SAVE, VipsForeignSaveClass)) +#define VIPS_IS_FOREIGN_SAVE( obj ) \ + (G_TYPE_CHECK_INSTANCE_TYPE( (obj), VIPS_TYPE_FOREIGN_SAVE )) +#define VIPS_IS_FOREIGN_SAVE_CLASS( klass ) \ + (G_TYPE_CHECK_CLASS_TYPE( (klass), VIPS_TYPE_FOREIGN_SAVE )) +#define VIPS_FOREIGN_SAVE_GET_CLASS( obj ) \ + (G_TYPE_INSTANCE_GET_CLASS( (obj), \ + VIPS_TYPE_FOREIGN_SAVE, VipsForeignSaveClass )) + +/** + * VipsSaveable: + * @VIPS_SAVEABLE_RGB: 1 or 3 bands (eg. PPM) + * @VIPS_SAVEABLE_RGBA: 1, 2, 3 or 4 bands (eg. PNG) + * @VIPS_SAVEABLE_RGB_CMYK: 1, 3 or 4 bands (eg. JPEG) + * @VIPS_SAVEABLE_ANY: any number of bands (eg. TIFF) + * + * See also: #VipsForeignSave. + */ +typedef enum { + VIPS_SAVEABLE_RGB, + VIPS_SAVEABLE_RGBA, + VIPS_SAVEABLE_RGB_CMYK, + VIPS_SAVEABLE_ANY, + VIPS_SAVEABLE_LAST +} VipsSaveable; + +typedef struct _VipsForeignSave { + VipsForeign parent_object; + /*< public >*/ + + /* The image we are to save. + */ + VipsImage *in; + + /* The image converted to a saveable format (eg. 8-bit RGB). + */ + VipsImage *ready; + +} VipsForeignSave; + +typedef struct _VipsForeignSaveClass { + VipsForeignClass parent_class; + + /*< public >*/ + + /* How this format treats bands. + */ + VipsSaveable saveable; + + /* How this format treats band formats. + */ + VipsBandFormat *format_table; +} VipsForeignSaveClass; + +GType vips_foreign_save_get_type( void ); + +const char *vips_foreign_find_save( const char *filename ); + +/* Read/write an image convenience functions. + */ +int vips_foreign_read( const char *filename, VipsImage **out, ... ); +int vips_foreign_write( VipsImage *in, const char *filename, ... ); + +void vips_foreign_operation_init( void ); + +#ifdef __cplusplus +} +#endif /*__cplusplus*/ + +#endif /*VIPS_FOREIGN_H*/ diff --git a/libvips/include/vips/vips.h b/libvips/include/vips/vips.h index f8833eb8..6108a4b0 100644 --- a/libvips/include/vips/vips.h +++ b/libvips/include/vips/vips.h @@ -116,7 +116,7 @@ extern "C" { #include #include #include -#include +#include #include diff --git a/libvips/iofuncs/Makefile.am b/libvips/iofuncs/Makefile.am index 784f936b..6674a666 100644 --- a/libvips/iofuncs/Makefile.am +++ b/libvips/iofuncs/Makefile.am @@ -41,7 +41,7 @@ INCLUDES = -I${top_srcdir}/libvips/include @VIPS_CFLAGS@ @VIPS_INCLUDES@ # well vips_scan_headers = \ ${top_srcdir}/libvips/include/vips/memory.h \ - ${top_srcdir}/libvips/include/vips/file.h \ + ${top_srcdir}/libvips/include/vips/foreign.h \ ${top_srcdir}/libvips/include/vips/conversion.h \ ${top_srcdir}/libvips/include/vips/arithmetic.h \ ${top_srcdir}/libvips/include/vips/util.h \ diff --git a/libvips/iofuncs/enumtypes.c b/libvips/iofuncs/enumtypes.c index ef3548b7..93d73650 100644 --- a/libvips/iofuncs/enumtypes.c +++ b/libvips/iofuncs/enumtypes.c @@ -4,21 +4,21 @@ /* auto-generated enums for vips introspection */ #include -/* enumerations from "../../libvips/include/vips/file.h" */ +/* enumerations from "../../libvips/include/vips/foreign.h" */ GType -vips_file_flags_get_type( void ) +vips_foreign_flags_get_type( void ) { static GType etype = 0; if( etype == 0 ) { static const GEnumValue values[] = { - {VIPS_FILE_NONE, "VIPS_FILE_NONE", "none"}, - {VIPS_FILE_PARTIAL, "VIPS_FILE_PARTIAL", "partial"}, - {VIPS_FILE_BIGENDIAN, "VIPS_FILE_BIGENDIAN", "bigendian"}, + {VIPS_FOREIGN_NONE, "VIPS_FOREIGN_NONE", "none"}, + {VIPS_FOREIGN_PARTIAL, "VIPS_FOREIGN_PARTIAL", "partial"}, + {VIPS_FOREIGN_BIGENDIAN, "VIPS_FOREIGN_BIGENDIAN", "bigendian"}, {0, NULL, NULL} }; - etype = g_enum_register_static( "VipsFileFlags", values ); + etype = g_enum_register_static( "VipsForeignFlags", values ); } return( etype ); diff --git a/libvips/iofuncs/image.c b/libvips/iofuncs/image.c index d24d979d..84c0ca58 100644 --- a/libvips/iofuncs/image.c +++ b/libvips/iofuncs/image.c @@ -472,7 +472,7 @@ vips_image_rewind( VipsObject *object ) static void vips_image_save_cb( VipsImage *image, int *result, char *filename ) { - if( vips_file_write( image, filename, NULL ) ) + if( vips_foreign_write( image, filename, NULL ) ) *result = -1; g_free( filename ); @@ -602,6 +602,9 @@ vips_image_build( VipsObject *object ) VipsImage *t; VipsImage *t2; + printf( "vips_image_build: " + "byteswapping vips read\n" ); + /* Open the image in t, then byteswap to this * image. */ @@ -628,7 +631,7 @@ vips_image_build( VipsObject *object ) else { VipsImage *t; - if( vips_file_read( filename, &t, NULL ) ) + if( vips_foreign_read( filename, &t, NULL ) ) return( -1 ); image->dtype = VIPS_IMAGE_PARTIAL; @@ -645,10 +648,10 @@ vips_image_build( VipsObject *object ) { const char *file_op; - if( !(file_op = vips_file_find_save( filename )) ) + if( !(file_op = vips_foreign_find_save( filename )) ) return( -1 ); - if( strcmp( file_op, "VipsFileSaveVips" ) == 0 ) + if( strcmp( file_op, "VipsForeignSaveVips" ) == 0 ) image->dtype = VIPS_IMAGE_OPENOUT; else { image->dtype = VIPS_IMAGE_PARTIAL; diff --git a/libvips/iofuncs/init.c b/libvips/iofuncs/init.c index a51079a1..bf0b51f1 100644 --- a/libvips/iofuncs/init.c +++ b/libvips/iofuncs/init.c @@ -231,7 +231,7 @@ vips_init( const char *argv0 ) */ vips_arithmetic_operation_init(); vips_conversion_operation_init(); - vips_file_operation_init(); + vips_foreign_operation_init(); /* Load up any plugins in the vips libdir. We don't error on failure, * it's too annoying to have VIPS refuse to start because of a broken diff --git a/libvips/iofuncs/object.c b/libvips/iofuncs/object.c index fcfe2a91..524edcb5 100644 --- a/libvips/iofuncs/object.c +++ b/libvips/iofuncs/object.c @@ -1232,7 +1232,7 @@ vips_object_set_argument_from_string( VipsObject *object, g_assert( argument_class->flags & VIPS_ARGUMENT_INPUT ); if( g_type_is_a( otype, VIPS_TYPE_IMAGE ) && - (oclass = g_type_class_ref( VIPS_TYPE_FILE_LOAD )) ) { + (oclass = g_type_class_ref( VIPS_TYPE_FOREIGN_LOAD )) ) { VipsObject *new_object; VipsImage *out; @@ -1418,7 +1418,7 @@ vips_object_get_argument_to_string( VipsObject *object, g_assert( argument_class->flags & VIPS_ARGUMENT_OUTPUT ); if( g_type_is_a( otype, VIPS_TYPE_IMAGE ) && - (oclass = g_type_class_ref( VIPS_TYPE_FILE_SAVE )) ) { + (oclass = g_type_class_ref( VIPS_TYPE_FOREIGN_SAVE )) ) { VipsObject *new_object; VipsImage *in;