/* Copyright (c) 1993 Association of Universities for Research * in Astronomy. All rights reserved. Produced under National * Aeronautics and Space Administration Contract No. NAS5-26555. */ /* hinv.c Inverse H-transform of NX x NY integer image * * Programmer: R. White Date: 10 April 1992 */ #include #include static void unshuffle(); extern void hsmooth(); extern void hinv(a,nx,ny,smooth,scale) int a[]; int nx,ny; int smooth; /* 0 for no smoothing, else smooth during inversion */ int scale; /* used if smoothing is specified */ { int nmax, log2n, i, j, k; int b11, b10, b01, b00; int nxtop,nytop,nxf,nyf,c; int oddx,oddy; int shift,dp, dm; int s10, s00; int *tmp; /* * log2n is log2 of max(nx,ny) rounded up to next power of 2 */ nmax = (nx>ny) ? nx : ny; log2n = log((float) nmax)/log(2.0)+0.5; if ( nmax > (1<=0; k--) { /* * this somewhat cryptic code generates the sequence * ntop[k-1] = (ntop[k]+1)/2, where ntop[log2n] = n */ c = c>>1; nxtop = nxtop<<1; nytop = nytop<<1; if (nxf <= c) { nxtop -= 1; } else { nxf -= c; } if (nyf <= c) { nytop -= 1; } else { nyf -= c; } /* * double divisor on last pass */ if (k == 0) { shift = 2; dp = 2; /* for negative numbers, dm = - dp + 2**shift -1 = -2+3 = +1 */ dm = 1; } /* * unshuffle in each dimension to interleave coefficients */ for (i = 0; i0) ? (b11+dp) : (b11+dm)) >> shift; a[s10 ] = ((b10>0) ? (b10+dp) : (b10+dm)) >> shift; a[s00+1] = ((b01>0) ? (b01+dp) : (b01+dm)) >> shift; a[s00 ] = ((b00>0) ? (b00+dp) : (b00+dm)) >> shift; s00 += 2; s10 += 2; } if (oddy) { /* * do last element in row if row length is odd * s00+1, s10+1 are off edge */ b10 = a[s00] + a[s10]; b00 = a[s00] - a[s10]; a[s10 ] = ((b10>0) ? (b10+dp) : (b10+dm)) >> shift; a[s00 ] = ((b00>0) ? (b00+dp) : (b00+dm)) >> shift; } } if (oddx) { /* * do last row if column length is odd * s10, s10+1 are off edge */ s00 = ny*i; for (j = 0; j0) ? (b01+dp) : (b01+dm)) >> shift; a[s00 ] = ((b00>0) ? (b00+dp) : (b00+dm)) >> shift; s00 += 2; } if (oddy) { /* * do corner element if both row and column lengths are odd * s00+1, s10, s10+1 are off edge */ b00 = a[s00]; a[s00 ] = ((b00>0) ? (b00+dp) : (b00+dm)) >> shift; } } } free(tmp); } static void unshuffle(a,n,n2,tmp) int a[]; /* array to shuffle */ int n; /* number of elements to shuffle */ int n2; /* second dimension */ int tmp[]; /* scratch storage */ { int i; int nhalf; int *p1, *p2, *pt; /* * copy 2nd half of array to tmp */ nhalf = (n+1)>>1; pt = tmp; p1 = &a[n2*nhalf]; /* pointer to a[i] */ for (i=nhalf; i= 0; i--) { *p1 = *p2; p2 -= n2; p1 -= (n2+n2); } /* * now distribute 2nd half of array (in tmp) to odd elements */ pt = tmp; p1 = &a[n2]; /* pointer to a[i] */ for (i=1; i