541 lines
17 KiB
C
Executable File
541 lines
17 KiB
C
Executable File
#ifndef __INCLUDE_ILIB_H__
|
|
#define __INCLUDE_ILIB_H__
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*****************************************************************************
|
|
**
|
|
** Image library
|
|
**
|
|
** Name : ilib.h header file for use with the image library
|
|
** Author : A.Hervas
|
|
** Version : Beta 1.01, Wed May 18th 1994
|
|
**
|
|
** Copyright (C) 1997 Nothing Real LLC
|
|
**
|
|
** These coded instructions, statements and computer programs contain
|
|
** unpublished information proprietary to Nothing Real LLC and
|
|
** Alias|Wavefront Inc. and are protected by Canadian and US federal
|
|
** copyright laws. They may not be disclosed to third parties or
|
|
** copied or duplicated, in whole or in part, without prior written
|
|
** consent of Alias|Wavefront Inc.
|
|
**
|
|
** Unpublished-rights reserved under the Copyright Laws of the United States.
|
|
**
|
|
*****************************************************************************/
|
|
|
|
#include "flib.h"
|
|
|
|
#ifndef IMAGE_EXPORT /* for fcheck and irix */
|
|
#define IMAGE_EXPORT
|
|
#endif
|
|
/*
|
|
NAME
|
|
ILintro - Introduction to the image library
|
|
|
|
DESCRIPTION
|
|
|
|
The IO image library is part of the flib library.
|
|
A set of routines allows to read and write images in a
|
|
structured file.
|
|
|
|
FILE FORMAT
|
|
The format of an image file is very flexible.
|
|
Constraints on the number and relative position of the different
|
|
blocks are minimal and often purely of a logical nature
|
|
(for example, "the header must come before the pixel blocks"
|
|
rather than more static constraints such as "the header begins
|
|
at offset 124").
|
|
|
|
An image file being first and foremost a file
|
|
(as far as flib is concerned) the user is free to insert extra
|
|
blocks. A minimal image is composed of a FOR4 group
|
|
(aligned to a word) of CIMG type containing, in the following order:
|
|
|
|
- a BMHD header (bitmap header)
|
|
- a FOR4 group of type TBMP (tiled bitmap)
|
|
|
|
Pixel information is contained in the TBMP group, which can be
|
|
quickly skipped if necessary.
|
|
|
|
In its minimal version, the TBMP group contains pixel related
|
|
data blocks, in some order. For example, for a picture divided
|
|
in four tiles we have:
|
|
|
|
|
|
FOR4 <taille> CIMG
|
|
BMHD 24 ... definition of size, maps, etc...
|
|
FOR4 <taille2> TBMP
|
|
RGBA <ttile1> ... pixels of tile 1 ...
|
|
RGBA <ttile2> ... pixels of tile 2 ...
|
|
RGBA <ttile3> ... pixels of tile 3 ...
|
|
RGBA <ttile4> ... pixels of tile 4 ...
|
|
|
|
The header is defined by structure ILheader.
|
|
RGBA blocks have the following structure:
|
|
|
|
[x1, y1, x2, y2] : tile coordinates (2 bytes each)
|
|
[pixels] : encoded according to compression mode.
|
|
|
|
If the image has a z-buffer, it is described by ZBUF blocks with the
|
|
same structure as the RGBA blocks, RLE encoded.
|
|
NOTE: See TrenderFrame::writeToFile() for more information on how the
|
|
depth is encoded by Maya.
|
|
|
|
An IFF field typically also contains end fields.
|
|
Calls to FLIB after image loading can be used to check for and
|
|
retrieve this data. ILIB ignores these fields. The following four
|
|
fields provide information about the image:
|
|
|
|
HIST: string data giving the Maya command line from which this
|
|
image was created.
|
|
|
|
VERS: string data giving the Maya cut information.
|
|
|
|
CLPZ: depth map specific field giving the clipping planes used.
|
|
This information is stored as two float values.
|
|
|
|
ESXY: eye x-y ratios. This is a depth map specific field used to
|
|
compute the xy eye coordinates from the normalized pixel
|
|
coordinates stored as two float values.
|
|
|
|
NOTE:
|
|
The ILIB library does not support these end fields.
|
|
|
|
[claforte Oct 12 2001 NOTE: Why the heck wasn't that included as part
|
|
of the header at the beginning of the file? We have to read all of
|
|
the file to get that information, that's stupid and inefficient.]
|
|
|
|
|
|
TYPICAL EXAMPLE
|
|
Maya produces IFF files whose RGBA and ZBUF tiles are interlaced.
|
|
Note that fcheck doesn't currently translate tags from big-endian
|
|
to little-endian machine. The end result is that on the Intel
|
|
architecture, the tag names are inverted. (ie: FUBZ instead of ZBUF)
|
|
Here is an example:
|
|
|
|
C:\TEMP> fcheck -acv hasDepth.iff
|
|
|
|
File : hasDepth.iff
|
|
4ROF 125860 GMIC
|
|
.REVF 4
|
|
.DHBT 32 320x240 Color RLE, 8 bits with Mask, ZBuf, 8 tiles
|
|
.HTUA 19 rjones on PC-RJONES
|
|
.ETAD 24 Thu Oct 11 12:55:13 2001
|
|
.4ROF 125524 PMBT
|
|
..ABGR 14488 x1: 160 y1: 0 x2: 239 y2: 119
|
|
..FUBZ 14720 x1: 160 y1: 0 x2: 239 y2: 119
|
|
..ABGR 620 x1: 240 y1: 0 x2: 319 y2: 119
|
|
..FUBZ 608 x1: 240 y1: 0 x2: 319 y2: 119
|
|
..ABGR 16153 x1: 160 y1: 120 x2: 239 y2: 239
|
|
..FUBZ 14760 x1: 160 y1: 120 x2: 239 y2: 239
|
|
..ABGR 618 x1: 240 y1: 120 x2: 319 y2: 239
|
|
..FUBZ 608 x1: 240 y1: 120 x2: 319 y2: 239
|
|
..ABGR 680 x1: 0 y1: 0 x2: 79 y2: 119
|
|
..FUBZ 608 x1: 0 y1: 0 x2: 79 y2: 119
|
|
..ABGR 15485 x1: 80 y1: 0 x2: 159 y2: 119
|
|
..FUBZ 14764 x1: 80 y1: 0 x2: 159 y2: 119
|
|
..ABGR 648 x1: 0 y1: 120 x2: 79 y2: 239
|
|
..FUBZ 608 x1: 0 y1: 120 x2: 79 y2: 239
|
|
..ABGR 15319 x1: 80 y1: 120 x2: 159 y2: 239
|
|
..FUBZ 14695 x1: 80 y1: 120 x2: 159 y2: 239
|
|
.ZPLC 8
|
|
.YXSE 8
|
|
.TSIH 138 mayaBatch -render -n 1 -proj default -A
|
|
pc-rjones.tor.aw.sgi.com:7835
|
|
-p hasDepth
|
|
E:/rjones/maya/.../hasDepth.mb
|
|
.SREV 21 Maya cut 200105302318
|
|
|
|
|
|
FUNCTIONS
|
|
Some functions allow the reading and writing of images in line
|
|
to line mode without worrying about tile management. Images can also
|
|
be automatically zoomed and/or corrected (by lookup) during read
|
|
(correction on compressed data being significantly more efficient).
|
|
Finally, an automatic conversion system makes it possible to read images
|
|
stored under other formats.
|
|
|
|
For more details on routines from the image library, see the man pages as well
|
|
as includes and examples provided with the library.
|
|
|
|
*/
|
|
|
|
typedef int (*ILgfunc)(void *, const void **, const float **);
|
|
|
|
typedef struct _ILheader
|
|
{
|
|
unsigned int width;
|
|
unsigned int height;
|
|
unsigned short prnum;
|
|
unsigned short prden;
|
|
unsigned int flags;
|
|
unsigned short bytes;
|
|
unsigned short tiles;
|
|
unsigned int compress;
|
|
int orgx;
|
|
int orgy;
|
|
|
|
} ILheader;
|
|
|
|
typedef struct _ILpage
|
|
{
|
|
FLnode node;
|
|
unsigned int fpos;
|
|
unsigned int size;
|
|
unsigned short coords[4];
|
|
|
|
} ILpage;
|
|
|
|
typedef struct _ILfkern
|
|
{
|
|
uint n;
|
|
int off;
|
|
int * w;
|
|
|
|
} ILfkern;
|
|
|
|
typedef struct _ILfint
|
|
{
|
|
FLnode node;
|
|
int use;
|
|
float rad, min, max;
|
|
float * tab;
|
|
|
|
} ILfint;
|
|
|
|
typedef struct _ILzoom
|
|
{
|
|
FLnode node;
|
|
FLmkey memory;
|
|
int updated;
|
|
uint w,h;
|
|
uint zw,zh;
|
|
int extend;
|
|
float xblur;
|
|
float yblur;
|
|
float xoff;
|
|
float yoff;
|
|
uint lw,clw;
|
|
int degen;
|
|
ILfint * xshape;
|
|
ILfint * yshape;
|
|
ILfint * s_xshape;
|
|
ILfint * s_yshape;
|
|
unsigned int * cbuf;
|
|
float * zbuf;
|
|
int * xmap;
|
|
int curay;
|
|
uint y,ay,ny;
|
|
ILfkern* xfilt;
|
|
ILfkern* yfilt;
|
|
uint nrows;
|
|
int ** fcrows;
|
|
float ** fzrows;
|
|
int * acrow;
|
|
float * azrow;
|
|
void * id;
|
|
ILgfunc gfunc;
|
|
uint iavail;
|
|
int * iptr;
|
|
int gback;
|
|
float xlm,ybm;
|
|
float xrm,ytm;
|
|
|
|
} ILzoom;
|
|
|
|
typedef struct _ILcdef
|
|
{
|
|
uint width;
|
|
uint height;
|
|
uint depth;
|
|
uint mask;
|
|
uint ignore;
|
|
uint channels;
|
|
uint stride;
|
|
uint btrunc;
|
|
uint size;
|
|
const unsigned char ** lookups;
|
|
|
|
} ILcdef;
|
|
|
|
typedef int (*ILcfunc)(void *, const void *, const ILcdef *);
|
|
|
|
typedef struct _ILimage
|
|
{
|
|
FLfile fp;
|
|
|
|
int version;
|
|
ILheader bmhd; /* bitmap header */
|
|
unsigned int ictl; /* image control field */
|
|
|
|
int twidth; /* tiling */
|
|
int theight;
|
|
|
|
FLfunc auxfunc; /* callback for aux blocks */
|
|
FLfunc usrfunc; /* callback for user blocks */
|
|
|
|
unsigned int bitmask; /* mask of active channels */
|
|
int channels; /* nb of color channels */
|
|
int pwidth; /* pixel width in bytes */
|
|
int lwidth; /* line width in bytes */
|
|
|
|
char * line; /* line buffer in line mode */
|
|
float * zline; /* z-line in line mode */
|
|
int waterline; /* nb of lines in write buffer */
|
|
int startline; /* # of the first line in wbuf */
|
|
|
|
FLlist pages; /* page buffer */
|
|
int pbound; /* page boundary */
|
|
int pheight; /* page height */
|
|
|
|
void * color; /* color buffer for line mode */
|
|
float * zbuffer; /* z-buffer for line mode */
|
|
|
|
int samples; /* # of samples in page buffer */
|
|
int zsamples; /* same for Z page buffer */
|
|
|
|
const unsigned char ** lookups;
|
|
ILcfunc cfunc;
|
|
ILzoom * zoom;
|
|
|
|
FLlist fields;
|
|
int headerTellPos;
|
|
|
|
} ILimage;
|
|
|
|
#define IL_DefaultVersion FLmakeversion(1,0)
|
|
#define IL_Version FLmakeversion(1,1)
|
|
|
|
/* builtin compressors */
|
|
|
|
#define ILC_None 0
|
|
#define ILC_RLE 1
|
|
#define ILC_QRL 2
|
|
#define ILC_QR4 3
|
|
|
|
#define ILC_Builtin 31
|
|
#define ILC_User 32
|
|
#define ILC_Max 63
|
|
|
|
#define ILC_Default ILC_RLE
|
|
|
|
/* Bitmap header's flags */
|
|
|
|
#define ILH_RGB 0x00000001
|
|
#define ILH_Alpha 0x00000002
|
|
#define ILH_Zbuffer 0x00000004
|
|
#define ILH_Abuffer 0x00000008
|
|
#define ILH_Black 0x00000010
|
|
#define ILH_Type 0x0000001f
|
|
|
|
#define ILH_RGBA (ILH_RGB | ILH_Alpha)
|
|
#define ILH_RGBAZ (ILH_RGB | ILH_Alpha | ILH_Zbuffer)
|
|
|
|
/* Reserved for mapping */
|
|
|
|
#define ILH_Reserved 0xffff0000
|
|
#define ILH_LBuffer 0x00020000
|
|
#define ILH_RBump 0x00100000
|
|
#define ILH_GBump 0x00200000
|
|
#define ILH_BBump 0x00400000
|
|
#define ILH_ABump 0x00800000
|
|
#define ILH_TxFlags 0x00f20000
|
|
|
|
/* Control flags */
|
|
|
|
#define ILF_HdrOK 0x00000001 /* Header read or written */
|
|
#define ILF_PageIO 0x00000002 /* set when writing TBMP */
|
|
#define ILF_LineIO 0x00000004 /* set in line mode */
|
|
#define ILF_LBLoaded 0x00000008 /* long buffer loaded (maps) */
|
|
#define ILF_Finish 0x00000010 /* TBMP written and closed */
|
|
#define ILF_Forced 0x00000020 /* switches auto-tiling off */
|
|
#define ILF_Extended 0x00000080 /* 16 extension of 8 bits img */
|
|
#define ILF_Reading 0x00001000 /* r or r+ mode */
|
|
#define ILF_SysInit 0x000007ff
|
|
|
|
/* User modifiable control flags */
|
|
|
|
#define ILF_User 0xffff0000
|
|
#define ILF_Updown 0x00010000 /* line are r/w from top */
|
|
#define ILF_Vertical 0x00020000 /* not yet implemented */
|
|
#define ILF_Pack 0x00040000 /* do not expand to RGBA */
|
|
#define ILF_Full 0x00100000 /* r/w in 16 bits format */
|
|
#define ILF_NoMask 0x00200000 /* Ignore mask when reading */
|
|
|
|
/* Status of pages in cache */
|
|
|
|
#define ILP_Loaded 0x00000001
|
|
#define ILP_Expanded 0x00000002
|
|
#define ILP_Zpage 0x00000004
|
|
|
|
/* Indexes of corners */
|
|
|
|
#define IL_TX1 0
|
|
#define IL_TY1 1
|
|
#define IL_TX2 2
|
|
#define IL_TY2 3
|
|
|
|
/* flags for 16 bit */
|
|
|
|
#define ILE_None 0
|
|
#define ILE_In 1
|
|
#define ILE_Out 2
|
|
#define ILE_InOut 3
|
|
|
|
/* flags for ILconfig */
|
|
|
|
#define ICFG_NoCvt 0x00000001
|
|
#define ICFG_PipeCvt 0x00000002
|
|
#define ICFG_FifoCpr 0x00000004
|
|
#define ICFG_NoFCache 0x00000008
|
|
|
|
/* Field types and qualifiers */
|
|
|
|
#define IL_FByte 0x01
|
|
#define IL_FHalf 0x02
|
|
#define IL_FWord 0x04
|
|
#define IL_FFloat 0x04
|
|
#define IL_FDouble 0x08
|
|
|
|
#define IL_FType FLmakeid(0, 0, 0, 0x0f)
|
|
|
|
#define IL_FVolatile 0x00
|
|
#define IL_FPermanent 0x10
|
|
|
|
#define IL_FQual FLMakeid(0, 0, 0, 0xf0)
|
|
|
|
/* some actually used fields */
|
|
|
|
#define IL_FFormat FLmakeid('F', 'M', 'T', IL_FByte)
|
|
|
|
/*
|
|
** function prototypes
|
|
**
|
|
*****************************************************************************/
|
|
|
|
extern IMAGE_EXPORT const unsigned char ildeflut[256];
|
|
|
|
extern IMAGE_EXPORT ILimage * ILopen(const char *, const char *);
|
|
extern IMAGE_EXPORT ILimage * ILreopen(const char *, const char *, ILimage *);
|
|
extern IMAGE_EXPORT int ILclose(ILimage *);
|
|
extern IMAGE_EXPORT int ILnext(ILimage *);
|
|
|
|
extern IMAGE_EXPORT void ILinfilter(const char *);
|
|
extern IMAGE_EXPORT void ILoutfilter(const char *);
|
|
|
|
extern IMAGE_EXPORT int ILrange(const char *, float *, char *, float *);
|
|
|
|
extern IMAGE_EXPORT ILheader * ILgetheader(ILimage *);
|
|
|
|
extern IMAGE_EXPORT int ILgetsize(ILimage *, int *, int *);
|
|
extern IMAGE_EXPORT int ILgetorigin(ILimage *, int *, int *);
|
|
extern IMAGE_EXPORT int ILgetratio(ILimage *, int *, int *);
|
|
extern IMAGE_EXPORT int ILgettype(ILimage *);
|
|
extern IMAGE_EXPORT int ILgetbpp(ILimage *);
|
|
extern IMAGE_EXPORT int ILgetcompress(ILimage *);
|
|
extern IMAGE_EXPORT int ILgetpages(ILimage *);
|
|
|
|
extern IMAGE_EXPORT int ILsetsize(ILimage *, int, int);
|
|
extern IMAGE_EXPORT int ILsetorigin(ILimage *, int, int);
|
|
extern IMAGE_EXPORT int ILsettype(ILimage *, int);
|
|
extern IMAGE_EXPORT int ILsetratio(ILimage *, int, int);
|
|
extern IMAGE_EXPORT int ILsetbpp(ILimage *, int);
|
|
extern IMAGE_EXPORT int ILsetcompress(ILimage *, int);
|
|
extern IMAGE_EXPORT int ILsetpages(ILimage *, int);
|
|
extern IMAGE_EXPORT int ILsetpagesize(ILimage *, int, int);
|
|
extern IMAGE_EXPORT int ILsetlookups(ILimage *, const unsigned char **);
|
|
|
|
extern IMAGE_EXPORT int ILgetline(ILimage *, const void **, const float **);
|
|
extern IMAGE_EXPORT int ILreadline(ILimage *, void *, float *);
|
|
|
|
extern IMAGE_EXPORT int ILsetzoom(ILimage *, const char *, int, int,
|
|
float, float, float, float);
|
|
extern IMAGE_EXPORT void ILdefaultzoom(const char *);
|
|
|
|
extern IMAGE_EXPORT ILzoom * ILnewzoom(const char *);
|
|
extern IMAGE_EXPORT void ILsetzoomblur(ILzoom *, float, float);
|
|
extern IMAGE_EXPORT void ILsetzoomoffset(ILzoom *, float, float);
|
|
extern IMAGE_EXPORT void ILsetzoommargin(ILzoom *, float, float, float, float);
|
|
extern IMAGE_EXPORT void ILdelzoom(ILzoom *);
|
|
extern IMAGE_EXPORT int ILbindzoom(ILzoom *, void *, ILgfunc, int, int, int,
|
|
int, int);
|
|
extern IMAGE_EXPORT int ILreadzoom(ILzoom *, void *, float *);
|
|
extern IMAGE_EXPORT int ILgetzoom(ILzoom *, const void **, const float **);
|
|
extern IMAGE_EXPORT int ILputheader(ILimage *img);
|
|
|
|
extern IMAGE_EXPORT int ILwriteline(ILimage *, const void *, const float *);
|
|
extern IMAGE_EXPORT void * ILbgnline(ILimage *, float **);
|
|
extern IMAGE_EXPORT int ILendline(ILimage *);
|
|
|
|
extern IMAGE_EXPORT int ILwritetile(ILimage *, const void *, const float *,
|
|
const int *, int);
|
|
extern IMAGE_EXPORT int ILendtile(ILimage *);
|
|
|
|
extern IMAGE_EXPORT void ILconfig(int, int);
|
|
extern IMAGE_EXPORT int ILctrl(ILimage *, int, int);
|
|
|
|
extern IMAGE_EXPORT void ILaddcompressor(int, const char *, ILcfunc, ILcfunc);
|
|
extern IMAGE_EXPORT void ILfindcompressor(int, char *, ILcfunc *, ILcfunc *);
|
|
|
|
extern IMAGE_EXPORT int ILpack(void *, const void *, const ILcdef *);
|
|
extern IMAGE_EXPORT int ILpackrle(void *, const void *, const ILcdef *);
|
|
extern IMAGE_EXPORT int ILpackqrl(void *, const void *, const ILcdef *);
|
|
extern IMAGE_EXPORT int ILpackqr4(void *, const void *, const ILcdef *);
|
|
extern IMAGE_EXPORT int ILunpack(void *, const void *, const ILcdef *);
|
|
extern IMAGE_EXPORT int ILunpackrle(void *, const void *, const ILcdef *);
|
|
extern IMAGE_EXPORT int ILunpackqrl(void *, const void *, const ILcdef *);
|
|
extern IMAGE_EXPORT int ILunpackqr4(void *, const void *, const ILcdef *);
|
|
|
|
extern IMAGE_EXPORT void ILfill(unsigned int *, int, int, int, int, int);
|
|
|
|
extern IMAGE_EXPORT int ILloadbm(ILimage *, void *, float *);
|
|
extern IMAGE_EXPORT int ILload(ILimage *, void *, float *);
|
|
extern IMAGE_EXPORT int ILsave(ILimage *, const void *, const float *, int);
|
|
|
|
extern IMAGE_EXPORT int ILgetfield(ILimage *, FLid, const void **);
|
|
extern IMAGE_EXPORT int ILsetfield(ILimage *, FLid, uint size, const void *);
|
|
extern IMAGE_EXPORT int ILcopyfields(ILimage *dest, ILimage *src);
|
|
|
|
/*
|
|
** Private functions
|
|
*/
|
|
|
|
extern IMAGE_EXPORT void ILinitio(ILimage *);
|
|
extern IMAGE_EXPORT void ILinitfields(ILimage *);
|
|
extern IMAGE_EXPORT int ILreadfields(ILimage *);
|
|
extern IMAGE_EXPORT int ILwritefields(ILimage *);
|
|
extern IMAGE_EXPORT void * ILgetpath(void);
|
|
extern IMAGE_EXPORT int ILrebindzoom(ILzoom *);
|
|
|
|
/*
|
|
** temporary
|
|
*/
|
|
|
|
extern IMAGE_EXPORT int ILqblur(unsigned int *, const unsigned int *, int, int, float);
|
|
|
|
/*
|
|
** under development
|
|
*/
|
|
|
|
extern IMAGE_EXPORT int ILdfft1x(float *, const float *, int);
|
|
extern IMAGE_EXPORT int ILifft1x(float *, const float *, int);
|
|
extern IMAGE_EXPORT int ILdfft1f(float *, const float *, int);
|
|
extern IMAGE_EXPORT int ILifft1f(float *, const float *, int);
|
|
extern IMAGE_EXPORT void ILqft(float *, float *, int);
|
|
|
|
extern IMAGE_EXPORT int ILcload(ILimage *, void *, int, int, int, int,
|
|
float, float, int);
|
|
|
|
#if (BYTE_ORDER == LITTLE_ENDIAN)
|
|
extern IMAGE_EXPORT void ConvertABGRtoBGRA(void *dest, const ILcdef *cd);
|
|
extern IMAGE_EXPORT void ConvertBGRAtoABGR(void *dest, const ILcdef *cd);
|
|
#endif
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif
|
|
|