diff options
Diffstat (limited to 'pkg/images/tv/imedit/epmove.x')
-rw-r--r-- | pkg/images/tv/imedit/epmove.x | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/pkg/images/tv/imedit/epmove.x b/pkg/images/tv/imedit/epmove.x new file mode 100644 index 00000000..687a200e --- /dev/null +++ b/pkg/images/tv/imedit/epmove.x @@ -0,0 +1,129 @@ +include "epix.h" + +# EP_MOVE -- Replace the output aperture by the data in the input aperture. +# There is no centering. A background is fit to the input data and subtracted +# and then a background is fit to the output aperture and added to the +# input aperture data. + +procedure ep_move (ep, ap, xa1, ya1, xb1, yb1, xa2, ya2, xb2, yb2, key) + +pointer ep # EPIX structure +int ap # Aperture type +int xa1, ya1, xb1, yb1 # Aperture coordinates +int xa2, ya2, xb2, yb2 # Aperture coordinates +int key # Key + +int i, x1, x2, y1, y2 +pointer bufdata, mask, x, y, w + +begin + i = EP_BUFFER(ep) + EP_WIDTH(ep) + 1 + x1 = min (xa1, xb1) - i + x2 = max (xa1, xb1) + i + y1 = min (ya1, yb1) - i + y2 = max (ya1, yb1) + i + call ep_gindata (ep, x1, x2, y1, y2) + if (EP_INDATA(ep) != NULL) { + call malloc (bufdata, EP_NPTS(ep), TY_REAL) + call malloc (mask, EP_NPTS(ep), TY_INT) + call malloc (x, EP_NPTS(ep), TY_REAL) + call malloc (y, EP_NPTS(ep), TY_REAL) + call malloc (w, EP_NPTS(ep), TY_REAL) + + call amovr (Memr[EP_INDATA(ep)], Memr[bufdata], EP_NPTS(ep)) + call ep_mask (ep, mask, ap, xa1, ya1, xb1, yb1) + i = EP_BUFFER(ep) + EP_WIDTH(ep) + 1 + x1 = min (xa2, xb2) - i + x2 = max (xa2, xb2) + i + y1 = min (ya2, yb2) - i + y2 = max (ya2, yb2) + i + i = EP_NPTS(ep) + call ep_gdata (ep, x1, x2, y1, y2) + if (i != EP_NPTS(ep)) { + call eprintf ("Raster sizes don't match\n") + EP_OUTDATA(ep) = NULL + } + if (EP_OUTDATA(ep) != NULL) { + switch (key) { + case 'm': + call ep_movem (ep, Memr[bufdata], Memr[EP_OUTDATA(ep)], + Memi[mask], Memr[x], Memr[y], Memr[w], + EP_NX(ep), EP_NY(ep)) + case 'n': + call ep_moven (ep, Memr[bufdata], Memr[EP_OUTDATA(ep)], + Memi[mask], Memr[x], Memr[y], Memr[w], + EP_NX(ep), EP_NY(ep)) + } + } + + call mfree (bufdata, TY_REAL) + call mfree (mask, TY_INT) + call mfree (x, TY_REAL) + call mfree (y, TY_REAL) + call mfree (w, TY_REAL) + } +end + + +# EP_MOVEM -- Move the input aperture to the output. + +procedure ep_movem (ep, indata, outdata, mask, x, y, w, nx, ny) + +pointer ep # EPIX structure +real indata[nx,ny] # Input data subraster +real outdata[nx,ny] # Output data subraster +int mask[nx,ny] # Mask subraster +real x[nx,ny], y[nx,ny] # Coordinates +real w[nx,ny] # Weights +int nx, ny # Size of subraster + +int i, j +real gseval() +pointer gsin, gsout + +begin + call ep_gsfit (ep, indata, mask, x, y, w, nx, ny, gsin) + if (gsin == NULL) + return + call ep_gsfit (ep, outdata, mask, x, y, w, nx, ny, gsout) + if (gsout == NULL) { + call gsfree (gsin) + return + } + do j = 1, ny + do i = 1, nx + if (mask[i,j] == 1) + outdata[i,j] = indata[i,j] - gseval (gsin, x[i,j], y[i,j]) + + gseval (gsout, x[i,j], y[i,j]) + call gsfree (gsin) + call gsfree (gsout) +end + + +# EP_MOVEN -- Add the input aperture to the output. + +procedure ep_moven (ep, indata, outdata, mask, x, y, w, nx, ny) + +pointer ep # EPIX structure +real indata[nx,ny] # Input data subraster +real outdata[nx,ny] # Output data subraster +int mask[nx,ny] # Mask subraster +real x[nx,ny], y[nx,ny] # Coordinates +real w[nx,ny] # Weights +int nx, ny # Size of subraster + +int i, j +real gseval() +pointer gs + +begin + call ep_gsfit (ep, indata, mask, x, y, w, nx, ny, gs) + if (gs == NULL) + return + do j = 1, ny + do i = 1, nx + if (mask[i,j] == 1) + outdata[i,j] = indata[i,j] - gseval (gs, x[i,j], y[i,j]) + + outdata[i,j] + call gsfree (gs) +end |