www.pudn.com > PtOpenGuiSourceCode.zip > filter.h


/* Panorama_Tools	-	Generate, Edit and Convert Panoramic Images 
   Copyright (C) 1998,1999 - Helmut Dersch  der@fh-furtwangen.de 
    
   This program is free software; you can redistribute it and/or modify 
   it under the terms of the GNU General Public License as published by 
   the Free Software Foundation; either version 2, 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 General Public License for more details. 
 
   You should have received a copy of the GNU General Public License 
   along with this program; if not, write to the Free Software 
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */ 
 
/*------------------------------------------------------------*/ 
 
// Image changed to PTImage by JuHe 
 
#ifndef FILTER_H 
#define FILTER_H 
 
 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
 
#include "panorama.h" 
//#include "tiffio.h" 
 
#ifndef TRUE 
	#define TRUE 1 
#endif 
 
#ifndef FALSE 
	#define FALSE 0 
#endif 
 
 
//---------------------- Types --------------------------------------------- 
 
#define UCHAR	unsigned char 
#define USHORT  unsigned short 
#define ULONG   unsigned long 
 
enum{ 
	_UCHAR, 
	_USHORT, 
	_ULONG 
	}; 
 
//---------------------- Some useful math defines -------------------------- 
 
#ifndef PI 
	#define PI 3.14159265358979323846 
#endif 
 
// Normalize an angle to +/-180degrees 
 
#define NORM_ANGLE( x )  while( x >180.0 ) x -= 360.0; while( x < -180.0 ) x += 360.0; 
 
// Convert degree to radian 
 
#define DEG_TO_RAD( x )		( (x) * 2.0 * PI / 360.0 ) 
 
// and reverse 
 
#define RAD_TO_DEG( x )		( (x) * 360.0 / ( 2.0 * PI ) ) 
 
// Convert double x to unsigned char/short c 
 
 
 
#define	DBL_TO_UC( c, x )	if(x>255.0) c=255U;								\ 
								else if(x<0.0) c=0;							\ 
								else c=(unsigned char)floor(x+0.5); 
 
#define	DBL_TO_US( c, x )	if(x>65535.0) c=65535U;							\ 
								else if(x<0.0) c=0;							\ 
								else c=(unsigned short)floor(x+0.5); 
 
 
 
#define MAX_FISHEYE_FOV		160.0 
 
extern int JavaUI; // Flag to indicate use of java dialogs 
void JPrintError( char* text ); 
 
 
 
struct PTPoint 
{ 
	double x; 
	double y; 
}; 
 
typedef struct PTPoint PTPoint; 
 
#define CopyPTPoint( to, from )       memcpy( &to, &from, sizeof( PTPoint )) 
#define SamePTPoint( p, s )			  ((p).x == (s).x && (p).y == (s).y) 
 
struct PTLine 
{ 
	PTPoint v[2]; 
}; 
 
typedef struct PTLine PTLine; 
 
 
struct PTTriangle 
{ 
	PTPoint v[3]; 
}; 
 
typedef struct PTTriangle PTTriangle; 
 
 
 
 
// Maximum number of controlpoints in a pair of images, which can be read 
// via Barcodes 
 
#define NUMPTS 21 
 
// Randomization of feather in stitching tools 
 
#define	BLEND_RANDOMIZE		0.1 
 
 
 
 
//----------------------- Structures ------------------------------------------- 
 
struct remap_Prefs{								// Preferences Structure for remap 
		long    magic;					//  File validity check, must be 30 
		int	from;					// Image format source image 
		int	to;						// Image format destination image 
		double	hfov;					// horizontal field of view /in degrees 
		double	vfov;					// vertical field of view (usually ignored) 
		} ; 
 
typedef struct remap_Prefs rPrefs; 
 
struct perspective_Prefs{						//  Preferences structure for tool perspective 
		long	magic;					//  File validity check, must be 40 
		int	format;					//  rectilinear or fisheye? 
		double  hfov;					//  Horizontal field of view (in degree) 
		double	x_alpha;				//  New viewing direction (x coordinate or angle) 
		double 	y_beta;					//  New viewing direction (y coordinate or angle) 
		double	gamma;					//  Angle of rotation 
		int	unit_is_cart;			//  true, if viewing direction is specified in coordinates 
		int	width;					//  new width 
		int	height;					//  new height 
		} ; 
 
typedef struct perspective_Prefs pPrefs; 
 
 
struct optVars{				//  Indicate to optimizer which variables to optimize 
		int hfov;		//  optimize hfov? 0-no 1-yes, 2-same as index 0, 3-same as index 1, ... 
		int yaw; 
		int pitch; 
		int roll; 
		int a;			// can be linked: value 2.. means linked to 0.. 
		int b;			// linked 
		int c;			// linked 
		int d;			// linked 
		int e;			// linked 
		int shear_x; 
		int shear_y; 
		}; 
 
