diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /noao/digiphot/daophot/substar/dpgimbufr.x | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'noao/digiphot/daophot/substar/dpgimbufr.x')
-rw-r--r-- | noao/digiphot/daophot/substar/dpgimbufr.x | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/noao/digiphot/daophot/substar/dpgimbufr.x b/noao/digiphot/daophot/substar/dpgimbufr.x new file mode 100644 index 00000000..d4fac359 --- /dev/null +++ b/noao/digiphot/daophot/substar/dpgimbufr.x @@ -0,0 +1,137 @@ +include <imhdr.h> + +# DP_GIMBUFR -- Maintain buffer of image lines. A new buffer is created when +# the buffer pointer is null. No changing of buffer size is allowed, although +# this should be added. The minimum number of image reads is used. + +define flush_ 91 + +procedure dp_gimbufr (inim, outim, line1, line2, buf, flush) + +pointer inim # input image pointer +pointer outim # output image pointer +int line1 # first image line of buffer +int line2 # last image line of buffer +pointer buf # buffer +bool flush # flush the current contents of the buffer + +int i, ncols, nlines, llast1, llast2, nllast, lp, lout +pointer buf1, buf2 +pointer imgl2r(), impl2r() + +begin + nlines = line2 - line1 + 1 + ncols = IM_LEN (inim, 1) + lp = 0 + + if (flush) + goto flush_ + + # If the buffer pointer is undefined then allocate memory for the + # buffer. If the number of columns or lines requested changes + # reallocate the buffer. Initialize the last line values to force + # a full buffer image read. + + if (buf == NULL) { + call malloc (buf, ncols * nlines, TY_REAL) + #llast1 = line1 - nlines + #llast2 = line2 - nlines + llast1 = 0 + llast2 = 0 + } else if ((nlines > nllast)) { + call eprintf ("Buffer requested is larger than previous one\n") + return + } + + #call printf ("line1=%d line2=%d llast1=%d llast2=%d\n") + #call pargi (line1) + #call pargi (line2) + #call pargi (llast1) + #call pargi (llast2) + + # Write out the lines that are not needed any more. + if (line1 > llast1 && llast1 > 0) { + buf2 = buf + lout = min (llast2, line1 - 1) + do i = llast1, lout{ + buf1 = impl2r (outim, i) + call amovr (Memr[buf2], Memr[buf1], ncols) + #call printf ("Writing line: %d\n") + #call pargi (i) + buf2 = buf2 + ncols + } + } + + # Write out any skipped image lines. + if (line1 > llast2) { + do i = llast2 + 1, line1 - 1 { + buf2 = imgl2r (inim, i) + buf1 = impl2r (outim, i) + call amovr (Memr[buf2], Memr[buf1], ncols) + #call printf ("Copying line: %d\n") + #call pargi (i) + } + } + + # Now move the remaining lines to the begining of the buffer. + if (llast2 >= line1 ) { + buf2 = buf + ncols * (line1 - llast1) + buf1 = buf + do i = line1, llast2 { + lp = lp + 1 + call amovr (Memr[buf2], Memr[buf1], ncols) + #call printf ("Moving line: %d\n") + #call pargi (i) + buf2 = buf2 + ncols + buf1 = buf1 + ncols + } + } + + # Read only the image lines with are different from the last buffer. + buf1 = buf + ncols * lp + lout = max (line1, llast2 + 1) + do i = lout, line2 { + #call printf ("Reading line: %d\n") + #call pargi (i) + buf2 = imgl2r (inim, i) + call amovr (Memr[buf2], Memr[buf1], ncols) + buf1 = buf1 + ncols + } + + # Save the buffer parameters. + llast1 = line1 + llast2 = line2 + nllast = nlines + + # Quit + return + +flush_ + # If requested to flush the current contents of the buffer we + # write out lines llast1 to llast2 and then set buf == NULL. + + # Flush the data buffer. + if (buf != NULL) { + buf2 = buf + do i = llast1, llast2 { + buf1 = impl2r (outim, i) + call amovr (Memr[buf2], Memr[buf1], ncols) + #call printf ("Writing line: %d\n") + #call pargi (i) + buf2 = buf2 + ncols + } + } + + # Copy any remaining image lines. + do i = llast2 + 1, IM_LEN(inim,2) { + buf2 = imgl2r (inim, i) + buf1 = impl2r (outim, i) + call amovr (Memr[buf2], Memr[buf1], ncols) + #call printf ("Copying line: %d\n") + #call pargi (i) + } + + call mfree (buf, TY_REAL) + buf = NULL + nllast = 0 +end |