aboutsummaryrefslogtreecommitdiff
path: root/noao/nproto/ace/skygrow.xNEW
diff options
context:
space:
mode:
Diffstat (limited to 'noao/nproto/ace/skygrow.xNEW')
-rw-r--r--noao/nproto/ace/skygrow.xNEW89
1 files changed, 89 insertions, 0 deletions
diff --git a/noao/nproto/ace/skygrow.xNEW b/noao/nproto/ace/skygrow.xNEW
new file mode 100644
index 00000000..8c78a4bc
--- /dev/null
+++ b/noao/nproto/ace/skygrow.xNEW
@@ -0,0 +1,89 @@
+include <imhdr.h>
+
+task skygrow = t_skygrow
+
+procedure t_skygrow ()
+
+int nc, nl
+pointer im, sky, immap(), imps2r(), imgs2r()
+
+begin
+ im = immap ("skyblk", READ_WRITE, 0)
+ nc = IM_LEN(im,1)
+ nl = IM_LEN(im,2)
+ sky = imps2r (im, 1, nc, 1, nl)
+ call amovr (Memr[imgs2r(im,1,nc,1,nl)], Memr[sky], nc*nl)
+ call skygrow (sky, nc, nl, 1.5, 0.)
+ call imunmap (im)
+end
+
+
+procedure skygrow (sky, nc, nl, grow, growval)
+
+pointer sky # Pointer tor eal sky array to be grown
+int nc, nl # Size of sky array
+real grow # Grow radius
+real growval # Value to be grown
+
+int i, j, k, l1, l2, ngrow, nbufs
+real grow2, growval1, val1, val2, y2
+pointer buf, buf1, buf2, ptr
+errchk calloc
+
+begin
+ # Initialize.
+ ngrow = int (grow)
+ grow2 = grow * grow
+ nbufs = min (1 + 2 * ngrow, nl)
+ if (growval == 0.) {
+ growval1 = 1.
+ call malloc (buf, nc*nbufs, TY_REAL)
+ call amovkr (growval1, Memr[buf], nc*nbufs)
+ } else {
+ growval1 = 0.
+ call calloc (buf, nc*nbufs, TY_REAL)
+ }
+
+ l1 = 1; l2 = 1
+ while (l1 <= nl) {
+ buf1 = sky + (l1 - 1) * nc
+ buf2 = buf + mod (l1, nbufs) * nc
+ do i = 1, nc {
+ val1 = Memr[buf1]
+ val2 = Memr[buf2]
+ if (val1 == growval) {
+ do j = max(1,l1-ngrow), min (nl,l1+ngrow) {
+ ptr = buf + mod (j, nbufs) * nc - 1
+ y2 = (j - l1) ** 2
+ do k = max(1,i-ngrow), min (nc,i+ngrow) {
+ if ((k-i)**2 + y2 > grow2)
+ next
+ Memr[ptr+k] = growval
+ }
+ }
+ } else if (val2 != growval)
+ Memr[buf2] = val1
+ buf1 = buf1 + 1
+ buf2 = buf2 + 1
+ }
+
+ if (l1 > ngrow) {
+ while (l2 <= nl) {
+ buf1 = sky + (l2 - 1) * nc
+ buf2 = buf + mod (l2, nbufs) * nc
+ do i = 1, nc {
+ Memr[buf1] = Memr[buf2]
+ Memr[buf2] = growval1
+ buf1 = buf1 + 1
+ buf2 = buf2 + 1
+ }
+ l2 = l2 + 1
+ if (l1 != nl)
+ break
+ }
+ }
+ l1 = l1 + 1
+ }
+
+ call mfree (buf, TY_REAL)
+end