typedef struct optVars optVars; 
struct GuioptVars{				//  Indicate to optimizer which variables to optimize 
		int hfov;		//  optimize hfov? 0-no 1-yes, 2-same as index 0, 3-same as index 1, ... 
		int yaw; 
		int pitch; 
		int roll; 
		int a;			// can be linked: value 2.. means linked to 0.. 
		int b;			// linked 
		int c;			// linked 
		int d;			// linked 
		int e;			// linked 
		int shear_x; 
		int shear_y; 
		int use;		// use this for optimization 
		int stitch_pre;	// use in preview 
		int stitch_fin; // use in final stitch 
		}; 
 
typedef struct GuioptVars GuioptVars; 
 
 
enum{										// Enumerates for stBuf.seam 
	_middle,								// seam is placed in the middle of the overlap 
	_dest									// seam is places at the edge of the image to be inserted 
	}; 
 
enum{										// Enumerates for colcorrect 
	_colCorrectImage 	= 1, 
	_colCorrectBuffer	= 2, 
	_colCorrectBoth		= 3, 
	}; 
 
struct stitchBuffer{						// Used describe how images should be merged 
	//char				srcName[256];		// Buffer should be merged to image; 0 if not. 
	//char				destName[256];		// Converted image (ie pano) should be saved to buffer; 0 if not 
	char				*srcName;		// Buffer should be merged to image; 0 if not. 
	char				*destName;		// Converted image (ie pano) should be saved to buffer; 0 if not 
	int				feather;		// Width of feather 
	int				colcorrect;		// Should the images be color corrected? 
	int				seam;			// Where to put the seam (see above) 
	}; 
 
typedef struct stitchBuffer stBuf; 
 
struct panControls{							// Structure for realtime Panoeditor 
		double panAngle;					// The amount by which yaw/pitch are changed per click 
		double zoomFactor;					// The percentage for zoom in/out 
		}; 
 
typedef struct panControls panControls; 
 
enum{										// Enumerates for aPrefs.mode 
		_readControlPoints, 
		_runOptimizer, 
		_insert, 
		_extract, 
		_useScript = 8,						// else use options 
	}; 
 
struct adjust_Prefs{		//  Preferences structure for tool adjust 
		long	magic;	//  File validity check, must be 50 
		long	mode;	//  What to do: create Panorama etc? 
		PTImage	im;	//  Image to be inserted/extracted 
		PTImage	pano;	//  Panorama to be created/ used for extraction 
		 
		stBuf	sBuf; 
		fullPath scriptFile;	// On Mac: Cast to FSSpec; else: full path to scriptFile 
		int     nt;	// morphing triangles 
		PTTriangle 	*ts; // Source triangles 
		PTTriangle 	*td; // Destination triangles 
 
		int interpolator; 
		double gamma;		 
}; 
		 
typedef struct adjust_Prefs aPrefs; 
 
union panoPrefs{ 
		cPrefs	cP; 
		pPrefs	pP; 
		rPrefs	rP; 
		aPrefs	aP; 
		panControls pc; 
		}; 
 
typedef union panoPrefs panoPrefs; 
 
struct size_Prefs{								// Preferences structure for 'pref' dialog 
		long			magic;					//  File validity check; must be 70 
		int				displayPart;			// Display cropped/framed image ? 
		int				saveFile;				// Save to tempfile? 0-no, 1-yes 
		fullPath		sFile;					// Full path to file (short name) 
		int				launchApp;				// Open sFile ? 
		fullPath		lApp;					// the Application to launch 
		int				interpolator;			// Which interpolator to use 
		double			gamma;					// Gamma correction value 
		int				noAlpha;				// If new file is created: Don't save mask (Photoshop LE) 
		int				optCreatePano;			// Optimizer creates panos? 0  no/ 1 yes 
		} ; 
 
typedef struct size_Prefs sPrefs; 
 
struct controlPoint{				// Control Points to adjust images 
		int  num[2];				// Indices of Images 
		double x[2];				// x - Coordinates 
		double y[2];				// y - Coordinates 
		int  type;					// What to optimize: 0-r, 1-x, 2-y, type is negative if control point is deleted 
		double ds;                  // already optimized value 
		} ; 
 
typedef struct controlPoint controlPoint; 
 
struct GuiControlPoint{				// Control Points to adjust images 
		int  num[2];				// Indices of Images 
		double x[2];				// x - Coordinates 
		double y[2];				// y - Coordinates 
		int  type;					// What to optimize: 0-r, 1-x, 2-y, type is negative if control point is deleted 
		double ds;                  // already optimized value 
		char *comment;				// note for control point, optional 
		} ; 
 
typedef struct GuiControlPoint GuiControlPoint; 
 
struct CoordInfo{								// Real World 3D coordinates 
		int  num;								// auxilliary index 
		double x[3]; 
		int  set[3]; 
		}; 
		 
