jedioutcast/utils/roq2/libim/im.h
2013-04-04 13:07:40 -05:00

1526 lines
51 KiB
C

/**
** $Header: /sdsc/dev/vis/image/imtools/v3.0/libim/src/include/RCS/im.h,v 1.48 1995/06/30 22:13:07 bduggan Exp $
** Copyright (c) 1989-1995 San Diego Supercomputer Center (SDSC)
** a division of General Atomics, San Diego, California, USA
**
** Users and possessors of this source code are hereby granted a
** nonexclusive, royalty-free copyright and design patent license to
** use this code in individual software. License is not granted for
** commercial resale, in whole or in part, without prior written
** permission from SDSC. This source is provided "AS IS" without express
** or implied warranty of any kind.
**
** For further information contact:
** E-Mail: info@sds.sdsc.edu
**
** Surface Mail: Information Center
** San Diego Supercomputer Center
** P.O. Box 85608
** San Diego, CA 92138-5608
** (619) 534-5000
**/
/**
** FILE
** im.h - Image library include file
**
** PROJECT
** libim - SDSC image manipulation library
**
** DESCRIPTION
** im.h contains the structs, typedefs, externs, defines, and macros
** needed to use the VFB, CLT, and File subpackages of the image
** library.
**
** PUBLIC CONTENTS
** d =defined constant
** f =function
** m =defined macro
** t =typedef/struct/union
** v =variable
** ? =other
**
** __IMH__ d file inclusion flag
**
** ImErrNo v error number
** ImNErr v number of error messages
** ImErrList v error messages
** IME... d error codes
**
** IMVFBNULL d NULL VFB
** IMCLTNULL d NULL CLT
** IMVFBNEW d Indicate a new VFB is to be allocated
** IMCLTNEW d Indicate a new CLT is to be allocated
**
** ImCltPtr t pointer to CLT entry
** ImClt t color lookup table
** ImVfbPtr t pointer to VFB pixel
** ImVfb t virtual frame buffer
** ImHotSpot t image hotspot
**
** ImVfb... m set and query VFB attributes
** ImClt... m Set and query CLT attributes
** ImHotSpot... m set and query HotSpot attributes
**
** IMVFB... d fields mask values
** IMVFB... d raster operations and inout values
** IMVFB... d flip directions
** IMVFB... d resolution change algorithms
**
** IMTYPEINDEX d Indexed image type
** IMTYPERGB d RGB image type
** IMTYPE2D d 2D primitives
** IMCOMP... d Compression options
** IMINTER... d Interlace options
** IMCLT... d CLT options
** IMALPHA... d Alpha plane options
**
** ImFileFormat t file format info
**
** ImFileFormatReadMap t map of how a format handles reads
** ImFileFormatWriteMap t map of how a format handles writes
**
** Im... f Generic function declarations
** ImVfb... f VFB function declarations
** ImClt... f CLT function declarations
** ImFile... f File I/O function declarations
** ImGetFileFormats f Get the list of formats
**
** IMFILE... d Image file format-specific options
**
** IMERRORFATAL d fatal error
** IMERRORWARNING d warning error
** IMERRORINFO d information error
**
** IMMAXNAME d maximum name size
** IMDEFMONOTHRESH d default monochrome threshold
**
** IMMAXIMUM d computed maximum field value
** IMMINIMUM d computed minimum field value
** IMUNIQUEVAL d computed number of unique field values
** IMMAXNUMSTATS d number of statistics returned by ImVfbStat
**
** ImHistTable t histogram information table
** IMHIST... d histogram table array index names
** imhist_... d histogram table union field names
**
** PRIVATE CONTENTS
** none
**
** HISTORY
** $Log: im.h,v $
** Revision 1.48 1995/06/30 22:13:07 bduggan
** added ImVfbFSDitherToMono non-ansi prototype
**
** Revision 1.47 1995/06/29 00:30:40 bduggan
** Added IMVFBPRINTINTFLAOT
** oops, i mean FLOAT
**
** Revision 1.46 1995/06/16 07:16:09 bduggan
** removed IMFILECOMPZ
**
** Revision 1.45 1995/06/16 06:58:45 bduggan
** added imvfbcopychannel
**
** Revision 1.44 1995/06/16 06:47:00 bduggan
** Added compression support.
** Removed global ImFileFormats variable.
** Added ANSI declarations for pointers to functions.
**
** Revision 1.43 1995/05/18 00:09:51 bduggan
** Added IMCOMPASCII, ImVfbPrint, ImGetTransparency,
** IMFILECOMPZ,
** ImVfbSameRGB, ImVfbSameRGBA, (etc.),
** IMVFBPRINTFLOAT, IMVFBPRINTINT
**
** Revision 1.42 1995/04/03 22:11:26 bduggan
** added support for channel mapping requests,
** image quality requests (for jpeg compression),
** and took out #ifdef NEWMAGIC
**
** Revision 1.41 1995/01/18 21:54:21 bduggan
** Added GROUP macros and FSDitherToMono prototype
**
** Revision 1.40 1994/10/03 16:01:28 nadeau
** Updated to ANSI C and C++ compatibility by adding function prototypes.
** Minimized use of custom SDSC types (e.g., uchar vs. unsigned char)
** Changed all float arguments to double.
** Rearranged magic number structures for format handlers.
** Added definitions for IMMULTI, IMNOMULTI, IMPIPE, & IMNOPIPE.
** Updated copyright message.
**
** Revision 1.39 93/03/18 12:29:28 todd
** added extern ImVfb *ImVfbIndex() to quiet the compiler
**
** Revision 1.38 93/03/09 10:44:58 nadeau
** Corrected non-ANSI-ism of an #endif comment.
**
** Revision 1.37 92/12/03 02:19:54 nadeau
** Updated histogram information and function declarations.
**
** Revision 1.36 92/11/06 17:00:35 groening
** change ImFIleFormats struct.
**
** Revision 1.35 92/10/06 13:44:42 nadeau
** Added function declarations.
**
** Revision 1.34 92/09/04 18:35:45 groening
** Added IMEIMPSHEAR error.
**
** Revision 1.33 92/08/31 14:49:26 nadeau
** Added additional function declarations. Moved things around
** a bit. Added comments to hotspot declarations. Added additiona
** error codes. Changed names on some error codes.
**
** Revision 1.32 92/08/28 15:29:14 vle
** Added hotspot support.
**
** Revision 1.31 92/08/18 13:08:21 groening
** added error measges and stuff for imhist.c
** plus #defines for operations, etc.
**
** Revision 1.30 92/06/06 13:36:52 vle
** Fixed type problem with macros.
**
** Revision 1.29 92/04/15 12:23:56 nadeau
** Added more extern declarations.
**
** Revision 1.28 91/10/03 12:56:07 nadeau
** Removed out-of-date PBM and FPS flags.
**
** Revision 1.27 91/10/03 12:54:09 nadeau
** Cosmetic changes. Added read and write map support.
**
** Revision 1.26 91/01/23 12:50:34 doeringd
** Added prefix "IMFPS" to FPS enum list items.
**
** Revision 1.25 91/01/23 12:04:19 doeringd
** Removed unneeded enum name "aperture" to prevent conflict with
** int aperture.
**
** Revision 1.24 91/01/23 11:06:08 nadeau
** Removed redundant aperture declaration.
**
** Revision 1.23 91/01/23 10:44:00 doeringd
** Add fps enum definitions for apertures.
**
** Revision 1.22 91/01/23 10:27:08 nadeau
** Added multiVFB flag to ImFileFormats struct.
**
** Revision 1.21 91/01/20 07:43:55 doeringd
** Included imfps.h aperture enum values.
**
** Revision 1.20 91/01/16 10:30:04 doeringd
** Add PBM defines
**
** Revision 1.19 91/01/16 10:13:27 nadeau
** Added declarations for ImVfbIsMono() and ImVfbTo8Mono().
**
** Revision 1.18 90/09/04 14:03:44 ferrerj
** added ImVfbCopyArea to function list
**
** Revision 1.17 90/09/04 13:57:10 ferrerj
** added ImVfbCopyArea() to function list
**
** Revision 1.17 90/09/04 02:00:00 ferrerj
** added ImVfbCopyArea() to function list
**
** Revision 1.16 90/07/26 11:45:09 mcleodj
** Added Pixar PIC format flag values
**
** Revision 1.15 90/07/25 16:25:14 nadeau
** Changed RAS file format flag values and their names.
**
** Revision 1.14 90/07/25 13:34:05 todd
** added several new IME* errors.
** added IMTIFF flag values
**
** Revision 1.13 90/07/23 13:51:14 nadeau
** Fixed Index16 macros to use vfb_i32off instead of vfb_ioff. Added HDF
** write flags. Removed PIX write flag.
**
** Revision 1.12 90/07/15 09:30:28 mjb
** added ImVfbCut() and ImvfbLightness() to function list
**
** Revision 1.11 90/07/02 15:48:25 mercurio
** Error messages added
**
** Revision 1.10 90/06/28 20:14:29 mercurio
** Added IMENOIMAGE and IMEUNSUPPORTED error codes
**
** Revision 1.9 90/06/28 15:16:00 nadeau
** Removed tag table types and function declarations. Added #defines to
** map from the old tag table function names to the new ones. Added
** declarations and #defines for the error handling code.
**
** Revision 1.8 90/05/15 13:57:56 todd
** Move IMFILEFD & FP PIPE and FILE macros to new iminternal.h file
**
** Revision 1.7 90/05/11 14:26:34 nadeau
** Removed old IMFILE format defines.
**
** Revision 1.6 90/05/11 10:02:47 nadeau
** Added ImFileFormat struct for file format information. Left old way
** in still.
**
** Revision 1.5 90/05/02 11:13:25 mjb
** More of the above
**
** Revision 1.4 90/05/02 07:56:57 mjb
** moreof the above
**
** Revision 1.3 90/05/02 07:51:53 mjb
** Changed ImVfb and ImClt typedefs to be structures, not pointers
** This will require declarations of the form:
**
** ImClt *srcClt;
**
** Revision 1.2 90/04/30 10:28:54 nadeau
** Changed tag list stuff to tag table stuff. Added error codes and
** renumbered the ones already there. Updated the function declarations
** and fixed various comments. Added file format flag defines.
**
** Revision 1.1 90/03/28 11:17:57 nadeau
** Initial revision
**
**/
#ifndef __IMH__
#define __IMH__
#ifndef __SDSCH__
//#include "sdsc.h"
#endif /* __SDSCH__ */
/*
* GLOBAL VARIABLE
* ImErrNo - error number
* ImNErr - number of error messages
* ImErrList - error messages
*
* DESCRIPTION
* On an error, the image library routines return -1, or NULL, and set
* ImErrNo to an error code. The programmer may call ImPError
* to print the associated error message to stderr, or may do the
* message lookup in ImErrList directly.
*/
extern int ImErrNo; /* Current error number */
extern int ImNErr; /* Number of error messages */
extern char *ImErrList[]; /* List of error messages */
/*
* CONSTANTS
* IME... - error codes
*
* DESCRIPTION
* ImErrNo may be set to these error codes as a result of an error in
* calling one of the image library routines.
*/
#define IMESYS 0 /* System error */
#define IMEMALLOC 1 /* Cannot allocate */
#define IMENOCONTENTS 2 /* Bad fields mask */
#define IMENOFPDATA 3 /* Bad float data */
#define IMEBADINOUT 4 /* Bad inout arg */
#define IMEBADFBTYPE 5 /* Bad frame buffer type */
#define IMEFORMAT 6 /* Bad format */
#define IMENOFILE 7 /* No file? */
#define IMENOTINFO 8 /* Not enough info in VFB */
#define IMEBADFLIP 9 /* Bad flip selection */
#define IMEBADALGORITHM 10 /* Bad res change algorithm */
#define IMENOREAD 11 /* Read not supported on format */
#define IMENOWRITE 12 /* Write not supported on format*/
#define IMENOVFB 13 /* No VFB given for image write */
#define IMEMANYVFB 14 /* Too many VFB's for image write*/
#define IMENOTRGB 15 /* VFB isn't an RGB image */
#define IMEMAGIC 16 /* Bad magic number on image file*/
#define IMEIMAGETYPE 17 /* Unknown image type */
#define IMECLTTYPE 18 /* Unknown CLT type */
#define IMEDEPTH 19 /* Unknown image depth */
#define IMECLTLENGTH 20 /* Bad CLT length */
#define IMENOCLT 21 /* No CLT given for image */
#define IMEMANYCLT 22 /* Too many CLT's for image */
#define IMEUNKNOWN 23 /* VFB isn't a GRAY image */
#define IMENULLTAGTABLE 24 /* NULL tag table given */
#define IMESYNTAX 25 /* Syntax error */
#define IMENOIMAGE 26 /* No images in input file */
#define IMEUNSUPPORTED 27 /* Unsupported VFB type */
#define IMEDIFFSIZE 28 /* VFB's have different sizes */
#define IMEVERSION 29 /* Bad version number in header */
#define IMEPLANES 30 /* Unknown image plane config */
#define IMEOUTOFRANGE 31 /* Header value out of legal range */
#define IMEORIENTATION 32 /* Unsupported image orientation*/
#define IMEWIDTH 33 /* Zero or negative image width */
#define IMEHEIGHT 34 /* Zero or negative image height*/
#define IMECONFLICT 35 /* Conflicting info in im header*/
#define IMENOTINDEX8 36 /* Not an Index 8 image */
#define IMENOTINDEX16 37 /* Not an Index 16 image */
#define IMENOTMONO 38 /* Not a monochrome image */
#define IMEFIELD 39 /* Bad field mask */
#define IMENOTPOSSIBLE 40 /* Conversion/Output not possible*/
#define IMEDECODING 41 /* Error while decoding image */
#define IMEENCODING 42 /* Error while encoding image */
#define IMEOPERATION 43 /* Unknown operation */
#define IMEGRADUATION 44 /* Unknown graduation */
#define IMEHISTMAX 45 /* Histogram maximum exceeded */
#define IMEBADRANGE 46 /* Value range inappropriate */
#define IMEKEY 47 /* invalid key parameter passed */
#define IMEADJUST 48 /* invalid adjust parameter passed */
#define IMENOALPHA 49 /* no alpha present when needed */
#define IMEPIXELREP 50 /* not exact multiples for pixel rep */
#define IMEKEYFIELD 51 /* Bad keyField on adjust */
#define IMEADJUSTFIELD 52 /* Bad adjustField on adjust */
#define IMEIMPSHEAR 53 /* shear of 90 degrees encountered */
#define IMEBADCHANNEL 54 /* Bad channel map request */
#define IMEBADCHANNELS 55 /* Invalid channel map requests */
#define IMEVALOUTOFRANGE 56 /* Value out of range */
#define IMEFORMATUNKNOWN 57 /* Couldn't figure out format */
/* 58-2^32-1 Reserved */
/*
* CONSTANTS
* IMVFBNULL - NULL VFB
* IMCLTNULL - NULL CLT
* IMVFBNEW - Indicate a new VFB is to be allocated
* IMCLTNEW - Indicate a new CLT is to be allocated
*
* DESCRIPTION
* These values are each used when a NULL (empty) VFB, or CLT is to be
* indicated. These values may be passed as the destination arguments
* to VFB, and CLT, and may be returned as error condition values from
* functions that normally return VFB's, or CLT's.
*/
#define IMVFBNULL ((ImVfb *)0)
#define IMVFBNEW IMVFBNULL
#define IMCLTNULL ((ImClt *)0)
#define IMCLTNEW IMCLTNULL
/*
* TYPEDEF & STRUCTURE
* ImCltPtr - pointer to CLT entry
* ImClt - color lookup table
*
* DESCRIPTION
* The ImClt struct contains a color lookup table. Such a CLT may,
* or may not, be referenced by a VFB.
*
* clt_ncolors is the number of entries in the CLT. Each entry
* consists of 3 consecutive 8-bit bytes for red, green, and blue.
*
* clt_clt is a pointer to the first byte of the first entry in the
* CLT.
*/
typedef unsigned char *ImCltPtr; /* Color pointer */
typedef struct ImClt
{
int clt_ncolors; /* # colors in CLT storage */
ImCltPtr clt_clt; /* points to actual CLT storage */
} ImClt;
/*
* TYPEDEF & STRUCTURE
* ImVfbPtr - pointer to VFB pixel
* ImVfb - virtual frame buffer
*
* DESCRIPTION
* The ImVfb struct contains a virtual frame buffer (an image and its
* associated per-pixel data).
*
* vfb_width and vfb_height give the width and height of the VFB.
*
* vfb_fields is a mask that indicates what types of values are
* associated with each pixel in the VFB.
*
* vfb_nbytes is the number of bytes per pixel.
*
* vfb_clt is an optional CLT associated with the VFB. vfb_clt will
* be IMCLTNULL if there is no CLT.
*
* vfb_roff, vfb_goff, and vfb_boff are byte offsets to reach the
* red, green, and blue planes (if any) of the VFB.
*
* vfb_aoff is a byte offset to the alpha plane (if any) of the VFB.
*
* vfb_i8off, and vfb_i16off are byte offsets to the 8-bit or 16-bit
* color index planes (if any) of the VFB.
*
* vfb_wpoff is a byte offset to the write protect plane (if any) of the
* VFB.
*
* vfb_zoff is a byte offset to the Z-buffer plane (if any) of the VFB.
*
* vfb_fpoff and vfb_ioff are a byte offsets to the floating point and
* integer data planes (if any) of the VFB.
*
* vfb_pfirst and vfb_plast point to the first and last pixels in the
* VFB.
*/
typedef unsigned char *ImVfbPtr; /* Pixel pointer */
typedef struct ImVfb
{
int vfb_width; /* # cols */
int vfb_height; /* # rows */
int vfb_fields; /* mask specifying what is in each pixel*/
int vfb_nbytes; /* # bytes per pixel */
ImClt *vfb_clt; /* points to attached CLT, if any */
int vfb_roff; /* offset (in bytes) to reach red */
int vfb_goff; /* green */
int vfb_boff; /* blue */
int vfb_aoff; /* alpha-value */
int vfb_i8off; /* color index */
int vfb_wpoff; /* write protect offset */
int vfb_i16off; /* color index */
int vfb_zoff; /* z-value */
int vfb_moff; /* mono */
int vfb_fpoff; /* floating point */
int vfb_ioff; /* integer */
ImVfbPtr vfb_pfirst; /* points to first pixel */
ImVfbPtr vfb_plast; /* points to last pixel */
} ImVfb;
/*
* CONSTANTS
* IMVFB... - fields mask values
*
* DESCRIPTION
* The fields mask of a VFB is the bitwise OR of one or more of
* these mask values. Each value indicates that data of that type
* is to be stored in the VFB at each pixel location.
*/
#define IMVFBALL ( ~0 ) /* Everything */
#define IMVFBIMAGEMASK ( 0xFF ) /* Image items */
#define IMVFBMONO ( 1 << 0 )
#define IMVFBINDEX8 ( 1 << 1 )
#define IMVFBGRAY IMVFBINDEX8
#define IMVFBGREY IMVFBINDEX8
#define IMVFBINDEX16 ( 1 << 2 )
#define IMVFBRGB ( 1 << 3 )
/* 4-7 Reserved */
#define IMVFBOTHERMASK ( ~0xFF ) /* Non-image items */
#define IMVFBALPHA ( 1 << 9 )
#define IMVFBWPROT ( 1 << 10 )
#define IMVFBZ ( 1 << 11 )
#define IMVFBFDATA ( 1 << 12 )
#define IMVFBIDATA ( 1 << 13 )
#define IMVFBRED ( 1 << 14 )
#define IMVFBGREEN ( 1 << 15 )
#define IMVFBBLUE ( 1 << 16 )
/* 17-31 Reserved */
/*
* CONSTANTS
* IM... - field specifiers
*
* DESCRIPTION
* These are used to pass fields around for adjustment, fill, and other
* tools capable of working in color spaces beyond those actually
* stored in the VFB (such as hue, saturation, and intensity).
*
* NOTE! These are not valid for passing to routines, like ImVfbAlloc,
* to specify actual fields in a VFB! Use the IMVFB* variants instead.
*/
#define IMMONO IMVFBMONO
#define IMGRAY IMVFBGRAY
#define IMGREY IMVFBGREY
#define IMINDEX8 IMVFBINDEX8
#define IMINDEX16 IMVFBINDEX16
#define IMRGB IMVFBRGB
#define IMALPHA IMVFBALPHA
#define IMWPROT IMVFBWPROT
#define IMZ IMVFBZ
#define IMFDATA IMVFBFDATA
#define IMIDATA IMVFBIDATA
#define IMRED IMVFBRED
#define IMGREEN IMVFBGREEN
#define IMBLUE IMVFBBLUE
#define IMSATURATION ( 1 << 28 )
#define IMINTENSITY ( 1 << 29 )
#define IMHUE ( 1 << 30 )
/* 1-16 should be equal to equivalents to IMVFB*
17-27 are reserved */
/*
* CONSTANTS
* IM... - operations
*
* DESCRIPTION
* These are used to pass operations around
*/
#define IMADD ( 1 << 0 )
#define IMSUBTRACT ( 1 << 1 )
#define IMMULTIPLY ( 1 << 2 )
#define IMDIVIDE ( 1 << 3 )
#define IMSET ( 1 << 4 )
/* 5-8 Reserved */
#define IMCOMPOVER ( 1 << 9 )
#define IMCOMPINSIDE ( 1 << 10 )
#define IMCOMPOUTSIDE ( 1 << 11 )
#define IMCOMPATOP ( 1 << 12 )
/* 13-32 Reserved */
/*
* MACROS
* ImVfb... - set and query VFB attributes
*
* DESCRIPTION
* These macros, masquerading as subroutines, take a VFB pointer and
* set or query information from it.
*/
/* CLT and Characteristics. */
#define ImVfbQWidth( v ) ((v)->vfb_width)
#define ImVfbQHeight( v ) ((v)->vfb_height)
#define ImVfbQFields( v ) ((v)->vfb_fields)
#define ImVfbQNBytes( v ) ((v)->vfb_nbytes)
#define ImVfbQClt( v ) ((v)->vfb_clt)
#define ImVfbSClt( v, c ) ((v)->vfb_clt = (c))
/* Pixel values. */
#define ImVfbQMono( v, p ) ( (int) ( *( (p)+(v)->vfb_moff ) ) )
#define ImVfbQIndex8( v, p ) ( (int) ( *( (p)+(v)->vfb_i8off ) ) )
#define ImVfbQGrey( v, p ) ImVfbQIndex8(v,p)
#define ImVfbQGray( v, p ) ImVfbQIndex8(v,p)
#define ImVfbQIndex16( v, p ) ( *((sdsc_uint16 *)((p)+(v)->vfb_i16off ) ) )
#define ImVfbQIndex( v, p ) \
( ( ImVfbQFields(v)&IMVFBINDEX8 ) ? ImVfbQIndex8(v,p) :\
ImVfbQIndex16(v,p) )
#define ImVfbQRed( v, p ) ( (int) ( *( (p)+(v)->vfb_roff ) ) )
#define ImVfbQGreen( v, p ) ( (int) ( *( (p)+(v)->vfb_goff ) ) )
#define ImVfbQBlue( v, p ) ( (int) ( *( (p)+(v)->vfb_boff ) ) )
#define ImVfbQAlpha( v, p ) ( (int) ( *( (p)+(v)->vfb_aoff ) ) )
#define ImVfbQWProt( v, p ) ( (int) ( *( (p)+(v)->vfb_wpoff) ) )
#define ImVfbQZ( v, p ) ( *((int *)((p)+(v)->vfb_zoff ) ) )
#define ImVfbQFData( v, p ) ( *((float *)( (p)+(v)->vfb_fpoff ) ) )
#define ImVfbQIData( v, p ) ( *((int *)( (p)+(v)->vfb_ioff ) ) )
#define ImVfbSMono( v, p, m ) ( *( (p)+(v)->vfb_moff ) = (unsigned char)(m) )
#define ImVfbSGray( v, p, g ) ImVfbSIndex8(v,p,g)
#define ImVfbSGrey( v, p, g ) ImVfbSIndex8(v,p,g)
#define ImVfbSIndex8( v, p, i ) ( *( (p)+(v)->vfb_i8off ) = (unsigned char)(i) )
#define ImVfbSIndex16( v, p, i ) \
( *((sdsc_uint16 *)((p)+(v)->vfb_i16off) ) = (unsigned short)(i) )
#define ImVfbSIndex( v, p, i ) \
( ( ImVfbQFields(v)&IMVFBINDEX8 ) ? ImVfbSIndex8(v,p,i) :\
ImVfbSIndex16(v,p,i) )
#define ImVfbSRed( v, p, r ) ( *( (p)+(v)->vfb_roff ) = (unsigned char)(r) )
#define ImVfbSGreen( v, p, g ) ( *( (p)+(v)->vfb_goff ) = (unsigned char)(g) )
#define ImVfbSBlue( v, p, b ) ( *( (p)+(v)->vfb_boff ) = (unsigned char)(b) )
#define ImVfbSAlpha( v, p, a ) ( *( (p)+(v)->vfb_aoff ) = (unsigned char)(a) )
#define ImVfbSWProt( v, p, wp ) ( *( (p)+(v)->vfb_wpoff) = (unsigned char)(wp))
#define ImVfbSZ( v, p, z ) ( *((int *)((p)+(v)->vfb_zoff) ) = (int)(z) )
#define ImVfbSFData( v, p, fp ) ( *((float *)((p)+(v)->vfb_fpoff) )=(float)(fp))
#define ImVfbSIData( v, p, i ) ( *((int *)((p)+(v)->vfb_ioff) ) = (int)(i))
/* Pixel addressing. */
#define ImVfbQFirst( v ) ( (v)->vfb_pfirst )
#define ImVfbQLast( v ) ( (v)->vfb_plast )
#define ImVfbQPtr( v, x, y ) ( ImVfbQFirst(v) + \
ImVfbQNBytes(v)*( (y)*ImVfbQWidth(v) + \
(x) ) )
#define ImVfbQNext( v, p ) ( (p) + ImVfbQNBytes(v) )
#define ImVfbQPrev( v, p ) ( (p) - ImVfbQNBytes(v) )
#define ImVfbQLeft( v, p ) ImVfbQPrev(v,p)
#define ImVfbQRight( v, p ) ImVfbQNext(v,p)
#define ImVfbQUp( v, p ) ( (p) - ImVfbQWidth(v)*ImVfbQNBytes(v) )
#define ImVfbQDown( v, p ) ( (p) + ImVfbQWidth(v)*ImVfbQNBytes(v) )
#define ImVfbSInc( v, p ) ( (p) += ImVfbQNBytes(v) )
#define ImVfbSDec( v, p ) ( (p) -= ImVfbQNBytes(v) )
#define ImVfbSLeft( v, p ) ImVfbSDec( v, p )
#define ImVfbSRight( v, p ) ImVfbSInc( v, p )
#define ImVfbSPrev( v, p ) ImVfbSDec( v, p )
#define ImVfbSNext( v, p ) ImVfbSInc( v, p )
#define ImVfbSUp( v, p ) ( (p) -= ImVfbQWidth(v)*ImVfbQNBytes(v) )
#define ImVfbSDown( v, p ) ( (p) += ImVfbQWidth(v)*ImVfbQNBytes(v) )
#define ImVfbSameRGB(vfb, one, two) \
((ImVfbQRed(vfb, one)==ImVfbQRed(vfb,two)) && \
(ImVfbQGreen(vfb, one)==ImVfbQGreen(vfb, two)) && \
(ImVfbQBlue(vfb, one)==ImVfbQBlue(vfb, two)) )
#define ImVfbSameRGBA(vfb, one, two) \
((ImVfbQRed(vfb, one)==ImVfbQRed(vfb,two)) && \
(ImVfbQGreen(vfb, one)==ImVfbQGreen(vfb, two)) && \
(ImVfbQAlpha(vfb, one)==ImVfbQAlpha(vfb, two)) && \
(ImVfbQBlue(vfb, one)==ImVfbQBlue(vfb, two)) )
#define ImVfbSameIndex8(vfb, one, two) \
(ImVfbQIndex8(vfb, one)==ImVfbQIndex8(vfb,two))
#define ImVfbSameIndex16(vfb, one, two) \
(ImVfbQIndex16(vfb, one)==ImVfbQIndex16(vfb,two))
/*
* MACROS
* ImClt... - Set and query CLT attributes
*
* DESCRIPTION
* These macros, masquerading as subroutines, take a CLT pointer and
* set or retrieve information from it.
*/
/* Characteristics. */
#define ImCltQNColors(c) ( (c)->clt_ncolors )
/* Entry values. */
#define ImCltQRed( p ) ( (int) ( *((p)+0) ) )
#define ImCltQGreen( p ) ( (int) ( *((p)+1) ) )
#define ImCltQBlue( p ) ( (int) ( *((p)+2) ) )
#define ImCltSRed( p, r ) ( *((p)+0) = (unsigned char)(r) )
#define ImCltSGreen( p, g ) ( *((p)+1) = (unsigned char)(g) )
#define ImCltSBlue( p, b ) ( *((p)+2) = (unsigned char)(b) )
/* Entry addressing. */
#define ImCltQFirst( c ) ( (c)->clt_clt )
#define ImCltQPtr( c, i ) ( ImCltQFirst(c) + (3 * (i)) )
#define ImCltQLast( c ) ( ImCltQFirst(c) + \
( 3*( ImCltQNColors(c) - 1 ) ) )
#define ImCltQNext( c, p ) ( (p) + 3 )
#define ImCltQPrev( c, p ) ( (p) - 3 )
#define ImCltSInc( c, p ) ( (p) += 3 )
#define ImCltSDec( c, p ) ( (p) -= 3 )
/*
* TYPEDEF & STRUCT
* ImFileFormatReadMap - map of how a format handles reads
* ImFileFormatWriteMap - map of how a format handles writes
*
* DESCRIPTION
* These two tables are essentially mirror images of each other. The
* read map tells what depths of imagery can be read from a format and
* how it maps to VFB's. The write map tells how different VFB's map
* to file depths.
*
* map_inType and map_outType select whether the image is represented
* as a CLT index per pixel (pseudo-color) or with the full RGB color
* per pixel (true-color).
*
* map_inNChannels and map_outNChannels give the number of channels per
* pixel (usually 1 or 3).
*
* map_inChannelDepth and map_outChannelDepth give the size of the
* channels, in bits. Usually 1-bit (mono) through 8-bit.
*
* map_inAttributes and map_outAttributes select the attributes of
* an incomming or outgoing file image, such as whether it has a CLT,
* alpha planes, or is compressed somehow. For read, the _outAttributes
* may not contain any compression indications. Likewise for write, the
* _inAttributes may not contain compression stuff.
*
* map_inField and map_outField select the type of VFB (as a VFB
* field mask) that is created by the read or taken by the write. Only
* image depth type field values should be included (ie., don't add
* IMVFBALPHA, etc).
*
* map_write is a function pointer to the write function to handle
* this specific output mapping. There is no equivalent read for the
* read map.
*/
typedef struct ImFileFormatReadMap
{
int map_inType; /* In image type (index | rgb) */
int map_inNChannels; /* In # of channels */
int map_inChannelDepth; /* In channel size (in bits) */
int map_inAttributes; /* In image attributes */
int map_outField; /* Out VFB field */
int map_outAttributes; /* Out VFB attributes */
} ImFileFormatReadMap;
typedef struct ImFileFormatWriteMap ImFileFormatWriteMap;
struct ImFileFormatWriteMap
{
int map_inField; /* In VFB field */
int map_inAttributes; /* In VFB attributes */
int map_outType; /* Out image type (index | rgb) */
int map_outNChannels; /* Out # of channels */
int map_outChannelDepth; /* Out channel size (in bits) */
int map_outAttributes; /* Out image attributes */
#ifdef __STDC__
int (*map_write)(
ImFileFormatWriteMap * ,
int , int , FILE* ,
TagTable* , TagTable* );/* Out write function */
#else
int (*map_write)( ); /* Out write function */
#endif
};
/*
* CONSTANTS
* IMTYPEINDEX - Indexed image type
* IMTYPERGB - RGB image type
* IMTYPE2D - 2D primitives
* IMCOMP* - Compression options
* IMINTER* - Interlace options
* IMCLT* - CLT options
* IMALPHA* - Alpha plane options
* IMGROUP* - Grouping options
* IMFILECOMP* - File compression option(s)
*
* DESCRIPTION
* All of these are values used in initializing fields of the read
* and write mapping structures for the various formats. They may also
* be used as user request values for flagsTable flags:
*
* "image type request", int type = IMTYPEINDEX or IMTYPERGB
* "image channel number request", int nchannels = 1 or 3 usually
* "image channel depth request", int depth = 1-32
* "image compression request", int comp = IMCOMP*
* "image interleave request", int inter = IMINTER*
* "image clt request", int clt = IMCLT*
* "image alpha request", int alpha = IMALPHA*
* "image group request", int group = IMGROUP*
* "image quality request" int quality = 1..100 usually
* "file compression" int type = 1
*
*/
#define IMTYPEINDEX (0) /* CLT index per pixel */
#define IMTYPERGB (1) /* RGB color per pixel */
#define IMTYPE2D (2) /* 2D primitives */
#define IMCOMPMASK 0x0F
#define IMCOMPNO (0<<0) /* No compression */
#define IMCOMPNONE (0<<0) /* No compression */
#define IMCOMPRLE (1<<0) /* Run-Length Encoded compression*/
#define IMCOMPLZW (2<<0) /* Limpel-Ziv Welsh compression */
#define IMCOMPPACKBITS (3<<0) /* Packbits compression */
#define IMCOMPPB (3<<0) /* Packbits compression */
#define IMCOMPMAC (3<<0) /* Packbits compression */
#define IMCOMPDCT (4<<0) /* Descrete Cosine Transform */
#define IMCOMPASCII (5<<0) /* Descrete Cosine Transform */
/* (6<<0) - (15<<0) Reserved */
#define IMGROUPMASK 0xF0
#define IMGROUPSCANLINES (0<<4) /* Group into scanlines(default)*/
#define IMGROUPTILES (1<<4) /* Group into tiles */
/* (2<<4) - (15<<4) Reserved */
#define IMINTERMASK 0xF00
#define IMINTERNO (0<<8) /* Non-interleave */
#define IMINTERNONE (0<<8) /* Non-interleave */
#define IMINTERLINE (1<<8) /* Scanline interleave */
#define IMINTERPLANE (2<<8) /* Plane interleave */
/* (3<<8) - (15<<8) Reserved */
#define IMCLTMASK 0xF000
#define IMCLTNO (0<<12) /* No CLT included */
#define IMCLTNONE (0<<12) /* No CLT included */
#define IMCLTNODUMP (0<<12) /* No CLT included */
#define IMCLTYES (1<<12) /* CLT included */
#define IMCLTDUMP (2<<12) /* CLT included */
/* (3<<12) - (15<<12) Reserved */
#define IMALPHAMASK 0xF0000
#define IMALPHANO (0<<16) /* No Alpha planes included */
#define IMALPHANONE (0<<16) /* No Alpha planes included */
#define IMALPHANODUMP (0<<16) /* No Alpha planes included */
#define IMALPHAYES (1<<16) /* Alpha planes included */
#define IMALPHADUMP (1<<16) /* Alpha planes included */
/* (2<<16) - (15<<16) Reserved */
#define IMQUALITYMASK 0xF00000
#define IMQUALITYNO (0<<20) /* No quality control allowed */
#define IMQUALITYYES (1<<20) /* Optional quality control */
/* (2<<20) - (15<<20) Reserved */
/* (1<<24) - (1<<31) Reserved */
/*
* TYPEDEF & STRUCT
* ImFileMagic - magic number info
* ImFileFormat - file format info
*
* DESCRIPTION
* The imFileFormat struct describes everything we know generically
* about the set of file formats supported by the image library.
*
* format_names is a list of the names we know the format by. The
* first name in the list is its "primary" name (the name we like most).
* The rest are "equivalent" names. Names are used as command-line
* options in image tools, and as possible file extensions. The list
* is terminated with a NULL. Since all name checking is case-insensitive,
* only list things in lower case.
*
* format_help is a help string that explains what the format is, in
* 40 characters or less. For instance, "ras" would have "Sun rasterfile"
* as its help string. "pix" would have "Alias picture file" as its
* help string. Image library tools will use this as the help string
* for the option keyword in their argument parsing code.
*
* format_creator is a string indicating who created and/or supports
* this format. "rgb" would read "Silicon Graphics". "ras" would read
* "Sun Microsystems, Inc.".
*
* format_readSupport and format_writeSupport are one-or-more line strings
* describing the variants of the format that we support. The real
* detail specifics are left to the read and write maps (later), but these
* strings say the same thing in more human terms. The strings are used
* by image tools to list what can be supported.
*
* The struct ImFileMagic contains:
* format_magicLocation, _magicLength, and _magicNumber give information
* about the format's magic number, if any. The location is the # of
* bytes from the start of the file at which the magic number is found.
* This is almost always 0. The length is the # of bytes that constitute
* the magic number, and is usually 4. If this value is 0, there is no
* magic number for this format. The magic number itself is a string of
* bytes that must match the number in the file. Image library tools
* will typicaly check this against the file in both MBF and LBF order.
*
* format_readMultiVfb and format_writeMultiVfb are booleans indicating
* if the format can read in, and write out multiple images for the same
* file.
*
* format_readPipe and format_writePipe are booleans indicating if
* the format can handle a pipe. If they can't, the generic code will
* make a temp file for the format code.
*
* format_read is a function pointer to the top level read routine for
* the format. All format read requests enter here.
*
* format_readMap describes in detail the different file variants that
* can be handled and what kind of VFB they map to.
*
* format_writeMap describes in detail the different file variants that
* can be written and what kind of VFB they accept. The map also has
* function pointers to specific format write routines to handle those
* variants.
*/
typedef struct ImFileMagic
{
int format_magicLocation; /* Location of magic # */
int format_magicLength; /* # bytes in magic # */
unsigned char *format_magicNumber; /* Magic # */
} ImFileMagic;
typedef struct ImFileFormat
{
char **format_names; /* Format name string */
char *format_help; /* Long form of name */
char *format_creator; /* Creator/source of format */
char *format_readSupport; /* Message on read handling */
char *format_writeSupport; /* Message on write handling */
ImFileMagic *format_magicMap; /* Magic numbers */
int format_readMultiVfb; /* Can read generate multiple VFBs?*/
int format_readPipe; /* Can read handle a pipe? */
int format_writeMultiVfb; /* Can write take multiple VFBs?*/
int format_writePipe; /* Can write handle a pipe? */
#ifdef __STDC__
int (*format_read)(int,int,FILE*,
TagTable*, TagTable*); /* Read format */
#else
int (*format_read)( ); /* Read format */
#endif
ImFileFormatReadMap *format_readMap;/* Read support mapping */
ImFileFormatWriteMap *format_writeMap;/* Write support mapping */
} ImFileFormat;
/*
* Values for format_readMultiVfb and format_writeMultiVfb:
*/
#define IMMULTI (1) /* Supports multi-image files */
#define IMNOMULTI (0) /* Doesn't */
#define IMPIPE (1) /* Supports pipe input */
#define IMNOPIPE (0) /* Doesn't */
/*
* TYPEDEF and STRUCTURE
* ImCompressScheme
*
* DESCRIPTION
* This is the list of file compression/encoding schemes.
*
* The elements of the structure are as follows:
*
* compress_suffixes
* A list of suffixes used by the scheme. For instance,
* compress/uncompress use the "Z" suffix.
*
* compress_name
* The name of the scheme. "Z" compression is called
* "Lempel-Ziv Encoding"
*
* compress_magic_numbers
* The possible magic numbers for a file of this type.
* This magic number structure is the same as the one
* in the ImFileFormat structure above.
*
* compress_decode
* This is a subroutine which uncompresses a file, and destroys
* the compressed one.
*
* compress_encode
* This is a subroutine which encodes a file, and destroys the
* unencoded one.
*
* For more information about how to add your own compression schemes,
* refer to imschemes.c.
*
*/
typedef struct ImCompressScheme
{
char **compress_suffixes; /* List of suffixes */
char *compress_name; /* Name */
ImFileMagic* compress_magic_numbers; /* Magic number(s) */
#ifdef __STDC__
int (*compress_decode)(char*,char*,TagTable*); /* Decode (read) routine*/
int (*compress_encode)(char*,char*,TagTable*); /* Encode (write) routine*/
#else
int (*compress_decode)(); /* Read routine */
int (*compress_encode)(); /* Write routine */
#endif
} ImCompressScheme;
/*
* CONSTANTS
* IMVFB... - raster operations and inout values
*
* DESCRIPTION
* The first set of constants define various different raster operations
* used by ImVfbFill() et al.
*
* IMVFBINSIDE and IMVFBOUTSIDE indicate how filling is to take place
* in ImVfbFill().
*/
#define IMVFBCLEAR 0
#define IMVFBSET 15
#define IMVFBSOURCE 3
#define IMVFBPATTERN 5
#define IMVFBNSOURCE 12
#define IMVFBNPATTERN 10
#define IMVFBAND 1
#define IMVFBNAND 14
#define IMVFBOR 7
#define IMVFBXOR 6
#define IMVFBNOR 8
#define IMVFBNXOR 9
#define IMVFBINSIDE 0
#define IMVFBOUTSIDE 1
#define IMGRADNONE 0
#define IMGRADHORIZ 1
#define IMGRADVERT 2
#define IMVFBPRINTFLOAT (1<<0)
#define IMVFBPRINTINT (1<<1)
#define IMVFBPRINTINTFLOAT (IMVFBPRINTFLOAT|IMVFBPRINTINT)
/*
* CONSTANTS
* IMVFB... - flip directions
*
* DESCRIPTION
* These constants are used to select flip directions in ImVfbFlip().
*/
#define IMVFBXFLIP 0x1 /* X direction */
#define IMVFBYFLIP 0x2 /* Y direction */
#define IMVFBXYFLIP ( IMVFBXFLIP | IMVFBYFLIP ) /* Both */
#define IMVFBLEFTRIGHT IMVFBXFLIP
#define IMVFBUPDOWN IMVFBYFLIP
#define IMVFBLEFTRIGHTUPDOWN IMVFBXYFLIP
/* 0x4-0xFFFFFFFF Reserved */
/*
* CONSTANTS
* IMVFB... - resolution change algorithms
*
* DESCRIPTION
* These constants select the algorithm to use when changing the
* resolution of an image using ImVfbResize().
*/
#define IMVFBPIXELREP 0 /* Pixel replecation */
#define IMVFBBILINEAR 1 /* Bilinear interpolation */
/*
* MACROS
* Im... - function pseudonims
*
* DESCRIPTION
* These macros are defiend to support various names for the same
* function, such as 'gray' vs. 'grey'.
*/
#define ImVfbToGrey ImVfbToGray
/*
* CONSTANTS
* IMERRORFATAL - fatal error
* IMERRORWARNING - warning error
* IMERRORINFO - information error
*
* DESCRIPTION
* These three values flag the type of error causing the invocation of
* an error handler (nominated via the flagsTable).
*/
#define IMERRORFATAL 0
#define IMERRORWARNING 1
#define IMERRORINFO 2
/* 3-2^32 Reserved */
/*
* CONSTANT
* IMMAXNAME - maximum format name size
* IMDEFMONOTHRESH - default monochrome threshold
*/
#define IMMAXNAME 100
#define IMDEFMONOTHRESH 127
/*
* STRUCT & TYPEDEF
* ImHistTable - histogram information table
*
* DESCRIPTION
* ImVfbHist( ) computes a field-correlated histogram on an image
* and returns occurrence counts for each unique field value or
* combination of field values. That list of occurrence counts and
* unique values is returned in an ImHistTable structure.
*
* For example, a histogram is computed on the RED and GREEN fields
* of an image. The returned ImHistTable will have:
*
* imhist_nEntries
* The number of unique RED-GREEN color combinations found.
* imhist_fieldMask
* A bitmask mask of the fields checked: IMRED | IMGREEN
* imhist_nFields
* The number of fields checked... in this case 2: RED & GREEN.
* imhist_values[IMHISTRED]
* A list of imhist_nEntries red values as part of the RED-GREEN
* combo.
* imhist_values[IMHISTGREEN]
* A list of imhist_nEntries green values as part of the RED-GREEN
* combo.
* imhist_values[all others]
* NULL pointers because these fields were not part of the
* histogram calcuation requested.
* imhist_nOccur
* A list of the occurrence counts for each of the RED-GREEN
* pairs listed in imhist_values[IMHISTRED] and
* imhist_values[IMHISTGREEN]. This list will be sorted from
* high to low, if requested on the call to ImVfbHist( ).
*
* This information could be plotted by the user on a graph where the
* vertical axis is an occurrence count, and the horizontal axis is
* each RED-GREEN color combo listed one at a time. The imhist_nOccur
* value for each RED-GREEN pair would be the height of a data point
* for the horizontal position of the RED-GREEN pair on the graph.
*
* Such graphs are more typically used on single-field histograms,
* such as just the RED field, or just the HUE field, or whatever.
* In that case, occurrences would be the vertical axis, and the field
* value the horizontal axis. For example, a histogram of RED in an
* image would produce a graph like the following:
*
* 100 -| * *
* | *
* 80 -| **
* | * * *
* 60 -| * * *
* | * *
* 40 -|* *
* | * * * * *
* 20 -| * * * *
* | * * ****** * * ***** ***************** ** ***
* 0 -|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
* 0 32 64 96 128 160 192 224 256
*
* This kind of graph of histogram values shows us that this example
* image has a fair amount of bright red (right end of graph) quite a bit
* of low-midrange red (middle of graph) and a bit of dark red (left
* edge of graph). The blank spots in the graph are red values that do
* not occur in the image (the *'s along the bottom of the graph show
* occurrence values of 0).
*/
#define IMMAXFIELDS 20
typedef struct ImHistTable
{
int imhist_nEntries; /* Number of unique colors in table*/
int imhist_fieldMask; /* Fields for histogram */
int imhist_nFields; /* Number of fields for histogram*/
union
{
unsigned short *imhist_val16; /* list for index16 numbers */
unsigned char *imhist_val8; /* list for rgba & index8 #s*/
float *imhist_valFloat;/* list for hue, sat, intensity nums*/
} imhist_values[IMMAXFIELDS];
unsigned int *imhist_nOccur; /* list of occurrence counts */
} ImHistTable;
/*
* CONSTANTS
* IMHIST... - histogram table array index names
* imhist_... - histogram table union field names
*
* DESCRIPTION
* Values in an ImHistTable returned by ImVfbHist( ) are indexed through
* the imhist_values field. Indexes are named for fields on which the
* histogram may have been done.
*
* To provide a more intuitive look to code using a ImHistTable, the
* fields in the union are given names for quick reference.
*/
#define IMHISTRED 0
#define IMHISTGREEN 1
#define IMHISTBLUE 2
#define IMHISTALPHA 3
#define IMHISTHUE 4
#define IMHISTSATURATION 5
#define IMHISTINTENSITY 6
#define IMHISTINDEX8 7
#define IMHISTGRAY 7
#define IMHISTGREY 7
#define IMHISTINDEX16 8
#define IMHISTMONO 9
#define imhist_red imhist_values[IMHISTRED].imhist_val8
#define imhist_blue imhist_values[IMHISTBLUE].imhist_val8
#define imhist_green imhist_values[IMHISTGREEN].imhist_val8
#define imhist_alpha imhist_values[IMHISTALPHA].imhist_val8
#define imhist_hue imhist_values[IMHISTHUE].imhist_valFloat
#define imhist_saturation imhist_values[IMHISTSATURATION].imhist_valFloat
#define imhist_intensity imhist_values[IMHISTINTENSITY].imhist_valFloat
#define imhist_gray imhist_values[IMHISTINDEX8].imhist_val8
#define imhist_grey imhist_values[IMHISTINDEX8].imhist_val8
#define imhist_index8 imhist_values[IMHISTINDEX8].imhist_val8
#define imhist_index16 imhist_values[IMHISTINDEX16].imhist_val16
#define imhist_mono imhist_values[IMHISTMONO].imhist_val8
/*
* CONSTANTS
* IMMAXIMUM - computed maximum field value
* IMMINIMUM - computed minimum field value
* IMUNIQUEVAL - computed number of unique field values
* IMMAXNUMSTATS - number of statistics returned by ImVfbStat
*
* DESCRIPTION
* ImVfbStat( ) computes simple statistics on a single pixel field in
* an image. Statistics are returned in a floating point array of
* IMMAXNUMSTATS entries. Individual statistics are obtained by
* indexing into this array using IMMAXIMUM, etc.
*/
#define IMMAXIMUM 0
#define IMMINIMUM 1
#define IMUNIQUEVAL 2
#define IMMAXNUMSTATS 20
/*
* TYPEDEF & STRUCTURE
* ImHotSpot - image hotspot
*
* DESCRIPTION
* ImHotSpot contains a cursor hotspot: the point on a cursor image
* that corresponds to the cursor's location for picking purposes.
* For instance, this would be the point of an arrow cursor, the tip
* of a pencil cursor, or the end of the stinger on a bumble-bee cursor!
*
* ImHotSpot contains the cursor's hotspot location, as measured from
* the upper-left corner (0,0) of the image, in pixels.
*/
typedef struct ImHotSpot
{
int hot_x; /* x coordinate of hotspot */
int hot_y; /* y coordinate of hotspot */
} ImHotSpot;
typedef ImHotSpot *ImHotSpotPtr;
/*
* MACROS
* ImHotSpot... - set and query HotSpot attributes
*
* DESCRIPTION
* These macros, masquerading as subroutines, take a HotSpot pointer
* and set or query information from it.
*/
#define ImHotSpotQX( hs ) ( (hs)->hot_x )
#define ImHotSpotQY( hs ) ( (hs)->hot_y )
#define ImHotSpotSX( hs, xcoord ) ( (hs)->hot_x = (int) xcoord )
#define ImHotSpotSY( hs, ycoord ) ( (hs)->hot_y = (int) ycoord )
/*
* FUNCTIONS
* Im... - Generic functions
* ImClt... - CLT functions
* ImVfb... - VFB functions
* ImFile... - File I/O functions
*/
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __STDC__
extern void ImPError( char * );
extern char *ImQError( void );
extern void ImRgbToHsi( int[3], float[3] );
extern void ImHsiToRgb( float[3], int[3] );
extern ImClt *ImCltAlloc( int );
extern void ImCltFree( ImClt * );
extern ImClt *ImCltDup( ImClt * );
extern ImClt *ImCltGrayRamp( ImClt *, int, int, int, int, ImClt * );
extern ImClt *ImCltRoll( ImClt *, int, ImClt * );
extern ImVfb *ImVfbAdjust( ImVfb *, int, double, double, int, int, double, double, ImVfb * );
extern ImVfb *ImVfbAlloc( int, int, int );
extern ImVfb *ImVfbClear( int, int, ImVfb * );
extern ImVfb *ImVfbComp( ImVfb *, int, int, int, int, int, int, ImVfb *, int, int );
extern ImVfb *ImVfbCopy( ImVfb *, int, int, int, int, int, ImVfb *, int, int );
extern ImVfb *ImVfbDup( ImVfb * );
extern ImVfb *ImVfbFade( ImVfb *, double, int, ImVfb * );
extern ImVfb *ImVfbFill( ImVfb *, int, int, int, int, int, double, double, int, int, ImVfb * );
extern ImVfb *ImVfbFlip( ImVfb *, int, ImVfb * );
extern void ImVfbFree( ImVfb * );
extern ImHistTable *ImVfbHist( ImVfb *, int, int );
extern void ImVfbHistTableFree( ImHistTable * );
extern ImVfb *ImVfbLightness( ImVfb *, double, ImVfb * );
extern ImVfb *ImVfbMix( ImVfb *, double, ImVfb *, double, int, ImVfb * );
extern ImVfb *ImVfbResize( ImVfb *, int, ImVfb *, int, int );
extern ImVfb *ImVfbRoll( ImVfb *, int, int, ImVfb * );
extern ImVfb *ImVfbRotate( ImVfb *, double, ImVfb * );
extern ImVfb *ImVfb90Rotate( ImVfb *, ImVfb * );
extern float *ImVfbStat( ImVfb *, int, float * );
extern ImVfb *ImVfbToIndex( ImVfb *, int, ImVfb * );
extern ImVfb *ImVfbToIndex8( ImVfb *, ImVfb * );
extern ImVfb *ImVfbToIndex16( ImVfb *, ImVfb * );
extern ImVfb *ImVfbToMono( ImVfb *, int, ImVfb * );
extern ImVfb *ImVfbFSDitherToMono( ImVfb *, ImVfb * );
extern ImVfb *ImVfbToRgb( ImVfb *, ImVfb * );
extern ImVfb *ImVfbToGray( ImVfb *, ImVfb * );
extern ImVfb *ImVfbXShear( ImVfb *, double, ImVfb * );
extern ImVfb *ImVfbYShear( ImVfb *, double, ImVfb * );
extern void ImVfbPrint( FILE*, int, ImVfb* );
extern ImVfb *ImVfbCopyChannel( ImVfb* inVfb, int inFieldMask, ImVfb* outVfb, int outFieldMask);
extern int ImFileRead( int, char *, TagTable *, TagTable * );
extern int ImFileFRead( FILE *, char *, TagTable *, TagTable * );
extern int ImFileWrite( int, char *, TagTable *, TagTable * );
extern int ImFileFWrite( FILE *, char *, TagTable *, TagTable * );
extern char *ImFileQFormat( int, char * );
extern char *ImFileQFFormat( FILE *, char * );
extern int ImFileQNFormat( void );
extern int ImFileFormatOptions( int, ArgOption *, ArgOption ** );
extern int ImFileFormatEquivs( int, ArgEquiv *, ArgEquiv ** );
extern ImFileFormat **ImFileFindFormat( char * );
extern char *ImFileQCompression(int , TagTable* );
extern char *ImFileQFCompression(FILE* , TagTable* );
ImCompressScheme *ImFileFindCompressionScheme( char* );
extern ImFileFormat **ImGetFileFormats( void );
extern ImCompressScheme**ImGetCompressSchemes( void );
#else
extern void ImPError( );
extern char *ImQError( );
extern void ImRgbToHsi( );
extern void ImHsiToRgb( );
extern ImClt *ImCltAlloc( );
extern void ImCltFree( );
extern ImClt *ImCltDup( );
extern ImClt *ImCltGrayRamp( );
extern ImClt *ImCltRoll( );
extern ImVfb *ImVfbAdjust( );
extern ImVfb *ImVfbAlloc( );
extern ImVfb *ImVfbClear( );
extern ImVfb *ImVfbComp( );
extern ImVfb *ImVfbCopy( );
extern ImVfb *ImVfbDup( );
extern ImVfb *ImVfbFade( );
extern ImVfb *ImVfbFill( );
extern ImVfb *ImVfbFlip( );
extern void ImVfbFree( );
extern ImVfb *ImVfbGamma( );
extern ImHistTable *ImVfbHist( );
extern void ImVfbHistTableFree( );
extern ImVfb *ImVfbLightness( );
extern ImVfb *ImVfbMix( );
extern ImVfb *ImVfbResize( );
extern ImVfb *ImVfbRoll( );
extern ImVfb *ImVfbRotate( );
extern ImVfb *ImVfb90Rotate( );
extern float *ImVfbStat( );
extern ImVfb *ImVfbToIndex( );
extern ImVfb *ImVfbToIndex8( );
extern ImVfb *ImVfbToIndex16( );
extern ImVfb *ImVfbFSDitherToMono( );
extern ImVfb *ImVfbToMono( );
extern ImVfb *ImVfbToRgb( );
extern ImVfb *ImVfbToGray( );
extern ImVfb *ImVfbXShear( );
extern ImVfb *ImVfbYShear( );
extern void ImVfbPrint( );
extern ImVfb *ImVfbCopyChannel( );
extern int ImFileRead( );
extern int ImFileFRead( );
extern int ImFileWrite( );
extern int ImFileFWrite( );
extern char *ImFileQFormat( );
extern char *ImFileQFFormat( );
extern int ImFileQNFormat( );
extern int ImFileFormatOptions( );
extern int ImFileFormatEquivs( );
extern ImFileFormat **ImFileFindFormat( );
extern char *ImFileQCompression( );
extern ImCompressScheme *ImFileFindCompressionScheme( );
extern ImFileFormat **ImGetFileFormats( );
extern ImCompressScheme**ImGetCompressSchemes( );
#endif
#ifdef __cplusplus
}
#endif
#endif /* __IMH__ */