diff options
Diffstat (limited to 'fitsy/ftacht.c')
-rw-r--r-- | fitsy/ftacht.c | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/fitsy/ftacht.c b/fitsy/ftacht.c new file mode 100644 index 0000000..b88892f --- /dev/null +++ b/fitsy/ftacht.c @@ -0,0 +1,112 @@ +/* ft_acht.c +** +** Vector change type operators. +** FITS adds bzero and bascle. +**/ + +#include "xos.h" +#include "fitsy.h" +#include "generic.h" + + +#ifdef __STDC__ +#define achtxx(ch1, type1, ch2, type2) \ + \ +void acht##ch1##ch2(v1, v2, npix, direction, hasscale, bscale, bzero) \ + type1* v1; \ + type2* v2; \ + int npix; \ + int direction; \ + int hasscale; \ + double bscale; \ + double bzero; \ +{ \ + if ( hasscale ) { \ + if ( direction ) { \ + while ( npix-- ) v1[npix] = v2[npix] * bscale + bzero; \ + } else { \ + while ( npix-- ) v1[npix] = (v2[npix] - bzero) / bscale; \ + } \ + } else { \ + while ( npix-- ) v1[npix] = v2[npix]; \ + } \ +} +#else +#define achtxx(ch1, type1, ch2, type2) \ + \ +void acht/**/ch1/**/ch2(v1, v2, npix, direction, hasscale, bscale, bzero)\ + type1* v1; \ + type2* v2; \ + int npix; \ + int direction; \ + int hasscale; \ + double bscale; \ + double bzero; \ +{ \ + if ( hasscale ) { \ + if ( direction ) { \ + while ( npix-- ) v1[npix] = v2[npix] * bscale + bzero; \ + } else { \ + while ( npix-- ) v1[npix] = (v2[npix] - bzero) / bscale; \ + } \ + } else { \ + while ( npix-- ) v1[npix] = v2[npix]; \ + } \ +} +#endif + + +DOUBLE_GENERIC(achtxx) + + +static int pixtype(type) + int type; +{ + switch ( type ) { + case 8: return TY_UCHAR; + case 16: return TY_SHORT; + case 32: return TY_INT; + + case FT_UNSIGNED | 8: return TY_UCHAR; + case FT_UNSIGNED | 16: return TY_USHORT; + case FT_UNSIGNED | 32: return TY_UINT; + + case -32: return TY_REAL; + case -64: return TY_DOUBLE; + } + + return -1; +} + +void ft_acht(type1, v1, type2, v2, npix, direction, hasscale, bscale, bzero) + int type1; + void* v1; + int type2; + void* v2; + int npix; + int direction; + int hasscale; + double bscale; + double bzero; +{ + typedef void (*vector)(); + +static vector matrix[10][10] = { + { achtcc,achtcs,achtci,achtcl,achtcr,achtcd,achtct,achtcu,achtcv } + , { achtsc,achtss,achtsi,achtsl,achtsr,achtsd,achtst,achtsu,achtsv } + , { achtic,achtis,achtii,achtil,achtir,achtid,achtit,achtiu,achtiv } + , { achtlc,achtls,achtli,achtll,achtlr,achtld,achtlt,achtlu,achtlv } + , { achtrc,achtrs,achtri,achtrl,achtrr,achtrd,achtrt,achtru,achtrv } + , { achtdc,achtds,achtdi,achtdl,achtdr,achtdd,achtdt,achtdu,achtdv } + , { achttc,achtts,achtti,achttl,achttr,achttd,achttt,achttu,achttv } + , { achtuc,achtus,achtui,achtul,achtur,achtud,achtut,achtuu,achtuv } + , { achtvc,achtvs,achtvi,achtvl,achtvr,achtvd,achtvt,achtvu,achtvv } +}; + + type1 = pixtype(type1); + type2 = pixtype(type2); + + if ( type1 < 0 || type2 < 0 ) return; + + (*matrix[type1][type2])(v1, v2, npix, direction, hasscale, bscale, bzero); +} |