typedef struct CoordInfo CoordInfo; 
 
// Some useful macros for vectors 
 
#define SCALAR_PRODUCT( v1, v2 )	( (v1)->x[0]*(v2)->x[0] + (v1)->x[1]*(v2)->x[1] + (v1)->x[2]*(v2)->x[2] )  
#define ABS_SQUARED( v )			SCALAR_PRODUCT( v, v ) 
#define ABS_VECTOR( v )				sqrt( ABS_SQUARED( v ) ) 
#define CROSS_PRODUCT( v1, v2, r )  { (r)->x[0] = (v1)->x[1] * (v2)->x[2] - (v1)->x[2]*(v2)->x[1];  \ 
									  (r)->x[1] = (v1)->x[2] * (v2)->x[0] - (v1)->x[0]*(v2)->x[2];	\ 
									  (r)->x[2] = (v1)->x[0] * (v2)->x[1] - (v1)->x[1]*(v2)->x[0]; } 
#define DIFF_VECTOR( v1, v2, r )  	{ 	(r)->x[0] = (v1)->x[0] - (v2)->x[0];  \ 
									  	(r)->x[1] = (v1)->x[1] - (v2)->x[1];  \ 
									  	(r)->x[2] = (v1)->x[2] - (v2)->x[2]; } 
#define DIST_VECTOR( v1, v2 )		sqrt( ((v1)->x[0] - (v2)->x[0]) * ((v1)->x[0] - (v2)->x[0]) + \ 
										  ((v1)->x[1] - (v2)->x[1]) * ((v1)->x[1] - (v2)->x[1]) + \ 
										  ((v1)->x[2] - (v2)->x[2]) * ((v1)->x[2] - (v2)->x[2]) ) 
 
struct transformCoord{							//  
		int nump;								// Number of p-coordinates 
		CoordInfo  *p;							// Coordinates "as is" 
		int numr;								// Number of r-coordinates 
		CoordInfo  *r;							// Requested values for coordinates 
		} ; 
	 
typedef struct transformCoord transformCoord; 
 
struct  tMatrix{ 
		double alpha; 
		double beta; 
		double gamma; 
		double x_shift[3]; 
		double scale; 
		}; 
 
typedef struct tMatrix tMatrix; 
 
struct MakeParams{								// Actual parameters used by Xform functions for pano-creation 
	double 	scale[2];							// scaling factors for resize; 
	double 	shear[2];							// shear values 
	double  rot[2];								// horizontal rotation params 
	void	*perspect[2];						// Parameters for perspective control functions 
	double	rad[6];								// coefficients for polynomial correction (0,...3) and source width/2 (4) and correction radius (5) 
	double	mt[3][3];							// Matrix 
	double  distance; 
	double	horizontal; 
	double	vertical; 
	}; 
 
struct LMStruct{								// Parameters used by the Levenberg Marquardt-Solver 
	int			m; 
	int			n; 
	double 		*x; 
	double 		*fvec; 
	double 		ftol; 
	double 		xtol; 
	double 		gtol; 
	int 		maxfev; 
	double 		epsfcn; 
	double 		*diag; 
	int 		mode; 
	double 		factor; 
	int			nprint; 
	int			info; 
	int			nfev; 
	double 		*fjac; 
	int			ldfjac; 
	int 		*ipvt; 
	double 		*qtf; 
	double 		*wa1; 
	double 		*wa2; 
	double 		*wa3; 
	double 		*wa4; 
	}; 
 
// function to minimize in Levenberg-Marquardt solver 
 
typedef		int (*lmfunc)(); 
 
struct triangle 
{ 
	int vert[3];	// Three vertices from list 
	int nIm;		// number of image for texture mapping 
}; 
 
typedef struct triangle triangle; 
 
struct AlignInfo{							// Global data structure used by alignment optimization 
	PTImage 				*im;				// Array of Pointers to Image Structs 
	optVars				*opt;				// Mark variables to optimize 
	int				numIm;				// Number of images 
	controlPoint 			*cpt;				// List of Control points 
	triangle			*t;				// List of triangular faces 
	int				nt;				// Number of triangular faces 
	int     			numPts;				// Number of Control Points 
	int				numParam;			// Number of parameters to optimize 
	PTImage				pano;				// Panoramic Image decription 
	stBuf				st;				// Info on how to stitch the panorama 
	void				*data; 
	lmfunc				fcn; 
	sPrefs				sP; 
	CoordInfo			*cim;				// Real World coordinates 
	}; 
 
typedef struct AlignInfo AlignInfo; 
 
