DIRECTORY Args, ColorTrixBasics, ColorTrixMod, ColorTrixPalette, ColorTrixPix, Commander, ImagerPixelMap, Interminal, IO, Rope, Terminal, ViewerClasses; ColorTrixCommandsImpl: CEDAR PROGRAM IMPORTS Args, ColorTrixBasics, ColorTrixMod, ColorTrixPalette, ColorTrixPix, Commander, ImagerPixelMap, IO, Rope ~ { PixelMap: TYPE ~ ImagerPixelMap.PixelMap; palOn: BOOL _ FALSE; initialW: ImagerPixelMap.DeviceRectangle _ ImagerPixelMap.Window[ColorTrixBasics.GetPm[]]; globalW: ImagerPixelMap.DeviceRectangle _ initialW; ArgWindow: PROC [x, y, w, h: Args.Arg] RETURNS [ImagerPixelMap.DeviceRectangle] ~ { RETURN[ImagerPixelMap.Intersect[initialW, [y.int, x.int, h.int, w.int]]]; }; GetWindowedPm: PROC [cmd: Commander.Handle] RETURNS [PixelMap] ~ { x, y, w, h: Args.Arg; window: ImagerPixelMap.DeviceRectangle _ globalW; FOR n: NAT _ 0, n+1 WHILE n < Args.NArgs[cmd] DO IF NOT Args.GetRope[cmd, n].Equal["-w"] THEN LOOP; x _ Args.ArgInt[cmd, n+1]; y _ Args.ArgInt[cmd, n+2]; w _ Args.ArgInt[cmd, n+3]; h _ Args.ArgInt[cmd, n+4]; EXIT; ENDLOOP; IF x.ok AND y.ok AND w.ok AND h.ok THEN window _ ArgWindow[x, y, w, h]; RETURN[ImagerPixelMap.SetWindow[ColorTrixBasics.GetPm[], window]]; }; ResetWindow: Commander.CommandProc ~ { globalW _ initialW; }; SetWindow: Commander.CommandProc ~ { ok: BOOL; x, y, w, h: Args.Arg; [ok, x, y, w, h] _ Args.ArgsGet[cmd, "%iiii"]; IF NOT ok THEN RETURN[$Failure, "Bad argument(s)."]; globalW _ ImagerPixelMap.Intersect[ArgWindow[x, y, w, h], initialW]; }; PrintWindow: Commander.CommandProc ~ { cmd.out.PutF["global window is (x, y, w, h): [%g, %g, %g, %g].\n", IO.int[globalW.fMin], IO.int[globalW.sMin], IO.int[globalW.fSize], IO.int[globalW.sSize]]; }; Pal: Commander.CommandProc ~ { ok: BOOL; n, smooth, unpal: Args.Arg; pm: PixelMap _ ColorTrixBasics.GetPm[]; [ok, n, smooth, unpal] _ Args.ArgsGet[cmd, "[i-s%b-u%b"]; IF NOT ok THEN RETURN[$Failure, "Bad argument(s)."]; IF unpal.bool THEN ColorTrixPalette.UnPal[ColorTrixBasics.GetPm[]]; ColorTrixPalette.Pal[pm, IF n.ok THEN n.int ELSE 5, smooth.ok AND smooth.bool]; palOn _ TRUE; }; UnPal: Commander.CommandProc ~ { IF palOn THEN ColorTrixPalette.UnPal[ColorTrixBasics.GetPm[]]; palOn _ FALSE; }; GammaTest: Commander.CommandProc ~ { FillChex: PROC [p: PixelMap, val: NAT] RETURNS [PixelMap] ~ { w: ImagerPixelMap.DeviceRectangle ~ ImagerPixelMap.Window[p]; spacer, spacing: NAT _ 1; ImagerPixelMap.Fill[p, w, IF val < 255 THEN 0 ELSE 255]; IF val = 0 OR val = 255 THEN RETURN[p]; spacing _ 256/val; FOR y: NAT IN[w.sMin..w.sMin+w.sSize) DO xx: INTEGER _ w.fMin+w.fSize-1; FOR x: NAT IN [w.fMin..w.fMin+w.fSize) DO IF (spacer _ spacer+1) = spacing THEN spacer _ 0; IF spacer=0 THEN ImagerPixelMap.Fill[p, [y, IF y MOD 2 =0 THEN x ELSE xx,1,1],255]; xx _ xx-1; ENDLOOP; ENDLOOP; RETURN[p]; }; pm: PixelMap ~ GetWindowedPm[cmd]; w: ImagerPixelMap.DeviceRectangle ~ ImagerPixelMap.Window[pm]; margin: NAT ~ w.fSize/32; width: INTEGER _ (w.fSize/9)-margin; x: NAT _ w.fMin+margin; val: INTEGER _ 255; chex: PixelMap ~ ImagerPixelMap.Create[3, [0, 0, 64, 64]]; ImagerPixelMap.Fill[pm, w, 127]; FOR i: NAT IN [0..8) DO tile: ImagerPixelMap.Tile _ ImagerPixelMap.CreateTile[FillChex[chex, val]]; ImagerPixelMap.Fill[pm, [w.sMin+w.sSize/2, x, w.sSize/2, width], val]; ImagerPixelMap.TransferTile[ImagerPixelMap.Clip[pm, [w.sMin, x, w.sSize/2, width]], tile]; x _ x+width+margin; IF (val _ val/2) < 3 THEN val _ 0; ENDLOOP; }; Clear: Commander.CommandProc ~ { ok: BOOL; pVal, dum: Args.Arg; pm: PixelMap _ GetWindowedPm[cmd]; w: ImagerPixelMap.DeviceRectangle _ ImagerPixelMap.Window[pm]; [ok, pVal, dum, dum, dum, dum] _ Args.ArgsGet[cmd, "[i-w%iiii"]; IF NOT ok THEN RETURN[$Failure, "Bad argument(s)."]; ImagerPixelMap.Fill[pm, w, MIN[255, MAX[0, INTEGER[IF pVal.ok THEN pVal.int ELSE 0]]]]; }; Lum: Commander.CommandProc ~ { ColorTrixMod.Lum[GetWindowedPm[cmd]]; }; Ramp: Commander.CommandProc ~ { ok: BOOL; v, h, dum: Args.Arg; [ok, v, h, dum, dum, dum, dum] _ Args.ArgsGet[cmd, "-v%b-h%b-w%iiii"]; IF NOT ok THEN RETURN[$Failure, "Bad argument(s)"]; IF h.bool THEN ColorTrixPix.RampH[GetWindowedPm[cmd]] ELSE ColorTrixPix.RampV[GetWindowedPm[cmd]]; }; Pie: Commander.CommandProc ~ { ColorTrixPix.Pie[GetWindowedPm[cmd]]; }; Up: Commander.CommandProc ~ { arg: Args.Arg _ Args.ArgIntDef[cmd, 0, 0]; IF NOT arg.ok THEN RETURN[$Failure, "Bad argument."]; ColorTrixMod.Up[GetWindowedPm[cmd], arg.int]; }; Left: Commander.CommandProc ~ { arg: Args.Arg _ Args.ArgIntDef[cmd, 0, 0]; IF NOT arg.ok THEN RETURN[$Failure, "Bad argument."]; ColorTrixMod.Left[GetWindowedPm[cmd], arg.int]; }; Negate: Commander.CommandProc ~ { ColorTrixMod.Negate[GetWindowedPm[cmd]]; }; Reflect: Commander.CommandProc ~ { ok: BOOL; v, h, dum: Args.Arg; [ok, v, h, dum, dum, dum, dum] _ Args.ArgsGet[cmd, "-v%b-h%b-w%iiii"]; IF NOT ok THEN RETURN[$Failure, "Bad argument(s)"]; IF h.bool THEN ColorTrixMod.ReflectH[GetWindowedPm[cmd]] ELSE ColorTrixMod.ReflectV[GetWindowedPm[cmd]]; }; Mirror: Commander.CommandProc ~ { pm: PixelMap _ GetWindowedPm[cmd]; ok: BOOL; l, r, t, b, d: Args.Arg; [ok, l, r, t, b, d, d, d, d] _ Args.ArgsGet[cmd, "-l%b-r%b-t%b-b%b-w%iiii"]; IF NOT ok THEN RETURN[$Failure, "Bad argument(s)"]; SELECT TRUE FROM l.bool => ColorTrixMod.MirrorV[pm, TRUE]; r.bool => ColorTrixMod.MirrorV[pm, FALSE]; t.bool => ColorTrixMod.MirrorH[pm, TRUE]; b.bool => ColorTrixMod.MirrorH[pm, FALSE]; ENDCASE => ColorTrixMod.MirrorH[pm, FALSE]; }; PVal: Commander.CommandProc ~ { List: TYPE ~ RECORD[first: NAT, rest: REF List]; n: NAT _ 0; new, old: Args.Arg; list: REF List _ NIL; nArgs: NAT _ Args.NArgs[cmd]; WHILE n < nArgs DO IF Args.GetRope[cmd, n].Equal["-w"] THEN {n _ n+5; LOOP}; IF new.ok THEN { IF NOT (old _ Args.ArgInt[cmd, n]).ok THEN RETURN[$Failure, "Bad old value."]; list _ NEW[List _ [old.int, list]]; } ELSE IF NOT (new _ Args.ArgInt[cmd, n]).ok THEN RETURN[$Failure, "Bad new value."]; n _ n+1; ENDLOOP; IF list # NIL THEN ColorTrixMod.PVal[GetWindowedPm[cmd], new.int, list]; }; Grid: Commander.CommandProc ~ { ok: BOOL; pval, spacing, lineWidth: Args.Arg; pm: PixelMap _ GetWindowedPm[cmd]; pvalInt, spacingInt, lineWidthInt: INT; [ok, pval, spacing, lineWidth] _ Args.ArgsGet[cmd, "-pVal%i-spacing%i-lineWidth%i"]; pvalInt _ IF ok AND pval.ok THEN pval.int ELSE 255; spacingInt _ IF ok AND spacing.ok THEN spacing.int ELSE 40; lineWidthInt _ IF ok AND lineWidth.ok THEN lineWidth.int ELSE 1; FOR i: NAT _ 0, i+spacingInt WHILE i < pm.fSize DO FOR j: NAT _ 0, j+1 WHILE j < pm.sSize DO ImagerPixelMap.Fill[pm, [j, i, lineWidthInt, lineWidthInt], pvalInt]; ENDLOOP; ENDLOOP; FOR j: NAT _ 0, j+spacingInt WHILE j < pm.sSize DO FOR i: NAT _ 0, i+1 WHILE i < pm.fSize DO ImagerPixelMap.Fill[pm, [j, i, lineWidthInt, lineWidthInt], pvalInt]; ENDLOOP; ENDLOOP; }; Commander.Register["SetWindow", SetWindow, "\nSetWindow ."]; Commander.Register["ResetWindow", ResetWindow, "\nReset the window."]; Commander.Register["PrintWindow", PrintWindow, "\nPrint the window."]; Commander.Register["Pal", Pal, "\nDisplay palette (-s for smooth) (-u unpal)."]; Commander.Register["UnPal", UnPal, "\nRemove palette."]; Commander.Register["Negate", Negate, "\nNegate the image."]; Commander.Register["Reflect", Reflect, "\nReflect ."]; Commander.Register["Mirror", Mirror, "\nMirror ."]; Commander.Register["Left", Left, "\nLeft Move image."]; Commander.Register["Up", Up, "\nUp Move image."]; Commander.Register["Clear", Clear, "\nClear ; clear the color display."]; Commander.Register["Lum", Lum, "\nConvert pseudo-colors to luminance."]; Commander.Register["Ramp", Ramp, "\nDisplay ramp (-h: horiz, -v: vertical)."]; Commander.Register["Grid", Grid, "\n[-pVal ] [-spacing ] [-lineWidth ]."]; Commander.Register["Pie", Pie, "\n < Make a circular ramp (pie)."]; Commander.Register["PVal", PVal, "\nPVal [oldVal] . . ."]; Commander.Register["GammaTest", GammaTest, "\nIf the monitor is properly gamma corrected, the dithered rectangles should appear to be as bright as their grayscale counterparts"]; }. ΜColorTrixCommandsImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Bloomenthal, May 12, 1986 1:33:59 pm PDT GammaTest: Commander.CommandProc ~ { pm: PixelMap _ GetWindowedPm[cmd]; w: ImagerPixelMap.DeviceRectangle _ ImagerPixelMap.Window[pm]; margin: INTEGER _ w.fSize/32; width: INTEGER _ (w.fSize/9)-margin; x: INTEGER _ w.fMin+margin; val: INTEGER _ 255; checker: PixelMap _ ImagerPixelMap.Create[3, [ ImagerPixelMap.Fill[pm, w, 127]; FOR i: NAT IN [0..8) DO ImagerPixelMap.Fill[pm, [w.sMin+w.sSize/2, x, w.sSize/2, width], val]; ColorTrixPix.Dither[ImagerPixelMap.SetWindow[pm, [w.sMin, x, w.sSize/2, width]], val]; x _ x+width+margin; IF (val _ val/2) < 3 THEN val _ 0; ENDLOOP; }; Κ ‚˜šœ™Jšœ Οmœ1™Jšœžœ˜J˜—J˜š’ œ˜$š œžœžœžœ˜=Jšœ=˜=Jšœžœ˜Jšœžœ žœžœ˜8Jšžœ žœ žœžœ˜'J˜šžœžœžœž˜(Jšœžœ˜šžœžœžœž˜)Jšžœžœ ˜1Jš žœ žœžœžœžœžœ˜SJ˜ Jšžœ˜—Jšžœ˜—Jšžœ˜ J˜—Kšœ"˜"Jšœ>˜>Jšœžœ˜Jšœžœ˜$Jšœžœ˜Jšœžœ˜Jšœ:˜:Jšœ ˜ šžœžœžœž˜J˜KJšœF˜FJšœZ˜ZJšœ˜Jšžœžœ ˜"Jšžœ˜—Jšœ˜J˜—š’ œ™$Kšœ"™"Jšœ>™>Jšœžœ™Jšœžœ™$Jšœžœ™Jšœžœ™Jšœ.™.Jšœ ™ šžœžœžœž™JšœF™FJšœV™VJšœ™Jšžœžœ ™"Jšžœ™—Jšœ™J™—š’œ˜ Kšœžœ˜ Kšœ˜Kšœ"˜"K˜>Kšœ@˜@Kšžœžœžœžœ˜4Jš œžœžœžœžœ žœ žœ˜WJšœ˜J˜—š’œ˜Jšœ%˜%Jšœ˜J˜—š’œ˜Lšœžœ˜ Lšœ˜JšœF˜FJšžœžœžœžœ˜3Jšžœžœ'˜5Jšžœ(˜,Jšœ˜—J˜š’œ˜Jšœ%˜%Jšœ˜J˜—š’œ˜Lšœ*˜*Jšžœžœžœžœ˜5Jšœ-˜-Jšœ˜J˜—š’œ˜Lšœ*˜*Jšžœžœžœžœ˜5Jšœ/˜/Jšœ˜J˜—š’œ˜!Jšœ(˜(Jšœ˜J˜—š’œ˜"Lšœžœ˜ Lšœ˜JšœF˜FJšžœžœžœžœ˜3Jšžœžœ*˜8Jšžœ+˜/Jšœ˜J˜—š’œ˜!Jšœ"˜"Lšœžœ˜ Lšœ˜JšœL˜LJšžœžœžœžœ˜3šžœžœž˜Lšœ#žœ˜)Lšœ#žœ˜*Lšœ#žœ˜)Lšœ#žœ˜*Lšžœžœ˜+—Jšœ˜J˜—š’œ˜Jš œžœžœžœžœ˜0Lšœžœ˜ Lšœ˜Lšœžœžœ˜Lšœžœ˜šžœ ž˜Lšžœ"žœ žœ˜9šžœžœ˜Lšžœžœ žœžœ˜NLšœžœ˜#L˜—Lšžœžœ žœžœ˜SLšœ˜Lšžœ˜—Jšžœžœžœ6˜HJšœ˜J˜—š’œ˜Jšœžœ˜ Jšœ#˜#Jšœ"˜"Jšœ#ž˜'J˜LšœT˜TL˜Jš œ žœžœ žœ žœ˜3Jš œ žœžœ žœ žœ˜;Jš œžœžœžœžœ˜@L˜L˜šžœžœžœž˜2šžœžœ žœž˜)LšœE˜ELšžœ˜—Lšžœ˜—L˜šžœžœžœž˜2šžœžœ žœž˜)LšœE˜ELšžœ˜—Lšžœ˜—Jšœ˜J˜—JšœI˜IJšœF˜FJšœF˜FJšœP˜PJšœ8˜8Jšœ<˜