aboutsummaryrefslogtreecommitdiff
path: root/noao/digiphot/daophot/allstar/dpabuf.x
diff options
context:
space:
mode:
Diffstat (limited to 'noao/digiphot/daophot/allstar/dpabuf.x')
-rw-r--r--noao/digiphot/daophot/allstar/dpabuf.x495
1 files changed, 495 insertions, 0 deletions
diff --git a/noao/digiphot/daophot/allstar/dpabuf.x b/noao/digiphot/daophot/allstar/dpabuf.x
new file mode 100644
index 00000000..13aac109
--- /dev/null
+++ b/noao/digiphot/daophot/allstar/dpabuf.x
@@ -0,0 +1,495 @@
+include <imhdr.h>
+include "../lib/daophotdef.h"
+include "../lib/allstardef.h"
+
+# DP_GWT -- Return a pointer to the desired weights pixels. The weights buffer
+# pointer is assumed to be NULL on the initial all. If the new line limits
+# are totally contained within the old line limits no action is taken and
+# the old line limits are returned. If the weights pixels are stored in a
+# scratch image the pixels must be accessed sequentially, otherwise an
+# error is returned.
+
+pointer procedure dp_gwt (dao, im, line1, line2, mode, flush)
+
+pointer dao # pointer to the daophot strucuture
+pointer im # pointer to the input image
+int line1 # the lower line limit
+int line2 # the upper line limit
+int mode # input / output mode
+int flush # flush the output
+
+int nx, ny, xoff, yoff, llast1, llast2
+pointer allstar
+
+begin
+ allstar = DP_ALLSTAR(dao)
+ if (DP_WBUF(allstar) == NULL) {
+ llast1 = 0
+ llast2 = 0
+ } else if (flush == YES) {
+ line1 = llast1
+ line2 = llast2
+ } else if ((line1 >= llast1) && (line2 <= llast2)) {
+ line1 = llast1
+ line2 = llast2
+ return (DP_WBUF(allstar))
+ } else if (line1 < llast1)
+ call error (0,
+ "ERROR: Attempting to access the weights pixels randomly")
+
+ # All the data is cached.
+ if (DP_CACHE (allstar, A_WEIGHT) == YES) {
+
+ nx = IM_LEN(im,1)
+ ny = IM_LEN(im,2)
+ xoff = 1
+ yoff = 1
+ DP_WBUF(allstar) = DP_WEIGHTS(allstar)
+
+ # Read in some new data.
+ } else if (mode == READ_ONLY) {
+
+ call dp_albufl2r (DP_WEIGHTS(allstar), DP_WBUF(allstar),
+ llast1, llast2, line1, line2, flush)
+
+ if (flush == NO) {
+ nx = IM_LEN(im,1)
+ ny = line2 - line1 + 1
+ xoff = 1
+ yoff = line1
+ } else {
+ nx = 0
+ ny = 0
+ xoff = 0
+ yoff = 0
+ }
+
+ # Write out the old data and read in some new data.
+ } else if (mode == READ_WRITE) {
+
+ call dp_albufl2rw (DP_WEIGHTS(allstar), DP_WEIGHTS(allstar),
+ DP_WBUF(allstar), llast1, llast2, line1, line2, flush)
+
+ if (flush == NO) {
+ nx = IM_LEN(im,1)
+ ny = line2 - line1 + 1
+ xoff = 1
+ yoff = line1
+ } else {
+ nx = 0
+ ny = 0
+ xoff = 0
+ yoff = 0
+ }
+ }
+
+ # Update the required buffer parameters.
+ DP_WNX(allstar) = nx
+ DP_WNY(allstar) = ny
+ DP_WXOFF(allstar) = xoff
+ DP_WYOFF(allstar) = yoff
+
+ # Update the buffer definition which is currently not used.
+ DP_WLX(allstar) = xoff
+ DP_WMX(allstar) = max (xoff + nx - 1, 0)
+ DP_WLY(allstar) = yoff
+ DP_WMY(allstar) = max (yoff + ny - 1, 0)
+
+ return (DP_WBUF(allstar))
+end
+
+
+# DP_GST -- Return a pointer to the scratch image pixels. The scratch image
+# pointer is assumed to be NULL on the initial all. If the new line limits
+# are totally contained within the old line limits no action is taken and
+# the old line limits are returned. If the scratch image pixels are stored in a
+# scratch image the pixels must be accessed sequentially, otherwise an
+# error is returned.
+
+pointer procedure dp_gst (dao, im, line1, line2, mode, flush)
+
+pointer dao # pointer to the daophot structure
+pointer im # pointer to the input image
+int line1 # the lower line limit
+int line2 # the upper line limit
+int mode # input / output mode
+int flush # flush the buffer
+
+int nx, ny, xoff, yoff, llast1, llast2
+pointer allstar
+
+begin
+ allstar = DP_ALLSTAR(dao)
+ if (DP_SBUF(allstar) == NULL) {
+ llast1 = 0
+ llast2 = 0
+ } else if (flush == YES) {
+ line1 = llast1
+ line2 = llast2
+ } else if ((line1 >= llast1) && (line2 <= llast2)) {
+ line1 = llast1
+ line2 = llast2
+ return (DP_SBUF(allstar))
+ } else if (line1 < llast1)
+ call error (0,
+ "ERROR: Attempting to access scratch image pixels randomly")
+
+ # All the data is cached.
+ if (DP_CACHE (allstar, A_SUBT) == YES) {
+
+ nx = IM_LEN(im,1)
+ ny = IM_LEN(im,2)
+ xoff = 1
+ yoff = 1
+ DP_SBUF(allstar) = DP_SUBT(allstar)
+
+ # Read in some new data.
+ } else if (mode == READ_ONLY) {
+
+ call dp_albufl2r (DP_SUBT(allstar), DP_SBUF(allstar),
+ llast1, llast2, line1, line2, flush)
+
+ if (flush == NO) {
+ nx = IM_LEN(im,1)
+ ny = line2 - line1 + 1
+ xoff = 1
+ yoff = line1
+ } else {
+ nx = 0
+ ny = 0
+ xoff = 0
+ yoff = 0
+ }
+
+ # Write out the old data and read in some new data.
+ } else if (mode == READ_WRITE) {
+
+ call dp_albufl2rw (DP_SUBT(allstar), DP_SUBT(allstar),
+ DP_SBUF(allstar), llast1, llast2, line1, line2, flush)
+
+ if (flush == NO) {
+ nx = IM_LEN(im,1)
+ ny = line2 - line1 + 1
+ xoff = 1
+ yoff = line1
+ } else {
+ nx = 0
+ ny = 0
+ xoff = 0
+ yoff = 0
+ }
+ }
+
+ # Update the required buffer parameters.
+ DP_SNX(allstar) = nx
+ DP_SNY(allstar) = ny
+ DP_SXOFF(allstar) = xoff
+ DP_SYOFF(allstar) = yoff
+
+ # Update the buffer description which is not currently used.
+ DP_SLX(allstar) = xoff
+ DP_SMX(allstar) = max (xoff + nx - 1, 0)
+ DP_SLY(allstar) = yoff
+ DP_SMY(allstar) = max (yoff + ny - 1, 0)
+
+ return (DP_SBUF(allstar))
+end
+
+
+# DP_GDC -- Return a pointer to the subtracted image pixels. The subtracted
+# image pixels pointer is assumed to be NULL on the initial all. If the new
+# line limits are totally contained within the old line limits no action is
+# taken and the old line limits are returned. If the subtracted image pixels are
+# stored in a scratch image the pixels must be accessed sequentially,
+# otherwise an error is returned.
+
+pointer procedure dp_gdc (dao, im, line1, line2, mode, flush)
+
+pointer dao # pointer to the daophot strucuture
+pointer im # pointer to the input image
+int line1, line2 # the upper and lower line limits
+int mode # input / output mode
+int flush # flush the input data
+
+int nx, ny, xoff, yoff, llast1, llast2
+pointer allstar
+
+begin
+ allstar = DP_ALLSTAR(dao)
+ if (DP_DBUF(allstar) == NULL) {
+ llast1 = 0
+ llast2 = 0
+ } else if (flush == YES) {
+ line1 = llast1
+ line2 = llast2
+ } else if ((line1 >= llast1) && (line2 <= llast2)) {
+ line1 = llast1
+ line2 = llast2
+ return (DP_DBUF(allstar))
+ } else if (line1 < llast1)
+ call error (0,
+ "ERROR: Attempting to access subtracted image pixels randomly")
+
+ # All the data is cached.
+ if (DP_CACHE (allstar, A_DCOPY) == YES) {
+
+ nx = IM_LEN(im,1)
+ ny = IM_LEN(im,2)
+ xoff = 1
+ yoff = 1
+ DP_DBUF(allstar) = DP_DATA(allstar)
+
+ # Read in some new data.
+ } else if (mode == READ_ONLY) {
+
+ call dp_albufl2r (DP_DATA(allstar), DP_DBUF(allstar),
+ llast1, llast2, line1, line2, flush)
+
+ if (flush == NO) {
+ nx = IM_LEN(im,1)
+ ny = line2 - line1 + 1
+ xoff = 1
+ yoff = line1
+ } else {
+ nx = 0
+ ny = 0
+ xoff = 0
+ yoff = 0
+ }
+
+ # Write out the old data and read in some new data.
+ } else if (mode == READ_WRITE) {
+
+ call dp_albufl2rw (DP_DATA(allstar), DP_DATA(allstar),
+ DP_DBUF(allstar), llast1, llast2, line1, line2, flush)
+
+ if (flush == NO) {
+ nx = IM_LEN(im,1)
+ ny = line2 - line1 + 1
+ xoff = 1
+ yoff = line1
+ } else {
+ nx = 0
+ ny = 0
+ xoff = 0
+ yoff = 0
+ }
+ }
+
+ # Update the required buffer parameters.
+ DP_DNX(allstar) = nx
+ DP_DNY(allstar) = ny
+ DP_DXOFF(allstar) = xoff
+ DP_DYOFF(allstar) = yoff
+
+ # Update the buffer definition which is currently not used.
+ DP_DLX(allstar) = xoff
+ DP_DMX(allstar) = max (xoff + nx - 1, 0)
+ DP_DLY(allstar) = yoff
+ DP_DMY(allstar) = max (yoff + ny - 1, 0)
+
+ return (DP_DBUF(allstar))
+end
+
+
+# DP_ALBUFL2RW -- Maintain a buffer of image lines and which can be read from
+# an input image and written to an output image. The input and output images
+# may be the same but must have the same dimensions. A new buffer is created
+# when the buffer pointer is null and reallocated when the buffer changes size.
+
+procedure dp_albufl2rw (inim, outim, buf, llast1, llast2, line1, line2, flush)
+
+pointer inim # the input image pointer
+pointer outim # the output image pointer
+pointer buf # pointer to the internal buffer
+int llast1, llast2 # the line limits of the previous buffer
+int line1, line2 # the line limits of the requested buffer
+int flush # flush the output buffer
+
+int i, ncols, nlines, nllast, lout, nmove
+pointer buf1, buf2
+pointer imgl2r(), impl2r()
+
+define flush_ 11
+
+begin
+ # Write the data in the buffer to the output image and free
+ # the buffer.
+
+ if (flush == YES)
+ go to flush_
+
+ # Define the size of the current buffer.
+ ncols = IM_LEN(inim,1)
+ nlines = line2 - line1 + 1
+
+ # If the buffer pointer is undefined then allocate memory for the
+ # buffer.
+
+ if (buf == NULL) {
+ call malloc (buf, ncols * nlines, TY_REAL)
+ llast1 = 0
+ llast2 = 0
+ nllast = 0
+ } else
+ nllast = llast2 - llast1 + 1
+
+ # 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)
+ buf2 = buf2 + ncols
+ }
+ }
+
+ # Now move the remaining lines to the beginning of the buffer.
+
+ nmove = 0
+ if (llast2 >= line1) {
+ buf1 = buf
+ buf2 = buf + ncols * (line1 - llast1)
+ do i = line1, llast2 {
+ if (buf1 != buf2)
+ call amovr (Memr[buf2], Memr[buf1], ncols)
+ nmove = nmove + 1
+ buf2 = buf2 + ncols
+ buf1 = buf1 + ncols
+ }
+ }
+
+ # Resize the buffer if necessary.
+
+ if (nlines > nllast)
+ call realloc (buf, ncols * nlines, TY_REAL)
+
+ # Read only the image lines with are different from the last buffer.
+
+ if (line2 > llast2) {
+ buf1 = buf + ncols * nmove
+ lout = max (line1, llast2 + 1)
+ do i = lout, line2 {
+ buf2 = imgl2r (inim, i)
+ call amovr (Memr[buf2], Memr[buf1], ncols)
+ buf1 = buf1 + ncols
+ }
+ }
+
+ # Save the buffer parameters.
+ llast1 = line1
+ llast2 = line2
+
+ if (flush == NO)
+ return
+flush_
+ # Flush the remaining portion of the buffer to the output image
+ # and free the buffer space.
+
+ if (buf != NULL) {
+
+ buf2 = buf
+ do i = llast1, llast2 {
+ buf1 = impl2r (outim, i)
+ call amovr (Memr[buf2], Memr[buf1], ncols)
+ buf2 = buf2 + ncols
+ }
+ call imflush (outim)
+
+ call mfree (buf, TY_REAL)
+ }
+
+ buf = NULL
+end
+
+
+# DP_ALBUFL2R -- Maintain a buffer of image lines which can be read
+# sequentially from an input image. The buffer pointer must be initialized
+# to NULL. A new buffer is created when the buffer pointer is null and
+# reallocated when the buffer increases in size.
+
+procedure dp_albufl2r (inim, buf, llast1, llast2, line1, line2, flush)
+
+pointer inim # pointer to the input image
+pointer buf # pointer to the internal buffer
+int llast1, llast2 # the line limits of the previous buffer
+int line1, line2 # the line limits of the requested buffer
+int flush # flush the output buffer
+
+int i, ncols, nlines, nllast, lout, nmove
+pointer buf1, buf2
+pointer imgl2r()
+
+define flush_ 11
+
+begin
+
+ # Write the data in the buffer to the output image and free
+ # the buffer.
+
+ if (flush == YES)
+ go to flush_
+
+ # Define the size parameters for the new buffer.
+
+ ncols = IM_LEN(inim,1)
+ nlines = line2 - line1 + 1
+
+ # If the buffer pointer is undefined then allocate memory for the
+ # buffer.
+
+ if (buf == NULL) {
+ call malloc (buf, ncols * nlines, TY_REAL)
+ llast1 = 0
+ llast2 = 0
+ nllast = 0
+ } else
+ nllast = llast2 - llast1 + 1
+
+ # Now move the remaining lines to the beginning of the buffer.
+
+ nmove = 0
+ if (llast2 >= line1) {
+ buf1 = buf
+ buf2 = buf + ncols * (line1 - llast1)
+ do i = line1, llast2 {
+ if (buf1 != buf2)
+ call amovr (Memr[buf2], Memr[buf1], ncols)
+ nmove = nmove + 1
+ buf2 = buf2 + ncols
+ buf1 = buf1 + ncols
+ }
+ }
+
+ # Resize the buffer if necessary.
+
+ if (nlines > nllast)
+ call realloc (buf, ncols * nlines, TY_REAL)
+
+ # Read only the image lines with are different from the last buffer.
+
+ if (line2 > llast2) {
+ buf1 = buf + ncols * nmove
+ lout = max (line1, llast2 + 1)
+ do i = lout, line2 {
+ buf2 = imgl2r (inim, i)
+ call amovr (Memr[buf2], Memr[buf1], ncols)
+ buf1 = buf1 + ncols
+ }
+ }
+
+ # Save the buffer parameters.
+ llast1 = line1
+ llast2 = line2
+
+ if (flush == NO)
+ return
+flush_
+
+ # Free the buffer space.
+ if (buf != NULL)
+ call mfree (buf, TY_REAL)
+ buf = NULL
+end