<> <> <> <> DIRECTORY Basics USING [bitsPerWord, RawWords], CountedVM USING [Handle], PrincOps USING [BitAddress, SrcFunc, DstFunc], Scaled USING [Value], SF USING [Box, BoxAction, BoxGenerator, maxVec, minVec, Vec, zeroVec], Terminal USING [FrameBuffer]; IISample: CEDAR DEFINITIONS ~ BEGIN Vec: TYPE ~ SF.Vec; minVec: Vec ~ SF.minVec; zeroVec: Vec ~ SF.zeroVec; maxVec: Vec ~ SF.maxVec; Box: TYPE ~ SF.Box; maxBox: Box ~ [min: minVec, max: maxVec]; BoxAction: TYPE ~ SF.BoxAction; BoxGenerator: TYPE ~ SF.BoxGenerator; maxCount: NAT ~ NAT.LAST; MultipleReleaseOfScratch: ERROR; <> Sample: TYPE ~ WORD; maxSample: Sample ~ Sample.LAST; RawSamples: TYPE ~ Basics.RawWords; maxBitsPerSample: NAT ~ Basics.bitsPerWord; BitsPerSample: TYPE ~ NAT[0..maxBitsPerSample]; SampleBuffer: TYPE ~ REF SampleBufferRep; SampleBufferRep: TYPE ~ RECORD [ length: NAT, samples: SEQUENCE maxLength: NAT OF Sample ]; NewSamples: PROC [length: NAT, scratch: SampleBuffer _ NIL] RETURNS [SampleBuffer]; ObtainScratchSamples: PROC [length: NAT] RETURNS [SampleBuffer]; <<>> ReleaseScratchSamples: PROC [buffer: SampleBuffer]; DoWithScratchSamples: PROC [length: NAT, action: PROC [SampleBuffer]]; PointerToSamples: PROC [buffer: SampleBuffer, start, count: NAT] RETURNS [LONG POINTER TO RawSamples]; FlipSamples: PROC [buffer: SampleBuffer, start: NAT _ 0, count: NAT _ maxCount]; <> FillSamples: PROC [buffer: SampleBuffer, value: Sample, start: NAT _ 0, count: NAT _ maxCount]; CopySamples: PROC [dst, src: SampleBuffer, dstStart, srcStart: NAT _ 0, count: NAT _ maxCount]; ClearSamples: PROC [buffer: SampleBuffer, start: NAT _ 0, count: NAT _ maxCount]; <> SampleMap: TYPE ~ REF SampleMapRep; SampleMapRep: TYPE ~ PRIVATE RECORD [ <<-- It is UNSAFE to alter these fields. -->> box: Box, -- lower and upper bounds in each direction bitsPerSample: NAT, -- number of bits per sample bitsPerLine: NAT, -- bits per scan line base: PrincOps.BitAddress, -- starting bit address ref: REF -- for retaining the underlying storage ]; <> UnsafeNewSampleMap: UNSAFE PROC [box: Box, bitsPerSample: BitsPerSample, bitsPerLine: NAT, base: PrincOps.BitAddress, ref: REF, words: INT, scratchDescriptor: SampleMap _ NIL] RETURNS [SampleMap]; <> BitsForSamples: PROC [fSize: NAT, bitsPerSample: NAT] RETURNS [NAT]; <> WordsForLines: PROC [sSize: NAT, bitsPerLine: NAT] RETURNS [INT]; <> WordsForMap: PROC [size: Vec, bitsPerSample: BitsPerSample _ 1, bitsPerLine: NAT _ 0] RETURNS [INT]; <> <> <<>> NewSampleMap: PROC [box: Box, bitsPerSample: BitsPerSample _ 1, bitsPerLine: NAT _ 0] RETURNS [SampleMap]; <> <> MapFromVM: PROC [vm: CountedVM.Handle, box: Box, bitsPerSample: BitsPerSample _ 1, bitsPerLine: NAT _ 0 ] RETURNS [SampleMap]; <> <> MapFromFrameBuffer: PROC [frameBuffer: Terminal.FrameBuffer] RETURNS [SampleMap]; <> Copy: PROC [map: SampleMap, delta: Vec _ zeroVec, box: Box _ maxBox] RETURNS [SampleMap]; <> <> <> ObtainScratchMap: PROC [box: Box, bitsPerSample: BitsPerSample _ 1] RETURNS [SampleMap]; ReleaseScratchMap: PROC [map: SampleMap]; DoWithScratchMap: PROC [box: Box, bitsPerSample: BitsPerSample _ 1, action: PROC [SampleMap]]; <> ObtainUnsafeDescriptor: UNSAFE PROC [size: Vec, bitsPerSample: BitsPerSample, bitsPerLine: NAT, base: PrincOps.BitAddress, ref: REF, words: INT, rawMin, delta: Vec _ zeroVec] RETURNS [SampleMap]; <> <> <> <> <> ReIndex: PROC [map: SampleMap, delta: Vec _ zeroVec, box: Box _ maxBox] RETURNS [SampleMap]; <> <> <> <> Clip: PROC [map: SampleMap, box: Box _ maxBox] RETURNS [SampleMap]; <> Shift: PROC [map: SampleMap, delta: Vec _ zeroVec] RETURNS [SampleMap]; <> ZeroOrigin: PROC [map: SampleMap] RETURNS [SampleMap]; <> ReleaseDescriptor: UNSAFE PROC [map: SampleMap]; <> <> <> <<>> GetBox: PROC [map: SampleMap] RETURNS [Box] ~ INLINE {RETURN [map.box]}; GetSize: PROC [map: SampleMap] RETURNS [Vec] ~ INLINE {b: Box ~ map.box; RETURN [[s: b.max.s-b.min.s, f: b.max.f-b.min.f]]}; GetBitsPerSample: PROC [map: SampleMap] RETURNS [BitsPerSample] ~ INLINE {RETURN [map.bitsPerSample]}; GetBase: PROC [map: SampleMap] RETURNS [PrincOps.BitAddress] ~ INLINE {RETURN [map.base]}; Function: TYPE ~ RECORD [dstFunc: PrincOps.DstFunc, srcFunc: PrincOps.SrcFunc]; nullFunction: Function ~ [dstFunc: null, srcFunc: null]; <<[null, null] dst _ src>> <<[or, null] dst _ BITOR[dst, src]>> <<[and, null] dst _ BITAND[dst, src]>> <<[and, complement] dst _ BITAND[dst, BITNOT[src]]>> <<[xor, null] dst _ BITXOR[dst, src]>> <> <<>> <> Get: PROC [map: SampleMap, index: Vec] RETURNS [Sample]; <> <> Put: PROC [map: SampleMap, index: Vec, value: Sample, function: Function _ nullFunction]; <> <> GetSamples: PROC [map: SampleMap, initIndex: Vec _ zeroVec, delta: Vec _ [s: 0, f: 1], buffer: SampleBuffer, start: NAT _ 0, count: NAT _ maxCount]; <> <> <> <> <> <> GetTileSamples: PROC [tile: SampleMap, phase: NAT _ 0, initIndex: SF.Vec _ zeroVec, buffer: SampleBuffer]; <> <> <> <> Halftone: PROC [map: SampleMap, min: SF.Vec, sampleBuffer, thresholdBuffer: SampleBuffer, function: Function]; <> < thresholdBuffer[j] THEN 0 ELSE 1;>> <> <> PutSamples: PROC [map: SampleMap, initIndex: Vec _ zeroVec, delta: Vec _ [s: 0, f: 1], buffer: SampleBuffer, start: NAT _ 0, count: NAT _ maxCount, function: Function _ nullFunction]; <> <> <> <> <> <> <> Clear: PROC [map: SampleMap]; <> <> <> <<>> BasicTransfer: PROC [dst: SampleMap, src: SampleMap, dstMin: Vec _ zeroVec, srcMin: Vec _ zeroVec, size: Vec, function: Function _ nullFunction]; <> <> <> <> <> <> <> <> <> <<>> Transfer: PROC [dst: SampleMap, src: SampleMap, delta: Vec _ zeroVec, function: Function _ nullFunction]; <> <> <> Move: PROC [map: SampleMap, dstMin: Vec _ zeroVec, srcMin: Vec _ zeroVec, size: Vec _ maxVec, function: Function _ nullFunction]; <> <> <<(avoids ripple if the source and destination overlap)>> Fill: PROC [map: SampleMap, box: Box _ maxBox, value: Sample _ maxSample, function: Function _ nullFunction]; <> <> <> <> <> <> <> <> RawGenerator: TYPE ~ PROC [rawAction: RawAction]; RawAction: TYPE ~ PROC [box: Box, bitsPerLine: NAT, base: PrincOps.BitAddress]; RawTransfer: PROC [dst: SampleMap, rawGenerator: RawGenerator, function: Function _ nullFunction]; RawDescriptor: TYPE ~ RECORD [box: Box, bitsPerLine: NAT, basePointer: LONG POINTER]; rawArraySize: NAT ~ 32; RawArray: TYPE ~ ARRAY [0..rawArraySize) OF RawDescriptor; MultipleTransfer: PROC [dst: SampleMap, n: [0..rawArraySize], a: POINTER TO RawArray, function: Function _ nullFunction]; <> <> TileFromStipple: PROC [stipple: WORD, bitsPerSample: BitsPerSample _ 1, value0: Sample _ 0, value1: Sample _ maxSample, scratch: SampleMap _ NIL] RETURNS [SampleMap]; <> Tile: PROC [map: SampleMap, box: Box _ maxBox, tile: SampleMap, phase: NAT _ 0, function: Function _ nullFunction]; <> <> <> <> <> <> <> <> <> <> <> <> <> <> TileBoxes: PROC [map: SampleMap, boxes: BoxGenerator, tile: SampleMap, phase: NAT _ 0, function: Function _ nullFunction]; <> <> <> <> <<};>> <> <<>> <> TransferBoxes: PROC [dst: SampleMap, src: SampleMap, delta: Vec _ zeroVec, boxes: BoxGenerator, function: Function _ nullFunction]; <> <> <> <<};>> <> <> FillBoxes: PROC [map: SampleMap, boxes: BoxGenerator, value: Sample _ maxSample, function: Function _ nullFunction]; <> <> <> <> <<};>> <> EdgeAction: TYPE ~ PROC [ which: [0..1], -- Which side this specifies sMin: INTEGER, -- First scan line touched sCount: NAT, -- Number of scan lines touched f0: Scaled.Value, -- Initial value of f, offset by 1/2 pixel df: Scaled.Value -- df/ds ]; RegionFill: PROC [dst: SampleMap, edgeGenerator: PROC [EdgeAction], value: Sample _ maxSample, function: Function _ nullFunction]; <> <<>> BoxesFromBitmap: PROC [map: SampleMap, boxAction: BoxAction]; <> <<>> <> Trim: PROC [map: SampleMap, box: Box _ maxBox, background: Sample _ 0] RETURNS [Box]; <> <> IsAll: PROC [map: SampleMap, box: Box _ maxBox, value: Sample _ 0] RETURNS [BOOL]; <> <<>> Equal: PROC [s1, s2: SampleMap] RETURNS [BOOL]; <> <<>> END.