DIRECTORY ColorTrixBasics, ColorTrixPix, ImagerSample, ImagerPixelMap, PixelMapOps, Process, Random, Real; ColorTrixPixImpl: CEDAR PROGRAM IMPORTS ColorTrixBasics, ImagerSample, ImagerPixelMap, PixelMapOps, Process, Random, Real EXPORTS ColorTrixPix ~ BEGIN PixelMap: TYPE ~ ImagerPixelMap.PixelMap; Dither: PUBLIC PROC [pm: PixelMap, intensity: CARDINAL] ~ { w: ImagerPixelMap.DeviceRectangle _ ImagerPixelMap.Window[pm]; IF intensity = 0 AND pm.refRep.lgBitsPerPixel = 3 THEN { FOR y: INTEGER IN [w.sMin..w.sMin+w.sSize) DO Process.CheckForAbort[]; FOR x: INTEGER IN [w.fMin..w.fMin+w.fSize) DO pval: CARDINAL ~ ColorTrixBasics.GetPixel[pm, x, y]; v: CARDINAL ~ IF Random.ChooseInt[, 0, 255] > pval THEN 0 ELSE 255; ImagerPixelMap.Fill[pm, [y, x, 1, 1], v]; ENDLOOP; ENDLOOP; RETURN; }; FOR y: INTEGER IN [w.sMin..w.sMin+w.sSize) DO Process.CheckForAbort[]; IF pm.refRep.lgBitsPerPixel = 4 THEN FOR x: INTEGER IN [w.fMin..w.fMin+w.fSize) DO r: CARDINAL _ IF Random.ChooseInt[, 0, 255] > intensity THEN 0 ELSE 255*256; g: CARDINAL _ IF Random.ChooseInt[, 0, 255] > intensity THEN 0 ELSE 255; ImagerPixelMap.Fill[pm, [y, x, 1, 1], r+g]; ENDLOOP ELSE FOR x: INTEGER IN [w.fMin..w.fMin+w.fSize) DO v: CARDINAL _ IF Random.ChooseInt[, 0, 255] > intensity THEN 0 ELSE 255; ImagerPixelMap.Fill[pm, [y, x, 1, 1], v]; ENDLOOP; ENDLOOP; }; RampH: PUBLIC PROC [pm: PixelMap] ~ { w: ImagerPixelMap.DeviceRectangle ~ pm.Window; inc: REAL _ 255.0/Real.Float[w.fSize-1]; Action: PROC [line: ImagerSample.SampleBuffer] ~ TRUSTED { FOR y: INTEGER IN [w.sMin..w.sMin+w.sSize) DO ival: CARDINAL _ Real.Round[(y-w.sMin)*inc]; ival _ 256*ival+ival; -- for 8 or 16 bit pixel maps Process.CheckForAbort[]; FOR x: INTEGER IN [0..w.fSize) DO line.samples[x] _ ival; ENDLOOP; PixelMapOps.PutF[pm, y, w.fMin, line, 0, 0, w.fSize, null, null]; ENDLOOP; }; ImagerSample.DoWithScratchBuffer[1, pm.fSize, Action]; }; RampV: PUBLIC PROC [pm: PixelMap] ~ { w: ImagerPixelMap.DeviceRectangle ~ pm.Window; inc: REAL _ 255.0/Real.Float[w.fSize-1]; Action: PROC [line: ImagerSample.SampleBuffer] ~ TRUSTED { FOR x: INTEGER IN [0..w.fSize) DO v: CARDINAL _ Real.Round[x*inc]; line.samples[x] _ 256*v+v; -- for 8 or 16 bit pixel maps ENDLOOP; FOR y: INTEGER IN [w.sMin..w.sMin+w.sSize) DO Process.CheckForAbort[]; PixelMapOps.PutF[pm, y, w.fMin, line, 0, 0, w.fSize, null, null]; ENDLOOP; }; ImagerSample.DoWithScratchBuffer[1, pm.fSize, Action]; }; Pie: PUBLIC PROC [pm: PixelMap] ~ { Init: PROC ~ { val: INT _ 0; dval: INT _ 1; ddval: INT ~ 2; factor: REAL _ ratio*ratio; FOR i: INTEGER IN [0..512] DO sq[i] _ val; val _ val + dval; dval _ dval + ddval; ENDLOOP; FOR i: INTEGER IN [0..maxVal+1] DO threshs[i] _ Real.Round[factor*sq[i]]; ENDLOOP; }; Scan: PROC [y: CARDINAL] ~ { pval: CARDINAL _ Real.Round[MIN[255.0, MAX[1.0, REAL[y]/ratio]]]; thresh: INT _ threshs[pval]-sq[y]; FOR x: INTEGER IN [0..dx] DO WHILE sq[x] > thresh AND pval < maxVal DO pval _ pval+1; thresh _ threshs[pval]-sq[y]; ENDLOOP; IF pval = maxVal THEN { FOR xx: INTEGER IN [dx+x..pm.fSize) DO line.samples[xx] _ rgMaxVal; ENDLOOP; FOR xx: INTEGER IN [0..dx-x] DO line.samples[xx] _ rgMaxVal; ENDLOOP; EXIT; }; line.samples[dx+x] _ line.samples[dx-x] _ IF bits16 THEN pval+256*pval ELSE pval; ENDLOOP; PixelMapOps.PutF[pm, cy+y, pm.fMin, line, 0, 0, pm.fSize, null, null]; PixelMapOps.PutF[pm, cy-y, pm.fMin, line, 0, 0, pm.fSize, null, null]; }; line: ImagerSample.SampleBuffer ~ ImagerSample.ObtainScratchBuffer[1, pm.fSize]; dx: INTEGER ~ MIN[511, (pm.fSize+1)/2-1]; dy: INTEGER ~ MIN[511, (pm.sSize+1)/2-1]; cx: INTEGER ~ pm.fMin+dx; cy: INTEGER ~ pm.sMin+dy; maxVal: CARDINAL ~ 255; rgMaxVal: CARDINAL ~ maxVal+256*maxVal; sq: ARRAY [0..512] OF INT; threshs: ARRAY [0..maxVal+1] OF INT; ratio: REAL _ Real.RoundI[dx+1]/256.0; bits16: BOOL _ pm.refRep.lgBitsPerPixel = 4; Init[]; FOR y: INTEGER IN [0..dy] DO Process.CheckForAbort[]; Scan[y]; ENDLOOP; IF pm.sSize MOD 2 = 0 THEN ImagerPixelMap.Fill[pm, [pm.sMin+pm.sSize-1, pm.fMin, 1, pm.fSize], rgMaxVal]; IF pm.fSize MOD 2 = 0 THEN ImagerPixelMap.Fill[pm, [pm.sMin, pm.fMin+pm.fSize-1, pm.sSize, 1], rgMaxVal]; ImagerSample.ReleaseScratchBuffer[line]; }; END. ¬ColorTrixPixImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Bloomenthal, July 11, 1986 12:20:36 pm PDT Color Display Modification Procedures: Κœ˜šœ™Jšœ Οmœ1™L˜šžœžœžœ˜8šžœžœžœž˜-Jšœ˜šžœžœžœž˜-Jšœžœ&˜4Jš œžœžœ#žœžœ˜CJšœ)˜)Jšžœ˜—Jšžœ˜—Lšžœ˜Lšœ˜—J˜šžœžœžœž˜-Jšœ˜šžœ˜š žœžœžœžœž˜2Jš œžœžœ(žœžœ ˜LJš œžœžœ(žœžœ˜HJšœ+˜+Jšž˜—š žœžœžœžœž˜2Jš œžœžœ(žœžœ˜HJšœ)˜)Jšžœ˜——Jšžœ˜—J˜—J˜šΠbnœžœžœ˜%Jšœ.˜.Jšœžœ˜(codešΟbœžœ%žœ˜:šžœžœžœž˜-Jšœžœ˜,JšœΟc˜