// changed structure begins with Gui 
struct GuiAlignInfo{							// Global data structure used by alignment optimization 
	GuiImage 		*im;				// Array of Pointers to Image Structs 
	GuioptVars		*opt;				// Mark variables to optimize 
	int				numIm;				// Number of images 
	int				numMaxIm;			// memory reserved for images 
	GuiControlPoint	*cpt;				// List of Control points 
	triangle		*t;				// List of triangular faces 
	int				nt;				// Number of triangular faces 
	int     		numPts;				// Number of Control Points 
	int				numMaxPts;			// vector length for points 
	int				numParam;			// Number of parameters to optimize 
	GuiImage	 	pano;				// Panoramic Image decription 
	stBuf			st;				// Info on how to stitch the panorama 
	//void			*data; 
	lmfunc				fcn; 
	sPrefs				sP; 
	CoordInfo			*cim;				// Real World coordinates 
	bool	changeSingleImageLensData; 
	double		scanResolution; 
	int		lensSettingStyle;         	// RadioGroupHFOV->ItemIndex 
	double	lensFocalLength; 
	char	*outPanoFile; 
	char	*projDir;			// last directory for project read or save 
	int		jpegQ;				// quality for jpeg compression 
	bool	jpegProgressive; 
	int		refImNr;			// reference in optimization 
	bool	fov_not_yet_set;		// 
}; 
 
typedef struct GuiAlignInfo GuiAlignInfo; 
 
struct OptInfo{ 
	int numVars;				// Number of variables to fit 
	int numData;				// Number of data to fit to 
	int (*SetVarsToX)(double *x);		// Translate variables to x-values 
	int (*SetXToVars)(double *x);		// and reverse 
	lmfunc fcn;				// Levenberg Marquardt function measuring quality 
	char message[256];			// info returned by LM-optimizer 
}; 
	 
typedef struct OptInfo OptInfo; 
 
struct VRPanoOptions{ 
	int		width; 
	int		height; 
	double 		pan; 
	double 		tilt; 
	double 		fov; 
	int 		codec; 
	int 		cquality; 
	int			progressive; 
}; 
 
typedef struct VRPanoOptions VRPanoOptions; 
 
 
struct MultiLayerImage{ 
	int	numLayers; 
	PTImage	*Layer; 
	PTRect	selection; 
}; 
 
typedef struct MultiLayerImage MultiLayerImage; 
 
// Transformation function type (we have only one...) 
 
typedef		void (*trfn)( double x_dest,double  y_dest, double* x_src, double* y_src, void* params ); 
 
// Function descriptor to be executed by exec_function 
struct fDesc { 
	trfn	func;			// The function to be called 
	void	*param;			// The parameters to be used 
	};		 
 
typedef struct fDesc fDesc; 
 
#define SetDesc(fD,f,p)		fD.func = f; fD.param = p 
 
// Panorama tool type 
 
typedef		void (*fnPtr)(TrformStr *TrPtr); 
 
 
// Filter function type 
 
typedef unsigned char (*flfn)( unsigned char srcPixel, int xc, int yc, void *params ); 
 
 
// Interpolating functions for resampler 
 
typedef		void (*intFunc)( unsigned char *dst, 	unsigned char **rgb, 
							register double Dx,  
							register double Dy, 
							int color, int SamplesPerPixel); 
 
// Gamma Correction 
 
struct PTGamma{ 
	double *DeGamma; 
	unsigned short *Gamma; 
	int		ChannelSize; 
	int 	ChannelStretch; 
	int		GammaSize; 
	}; 
 
typedef struct PTGamma PTGamma; 
 
extern PTGamma glu; 
 
 
// Some macros to find out more about images 
 
#define GetBitsPerChannel( im, x )		switch( (im)->bitsPerPixel )	\ 
									{									\ 
										case 24:	x =  8; break;		\ 
										case 32: 	x =  8; break;		\ 
										case 48: 	x = 16; break;		\ 
										case 64: 	x = 16; break;		\ 
										default: 	x =  8; break;		\ 
									}												 
 
#define GetChannels( im, x )		switch( (im)->bitsPerPixel )		\ 
									{									\ 
										case 24:	x =  3; break;		\ 
										case 32: 	x =  4; break;		\ 
										case 48: 	x =  3; break;		\ 
										case 64: 	x =  4; break;		\ 
										default: 	x =  3; break;		\ 
									}												 
 
									 
 
//---------------------------------- Functions identical in all platforms ------------------------ 
 
 
void 	dispatch 	(TrformStr *TrPtr, sPrefs *s);	   // Entry into platform independent code 
void 	DoTransForm	(TrformStr *TrPtr, panoPrefs *p ); 
 
void setLibToResFile  ( void );			// MacOS: Get resources from shared lib 
void unsetLibToResFile( void );			// MacOS: Don't get resources from shared lib 
 
enum{					// Enumerates used by Progress and infoDlg 
	_initProgress,   	// display message "argument" 
	_setProgress,		// display progress (argument is percentage converted to string) 
	_disposeProgress,	// dispose progress indicator 
	_idleProgress		// do nothing; on Mac: call waitnextevent; 
	}; 
 
