diff options
Diffstat (limited to 'pkg/images/tv/iis/iism70/zsnapinit.x')
-rw-r--r-- | pkg/images/tv/iis/iism70/zsnapinit.x | 314 |
1 files changed, 314 insertions, 0 deletions
diff --git a/pkg/images/tv/iis/iism70/zsnapinit.x b/pkg/images/tv/iis/iism70/zsnapinit.x new file mode 100644 index 00000000..48ed083c --- /dev/null +++ b/pkg/images/tv/iis/iism70/zsnapinit.x @@ -0,0 +1,314 @@ +# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + +include <mach.h> +include <fset.h> +include "iis.h" +include "../lib/ids.h" + +define XSPLIT LEN_SELECT+1 +define YSPLIT LEN_SELECT+2 + +# ZSNAP_INIT -- initialize snap data structures. + +procedure zsnap_init(kind) + +short kind + +pointer ptr +short gram[LEN_GRAM] +short select[LEN_SELECT+2] # include split points +short color[4] +short frame[2] +short cds, off, num +short xsplit, x_right + +int i, j, k, temp +int khp, val, frame_count +bool used, mono +int and(), or(), fstati() + +include "zsnap.com" +include "iis.com" +include "../lib/ids.com" + +begin + i_snap = true + sn_frame = iframe + sn_bitpl = iplane + sn_fd = i_out + call flush(sn_fd) + call fseti(sn_fd, F_CANCEL, OK) + prev_y = -1 + + # Determine what snap range to do + if (kind == IDS_SNAP_MONO) + mono= true + else + mono = false + + switch (kind) { + case IDS_SNAP_RGB: + # Note: BLU < RD and covers full color range + sn_start = BLU + sn_end = RD + + case IDS_SNAP_MONO, IDS_SNAP_BLUE: + sn_start = BLU + sn_end = BLU + + case IDS_SNAP_GREEN: + sn_start = GR + sn_end = GR + + case IDS_SNAP_RED: + sn_start = RD + sn_end = RD + } + + # Find out which planes are active -- any quadrant + + call iishdr (IREAD, LEN_SELECT+2, COMMAND+LUT, ADVXONTC, 0, 0, 0) + call iisio (select, (LEN_SELECT+2)*SZB_CHAR) + + # record split point. Adjust x_split so 511 becomes + # 512. This is so the "right" side of a quadrant is given by one + # plus the last used point. + + ysplit = select[YSPLIT] + xsplit = select[XSPLIT] + x_right = xsplit + if (x_right == IIS_XDIM-1) + x_right = IIS_XDIM + + + # For certain split positions, some quadrants don't appear at all. + + if (xsplit == 0) + call nullquad (0, 2, select) + else if (xsplit == IIS_XDIM-1) + call nullquad (1, 3, select) + if (ysplit == 0) + call nullquad (0, 1, select) + else if (ysplit == IIS_YDIM-1) + call nullquad (2, 3, select) + + # Which frames are active, in any quadrant? + + temp = 0 + do i = 1, LEN_SELECT + temp = or (temp, int(select[i])) + do i = 1, i_maxframes { + if ( and (temp, 2**(i-1)) != 0) + on[i] = true + else + on[i] = false + } + + # Find out where each active plane starts and stops. Split points + # are screen coordinates, not picture coordinates. Graphics does + # not split (!). left coord is inclusive, right is one beyond end. + # left/right dimensions: color, above/below_ysplit, image_plane. + # Frame_count counts frames in use. Could be clever and only count + # active frames whose pixels are on the screen (pan/zoom effects). + + frame_count = 0 + do i = 1, i_maxframes { + if ( !on[i] ) + next + else + frame_count = frame_count + 1 + do j = sn_start, sn_end { # implicit BLUE (GREEN RED) + # quadrants for IIS are UL:0, UR:1, LL:2, LR:3 + do k = 0, 3 { + temp = select[(j-1)*4 + k + 1] + used = (and(temp, 2**(i-1)) != 0) + khp = k/2 + 1 + switch (k) { + case 0, 2: + if (used) { + left[j,khp,i] = 0 + right[j,khp,i] = x_right + } else { + left[j,khp,i] = -1 + } + + case 1, 3: + if (used) { + if ( left[j,khp,i] == -1) + left[j,khp,i] = xsplit + right[j,khp,i] = IIS_XDIM + } + } # end switch + } # end k ( quad loop) + } # end j ( color loop) + } # end i ( frame loop) + + # now do range and offset + + cds = IDS_READ + num = 3 + color[1] = IDS_BLUE + color[2] = IDS_GREEN + color[3] = IDS_RED + color[4] = IDS_EOD + call iisrange(cds, color, num, range) + call iisoffset(cds, color, num, offset) + do i = sn_start, sn_end + range[i] = 2**range[i] + + # now allocate memory for all the various tables + + call malloc (input, IIS_XDIM, TY_SHORT) + call malloc (answer, IIS_XDIM, TY_SHORT) + call malloc (zs, IIS_XDIM, TY_SHORT) + # for each color: + do j = sn_start, sn_end { + call malloc (result[j], IIS_XDIM, TY_SHORT) + call malloc (ofmp[j], LEN_OFM, TY_SHORT) + call malloc (grp[j], LEN_GRAM/2, TY_SHORT) + do i = 1, i_maxframes { + if ( on[i] ) + call malloc (lutp[j,i], LEN_LUT, TY_SHORT) + } + } + call malloc (grbit_on, IIS_XDIM, TY_INT) + + # fill these up + + cds = IDS_READ + off = 1 + frame[2] = IDS_EOD + color[2] = IDS_EOD + do j = sn_start, sn_end { + if (j == BLU) + color[1] = IDS_BLUE + else if ( j == GR) + color[1] = IDS_GREEN + else + color[1] = IDS_RED + num = LEN_OFM + call iisofm (cds, color, off, num, Mems[ofmp[j]]) + do i = 1, i_maxframes { + if (on[i]) { + frame[1] = i + num = LEN_LUT + call iislut (cds, frame, color, off, num, Mems[lutp[j,i]]) + } + } + } + + # the graphics planes ... assume insert mode!! + # Note if any graphics mapping ram is in use...if no graphics on, + # snap can run faster. + + call iishdr (IREAD, LEN_GRAM, GRAPHICS, ADVXONTC, 0, 0, 0) + call iisio (gram, LEN_GRAM * SZB_CHAR) + + gr_in_use = false + do j = sn_start, sn_end + call aclrs(Mems[grp[j]], LEN_GRAM/2) + # Leave first one 0; don't mess with cursor plane + do i = 2, LEN_GRAM/2 { + temp = and (77777B, int(gram[i])) + if (temp != 0) + gr_in_use = true + if (! mono) { + do j = sn_start, sn_end + switch (j) { + case RD: + Mems[grp[RD]+i-1] = and (temp,76000B)/32 + case GR: + Mems[grp[GR]+i-1] = and (temp, 1740B) + case BLU: + Mems[grp[BLU]+i-1] = and (temp, 37B)*32 + } + } else { + # All graphics planes + val = or ( and (temp, 76000B)/32, and (temp, 1740B)) + val = or ( and (temp, 37B)*32, val) + Mems[grp[sn_start]+i-1] = val + } + } + + if (gr_in_use) + frame_count = frame_count + 1 + if (frame_count > 1) { + multi_frame = true + # set buffer to size of one line + zbufsize = fstati (sn_fd, F_BUFSIZE) + call fseti (sn_fd, F_BUFSIZE, IIS_XDIM) + } else + multi_frame = false + + # Now adjust look up tables for fact that they do 9 bit 2's complement + # arithmetic! + do j = sn_start, sn_end { + do i = 1, i_maxframes { + if (on[i]) { + ptr = lutp[j,i] + do k = 1, LEN_LUT { + if (Mems[ptr+k-1] > 255 ) + Mems[ptr+k-1] = Mems[ptr+k-1] - 512 + } + } + } + } +end + + +# NULLQUAD -- zero out lut mapping for quadrants that cannot appear on +# screen + +procedure nullquad (q, p, sel) + +int q, p # two quadrants to eliminate, zero based +short sel[ARB] # the mapping array + +int i + +begin + do i = 0,2 { + sel[i*4 + q + 1] = 0 + sel[i*4 + p + 1] = 0 + } +end + + +# ZSNAP_DONE -- reset paramters + +procedure zsnap_done() + +int i,j + +include "iis.com" +include "zsnap.com" +include "../lib/ids.com" + +begin + if ( ! i_snap ) + return + i_snap = false + call fseti(sn_fd, F_CANCEL, OK) + if (multi_frame) { + # restore buffering + call fseti (sn_fd, F_BUFSIZE, zbufsize) + } + iframe = sn_frame + iplane = sn_bitpl + + # release storage + call mfree (grbit_on, TY_INT) + do j = sn_start, sn_end { + call mfree (result[j], TY_SHORT) + call mfree (ofmp[j], TY_SHORT) + call mfree (grp[j], TY_SHORT) + do i = 1, i_maxframes { + if ( on[i] ) + call mfree (lutp[j,i], TY_SHORT) + } + } + + call mfree (zs, TY_SHORT) + call mfree (answer, TY_SHORT) + call mfree (input, TY_SHORT) +end |