DIRECTORY AIS, Args, CedarProcess, ColorTrixBasics, ColorTrixDispatch, Commander, FileNames, ImagerPixelMap, ImagerSample, IO, PixelMapOps, Process, Real, Rope; ColorTrixMiscCommandsImpl: CEDAR PROGRAM IMPORTS AIS, Args, CedarProcess, ColorTrixBasics, ColorTrixDispatch, FileNames, ImagerPixelMap, ImagerSample, IO, PixelMapOps, Process, Real, Rope ~ BEGIN ROPE: TYPE ~ Rope.ROPE; PixelMap: TYPE ~ ImagerPixelMap.PixelMap; DeviceRectangle: TYPE ~ ImagerPixelMap.DeviceRectangle; PixelProc: TYPE ~ PROC [x, y: NAT] RETURNS [CARDINAL]; PixelArray: TYPE ~ REF PixelArrayRep; PixelArrayRep: TYPE ~ RECORD [ x, y, dx, dy: NAT _ 0, element: SEQUENCE length: NAT OF ImagerSample.SampleBuffer ]; nullPm: PixelMap _ [0, 0, 0, 0, 0, 0, NIL]; InitializePixelArray: PUBLIC PROC [w: DeviceRectangle] RETURNS [pa: PixelArray] ~ { pa _ NEW[PixelArrayRep[w.sMin+w.sSize]]; pa.x _ w.fMin; pa.y _ w.sMin; pa.dx _ w.fSize; pa.dy _ w.sSize; }; CreatePixelArray: PUBLIC PROC [w: DeviceRectangle] RETURNS [pa: PixelArray] ~ { pa _ InitializePixelArray[w]; FOR y: INT IN [pa.y..pa.y+pa.dy) DO pa[y] _ ImagerSample.NewBuffer[iSize: 1, jSize: pa.dx]; ENDLOOP; }; PixelArrayFromPixelMap: PUBLIC PROC [pm: PixelMap] RETURNS [pa: PixelArray] ~ { pa _ InitializePixelArray[ImagerPixelMap.BoundedWindow[pm]]; FOR y: INT IN [pa.y..pa.y+pa.dy) DO pa[y] _ ImagerSample.NewBuffer[iSize: 1, jSize: pa.dx]; PixelMapOps.GetF[pm, y, pa.x, pa[y], 0, 0, pa.dx]; ENDLOOP; }; PixelArrayFromAIS: PUBLIC PROC [fileName: ROPE] RETURNS [pa: PixelArray] ~ { ais: AIS.FRef _ AIS.OpenFile[fileName]; wRef: AIS.WRef _ AIS.OpenWindow[ais]; w: INTEGER _ wRef.lastPixel-wRef.firstPixel+1; h: INTEGER _ wRef.lastScan-wRef.firstScan+1; linePm: PixelMap _ ImagerPixelMap.Create[3, [0, 0, 1, w]]; lineBuf: AIS.Buffer _ [linePm.refRep.words, linePm.refRep.pointer]; pa _ CreatePixelArray[[0, 0, h, w]]; FOR y: NAT IN [0..h) DO TRUSTED {AIS.UnsafeReadLine[wRef, lineBuf, y]}; PixelMapOps.GetF[linePm, 0, pa.x, pa[y], 0, 0, pa.dx]; Process.CheckForAbort[]; ENDLOOP; AIS.CloseWindow[wRef]; }; PixelMapFromPixelArray: PUBLIC PROC [pa: PixelArray] RETURNS [pm: PixelMap] ~ { pm _ ImagerPixelMap.Create[3, [0, 0, pa.dy, pa.dx]]; FOR y: NAT IN [pa.y..pa.y+pa.dy) DO PixelMapOps.PutF[pixelMap: pm, s: y, f: pa.x, buffer: pa[y], bi: 0, bj: 0, count: pa.dx]; ENDLOOP; }; PixelArrayFromColorDisplay: PUBLIC PROC RETURNS [PixelArray] ~ { RETURN[PixelArrayFromPixelMap[ColorTrixBasics.GetColorDisplayPm[]]]; }; PixelArrayFromWindowedColorDisplay: PUBLIC PROC [cmd: Commander.Handle] RETURNS [PixelArray] ~ { RETURN[PixelArrayFromPixelMap[ColorTrixDispatch.GetWindowedPm[cmd]]]; }; ShowPixelArray: PUBLIC PROC [pa: PixelArray] ~ { ColorTrixBasics.ShowPm[PixelMapFromPixelArray[pa]]; }; DoToPixelArray: PUBLIC PROC [pa: PixelArray, proc: PixelProc, pm: PixelMap _ nullPm] ~ { FOR y: NAT IN [pa.y..pa.y+pa.dy) DO Process.CheckForAbort[]; FOR x: NAT IN [pa.x..pa.x+pa.dx) DO pa[y][x] _ proc[x, y]; ENDLOOP; IF pm # nullPm THEN PixelMapOps.PutF[pm, y, pa.x, pa[y], 0, 0, pa.dx]; ENDLOOP; }; CtBlur: PUBLIC Commander.CommandProc ~ { Blur: ColorTrixBasics.ValueProc ~ { sum: CARDINAL _ 0; IF x IN [x0..x1] AND y IN [y0..y1] THEN { FOR yy: INTEGER IN [y-radius..y+radius] DO FOR xx: INTEGER IN [x-radius..x+radius] DO sum _ sum+image[yy][xx]; ENDLOOP; ENDLOOP; RETURN[sum/denom]; } ELSE { n: NAT _ 0; FOR yy: INTEGER IN [y-radius..y+radius] DO IF yy IN [y0..y1] THEN FOR xx: INTEGER IN [x-radius..x+radius] DO IF xx IN [x0..x1] THEN {sum _ sum+image[yy][xx]; n _ n+1;} ENDLOOP; ENDLOOP; RETURN[IF n = 0 THEN 0 ELSE sum/n]; }; }; image: PixelArray _ PixelArrayFromColorDisplay[]; radius: NAT ~ IF Args.NArgs[cmd] = 1 THEN Args.ArgInt[cmd].int ELSE 1; denom: NAT ~ (2*radius+1)*(2*radius+1); x0: INTEGER ~ image.x+radius; y0: INTEGER ~ image.y+radius; x1: INTEGER ~ image.x+image.dx-1-radius; y1: INTEGER ~ image.y+image.dy-1-radius; ColorTrixBasics.PutFrame[ColorTrixDispatch.GetWindowedPm[cmd], Blur]; }; FullName: PROC [baseName: ROPE] RETURNS [ROPE] ~ { RETURN[FileNames.StripVersionNumber[FileNames.ResolveRelativePath[baseName]]]; }; CtMatte: PUBLIC Commander.CommandProc ~ { IF Args.NArgs[cmd] # 2 THEN RETURN[$Failure] ELSE { Matte: PixelProc ~ {RETURN[image[y][x]*matte[y][x]/255]}; Overlay: PixelProc ~ { a: REAL ~ (1.0/255.0)*REAL[matte[y][x]]; RETURN[Real.RoundI[REAL[bgrnd[y][x]]+a*(REAL[image[y][x]]-REAL[bgrnd[y][x]])]]; }; matting: BOOL _ Rope.Equal[cmd.command, "Matte", FALSE]; display: PixelMap _ ColorTrixDispatch.GetWindowedPm[cmd]; bgrnd: PixelArray _ IF matting THEN NIL ELSE PixelArrayFromColorDisplay[]; image: PixelArray _ PixelArrayFromAIS[FullName[Args.GetRope[cmd, 0]]]; matte: PixelArray _ PixelArrayFromAIS[FullName[Args.GetRope[cmd, 1]]]; DoToPixelArray[image, IF matting THEN Matte ELSE Overlay, display]; }; }; CtMedial: PUBLIC Commander.CommandProc ~ { v0, v1, count: CARDINAL; SetUp: PROC [x, y: CARDINAL] ~ { Process.CheckForAbort[]; v0 _ in[y][x]; count _ 0; }; Test: PROC [x, y, xx, yy: CARDINAL, noCompare: BOOL] ~ INLINE { val: CARDINAL; v1 _ in[y][x]; IF v0 # v1 THEN {count _ 0; v0 _ v1} ELSE IF count < 255 THEN count _ count+1; val _ MIN[count, out[yy][xx]+1]; IF noCompare THEN out[y][x] _ val ELSE IF val < out[y][x] THEN out[y][x] _ val; }; pm: PixelMap _ ColorTrixDispatch.GetWindowedPm[cmd]; w: ColorTrixBasics.DeviceRectangle ~ ImagerPixelMap.BoundedWindow[pm]; in: PixelArray ~ PixelArrayFromPixelMap[pm]; out: PixelArray ~ CreatePixelArray[w]; x0: CARDINAL ~ w.fMin; y0: CARDINAL ~ w.sMin; x1: CARDINAL ~ w.fMin+w.fSize-1; y1: CARDINAL ~ w.sMin+w.sSize-1; CedarProcess.SetPriority[background]; FOR x: NAT IN [x0..x1] DO out[y0][x] _ out[y1][x] _ 0; ENDLOOP; FOR y: NAT IN [y0..y1] DO out[y][x0] _ out[y][x1] _ 0; ENDLOOP; IO.PutRope[cmd.out, "Doing left to right, "]; FOR y: NAT IN (y0..y1) DO -- downwards, left to right SetUp[x0, y]; FOR x: NAT IN (x0..x1) DO Test[x, y, x, y-1, TRUE]; ENDLOOP; ENDLOOP; IO.PutRope[cmd.out, "right to left, "]; FOR y: NAT DECREASING IN (y0..y1) DO -- upwards, right to left SetUp[x1, y]; FOR x: NAT DECREASING IN (x0..x1) DO Test[x, y, x, y+1, FALSE]; ENDLOOP; ENDLOOP; IO.PutRope[cmd.out, "up to down, "]; FOR x: NAT IN (x0..x1) DO -- rightwards, up to down SetUp[x, y0]; FOR y: NAT IN (y0..y1) DO Test[x, y, x-1, y, FALSE]; ENDLOOP; ENDLOOP; IO.PutRope[cmd.out, "and down to up\n"]; FOR x: NAT DECREASING IN (x0..x1) DO -- leftwards, down to up SetUp[x, y1]; FOR y: NAT DECREASING IN (y0..y1) DO Test[x, y, x+1, y, FALSE]; ENDLOOP; ENDLOOP; ShowPixelArray[out]; }; ColorTrixDispatch.RegisterCtOp["Medial", CtMedial, "Ct Medial: pixel values increase towards medial axis of regions."]; ColorTrixDispatch.RegisterCtOp["Matte", CtMatte, "Ct Matte ."]; ColorTrixDispatch.RegisterCtOp["Overlay", CtMatte, "Ct Overlay ."]; ColorTrixDispatch.RegisterCtOp["Blur", CtBlur, "Ct Blur [radius, default = 1]."]; END. โColorTrixMiscCommandsImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Bloomenthal, February 17, 1987 11:00:12 pm PST Elements are stored by row, then column; that is, pixelArray[y][x]. Start Code ส N˜šœ™Jšœ ฯmœ1™˜DJ˜J˜—š "œž œ˜GJšžœ˜Jšžœ?˜EJ˜J˜—š œžœžœ˜0Jšœ3˜3J˜J˜—šะbnœžœžœ=˜Xšžœžœžœž˜#Jšœ˜šžœžœžœž˜#Jšœ˜Jšžœ˜—J–า[pixelMap: ImagerPixelMap.PixelMap, s: INTEGER, f: INTEGER, buffer: ImagerSample.SampleBuffer, bi: NAT, bj: NAT, count: NAT, srcFunc: PrincOps.SrcFunc _ null, dstFunc: PrincOps.DstFunc _ null]šžœ žœ3˜FJšžœ˜—Jšœ˜J˜—šกœžœ˜(š œ˜#Jšœžœ˜šžœžœ žœžœ ˜"šžœ˜šžœžœžœž˜*šžœžœžœž˜*J˜Jšžœ˜—Jšžœ˜—Jšžœ ˜J˜—šžœ˜Jšœžœ˜ šžœžœžœž˜*š žœžœ žœžœžœžœž˜AJšžœžœ žœ$˜:Jšžœ˜—Jšžœ˜—Jšžœžœžœžœ˜#J˜——Jšœ˜—Jšœ1˜1Jš œžœžœžœžœ˜FJšœžœ˜'Jšœžœ˜Jšœžœ˜Jšœžœ˜(Jšœžœ˜(JšœE˜EJšœ˜J˜—š  œžœ žœžœžœ˜2JšžœH˜NJ˜J˜—šกœžœ˜)šžœ˜Jšžœžœ ˜šžœ˜Jš œžœ˜9š œ˜Jšœžœžœ˜(Jšžœ žœžœžœ˜OJšœ˜—Jšœ žœ$žœ˜8Jšœ9˜9Jš œžœ žœžœžœ˜JJ˜FJ˜FJšœžœ žœžœ˜CK˜——Jšœ˜J˜—šกœžœ˜*Jšœžœ˜š œžœžœ˜ Jšœ˜Jšœ˜Jšœ ˜ J˜—š  œžœžœ žœžœ˜?Jšœžœ˜Jšœ˜šžœ˜ Jšžœ˜Jšžœžœ žœ˜)—Jšœžœ˜ šžœ ˜ Jšžœ˜Jšžœžœžœ˜-—J˜—Jšœ4˜4JšœF˜FJšœ,˜,Jšœ&˜&Jšœžœ ˜Jšœžœ ˜Jšœžœ˜ Jšœžœ˜ K˜%Jš žœžœžœ žœžœ˜?Jš žœžœžœ žœžœ˜?Jšžœ+˜-š žœžœžœ žœฯc˜7K˜ šžœžœžœ ž˜Jšœžœ˜Jšžœ˜—Jšžœ˜—Jšžœ%˜'š žœžœž œ žœข˜?K˜ šžœžœžœ ž˜$Jšœžœ˜Jšžœ˜—Jšžœ˜—Jšžœ"˜$š žœžœžœ žœข˜5K˜ šžœžœžœ ž˜Jšœžœ˜Jšžœ˜—Jšžœ˜—Jšžœ&˜(š žœžœžœ žœข˜>Kšœ ˜ šžœžœžœ ž˜$Jšœžœ˜Jšžœ˜—Jšžœ˜—J˜Jšœ˜——headšฯl ™ šœ2˜2JšœD˜DJ˜—JšœV˜VJšœZ˜ZJ˜šœQ˜QJ™——Jšž˜J˜—…—(4