int 	Progress( int command, char* argument );	// Progress Reporting  
int 	infoDlg ( int command, char* argument );	// Display info: same argumenmts as progress 
void  	PrintError( char* fmt, ...);				// Error Reporting 
 
int 	ccommand( char ***argvPtr);					// Shell for standalone programs 
 
 
//  Panorama Tool functions 
 
 
void 	perspective	(TrformStr *TrPtr, pPrefs *p); 	 
void 	correct		(TrformStr *TrPtr, cPrefs *c);   
void 	remap		(TrformStr *TrPtr, rPrefs *r);  
void 	adjust		(TrformStr *TrPtr, aPrefs *a);  
void 	pan			(TrformStr *TrPtr, panControls *pc); 
 
 
 
 
// Set Struct defaults 
 
void    SetPrefDefaults			(panoPrefs *prPtr,  int selector); 
void 	SetCorrectDefaults		( cPrefs *p ); 
void 	SetAdjustDefaults		( aPrefs *p ); 
void 	SetRemapDefaults		( rPrefs *p ); 
void 	SetPerspectiveDefaults	( pPrefs *p ); 
void 	SetImageDefaults		( PTImage *im); 
void	SetOptDefaults			( optVars *opt ); 
void	SetPanDefaults			( panControls *pc); 
void 	SetSizeDefaults			( sPrefs *pref); 
void	SetStitchDefaults		( stBuf *sbuf); 
void	SetVRPanoOptionsDefaults( VRPanoOptions *v); 
void 	SettMatrixDefaults		( tMatrix *t ); 
void 	SetCoordDefaults		( CoordInfo *c, int num); 
 
int		SetAlignParams			( double *x ); 
int 	SetLMParams				( double *x ); 
void 	SetGlobalPtr			( AlignInfo *p ); 
 
 
 
// Dialogs 
int 	SetPrefs		( panoPrefs *p ); 
int	SetPanPrefs		( panControls *p ); 
int 	SetCorrectPrefs		( cPrefs *p ); 
int 	SetRadialOptions	( cPrefs *p ); 
int 	SetHorizontalOptions	( cPrefs *p ); 
int 	SetVerticalOptions	( cPrefs *p ); 
int 	SetShearOptions		( cPrefs *p ); 
int 	SetScaleOptions		( cPrefs *p ); 
int 	SetLumOptions		( cPrefs *p ); 
int 	setSizePrefs		( sPrefs *p, int can_resize ); 
int 	SetRemapPrefs		( rPrefs *p ); 
int 	SetPerspectivePrefs	( pPrefs *p ); 
int 	SetAdjustPrefs		( aPrefs *p ); 
int 	SetInterpolator		( sPrefs *p ); 
int 	SetCreateOptions	( aPrefs *p ); 
int 	SetCutOptions		( cPrefs *p ); 
int 	SetFourierOptions	( cPrefs *p ); 
 
 
 
// File I/O 
 
int 	readPrefs			(char* p, int selector );   			// Preferences, same selector as dispatch 
void 	writePrefs			(char* p, int selector );   			// Preferences, same selector as dispatch 
 
int	LoadBufImage		( PTImage *image, char *fname, int mode); 
int	SaveBufImage		( PTImage *image, char *fname ); 
int	writeTIFF			( PTImage *im, fullPath* fname);			// On Mac: fname is FSSpec* 
void 	SaveOptions			( struct correct_Prefs * thePrefs ); 
int 	LoadOptions			( struct correct_Prefs * thePrefs ); 
void  	FindScript			( struct adjust_Prefs *thePrefs ); 
char* 	LoadScript			( fullPath* scriptFile  ); 
int 	WriteScript			( char* res, fullPath* scriptFile, int launch ); 
int 	writePSD			( PTImage *im, fullPath* fname);			// On Mac: fname is FSSpec* 
int 	readPSD				( PTImage *im, fullPath* fname, int mode); 
int 	FindFile			( fullPath *fname ); 
int 	SaveFileAs			( fullPath *fname, char *prompt, char *name ); 
void 	ConvFileName		( fullPath *fname,char *string); 
int 	writePSDwithLayer	( PTImage *im, fullPath *fname); 
int 	addLayerToFile		( PTImage *im, fullPath* sfile, fullPath* dfile, stBuf *sB); 
void 	showScript			( fullPath* scriptFile ); 
void 	MakeTempName		( fullPath *fspec, char *fname ); 
void 	makePathForResult	( fullPath *path ); 
int 	makePathToHost 		( fullPath *path ); 
void    open_selection		( fullPath *path ); 
int 	readPSDMultiLayerImage( MultiLayerImage *mim, fullPath* sfile); 
int 	GetFullPath 		(fullPath *path, char *filename); // Somewhat confusing, for compatibility easons 
int 	StringtoFullPath	(fullPath *path, char *filename); 
int 	IsTextFile			( char* fname ); 
int 	readPositions		( char* script, transformCoord *tP ); 
int 	readImage			( PTImage *im, fullPath *sfile ); 
int	readJPEG			( PTImage *im, fullPath *sfile ); 
int	readTIFF			( PTImage *im, fullPath *sfile ); 
int 	writeImage			( PTImage *im, fullPath *sfile ); 
int 	writeJPEG			( PTImage *im, fullPath *sfile, 	int quality, int progressive ); 
int 	makeTempPath		( fullPath *path ); 
int 	writePNG			( PTImage *im, fullPath *sfile ); 
int 	readPNG				( PTImage *im, fullPath *sfile ); 
int 	LaunchAndSendScript(char* application, char* script); 
aPrefs* readAdjustLine( fullPath *theScript ); 
//int	readtif(PTImage *im, TIFF* tif); 
 
