482 lines
12 KiB
C
482 lines
12 KiB
C
/* @(#) Header file for Birkbeck/VIPS Image Processing Library
|
|
* Authors: N. Dessipris, K. Martinez, Birkbeck College, London.
|
|
* Sept 94
|
|
*
|
|
* 15/7/96 JC
|
|
* - now does C++ extern stuff
|
|
* - many more protos
|
|
* 15/4/97 JC
|
|
* - protos split out
|
|
* 4/3/98 JC
|
|
* - IM_ANY added
|
|
* - sRGB colourspace added
|
|
* 28/10/98 JC
|
|
* - VASARI_MAGIC_INTEL and VASARI_MAGIC_SPARC added
|
|
* 29/9/99 JC
|
|
* - new locks for threading, no more threadgroup stuff in IMAGE
|
|
* 30/11/00 JC
|
|
* - override RGB/CMYK macros on cygwin
|
|
* 21/9/02 JC
|
|
* - new Xoffset/Yoffset fields
|
|
* - rationalized macro names
|
|
* 6/6/05 Markus Wollgarten
|
|
* - added Meta header field
|
|
* 31/7/05
|
|
* - added meta.h for new metadata API
|
|
* 22/8/05
|
|
* - scrapped stupid VAS_HD
|
|
* 30/9/05
|
|
* - added sizeof_header field for mmap window read of RAW files
|
|
* 4/10/05
|
|
* - now you have to define IM_ENABLE_DEPRECATED to get broken #defined
|
|
* 5/10/05
|
|
* - added GNUC attributes
|
|
* 8/5/06
|
|
* - added RGB16, GREY16
|
|
* 30/10/06
|
|
* - added im_window_t
|
|
*/
|
|
|
|
/*
|
|
|
|
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_VIPS_H
|
|
#define IM_VIPS_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif /*__cplusplus*/
|
|
|
|
/* If we're not using GNU C, elide __attribute__
|
|
*/
|
|
#ifndef __GNUC__
|
|
# ifndef __attribute__
|
|
# define __attribute__(x) /*NOTHING*/
|
|
# endif
|
|
#endif
|
|
|
|
#include <glib.h>
|
|
#include <gmodule.h>
|
|
|
|
#include <vips/version.h>
|
|
#include <vips/rect.h>
|
|
|
|
#define IM_SPARE (8)
|
|
|
|
/* If you read MSB first, you get these two values.
|
|
* intel order: byte 0 = b6
|
|
* SPARC order: byte 0 = 08
|
|
*/
|
|
#define IM_MAGIC_INTEL (0xb6a6f208)
|
|
#define IM_MAGIC_SPARC (0x08f2a6b6)
|
|
|
|
/* Private to iofuncs: the image size above which we switch from
|
|
* mmap()-whole-image behaviour to mmap()-window, plus window margins.
|
|
*/
|
|
#define IM__MMAP_LIMIT (1024*1024*30)
|
|
#define IM__WINDOW_MARGIN (128)
|
|
|
|
/* sizeof() a VIPS header on disc.
|
|
*/
|
|
#define IM_SIZEOF_HEADER (64)
|
|
|
|
typedef unsigned char PEL; /* useful datum */
|
|
|
|
/* All these #defines are here for backwards compatibility ... delete them
|
|
* soon. See the bottom of this file for the new names.
|
|
*/
|
|
|
|
/* Only define old, broken names if asked.
|
|
*/
|
|
#ifdef IM_ENABLE_DEPRECATED
|
|
|
|
/* On win32, need to override the wingdi defs for these. Yuk!
|
|
*/
|
|
#ifdef HAVE_WINDOWS_H
|
|
#ifdef RGB
|
|
#undef RGB
|
|
#endif
|
|
#ifdef CMYK
|
|
#undef CMYK
|
|
#endif
|
|
#endif /*HAVE_WINDOWS_H*/
|
|
|
|
/* Bits per Band */
|
|
#define BBBYTE 8
|
|
#define BBSHORT 16
|
|
#define BBINT 32
|
|
#define BBFLOAT 32
|
|
#define BBCOMPLEX 64 /* complex consisting of two floats */
|
|
#define BBDOUBLE 64
|
|
#define BBDPCOMPLEX 128 /* complex consisting of two doubles */
|
|
|
|
/* picture Type */
|
|
#define MULTIBAND 0
|
|
#define B_W 1
|
|
#define LUMINACE 2
|
|
#define XRAY 3
|
|
#define IR 4
|
|
#define YUV 5
|
|
#define RED_ONLY 6 /* red channel only */
|
|
#define GREEN_ONLY 7 /* green channel only */
|
|
#define BLUE_ONLY 8 /* blue channel only */
|
|
#define POWER_SPECTRUM 9
|
|
#define HISTOGRAM 10
|
|
#define FOURIER 24
|
|
|
|
/* Colour spaces.
|
|
*/
|
|
#define LUT 11
|
|
#define XYZ 12
|
|
#define LAB 13
|
|
#define CMC 14
|
|
#define CMYK 15
|
|
#define LABQ 16
|
|
#define RGB 17
|
|
#define UCS 18
|
|
#define LCH 19
|
|
#define LABS 21
|
|
#define sRGB 22
|
|
#define YXY 23
|
|
|
|
/* BandFmt
|
|
*/
|
|
#define FMTNOTSET -1
|
|
#define FMTUCHAR 0 /* pels interpreted as unsigned chars */
|
|
#define FMTCHAR 1 /* pels interpreted as signed chars */
|
|
#define FMTUSHORT 2 /* pels interpreted as unsigned shorts */
|
|
#define FMTSHORT 3 /* pels interpreted as signed shorts */
|
|
#define FMTUINT 4 /* pels interpreted as unsigned ints */
|
|
#define FMTINT 5 /* pels interpreted as signed ints */
|
|
#define FMTFLOAT 6 /* pels interpreted as floats */
|
|
#define FMTCOMPLEX 7 /* pels interpreted as complex (2 float each) */
|
|
#define FMTDOUBLE 8 /* pels interpreted as unsigned double */
|
|
#define FMTDPCOMPLEX 9 /* pels interpreted as complex (2 double each)*/
|
|
|
|
/* Coding type
|
|
*/
|
|
#define NOCODING 0
|
|
#define COLQUANT 1
|
|
#define LABPACK 2
|
|
#define LABPACK_COMPRESSED 3
|
|
#define RGB_COMPRESSED 4
|
|
#define LUM_COMPRESSED 5
|
|
|
|
/* Compression type
|
|
*/
|
|
#define NO_COMPRESSION 0
|
|
#define TCSF_COMPRESSION 1
|
|
#define JPEG_COMPRESSION 2
|
|
|
|
#endif /*IM_ENABLE_DEPRECATED*/
|
|
|
|
/* Types of image descriptor we may have. The type field is advisory only: it
|
|
* does not imply that any fields in IMAGE have valid data.
|
|
*/
|
|
typedef enum {
|
|
IM_NONE, /* no type set */
|
|
IM_SETBUF, /* malloced memory array */
|
|
IM_SETBUF_FOREIGN, /* memory array, don't free on close */
|
|
IM_OPENIN, /* input from fd */
|
|
IM_MMAPIN, /* memory mapped input file */
|
|
IM_MMAPINRW, /* memory mapped read/write file */
|
|
IM_OPENOUT, /* output to fd */
|
|
IM_PARTIAL /* partial image */
|
|
} im_desc_type;
|
|
|
|
/* Demand style from im_generate(). See im_demand_hint().
|
|
*/
|
|
typedef enum {
|
|
IM_SMALLTILE,
|
|
IM_FATSTRIP,
|
|
IM_THINSTRIP,
|
|
IM_ANY /* Not from a disc file, any geometry */
|
|
} im_demand_type;
|
|
|
|
/* What we track for each mmap window. Have a list of these on an openin
|
|
* IMAGE.
|
|
*/
|
|
typedef struct {
|
|
int ref_count; /* # of regions referencing us */
|
|
struct im__IMAGE *im; /* IMAGE we are attached to */
|
|
|
|
int top; /* Area of image we have mapped, in pixels */
|
|
int height;
|
|
char *data; /* First pixel of line 'top' */
|
|
|
|
PEL *baseaddr; /* Base of window */
|
|
size_t length; /* Size of window */
|
|
} im_window_t;
|
|
|
|
/* Struct we keep a record of execution time in. Passed to eval callback, so
|
|
* it can assess progress.
|
|
*/
|
|
typedef struct {
|
|
struct im__IMAGE *im; /* Image we are part of */
|
|
GTimer *start; /* Start time */
|
|
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 */
|
|
} im_time_t;
|
|
|
|
/* Image descriptor for subroutine i/o args
|
|
*/
|
|
typedef struct im__IMAGE {
|
|
/* Fields from file header.
|
|
*/
|
|
int Xsize;
|
|
int Ysize;
|
|
int Bands;
|
|
int Bbits;
|
|
int BandFmt;
|
|
int Coding;
|
|
int Type;
|
|
float Xres;
|
|
float Yres;
|
|
int Length;
|
|
short Compression;
|
|
short Level;
|
|
int Xoffset;
|
|
int Yoffset;
|
|
|
|
/* Derived fields that user can fiddle with.
|
|
*/
|
|
char *Hist; /* don't use ... call im_history_get() */
|
|
char *filename; /* pointer to copy of filename */
|
|
char *data; /* start of image data for WIO */
|
|
im_time_t *time; /* time struct for eval callback */
|
|
int kill; /* set to non-zero to block partial eval */
|
|
|
|
/* Private fields.
|
|
*/
|
|
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 */
|
|
im_demand_type 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 soomething 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;
|
|
|
|
/* Parent/child relationships, built from args to im_demand_hint().
|
|
* We use these to invalidate pixel buffers on im_invalidate(). Use
|
|
* 'serial' to spot circular dependencies.
|
|
*/
|
|
GSList *parents;
|
|
GSList *children;
|
|
int serial;
|
|
|
|
/* Keep a list of recounted GValue strings so we can share hist
|
|
* efficiently.
|
|
*/
|
|
GSList *history_list;
|
|
|
|
/* The IMAGE (if any) we should signal eval progress on.
|
|
*/
|
|
struct im__IMAGE *progress;
|
|
} IMAGE;
|
|
|
|
/* Only define if IM_ENABLE_DEPRECATED is set.
|
|
*/
|
|
#ifdef IM_ENABLE_DEPRECATED
|
|
|
|
/* Macros on IMAGEs.
|
|
* esize() sizeof band element
|
|
* psize() sizeof pel
|
|
* lsize() sizeof scan line
|
|
* niele() number of elements in scan line
|
|
*/
|
|
#define esize(I) ((I)->Bbits >> 3)
|
|
#define psize(I) (esize(I)*(I)->Bands)
|
|
#define lsize(I) (psize(I)*(I)->Xsize)
|
|
#define niele(I) ((I)->Bands*(I)->Xsize)
|
|
|
|
#endif /*IM_ENABLE_DEPRECATED*/
|
|
|
|
/* Used to define a region of interest for im_extract() etc.
|
|
*/
|
|
typedef struct {
|
|
int xstart;
|
|
int ystart;
|
|
int xsize;
|
|
int ysize;
|
|
int chsel; /* 1 2 3 or 0, for r g b or all respectively
|
|
*(channel select) */
|
|
} IMAGE_BOX;
|
|
|
|
/* @(#) Definition for structure to hold integer or double masks
|
|
*/
|
|
|
|
typedef struct im__INTMASK {
|
|
int xsize;
|
|
int ysize;
|
|
int scale;
|
|
int offset;
|
|
int *coeff;
|
|
char *filename;
|
|
} INTMASK ;
|
|
|
|
typedef struct im__DOUBLEMASK {
|
|
int xsize;
|
|
int ysize;
|
|
double scale;
|
|
double offset;
|
|
double *coeff;
|
|
char *filename;
|
|
} DOUBLEMASK ;
|
|
|
|
/* A colour temperature.
|
|
*/
|
|
typedef struct {
|
|
double X0, Y0, Z0;
|
|
} im_colour_temperature;
|
|
|
|
/* Sensible names for our #defines. Only bother with
|
|
* the ones we actually use. Switch over to defining only these ones at some
|
|
* point (vips8?).
|
|
*/
|
|
|
|
#define IM_BBITS_BYTE (8)
|
|
#define IM_BBITS_SHORT (16)
|
|
#define IM_BBITS_INT (32)
|
|
#define IM_BBITS_FLOAT (32)
|
|
#define IM_BBITS_COMPLEX (64)
|
|
#define IM_BBITS_DOUBLE (64)
|
|
#define IM_BBITS_DPCOMPLEX (128)
|
|
|
|
#define IM_TYPE_MULTIBAND (0)
|
|
#define IM_TYPE_B_W (1)
|
|
#define IM_TYPE_HISTOGRAM (10)
|
|
#define IM_TYPE_FOURIER (24)
|
|
#define IM_TYPE_XYZ (12)
|
|
#define IM_TYPE_LAB (13)
|
|
#define IM_TYPE_CMYK (15)
|
|
#define IM_TYPE_LABQ (16)
|
|
#define IM_TYPE_RGB (17)
|
|
#define IM_TYPE_UCS (18)
|
|
#define IM_TYPE_LCH (19)
|
|
#define IM_TYPE_LABS (21)
|
|
#define IM_TYPE_sRGB (22)
|
|
#define IM_TYPE_YXY (23)
|
|
#define IM_TYPE_RGB16 (25)
|
|
#define IM_TYPE_GREY16 (26)
|
|
|
|
#define IM_BANDFMT_NOTSET (-1)
|
|
#define IM_BANDFMT_UCHAR (0)
|
|
#define IM_BANDFMT_CHAR (1)
|
|
#define IM_BANDFMT_USHORT (2)
|
|
#define IM_BANDFMT_SHORT (3)
|
|
#define IM_BANDFMT_UINT (4)
|
|
#define IM_BANDFMT_INT (5)
|
|
#define IM_BANDFMT_FLOAT (6)
|
|
#define IM_BANDFMT_COMPLEX (7)
|
|
#define IM_BANDFMT_DOUBLE (8)
|
|
#define IM_BANDFMT_DPCOMPLEX (9)
|
|
|
|
#define IM_CODING_NONE (0)
|
|
#define IM_CODING_LABQ (2)
|
|
|
|
#define IM_IMAGE_SIZEOF_ELEMENT(I) ((I)->Bbits >> 3)
|
|
#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*/
|
|
|
|
#include <vips/proto.h>
|
|
#include <vips/colour.h>
|
|
#include <vips/dispatch.h>
|
|
#include <vips/region.h>
|
|
#include <vips/semaphore.h>
|
|
#include <vips/threadgroup.h>
|
|
#include <vips/meta.h>
|
|
#include <vips/util.h>
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif /*__cplusplus*/
|
|
|
|
#endif /*IM_VIPS_H*/
|