# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.

# MWCS.H -- Global (internal) definitions for the mini-WCS interface.

define	MWCS_MAGIC	4D57X		# identifies MWCS descriptors
define	DEF_SZSBUF	512		# initial string buffer size
define	INC_SZSBUF	512		# increment string buffer size
define	DEF_SZDBUF	64		# initial double buffer size
define	INC_SZDBUF	64		# increment double buffer size
define	MAX_DIM		7		# max dimension of a wcs
define	MAX_WCS		8		# max wcs per mwcs
define	MAX_WATTR	512		# max attributes per wcs
define	MAX_CTRAN	20		# max runtime ctran descriptors
define	MAX_CALL	7		# max CTRAN function calls
define	MAX_FUNC	7		# max WCS function descriptors
define	MAX_WCSFD	10		# max loaded WCS function drivers
define	MAX_FN		20		# max MWCS function drivers
define	SZ_FNNAME	20		# max size function name
define	SZ_ATNAME	20		# max size attribute name

# MWCS descriptor.  This consists of the base descriptor, global string
# buffer, global data buffer (TY_DOUBLE), and separately allocated buffers
# for each runtime CT (coordinate transformation) descriptor.  All character
# data is stored in SBUF.  All floating point data is stored as type double
# in DBUF (this does not mean that coordinate transformations are necessarily
# carried out in double precision).  All string and floating data is
# referenced in the base descriptor by its index in the appropriate data
# buffer, to make the descriptor invariant with respect to relocation of DBUF.
# To keep things simple, space is preallocated for a fixed number of WCS,
# and for each WCS, for a fixed number of attributes.

define	LEN_BASEMWCS	70
define	LEN_WCS		1626 # (depends upon MAX_WATTR)
define	LEN_MWCS	(LEN_BASEMWCS+LEN_WCS*MAX_WCS)
define	MI_LEN		(LEN_BASEMWCS+LEN_WCS*MI_NWCS($1))

define	MI_MAGIC	Memi[$1]		# magic marker
define	MI_NDIM		Memi[$1+1]		# wcs physical dimension
define	MI_WCS		Memi[$1+2]		# pointer to current wcs
define	MI_NWCS		Memi[$1+3]		# number of wcs defined
define	MI_REFIM	Memi[$1+4]		# reference image, if any
define	MI_SBUF		Memi[$1+5]		# string buffer pointer
define	MI_SBUFLEN	Memi[$1+6]		# string buffer alloclen
define	MI_SBUFUSED	Memi[$1+7]		# string buffer chars used
define	MI_DBUF		Memi[$1+8]		# double buffer pointer
define	MI_DBUFLEN	Memi[$1+9]		# double buffer alloclen
define	MI_DBUFUSED	Memi[$1+10]		# double buffer doubles used
define	MI_USEAXMAP	Memi[$1+11]		# enable axis mapping
define	MI_NLOGDIM	Memi[$1+12]		# dimension of logical system
	# (available)
define	MI_LTV		Memi[$1+18]		# dbuf index of LT vector
define	MI_LTM		Memi[$1+19]		# dbuf index of LT matrix
define	MI_AXNO		Memi[$1+20+($2)-1]	# axis map, log[phys]
define	MI_AXVAL	Memi[$1+30+($2)-1]	# axis value, if axno[i]=0
define	MI_PHYSAX	Memi[$1+40+($2)-1]	# inverted map, phys[log]
define	MI_CTRAN	Memi[$1+50+($2)-1]	# ctran descriptor pointers
define	MI_WCSP		($1+70+(($2)-1)*LEN_WCS)

# WCS descriptor.  This consists of a base structure, used to index string
# and double data which is stored in the global buffers SBUF and DBUF.
# An array of WCS descriptors is preallocated in the main MWCS descriptor.

define	WCS_NDIM	Memi[$1]		# dimension of world system
define	WCS_SYSTEM	Memi[$1+1]		# sbuf index of system name
define	WCS_AXCLASS	Memi[$1+2+($2)-1]	# axis type, 0 or FUNC index
define	WCS_R		Memi[$1+10]		# dbuf index of R array
define	WCS_W		Memi[$1+11]		# dbuf index of W array
define	WCS_CD		Memi[$1+12]		# dbuf index of CD matrix
define	WCS_NPTS	Memi[$1+20+($2)-1]	# number of points in wsampv
define	WCS_PV		Memi[$1+30+($2)-1]	# wsamp physical vector
define	WCS_WV		Memi[$1+40+($2)-1]	# wsamp world vector
define	WCS_NFUNC	Memi[$1+49]		# number of functions
define	WCS_FUNC	($1+50+(($2)-1)*5)	# function descriptors
define	WCS_NWATTR	Memi[$1+89]		# number of wcs attributes
define	WCS_WATTR	($1+90+(($2)-1)*3)	# pointer to wattr substruct