#define FullPathtoString( path, string ) 		GetFullPath( path, string) 
 
 
int		ReadMorphPoints( char *script, AlignInfo *gl, int nIm ); 
 
// Image manipulation 
 
void 	addAlpha			( PTImage *im ); 
void 	transForm			( TrformStr *TrPtr, fDesc *fD, int color); 
void    filter				( TrformStr *TrPtr, flfn func, void* params, int color); 
void 	CopyImageData		( PTImage *dest, PTImage *src ); 
void 	laplace				( PTImage *im ); 
void 	blurr				( PTImage *im ); 
void 	MakePano			( TrformStr *TrPtr, aPrefs *aP); 
void 	ExtractStill		( TrformStr *TrPtr , aPrefs *p ); 
int 	HaveEqualSize		( PTImage *im1, PTImage *im2 ); 
int 	merge				( PTImage *dst, PTImage *src, int feather, int showprogress, int seam ); 
void 	mergeAlpha			( PTImage *im, unsigned char *alpha, int feather, PTRect *theRect ); 
void 	SetEquColor			( cPrefs *p ); 
void 	CopyPosition		( PTImage *to, PTImage *from ); 
int  	isColorSpecific		( cPrefs *p ); 
void 	ThreeToFourBPP		( PTImage *im ); 
void 	FourToThreeBPP		( PTImage *im ); 
int 	SetUpGamma			( double pgamma, int psize); 
int 	cutTheFrame			( PTImage *dest, PTImage *src, int width, int height, int showprogress ); 
int 	PositionCmp			( PTImage *im1, PTImage *im2 ); 
int 	MorphImage			( PTImage *src, PTImage *dst, PTTriangle *ts, PTTriangle *td, int nt ); 
int 	MorphImageFile		( fullPath *sfile, fullPath *dfile, AlignInfo *g,int nIm ); 
int 	blendImages			( fullPath *f0,  fullPath *f1, fullPath *result, double s ); 
int 	InterpolateImage	( PTImage *src, PTImage *dst, PTTriangle *ts, PTTriangle *td, int nt ); 
int 	InterpolateTrianglesPerspective( AlignInfo *g, int nIm, double s, PTTriangle** t  ); 
int 	InterpolateImageFile( fullPath *sfile, fullPath *dfile, AlignInfo *g,int nIm ); 
void 	OneToTwoByte		( PTImage *im ); 
void 	TwoToOneByte		( PTImage *im ); 
void 	SetMakeParams		( struct fDesc *stack, struct MakeParams *mp, PTImage *im , PTImage *pn, int color ); 
void 	SetInvMakeParams	( struct fDesc *stack, struct MakeParams *mp, PTImage *im , PTImage *pn, int color ); 
void 	GetControlPointCoordinates(int i, double *x, double *y, AlignInfo *gl ); 
void 	ARGBtoRGBA(UCHAR* buf, int width, int bitsPerPixel); 
void 	RGBAtoARGB(UCHAR* buf, int width, int bitsPerPixel); 
int 	CropImage(PTImage *im, PTRect *r); 
void 	DoColorCorrection( PTImage *im1, PTImage *im2, int mode ); 
 
// Script Reading/Parsing/Writing 
 
int 	ParseScript			( char* script, AlignInfo *gl ); 
void 	WriteResults		( char* script, fullPath *sfile, AlignInfo *g, double ds( int i) , int launch); 
int 	readAdjust		( aPrefs *p,  fullPath* sfile, int insert, sPrefs *sP ); 
void 	readControlPoints	(char* script, controlPoint *c ); 
int	getVRPanoOptions	( VRPanoOptions *v, char *line ); 
void 	nextWord			( register char* word, char** ch ); 
void 	nextLine			( register char* line, char** ch ); 
int 	numLines			( char* script, char first ); 
 
// Memory 
 
