DIRECTORY AIS, Hist, Real, Rope; HistImpl: CEDAR PROGRAM IMPORTS AIS, Real EXPORTS Hist = BEGIN OPEN Hist; Calc: PUBLIC PROC [filename:Rope.ROPE, low,high: NAT] RETURNS [histogram: Histogram] ~ { Buffer: TYPE = REF BufferRec; BufferRec: TYPE = PACKED ARRAY [0..2048) OF [0..255]; fdIn: AIS.FRef; wIn: AIS.WRef; rIn:AIS.Raster; buffer:Buffer _ NEW[BufferRec]; counts: ARRAY[0..255] OF LONG CARDINAL _ ALL[0]; nPixels:REAL _ 0; histogram _ NEW[HistogramRec]; fdIn _ AIS.OpenFile[name:filename]; wIn _ AIS.OpenWindow[fdIn]; rIn _ AIS.ReadRaster[fdIn]; FOR line: NAT IN [0.. rIn.scanCount) DO TRUSTED { AIS.UnsafeReadLine[w:wIn, buffer:[length:rIn.scanLength, addr:LOOPHOLE[buffer]], line:line] }; FOR pixel: NAT IN [0..rIn.scanLength) DO IF buffer[pixel] IN [low..high] THEN { nPixels _ nPixels + 1; counts[buffer[pixel]] _ counts[buffer[pixel]] + 1; } ENDLOOP; ENDLOOP; FOR i: NAT IN [0..255] DO histogram[i] _ counts[i]/nPixels; ENDLOOP; AIS.CloseWindow[wIn]; AIS.CloseFile[fdIn]; }; Equalize: PUBLIC PROC [histogram: Histogram] RETURNS [trcVec: TRCVec] ~ { currentFraction: REAL _ 0; trcVec _ NEW[TRCVecRec]; FOR i: NAT IN [0..255] DO currentFraction _ currentFraction + histogram[i]; trcVec[i].out _ MIN[Real.RoundC[currentFraction*256], 255]; trcVec[i].pinned _ FALSE; ENDLOOP; }; END. DHistImpl.mesa Mik Lamming - October 23, 1984 11:45:56 am PDT ÊZ˜J™ J™.J™JšÏk œ˜ J˜šÏnœ ˜Jšœ ˜Jšœ˜ Jšœ œ˜J˜š žœœœœ œœ˜X˜Jšœœœ ˜Jš œ œœœ œ ˜5Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ ˜Jš œœ œœœœ˜0Jšœœ˜J˜Jšœ œ˜Jšœ#˜#Jšœ˜Jšœ˜šœœœ˜'šœ˜ Jšœ;œ˜[Jšœ˜—šœœœ˜(šœœ œ˜'Jšœ˜Jšœ2˜2J˜—Jš˜—Jš˜—šœœœ ˜Jšœ!˜!Jš˜—Jšœ˜Jšœ˜Jšœ˜——J˜•StartOfExpansion[]šžœ œœ˜IJšœœ˜Jšœ œ ˜šœœœ ˜Jšœ1˜1Jšœœ(˜;Jšœœ˜Jš˜—Jšœ˜—J˜J˜Jšœ˜—J˜—…—°