# WCS function descriptor.
define	LEN_WF		5
define	WF_FN		Memi[$1]		# function code
define	WF_NAXES	Memi[$1+1]		# number of axes 
define	WF_AXIS		Memi[$1+2+($2)-1]	# axes function applies to

# Function type flags.
define	FORWARD		0			# forward transform (P->W)
define	INVERSE		1			# inverse transform (W->P)

# WCS attribute descriptor.
define	LEN_AT		3
define	AT_AXIS		Memi[$1]		# wcs axis which owns attribute
define	AT_NAME		Memi[$1+1]		# sbuf index of name string
define	AT_VALUE	Memi[$1+2]		# sbuf index of value string

# CTRAN descriptor.  Prepared when a coordinate transformation is set up
# with mw_sctran.  The transformation is optimized and reduced to a series
# of matrix multiply, translate, wcs function call etc. instructions as
# described by this descriptor.  Both single and double precision versions
# of the transform are prepared, with the application deciding at runtime
# which precision routine to call.

define	LEN_CTBASE	(20+MAX_CALL*LEN_FC*2)

define	CT_D		($1)			# pointer to type double CT
define	CT_R		Memi[$1]		# pointer to type real CT
define	CT_MW		Memi[$1+1]		# pointer back to MWCS
define	CT_WCSI		Memi[$1+2]		# pointer back to system 1
define	CT_WCSO		Memi[$1+3]		# pointer back to system 2
define	CT_TYPE		Memi[$1+4]		# ctran type (optimized)
define	CT_NDIM		Memi[$1+5]		# ctran physical dimension
define	CT_LTM		Memi[$1+6]		# pointer to rot matrix
define	CT_LTV		Memi[$1+7]		# pointer to translation vector
define	CT_NCALLI	Memi[$1+8]		# number of function calls
define	CT_NCALLO	Memi[$1+9]		# number of function calls
define	CT_AXIS		Memi[$1+10+($2)-1]	# maps ctran axis to physax
define	CT_FCI		($1+20+(($2)-1)*LEN_FC)	# pointer to CALL descriptor
define	CT_FCO		($1+188+(($2)-1)*LEN_FC)

# CT types, for optimized transforms.
define	LNR		0			# linear, not rotated
define	LRO		1			# linear, rotated
define	GEN		2			# general catch all case

# Base FC (WCS function call) descriptor.  This consists of a base descriptor
# common to all WCS functions, followed by a private area reserved for use
# by the WCS function.

define	LEN_FC		24
define	FC_CT		Memi[$1]		# CTRAN descriptor
define	FC_WCS		Memi[$1+1]		# WCS descriptor
define	FC_WF		Memi[$1+2]		# WF descriptor
define	FC_FCN		Memi[$1+3]		# epa of WCS function
define	FC_NAXES	Memi[$1+4]		# number of axes in call
define	FC_AXIS		Memi[$1+5+($2)-1]	# CTRAN axes used by FC (max 3)
define	FCU		8			# offset to first user field

# WCS function driver (stored in common).
define	LEN_FN		5			# length of function driver
define	FN_FLAGS	fn_table[1,$1]		# function type flags
define	FN_INIT		fn_table[2,$1]		# initialize call descriptor
define	FN_DESTROY	fn_table[3,$1]		# free call descriptor
define	FN_FWD		fn_table[4,$1]		# forward transformation
define	FN_INV		fn_table[5,$1]		# inverse transformation
define	FN_NAME		fn_names[1,$1]		# function name

# WCS function codes.
define	F_LINEAR	0			# linear (not a function)

# WCS function type bit flags.
define	F_RADEC		01B			# function requires RA/DEC

# Handy macros.
define	S		Memc[MI_SBUF($1)+$2-1]	# string = S(mw,i)
define	D		Memd[MI_DBUF($1)+$2-1]	# double = D(mw,i)
