/*============================================================================
WCSLIB 4.3 - an implementation of the FITS WCS standard.
Copyright (C) 1995-2007, Mark Calabretta
This file is part of WCSLIB.
WCSLIB is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
WCSLIB is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
more details.
You should have received a copy of the GNU Lesser General Public License
along with WCSLIB. If not, see .
Correspondence concerning WCSLIB may be directed to:
Internet email: mcalabre@atnf.csiro.au
Postal address: Dr. Mark Calabretta
Australia Telescope National Facility, CSIRO
PO Box 76
Epping NSW 1710
AUSTRALIA
Author: Mark Calabretta, Australia Telescope National Facility
http://www.atnf.csiro.au/~mcalabre/index.html
$Id: wcs_f.c,v 4.3 2007/12/27 05:48:07 cal103 Exp $
*===========================================================================*/
#include
#include
#include
/* Fortran name mangling. */
#include
#define wcsnpv_ F77_FUNC(wcsnpv, WCSNPV)
#define wcsnps_ F77_FUNC(wcsnps, WCSNPS)
#define wcsini_ F77_FUNC(wcsini, WCSINI)
#define wcssub_ F77_FUNC(wcssub, WCSSUB)
#define wcscopy_ F77_FUNC(wcscopy, WCSCOPY)
#define wcsput_ F77_FUNC(wcsput, WCSPUT)
#define wcsget_ F77_FUNC(wcsget, WCSGET)
#define wcsfree_ F77_FUNC(wcsfree, WCSFREE)
#define wcsprt_ F77_FUNC(wcsprt, WCSPRT)
#define wcsset_ F77_FUNC(wcsset, WCSSET)
#define wcsp2s_ F77_FUNC(wcsp2s, WCSP2S)
#define wcss2p_ F77_FUNC(wcss2p, WCSS2P)
#define wcsmix_ F77_FUNC(wcsmix, WCSMIX)
#define wcssptr_ F77_FUNC(wcssptr, WCSSPTR)
#define WCS_FLAG 100
#define WCS_NAXIS 101
#define WCS_CRPIX 102
#define WCS_PC 103
#define WCS_CDELT 104
#define WCS_CRVAL 105
#define WCS_CUNIT 106
#define WCS_CTYPE 107
#define WCS_LONPOLE 108
#define WCS_LATPOLE 109
#define WCS_RESTFRQ 110
#define WCS_RESTWAV 111
#define WCS_NPV 112
#define WCS_NPVMAX 113
#define WCS_PV 114
#define WCS_NPS 115
#define WCS_NPSMAX 116
#define WCS_PS 117
#define WCS_ALTLIN 118
#define WCS_CD 119
#define WCS_CROTA 120
#define WCS_ALT 121
#define WCS_COLNUM 122
#define WCS_WCSNAME 123
#define WCS_CNAME 124
#define WCS_CRDER 125
#define WCS_CSYER 126
#define WCS_RADESYS 127
#define WCS_EQUINOX 128
#define WCS_SPECSYS 129
#define WCS_SSYSOBS 130
#define WCS_VELOSYS 131
#define WCS_SSYSSRC 132
#define WCS_ZSOURCE 133
#define WCS_OBSGEO 134
#define WCS_DATEOBS 135
#define WCS_DATEAVG 136
#define WCS_MJDOBS 137
#define WCS_MJDAVG 138
#define WCS_NTAB 200
#define WCS_TAB 201
#define WCS_NWTB 202
#define WCS_WTB 203
#define WCS_TYPES 204
#define WCS_LNGTYP 205
#define WCS_LATTYP 206
#define WCS_LNG 207
#define WCS_LAT 208
#define WCS_SPEC 209
#define WCS_CUBEFACE 210
#define WCS_LIN 211
#define WCS_CEL 212
#define WCS_SPC 213
/*--------------------------------------------------------------------------*/
int wcsnpv_(int *npvmax) { return wcsnpv(*npvmax); }
int wcsnps_(int *npsmax) { return wcsnps(*npsmax); }
/*--------------------------------------------------------------------------*/
int wcsini_(const int *naxis, int *wcs)
{
return wcsini(1, *naxis, (struct wcsprm *)wcs);
}
/*--------------------------------------------------------------------------*/
int wcssub_(const int *wcssrc, int *nsub, int axes[], int *wcsdst)
{
return wcssub(1, (const struct wcsprm *)wcssrc, nsub, axes,
(struct wcsprm *)wcsdst);
}
/*--------------------------------------------------------------------------*/
int wcscopy_(const int *wcssrc, int *wcsdst)
{
return wcscopy(1, (const struct wcsprm *)wcssrc, (struct wcsprm *)wcsdst);
}
/*--------------------------------------------------------------------------*/
int wcsput_(
int *wcs,
const int *what,
const void *value,
const int *i,
const int *j)
{
int i0, j0, k;
const char *cvalp;
const int *ivalp;
const double *dvalp;
struct wcsprm *wcsp;
/* Cast pointers. */
wcsp = (struct wcsprm *)wcs;
cvalp = (const char *)value;
ivalp = (const int *)value;
dvalp = (const double *)value;
/* Convert 1-relative FITS axis numbers to 0-relative C array indices. */
i0 = *i - 1;
j0 = *j - 1;
wcsp->flag = 0;
switch (*what) {
case WCS_FLAG:
wcsp->flag = *ivalp;
break;
case WCS_NAXIS:
wcsp->naxis = *ivalp;
break;
case WCS_CRPIX:
wcsp->crpix[i0] = *dvalp;
break;
case WCS_PC:
k = (i0)*(wcsp->naxis) + (j0);
*(wcsp->pc+k) = *dvalp;
break;
case WCS_CDELT:
wcsp->cdelt[i0] = *dvalp;
break;
case WCS_CUNIT:
strncpy(wcsp->cunit[i0], cvalp, 72);
wcsutil_null_fill(72, wcsp->cunit[i0]);
break;
case WCS_CTYPE:
strncpy(wcsp->ctype[i0], cvalp, 72);
wcsutil_null_fill(72, wcsp->ctype[i0]);
break;
case WCS_CRVAL:
wcsp->crval[i0] = *dvalp;
break;
case WCS_LONPOLE:
wcsp->lonpole = *dvalp;
break;
case WCS_LATPOLE:
wcsp->latpole = *dvalp;
break;
case WCS_RESTFRQ:
wcsp->restfrq = *dvalp;
break;
case WCS_RESTWAV:
wcsp->restwav = *dvalp;
break;
case WCS_NPV:
case WCS_NPVMAX:
return 1;
break;
case WCS_PV:
(wcsp->pv + wcsp->npv)->i = *i;
(wcsp->pv + wcsp->npv)->m = *j;
(wcsp->pv + wcsp->npv)->value = *dvalp;
(wcsp->npv)++;
break;
case WCS_NPS:
case WCS_NPSMAX:
return 1;
break;
case WCS_PS:
(wcsp->ps + wcsp->nps)->i = *i;
(wcsp->ps + wcsp->nps)->m = *j;
strncpy((wcsp->ps + wcsp->nps)->value, cvalp, 72);
wcsutil_null_fill(72, (wcsp->ps + wcsp->nps)->value);
(wcsp->nps)++;
break;
case WCS_ALTLIN:
wcsp->altlin = *ivalp;
break;
case WCS_CD:
k = (i0)*(wcsp->naxis) + (j0);
*(wcsp->cd+k) = *dvalp;
break;
case WCS_CROTA:
wcsp->crota[i0] = *dvalp;
break;
case WCS_ALT:
wcsp->alt[0] = cvalp[0];
wcsutil_null_fill(4, wcsp->alt);
break;
case WCS_COLNUM:
wcsp->colnum = *ivalp;
break;
case WCS_WCSNAME:
strncpy(wcsp->wcsname, cvalp, 72);
wcsutil_null_fill(72, wcsp->wcsname);
break;
case WCS_CNAME:
strncpy(wcsp->cname[i0], cvalp, 72);
wcsutil_null_fill(72, wcsp->cname[i0]);
break;
case WCS_CRDER:
wcsp->crder[i0] = *dvalp;
break;
case WCS_CSYER:
wcsp->csyer[i0] = *dvalp;
break;
case WCS_RADESYS:
strncpy(wcsp->radesys, cvalp, 72);
wcsutil_null_fill(72, wcsp->radesys);
break;
case WCS_EQUINOX:
wcsp->equinox = *dvalp;
break;
case WCS_SPECSYS:
strncpy(wcsp->specsys, cvalp, 72);
wcsutil_null_fill(72, wcsp->specsys);
break;
case WCS_SSYSOBS:
strncpy(wcsp->ssysobs, cvalp, 72);
wcsutil_null_fill(72, wcsp->ssysobs);
break;
case WCS_VELOSYS:
wcsp->velosys = *dvalp;
break;
case WCS_SSYSSRC:
strncpy(wcsp->ssyssrc, cvalp, 72);
wcsutil_null_fill(72, wcsp->ssyssrc);
break;
case WCS_ZSOURCE:
wcsp->zsource = *dvalp;
break;
case WCS_OBSGEO:
wcsp->obsgeo[i0] = *dvalp;
break;
case WCS_DATEOBS:
strncpy(wcsp->dateobs, cvalp, 72);
wcsutil_null_fill(72, wcsp->dateobs);
break;
case WCS_DATEAVG:
strncpy(wcsp->dateavg, cvalp, 72);
wcsutil_null_fill(72, wcsp->dateavg);
break;
case WCS_MJDOBS:
wcsp->mjdobs = *dvalp;
break;
case WCS_MJDAVG:
wcsp->mjdavg = *dvalp;
break;
default:
return 1;
}
return 0;
}
/*--------------------------------------------------------------------------*/
int wcsget_(const int *wcs, const int *what, void *value)
{
int i, j, k, naxis;
char *cvalp;
int *ivalp;
double *dvalp;
const int *iwcsp;
const double *dwcsp;
const struct wcsprm *wcsp;
/* Cast pointers. */
wcsp = (const struct wcsprm *)wcs;
cvalp = (char *)value;
ivalp = (int *)value;
dvalp = (double *)value;
naxis = wcsp->naxis;
switch (*what) {
case WCS_FLAG:
*ivalp = wcsp->flag;
break;
case WCS_NAXIS:
*ivalp = naxis;
break;
case WCS_CRPIX:
for (i = 0; i < naxis; i++) {
*(dvalp++) = wcsp->crpix[i];
}
break;
case WCS_PC:
/* C row-major to FORTRAN column-major. */
for (j = 0; j < naxis; j++) {
dwcsp = wcsp->pc + j;
for (i = 0; i < naxis; i++) {
*(dvalp++) = *dwcsp;
dwcsp += naxis;
}
}
break;
case WCS_CDELT:
for (i = 0; i < naxis; i++) {
*(dvalp++) = wcsp->cdelt[i];
}
break;
case WCS_CUNIT:
for (i = 0; i < naxis; i++) {
strncpy(cvalp, wcsp->cunit[i], 72);
wcsutil_blank_fill(72, cvalp);
cvalp += 72;
}
break;
case WCS_CTYPE:
for (i = 0; i < naxis; i++) {
strncpy(cvalp, wcsp->ctype[i], 72);
wcsutil_blank_fill(72, cvalp);
cvalp += 72;
}
break;
case WCS_CRVAL:
for (i = 0; i < naxis; i++) {
*(dvalp++) = wcsp->crval[i];
}
break;
case WCS_LONPOLE:
*dvalp = wcsp->lonpole;
break;
case WCS_LATPOLE:
*dvalp = wcsp->latpole;
break;
case WCS_RESTFRQ:
*dvalp = wcsp->restfrq;
break;
case WCS_RESTWAV:
*dvalp = wcsp->restwav;
break;
case WCS_NPV:
*ivalp = wcsp->npv;
break;
case WCS_NPVMAX:
*ivalp = wcsp->npvmax;
break;
case WCS_PV:
for (k = 0; k < wcsp->npv; k++) {
*(dvalp++) = (wcsp->pv + k)->i;
*(dvalp++) = (wcsp->pv + k)->m;
*(dvalp++) = (wcsp->pv + k)->value;
}
break;
case WCS_NPS:
*ivalp = wcsp->nps;
break;
case WCS_NPSMAX:
*ivalp = wcsp->npsmax;
break;
case WCS_PS:
for (k = 0; k < wcsp->nps; k++) {
*(dvalp++) = (wcsp->ps + k)->i;
*(dvalp++) = (wcsp->ps + k)->m;
cvalp += 2*sizeof(double);
strncpy(cvalp, (wcsp->ps + k)->value, 72);
wcsutil_blank_fill(72, cvalp);
cvalp += 72;
}
break;
case WCS_ALTLIN:
*ivalp = wcsp->altlin;
break;
case WCS_CD:
/* C row-major to FORTRAN column-major. */
for (j = 0; j < naxis; j++) {
dwcsp = wcsp->cd + j;
for (i = 0; i < naxis; i++) {
*(dvalp++) = *dwcsp;
dwcsp += naxis;
}
}
break;
case WCS_CROTA:
for (i = 0; i < naxis; i++) {
*(dvalp++) = wcsp->crota[i];
}
break;
case WCS_ALT:
strncpy(cvalp, wcsp->alt, 4);
wcsutil_blank_fill(4, cvalp);
break;
case WCS_COLNUM:
*ivalp = wcsp->colnum;
break;
case WCS_WCSNAME:
strncpy(cvalp, wcsp->wcsname, 72);
wcsutil_blank_fill(72, cvalp);
break;
case WCS_CNAME:
for (i = 0; i < naxis; i++) {
strncpy(cvalp, wcsp->cname[i], 72);
wcsutil_blank_fill(72, cvalp);
cvalp += 72;
}
break;
case WCS_CRDER:
for (i = 0; i < naxis; i++) {
*(dvalp++) = wcsp->crder[i];
}
break;
case WCS_CSYER:
for (i = 0; i < naxis; i++) {
*(dvalp++) = wcsp->csyer[i];
}
break;
case WCS_RADESYS:
strncpy(cvalp, wcsp->radesys, 72);
wcsutil_blank_fill(72, cvalp);
break;
case WCS_EQUINOX:
*dvalp = wcsp->equinox;
break;
case WCS_SPECSYS:
strncpy(cvalp, wcsp->specsys, 72);
wcsutil_blank_fill(72, cvalp);
break;
case WCS_SSYSOBS:
strncpy(cvalp, wcsp->ssysobs, 72);
wcsutil_blank_fill(72, cvalp);
break;
case WCS_VELOSYS:
*dvalp = wcsp->velosys;
break;
case WCS_SSYSSRC:
strncpy(cvalp, wcsp->ssyssrc, 72);
wcsutil_blank_fill(72, cvalp);
break;
case WCS_ZSOURCE:
*dvalp = wcsp->zsource;
break;
case WCS_OBSGEO:
for (i = 0; i < 3; i++) {
*(dvalp++) = wcsp->obsgeo[i];
}
break;
case WCS_DATEOBS:
strncpy(cvalp, wcsp->dateobs, 72);
wcsutil_blank_fill(72, cvalp);
break;
case WCS_MJDOBS:
*dvalp = wcsp->mjdobs;
break;
case WCS_MJDAVG:
*dvalp = wcsp->mjdavg;
break;
case WCS_NWTB:
*ivalp = wcsp->nwtb;
break;
case WCS_WTB:
*(void **)value = wcsp->wtb;
break;
case WCS_NTAB:
*ivalp = wcsp->ntab;
break;
case WCS_TAB:
*(void **)value = wcsp->tab;
break;
case WCS_TYPES:
for (i = 0; i < naxis; i++) {
*(ivalp++) = wcsp->types[i];
}
break;
case WCS_LNGTYP:
strncpy(cvalp, wcsp->lngtyp, 4);
wcsutil_blank_fill(4, cvalp);
break;
case WCS_LATTYP:
strncpy(cvalp, wcsp->lattyp, 4);
wcsutil_blank_fill(4, cvalp);
break;
case WCS_LNG:
*ivalp = wcsp->lng + 1;
break;
case WCS_LAT:
*ivalp = wcsp->lat + 1;
break;
case WCS_SPEC:
*ivalp = wcsp->spec + 1;
break;
case WCS_CUBEFACE:
*ivalp = wcsp->cubeface;
break;
case WCS_LIN:
k = (int *)(&(wcsp->lin)) - (int *)wcsp;
iwcsp = wcs + k;
for (k = 0; k < LINLEN; k++) {
*(ivalp++) = *(iwcsp++);
}
break;
case WCS_CEL:
k = (int *)(&(wcsp->cel)) - (int *)wcsp;
iwcsp = wcs + k;
for (k = 0; k < CELLEN; k++) {
*(ivalp++) = *(iwcsp++);
}
break;
case WCS_SPC:
k = (int *)(&(wcsp->spc)) - (int *)wcsp;
iwcsp = wcs + k;
for (k = 0; k < SPCLEN; k++) {
*(ivalp++) = *(iwcsp++);
}
break;
default:
return 1;
}
return 0;
}
/*--------------------------------------------------------------------------*/
int wcsfree_(int *wcs)
{
return wcsfree((struct wcsprm *)wcs);
}
/*--------------------------------------------------------------------------*/
int wcsprt_(int *wcs)
{
return wcsprt((struct wcsprm *)wcs);
}
/*--------------------------------------------------------------------------*/
int wcsset_(int *wcs)
{
return wcsset((struct wcsprm *)wcs);
}
/*--------------------------------------------------------------------------*/
int wcsp2s_(
int *wcs,
const int *ncoord,
const int *nelem,
const double pixcrd[],
double imgcrd[],
double phi[],
double theta[],
double world[],
int stat[])
{
return wcsp2s((struct wcsprm *)wcs, *ncoord, *nelem, pixcrd, imgcrd, phi,
theta, world, stat);
}
/*--------------------------------------------------------------------------*/
int wcss2p_(
int* wcs,
const int *ncoord,
const int *nelem,
const double world[],
double phi[],
double theta[],
double imgcrd[],
double pixcrd[],
int stat[])
{
return wcss2p((struct wcsprm *)wcs, *ncoord, *nelem, world, phi, theta,
imgcrd, pixcrd, stat);
}
/*--------------------------------------------------------------------------*/
int wcsmix_(
int *wcs,
const int *mixpix,
const int *mixcel,
const double vspan[2],
const double *vstep,
int *viter,
double world[],
double phi[],
double theta[],
double imgcrd[],
double pixcrd[])
{
return wcsmix((struct wcsprm *)wcs, *mixpix-1, *mixcel, vspan, *vstep,
*viter, world, phi, theta, imgcrd, pixcrd);
}
/*--------------------------------------------------------------------------*/
int wcssptr_(struct wcsprm *wcs, int *i, char ctype[9])
{
int status = wcssptr(wcs, i, ctype);
wcsutil_blank_fill(9, ctype);
return status;
}