void 	DisposeAlignInfo	( AlignInfo *g ); 
void**  mymalloc			( long numBytes );					// Memory allocation, use Handles 
void 	myfree				( void** Hdl );						// free Memory, use Handles 
int 	SetDestImage		( TrformStr *TrPtr, int width, int height) ; 
void	DisposeMultiLayerImage( MultiLayerImage *mim ); 
 
 
// Math 
 
void 	RunLMOptimizer		( OptInfo	*g); 
void 	RunBROptimizer		( OptInfo	*g, double minStepWidth); 
void 	RunOverlapOptimizer ( AlignInfo	*g); 
 
void 	SetMatrix			( double a, double b, double c , double m[3][3], int cl ); 
void 	matrix_mult			( double m[3][3], double vector[3] ); 
void 	matrix_inv_mult		( double m[3][3], double vector[3] ); 
double 	smallestRoot		( double *p ); 
void 	SetCorrectionRadius	( cPrefs *cP ); 
int		lmdif				(); 
void	fourier				( TrformStr *TrPtr, cPrefs *cP ); 
unsigned short 	gamma_correct( double pix ); 
int 	EqualCPrefs( cPrefs *c1, cPrefs *c2 ); 
double 	OverlapRMS			( MultiLayerImage *mim ); 
double 	distSquared			( int num );  
int		fcnPano(); 
void 	doCoordinateTransform( CoordInfo *c, tMatrix *t ); 
void 	findOptimumtMatrix( transformCoord *tP, tMatrix *tM, lmfunc f); 
int 	SolveLinearEquation2( double a[2][2], double b[2], double x[2] ); 
void 	SortControlPoints( AlignInfo *g , int nIm); 
void 	noisefilter			( PTImage *dest, PTImage *src );	 
void 	fwiener				( TrformStr *TrPtr, PTImage *nf, PTImage *psf, double gamma, double frame ); 
 
 
// Triangulation 
int 	PointInTriangle( double x, double y, PTTriangle *T, double c[2] ); 
int 	SetSourceTriangles( AlignInfo *g, int nIm, PTTriangle** t  ); 
int 	SetDestTriangles( AlignInfo *g, int nIm, PTTriangle** t  ); 
int 	InterpolateTriangles( AlignInfo *g, int nIm, double s, PTTriangle** t  ); 
int 	DelaunayIteration( AlignInfo *g, int nIm ); 
int 	PointInCircumcircle( double x, double y, PTTriangle *tC ); 
int 	TriangulatePoints( AlignInfo *g, int nIm ); 
int 	AddTriangle( triangle *t, AlignInfo *g ); 
int 	RemoveTriangle( int nt, AlignInfo *g ); 
void 	OrderVerticesInTriangle( int nt, AlignInfo *g ); 
void 	SetTriangleCoordinates( triangle *t, PTTriangle *tC, AlignInfo *g ); 
int 	TrianglesOverlap( PTTriangle *t0, PTTriangle *t1 ); 
int 	LinesIntersect( PTLine *s0, PTLine *s1) ;  
double 	PTDistance( PTPoint *s0, PTPoint *s1 ); 
int 	PTPointInRectangle(  PTPoint *p, PTLine *r ); 
int 	PTElementOf(  double x, double a, double b ); 
int 	PTNormal( double *a, double *b, double *c, PTLine *s ); 
int 	PTGetLineCrossing( PTLine *s0, PTLine *s1, PTPoint *ps ); 
int 	ReduceTriangles( AlignInfo *g, int nIm ); 
double 	PTAreaOfTriangle( PTTriangle *t ); 
int 	normalToTriangle( CoordInfo *n, CoordInfo *v, triangle *t ); 
 
 
 
 
double GetBlendfactor( int d, int s, int feather ); 
 
 
 
 
 
