/* Suppprted image formats.
 */

/*

    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 IM_FORMAT_H
#define IM_FORMAT_H

#ifdef __cplusplus
extern "C" {
#endif /*__cplusplus*/

/* Image file properties. OR these together to get the result of
 * im_format_flags_fn(). 0 is default.
 */
typedef enum {
	IM_FORMAT_FLAG_NONE = 0,/* No flags set */
	IM_FORMAT_FLAG_PARTIAL = 1/* Lazy read OK (eg. tiled tiff) */
} im_format_flags;

/* Function protos for formats.
 */
typedef gboolean (*im_format_is_a_fn)( const char * );
typedef int (*im_format_header_fn)( const char *, IMAGE * );
typedef int (*im_format_load_fn)( const char *, IMAGE * );
typedef int (*im_format_save_fn)( IMAGE *, const char * );
typedef im_format_flags (*im_format_flags_fn)( const char * );

/* A VIPS image format. 
 */
typedef struct im__format_t {
	const char *name;	/* Format name, same as mime */
	const char *name_user;	/* I18n'd name for users */
	int priority;		/* Keep formats sorted by this, default 0 */
	const char **suffs; 	/* Allowed suffixes */
	im_format_is_a_fn is_a;	/* Filename is in format */
	im_format_header_fn header;/* Load header only from filename */
	im_format_load_fn load;	/* Load image from filename */
	im_format_save_fn save;	/* Save image to filename */
	im_format_flags_fn flags;/* Get flags for filename */
} im_format_t;

/* Register/unregister formats.
 */
im_format_t *im_format_register( 
	const char *name, const char *name_user, const char **suffs,
	im_format_is_a_fn is_a, im_format_header_fn header,
	im_format_load_fn load, im_format_save_fn save,
	im_format_flags_fn flags );
void im_format_set_priority( im_format_t *format, int priority );
void im_format_unregister( im_format_t *format );

/* Map over and find formats.
 */
void *im_format_map( VSListMap2Fn fn, void *a, void *b );
im_format_t *im_format_for_file( const char *filename );
im_format_t *im_format_for_name( const char *filename );

/* Write an image convenience function.
 */
int im_format_read( const char *name, IMAGE *out );
int im_format_write( IMAGE *im, const char *name );

#ifdef __cplusplus
}
#endif /*__cplusplus*/

#endif /*IM_FORMAT_H*/