aboutsummaryrefslogtreecommitdiff
path: root/pkg/images/tv/imedit/epmove.x
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/images/tv/imedit/epmove.x')
-rw-r--r--pkg/images/tv/imedit/epmove.x129
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