void execute_stack		( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
 
void resize				( double x_dest,double  y_dest, double* x_src, double* y_src, void* params ); 
void shear				( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void horiz				( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void vert				( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void radial				( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
 
 
void persp_sphere		( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void persp_rect			( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
 
 
void rect_pano			( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void pano_rect			( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void pano_erect			( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void erect_pano			( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void sphere_cp_erect	( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void sphere_tp_erect	( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void erect_sphere_cp	( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void rect_sphere_tp		( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void sphere_tp_rect		( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void sphere_cp_pano		( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void rect_erect			( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void erect_rect			( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void erect_sphere_tp	( double x_dest,double  y_dest, double* x_src, double* y_src, void* params ); 
void mirror_erect		( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	  
void mirror_sphere_cp	( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void mirror_pano		( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void sphere_cp_mirror	( double x_dest,double  y_dest, double* x_src, double* y_src, void* params );	 
void sphere_tp_pano		( double x_dest,double  y_dest, double* x_src, double* y_src, void* params ); 
 
void pano_sphere_tp		( double x_dest,double  y_dest, double* x_src, double* y_src, void* params ); 
 
void rotate_erect		( double x_dest, double y_dest, double* x_src, double* y_src, void* params ); 
void inv_radial			( double x_dest, double y_dest, double* x_src, double* y_src, void* params ); 
 
void vertical			( double x_dest, double y_dest, double* x_src, double* y_src, void* params ); 
void inv_vertical		( double x_dest, double y_dest, double* x_src, double* y_src, void* params ); 
void deregister			( double x_dest, double y_dest, double* x_src, double* y_src, void* params ); 
void tmorph				( double x_dest,double  y_dest, double* x_src, double* y_src, void* params ); 
 
void shift_scale_rotate ( double x_dest,double  y_dest, double* x_src, double* y_src, void* params ); 
 
 
 
unsigned char radlum	( unsigned char srcPixel, int xc, int yc, void *params ); 
 
 
extern TrformStr 		*gTrPtr; 
extern sPrefs			*gsPrPtr; 
 
 
 
 
// Endian stuff: Read and write numbers from and to memory (ptr) 
 
#ifdef BIGENDIAN 
	#define	LONGNUMBER( number, ptr )					*ptr++ = ((char*)(&number))[0];	\ 
														*ptr++ = ((char*)(&number))[1];	\ 
														*ptr++ = ((char*)(&number))[2];	\ 
														*ptr++ = ((char*)(&number))[3]; 
 
	#define NUMBERLONG( number, ptr )					((char*)(&number))[0] = *ptr++;	\ 
														((char*)(&number))[1] = *ptr++;	\ 
														((char*)(&number))[2] = *ptr++;	\ 
														((char*)(&number))[3] = *ptr++; 
 
	#define	SHORTNUMBER( number, ptr )					*ptr++ = ((char*)(&number))[0];	\ 
														*ptr++ = ((char*)(&number))[1];	\ 
 
	#define NUMBERSHORT( number, ptr )					((char*)(&number))[0] = *ptr++;	\ 
														((char*)(&number))[1] = *ptr++;	\ 
 
#else 
	#define	LONGNUMBER( number, ptr )					*ptr++ = ((char*)(&number))[3];	\ 
														*ptr++ = ((char*)(&number))[2];	\ 
														*ptr++ = ((char*)(&number))[1];	\ 
														*ptr++ = ((char*)(&number))[0]; 
 
	#define NUMBERLONG( number, ptr )					((char*)(&number))[3] = *ptr++;	\ 
														((char*)(&number))[2] = *ptr++;	\ 
														((char*)(&number))[1] = *ptr++;	\ 
														((char*)(&number))[0] = *ptr++; 
 
	#define	SHORTNUMBER( number, ptr )					*ptr++ = ((char*)(&number))[1];	\ 
														*ptr++ = ((char*)(&number))[0];	\ 
 
	#define NUMBERSHORT( number, ptr )					((char*)(&number))[1] = *ptr++;	\ 
														((char*)(&number))[0] = *ptr++;	\ 
 
 
 
#endif // BIGENDIAN 
 
// Cross platform file functions 
 
#ifdef __Mac__ 
 
	#include  
	#include "sys_mac.h" 
	 
	#define			file_spec							short 
	#define			myopen( path, perm, fspec )			( FSpOpenDF( path, perm, &fspec ) != noErr ) 
	#define			mywrite( fspec, count, data )		FSWrite	(fspec, &count, data)  
	#define 		myread(  fspec, count, data )		FSRead  (fspec, &count, data)  
	#define         myclose( fspec )					FSClose (fspec ) 
	#define			mycreate( path, creator, type )		FSpCreate( path, creator, type,0) 
	#define			mydelete( path )					FSpDelete( path ) 
	#define			myrename( path, newpath )			FSpRename (path, (newpath)->name) 
	#define			write_text							fsWrPerm 
	#define			write_bin							fsWrPerm 
	#define			read_text							fsRdPerm 
	#define			read_bin							fsRdPerm 
	#define			read_write_text						fsRdWrPerm 
			 
#else // __Mac__, use ANSI-filefunctions 
	#define		file_spec			FILE* 
	#define		myopen( path, perm, fspec )	( (fspec = fopen( (path)->name, perm )) == NULL) 
	#define		mywrite( fspec, count, data )	count = fwrite( data, 1, count, fspec) 
	#define 	myread( fspec, count, data )	count = fread( data, 1, count, fspec )  
	#define         myclose( fspec )		fclose (fspec ) 
	#define		mycreate( path, creator, type )		 
	#define		mydelete( path )		remove((path)->name ) 
	#define		myrename( path, newpath )	rename ((path)->name, (newpath)->name) 
	#define		write_text			"w" 
	#define		write_bin			"wb" 
	#define		read_text			"r" 
	#define		read_bin			"rb" 
	#define		read_write_text			"rw" 
	#define		append_bin			"ab" 
	#define		p2cstr( x )	 
	#define		c2pstr( x ) 
															 
 
#endif 
 
 
 
 
#endif