blob: 0316ed553120868457d407345c5851c2b9069955 [file] [log] [blame]
/* VIPS image class.
*
* 7/7/09
* - from vips.h
*/
/*
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_IMAGE_H
#define IM_IMAGE_H
#ifdef __cplusplus
extern "C" {
#endif /*__cplusplus*/
/* Needed for 'unused' below. Remove this when we remove that.
*/
#include <time.h>
/* If you read MSB first, you get these two values.
* intel order: byte 0 = b6
* SPARC order: byte 0 = 08
*/
#define IM_MAGIC_INTEL (0xb6a6f208U)
#define IM_MAGIC_SPARC (0x08f2a6b6U)
/* Demand style from im_generate(). See im_demand_hint().
*/
typedef enum {
IM_SMALLTILE,
IM_FATSTRIP,
IM_THINSTRIP,
IM_ANY
} VipsDemandStyle;
typedef enum {
IM_TYPE_MULTIBAND = 0,
IM_TYPE_B_W = 1,
IM_TYPE_HISTOGRAM = 10,
IM_TYPE_FOURIER = 24,
IM_TYPE_XYZ = 12,
IM_TYPE_LAB = 13,
IM_TYPE_CMYK = 15,
IM_TYPE_LABQ = 16,
IM_TYPE_RGB = 17,
IM_TYPE_UCS = 18,
IM_TYPE_LCH = 19,
IM_TYPE_LABS = 21,
IM_TYPE_sRGB = 22,
IM_TYPE_YXY = 23,
IM_TYPE_RGB16 = 25,
IM_TYPE_GREY16 = 26
} VipsType;
typedef enum {
IM_BANDFMT_NOTSET = -1,
IM_BANDFMT_UCHAR = 0,
IM_BANDFMT_CHAR = 1,
IM_BANDFMT_USHORT = 2,
IM_BANDFMT_SHORT = 3,
IM_BANDFMT_UINT = 4,
IM_BANDFMT_INT = 5,
IM_BANDFMT_FLOAT = 6,
IM_BANDFMT_COMPLEX = 7,
IM_BANDFMT_DOUBLE = 8,
IM_BANDFMT_DPCOMPLEX = 9
} VipsBandFmt;
typedef enum {
IM_CODING_NONE = 0,
IM_CODING_LABQ = 2,
IM_CODING_RAD = 6
} VipsCoding;
/* Struct we keep a record of execution time in. Passed to eval callback, so
* it can assess progress.
*
* The 'unused' field is there for binary compatibility, remove this when we
* break ABI. Though, at least on windows, sizeof(time_t) can vary with
* compiler flags, so we might break ABI anyway. Remove the #include <time.h>
* when we remove this.
*/
typedef struct {
/*< private >*/
struct _VipsImage *im; /* Image we are part of */
time_t unused; /* FIXME ... for binary compatibility */
/*< public >*/
int run; /* Time we have been running */
int eta; /* Estimated seconds of computation left */
gint64 tpels; /* Number of pels we expect to calculate */
gint64 npels; /* Number of pels calculated so far */
int percent; /* Percent complete */
GTimer *start; /* Start time */
} VipsProgress;
typedef struct _VipsImage {
/*< public >*/
/* Fields from file header.
*/
int Xsize; /* image width, in pixels */
int Ysize; /* image height, in pixels */
int Bands; /* number of image bands */
/*< private >*/
/* No longer used.
*/
int Bbits; /* was number of bits in this format */
/*< public >*/
VipsBandFmt BandFmt; /* #VipsBandFmt describing the pixel format */
VipsCoding Coding; /* #VipsCoding describing the pixel coding */
VipsType Type; /* #VipsType hinting at pixel interpretation */
float Xres; /* horizontal pixels per millimetre */
float Yres; /* vertical pixels per millimetre */
/*< private >*/
/* No longer used.
*/
int Length;
short Compression;
short Level;
/*< public >*/
int Xoffset; /* image origin hint */
int Yoffset; /* image origin hint */
/* Derived fields that user can fiddle with.
*/
/*< private >*/
char *Hist; /* don't use ... call im_history_get() */
/*< public >*/
char *filename; /* pointer to copy of filename */
char *data; /* start of image data for WIO */
VipsProgress *time; /* evaluation progress */
int kill; /* set to non-zero to block partial eval */
/*< private >*/
im_desc_type dtype; /* descriptor type */
int fd; /* file descriptor */
char *baseaddr; /* pointer to the start of an mmap file */
size_t length; /* size of mmap area */
GSList *closefns; /* list of close callbacks */
GSList *evalfns; /* list of eval callbacks */
GSList *evalendfns; /* list of eval end callbacks */
int closing; /* true for this descriptor is closing */
int close_pending; /* true for this descriptor is a zombie */
guint32 magic; /* magic from header, endian-ness of image */
/* Partial image stuff. All private! All these fields are initialised
* to NULL and ignored unless set by im_generate() or im_partial().
*/
void *(*start)(); /* user-supplied start function */
int (*generate)(); /* user-supplied generate function */
int (*stop)(); /* user-supplied stop function */
void *client1; /* user arguments */
void *client2;
GMutex *sslock; /* start-stop lock */
GSList *regions; /* list of regions current for this image */
VipsDemandStyle dhint; /* demand style hint */
/* Extra user-defined fields ... see im_meta_get_int() etc.
*/
GHashTable *Meta; /* GhashTable of GValue */
GSList *Meta_traverse; /* Traverse order for Meta */
/* Part of mmap() read ... the sizeof() the header we skip from the
* file start. Usually IM_SIZEOF_HEADER, but can be something else
* for binary file read.
*/
int sizeof_header;
/* If this is a large disc image, don't map the whole thing, instead
* have a set of windows shared between the regions active on the
* image. List of im_window_t.
*/
GSList *windows;
/* Upstream/downstream relationships, built from args to
* im_demand_hint().
*
* We use these to invalidate downstream pixel buffers on
* im_invalidate(). Use 'serial' to spot circular dependencies.
*
* See also hint_set below.
*/
GSList *upstream;
GSList *downstream;
int serial;
/* Keep a list of recounted GValue strings so we can share hist
* efficiently.
*/
GSList *history_list;
/* The VipsImage (if any) we should signal eval progress on.
*/
struct _VipsImage *progress;
/* Some more callbacks.
*/
GSList *evalstartfns; /* list of start eval callbacks */
GSList *preclosefns; /* list of pre-close callbacks */
GSList *invalidatefns; /* list of invalidate callbacks */
/* Record the file length here. We use this to stop ourselves mapping
* things beyond the end of the file in the case that the file has
* been truncated.
*
* gint64 so that we can guarantee to work even on systems with
* strange ideas about large files.
*/
gint64 file_length;
/* Set this when im_demand_hint_array() is called, and check in any
* operation that will demand pixels from the image.
*
* We use im_demand_hint_array() to build the tree of
* upstream/downstream relationships, so it's a mandatory thing.
*/
gboolean hint_set;
/* Post-close callbacks happen on finalize. Eg. deleting the file
* associated with this temp image.
*/
GSList *postclosefns;
/* Written callbacks are triggered when an image has been written to.
* Used by eg. im_open("x.jpg", "w") to do the final write to jpeg.
*/
GSList *writtenfns;
} VipsImage;
extern const size_t im__sizeof_bandfmt[];
/* Pixel address calculation macros.
*/
#define IM_IMAGE_SIZEOF_ELEMENT(I) \
(im__sizeof_bandfmt[(I)->BandFmt])
#define IM_IMAGE_SIZEOF_PEL(I) \
(IM_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
#define IM_IMAGE_SIZEOF_LINE(I) \
(IM_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
#define IM_IMAGE_N_ELEMENTS(I) \
((I)->Bands * (I)->Xsize)
/* If DEBUG is defined, add bounds checking.
*/
#ifdef DEBUG
#define IM_IMAGE_ADDR(I,X,Y) \
( ((X) >= 0 && (X) < (I)->Xsize && \
(Y) >= 0 && (Y) < (I)->Ysize) ? \
((I)->data + \
(Y) * IM_IMAGE_SIZEOF_LINE(I) + \
(X) * IM_IMAGE_SIZEOF_PEL(I)) : \
(fprintf( stderr, \
"IM_IMAGE_ADDR: point out of bounds, " \
"file \"%s\", line %d\n" \
"(point x=%d, y=%d\n" \
" should have been within Rect left=%d, top=%d, " \
"width=%d, height=%d)\n", \
__FILE__, __LINE__, \
(X), (Y), \
0, 0, \
(I)->Xsize, \
(I)->Ysize ), abort(), (char *) NULL) \
)
#else /*DEBUG*/
#define IM_IMAGE_ADDR(I,X,Y) \
((I)->data + \
(Y) * IM_IMAGE_SIZEOF_LINE(I) + \
(X) * IM_IMAGE_SIZEOF_PEL(I))
#endif /*DEBUG*/
const char *im_get_argv0( void );
int im_init_world( const char *argv0 );
GOptionGroup *im_get_option_group( void );
const char *im_version_string( void );
int im_version( int flag );
const char *im_guess_prefix( const char *argv0, const char *env_name );
const char *im_guess_libdir( const char *argv0, const char *env_name );
VipsImage *im_open( const char *filename, const char *mode );
#define im_open_local( IM, NAME, MODE ) \
((IMAGE *) im_local( (IM), \
(im_construct_fn) im_open, (im_callback_fn) im_close, \
(void *) (NAME), (void *) (MODE), NULL ))
/* Strange double cast stops bogus warnings from gcc 4.1
*/
#define im_open_local_array( IM, OUT, N, NAME, MODE ) \
(im_local_array( (IM), (void **)((void*)(OUT)), (N),\
(im_construct_fn) im_open, (im_callback_fn) im_close, \
(void *) (NAME), (void *) (MODE), NULL ))
int im_close( VipsImage *im );
void im_invalidate( VipsImage *im );
void im_initdesc( VipsImage *image,
int xsize, int ysize, int bands, int bandbits,
VipsBandFmt bandfmt, VipsCoding coding, VipsType type,
float xres, float yres,
int xo, int yo );
int im_cp_desc( VipsImage *out, VipsImage *in );
int im_cp_descv( VipsImage *out, VipsImage *in1, ... )
__attribute__((sentinel));
int im_cp_desc_array( VipsImage *out, VipsImage *in[] );
VipsImage *im_binfile( const char *name,
int xsize, int ysize, int bands, int offset );
VipsImage *im_image( void *buffer,
int width, int height, int bands, VipsBandFmt bandfmt );
#ifdef __cplusplus
}
#endif /*__cplusplus*/
#endif /*IM_IMAGE_H*/