diff options
Diffstat (limited to 'pkg/images/tv/imedit/epreplace.x')
-rw-r--r-- | pkg/images/tv/imedit/epreplace.x | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/pkg/images/tv/imedit/epreplace.x b/pkg/images/tv/imedit/epreplace.x new file mode 100644 index 00000000..c79b943f --- /dev/null +++ b/pkg/images/tv/imedit/epreplace.x @@ -0,0 +1,260 @@ +include <mach.h> +include <imhdr.h> +include "epix.h" + + +# EP_REPLACE -- Replace all pixels that are ==, <=, or >= to the value at the +# reference pixel. Since this allocates and gets sections this may result in +# the entire image being put into memory with potential memory problems. It +# is intended for use with masks that have regions of constant values. +# +# Note that this version assumes the pixel values may be ACE object masks. + + +procedure ep_replacei (ep, x, y, key) + +pointer ep #I EPIX pointer +int x, y #I Reference pixel +int key #I Key + +int i, j, nc, nl, x1, x2, y1, y2 +real minv, maxv +int val, ival, oval +pointer im, buf + +int andi() +pointer imgs2i(), imps2i() +errchk imgs2i, imps2i + +begin + im = EP_IM(ep) + nc = IM_LEN(im,1) + nl = IM_LEN(im,2) + + EP_INDATA(ep) = NULL + EP_OUTDATA(ep) = NULL + if (x < 1 || x > nc || y < 1 || y > nl) { + call eprintf ("Pixel out of bounds\n") + return + } + + # Get reference pixel value and replacement value. + buf = imgs2i (im, x, x, y, y) + ival = andi (Memi[buf], 0777777B) + oval = EP_VALUE(ep) + minv = EP_MINVALUE(ep) + maxv = EP_MAXVALUE(ep) + if (IS_INDEFR(minv)) + minv = -MAX_REAL + if (IS_INDEFR(maxv)) + minv = MAX_REAL + + # This requires two passes to fit into the subraster model. + # First pass finds the limits of the change and the second + # makes the change. + + x1 = x+1; x2 = x-1; y1 = y+1; y2 = y-1 + do j = 1, nl { + buf = imgs2i (im, 1, nc, j, j) + switch (key) { + case '=': + do i = 1, nc { + val = andi (Memi[buf+i-1], 0777777B) + if (val != ival || val == oval || val < minv || val > maxv) + next + x1 = min (x1, i) + x2 = max (x2, i) + y1 = min (y1, j) + y2 = max (y2, j) + } + case '<': + do i = 1, nc { + val = andi (Memi[buf+i-1], 0777777B) + if (val > ival || val == oval || val < minv || val > maxv) + next + x1 = min (x1, i) + x2 = max (x2, i) + y1 = min (y1, j) + y2 = max (y2, j) + } + case '>': + do i = 1, nc { + val = andi (Memi[buf+i-1], 0777777B) + if (val < ival || val == oval || val < minv || val > maxv) + next + x1 = min (x1, i) + x2 = max (x2, i) + y1 = min (y1, j) + y2 = max (y2, j) + } + } + } + + # No pixels to change. + if (x2 < x1 || y2 < y1) + return + + # Set the rasters and change the pixels. + EP_X1(ep) = x1 + EP_X2(ep) = x2 + EP_Y1(ep) = y1 + EP_Y2(ep) = y2 + EP_NX(ep) = EP_X2(ep) - EP_X1(ep) + 1 + EP_NY(ep) = EP_Y2(ep) - EP_Y1(ep) + 1 + EP_NPTS(ep) = EP_NX(ep) * EP_NY(ep) + + EP_OUTDATA(ep) = imps2i (im, EP_X1(ep), EP_X2(ep), EP_Y1(ep), + EP_Y2(ep)) + EP_INDATA(ep) = imgs2i (im, EP_X1(ep), EP_X2(ep), EP_Y1(ep), + EP_Y2(ep)) + + buf = EP_OUTDATA(ep) + call amovi (Memi[EP_INDATA(ep)], Memi[buf], EP_NPTS(ep)) + switch (key) { + case '=': + do i = 1, EP_NPTS(ep) { + val = andi (Memi[buf], 0777777B) + if (val == ival && val >= minv && val <= maxv) + Memi[buf] = oval + buf = buf + 1 + } + case '<': + do i = 1, EP_NPTS(ep) { + val = andi (Memi[buf], 0777777B) + if (val <= ival && val >= minv && val <= maxv) + Memi[buf] = oval + buf = buf + 1 + } + case '>': + do i = 1, EP_NPTS(ep) { + val = andi (Memi[buf], 0777777B) + if (val >= ival && val >= minv && val <= maxv) + Memi[buf] = oval + buf = buf + 1 + } + } +end + +procedure ep_replacer (ep, x, y, key) + +pointer ep #I EPIX pointer +int x, y #I Reference pixel +int key #I Key + +int i, j, nc, nl, x1, x2, y1, y2 +real minv, maxv +real val, ival, oval +pointer im, buf + +pointer imgs2r(), imps2r() +errchk imgs2r, imps2r + +begin + im = EP_IM(ep) + nc = IM_LEN(im,1) + nl = IM_LEN(im,2) + + EP_INDATA(ep) = NULL + EP_OUTDATA(ep) = NULL + if (x < 1 || x > nc || y < 1 || y > nl) { + call eprintf ("Pixel out of bounds\n") + return + } + + # Get reference pixel value and replacement value. + buf = imgs2r (im, x, x, y, y) + ival = Memr[buf] + oval = EP_VALUE(ep) + minv = EP_MINVALUE(ep) + maxv = EP_MAXVALUE(ep) + if (IS_INDEFR(minv)) + minv = -MAX_REAL + if (IS_INDEFR(maxv)) + minv = MAX_REAL + + # This requires two passes to fit into the subraster model. + # First pass finds the limits of the change and the second + # makes the change. + + x1 = x+1; x2 = x-1; y1 = y+1; y2 = y-1 + do j = 1, nl { + buf = imgs2r (im, 1, nc, j, j) + switch (key) { + case '=': + do i = 1, nc { + val = Memr[buf+i-1] + if (val != ival || val == oval || val < minv || val > maxv) + next + x1 = min (x1, i) + x2 = max (x2, i) + y1 = min (y1, j) + y2 = max (y2, j) + } + case '<': + do i = 1, nc { + val = Memr[buf+i-1] + if (val > ival || val == oval || val < minv || val > maxv) + next + x1 = min (x1, i) + x2 = max (x2, i) + y1 = min (y1, j) + y2 = max (y2, j) + } + case '>': + do i = 1, nc { + val = Memr[buf+i-1] + if (val < ival || val == oval || val < minv || val > maxv) + next + x1 = min (x1, i) + x2 = max (x2, i) + y1 = min (y1, j) + y2 = max (y2, j) + } + } + } + + # No pixels to change. + if (x2 < x1 || y2 < y1) + return + + # Set the rasters and change the pixels. + EP_X1(ep) = x1 + EP_X2(ep) = x2 + EP_Y1(ep) = y1 + EP_Y2(ep) = y2 + EP_NX(ep) = EP_X2(ep) - EP_X1(ep) + 1 + EP_NY(ep) = EP_Y2(ep) - EP_Y1(ep) + 1 + EP_NPTS(ep) = EP_NX(ep) * EP_NY(ep) + + EP_OUTDATA(ep) = imps2r (im, EP_X1(ep), EP_X2(ep), EP_Y1(ep), + EP_Y2(ep)) + EP_INDATA(ep) = imgs2r (im, EP_X1(ep), EP_X2(ep), EP_Y1(ep), + EP_Y2(ep)) + + buf = EP_OUTDATA(ep) + call amovr (Memr[EP_INDATA(ep)], Memr[buf], EP_NPTS(ep)) + switch (key) { + case '=': + do i = 1, EP_NPTS(ep) { + val = Memr[buf] + if (val == ival && val >= minv && val <= maxv) + Memr[buf] = oval + buf = buf + 1 + } + case '<': + do i = 1, EP_NPTS(ep) { + val = Memr[buf] + if (val <= ival && val >= minv && val <= maxv) + Memr[buf] = oval + buf = buf + 1 + } + case '>': + do i = 1, EP_NPTS(ep) { + val = Memr[buf] + if (val >= ival && val >= minv && val <= maxv) + Memr[buf] = oval + buf = buf + 1 + } + } +end + |