<> <> <> <> DIRECTORY Basics USING [bitsPerWord, RawWords], CountedVM USING [Handle], ImagerTransformation USING [Transformation], PrincOps USING [BitAddress, SrcFunc, DstFunc], SF USING [Box, BoxAction, BoxGenerator, maxVec, Vec, zeroVec], Terminal USING [FrameBuffer]; ImagerSample: CEDAR DEFINITIONS ~ BEGIN Transformation: TYPE ~ ImagerTransformation.Transformation; Vec: TYPE ~ SF.Vec; zeroVec: Vec ~ SF.zeroVec; maxVec: Vec ~ SF.maxVec; Box: TYPE ~ SF.Box; maxBox: Box ~ [min: zeroVec, 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 [samples: SampleBuffer]; DoWithScratchSamples: PROC [length: NAT, action: PROC [SampleBuffer]]; PointerToSamples: PROC [samples: SampleBuffer, start, count: NAT] RETURNS [LONG POINTER TO RawSamples]; FlipSamples: PROC [samples: SampleBuffer]; FillSamples: PROC [samples: SampleBuffer, value: Sample, start: NAT _ 0, count: NAT _ maxCount]; <> SampleMap: TYPE ~ REF SampleMapRep; SampleMapRep: TYPE ~ RECORD [ <<-- It is unsafe for clients to alter these fields. -->> size: Vec, -- [s: , f: ] 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 [size: Vec, 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 [size: Vec, bitsPerSample: BitsPerSample _ 1, bitsPerLine: NAT _ 0, scratch: SampleMap _ NIL] RETURNS [SampleMap]; <> <> MapFromVM: PROC [vm: CountedVM.Handle, size: Vec, bitsPerSample: BitsPerSample _ 1, bitsPerLine: NAT _ 0 ] RETURNS [SampleMap]; <> <> MapFromFrameBuffer: PROC [frameBuffer: Terminal.FrameBuffer] RETURNS [SampleMap]; <> SubMap: PROC [self: SampleMap, box: Box _ maxBox] RETURNS [SampleMap]; <> CopyMap: PROC [self: SampleMap, box: Box _ maxBox] RETURNS [SampleMap]; <> ObtainScratchMap: PROC [size: Vec, bitsPerSample: BitsPerSample _ 1] RETURNS [SampleMap]; ReleaseScratchMap: PROC [self: SampleMap]; DoWithScratchMap: PROC [size: Vec, bitsPerSample: BitsPerSample _ 1, action: PROC [SampleMap]]; <> Function: TYPE ~ RECORD [dstFunc: PrincOps.DstFunc, srcFunc: PrincOps.SrcFunc]; nullFunction: Function ~ [null, 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 [self: SampleMap, index: Vec] RETURNS [Sample]; <> <> Put: PROC [self: SampleMap, index: Vec, value: Sample, function: Function _ nullFunction]; <> <> GetSamples: PROC [self: SampleMap, min: Vec _ zeroVec, delta: Vec _ [s: 0, f: 1], samples: SampleBuffer, start: NAT _ 0, count: NAT _ maxCount]; <> <> <> <> <> PutSamples: PROC [self: SampleMap, min: Vec _ zeroVec, delta: Vec _ [s: 0, f: 1], samples: SampleBuffer, start: NAT _ 0, count: NAT _ maxCount, function: Function _ nullFunction]; <> <> <> <> <> Clear: PROC [self: SampleMap]; <> <> <> <<>> Transfer: PROC [dst: SampleMap, src: SampleMap, dstMin: Vec _ zeroVec, srcMin: Vec _ zeroVec, size: Vec _ maxVec, function: Function _ nullFunction]; <> <> <> <> <> <> <> <> <> TransferBoxes: PROC [dst: SampleMap, src: SampleMap, boxes: BoxGenerator, dstOffset: Vec _ zeroVec, srcOffset: Vec _ zeroVec, function: Function _ nullFunction]; <> <> <> <> <> <<};>> <> Move: PROC [self: SampleMap, dstMin: Vec _ zeroVec, srcMin: Vec _ zeroVec, size: Vec _ maxVec, function: Function _ nullFunction]; <> MoveBoxes: PROC [self: SampleMap, boxes: BoxGenerator, dstOffset: Vec _ zeroVec, srcOffset: Vec _ zeroVec, function: Function _ nullFunction]; <> <> <> <> <> <<};>> <> Fill: PROC [self: SampleMap, box: Box _ maxBox, value: Sample _ maxSample, function: Function _ nullFunction]; <> <> <> <> <> <> <> <> FillBoxes: PROC [self: SampleMap, boxes: BoxGenerator, value: Sample _ maxSample, function: Function _ nullFunction]; <> <> <> <<};>> <> TileFromStipple: PROC [stipple: WORD, bitsPerSample: BitsPerSample _ 1, value0: Sample _ 0, value1: Sample _ maxSample, scratch: SampleMap _ NIL] RETURNS [SampleMap]; <> Tile: PROC [self: SampleMap, box: Box _ maxBox, tile: SampleMap, s0, f0: INT _ 0, phase: NAT _ 0, function: Function _ nullFunction]; <> <> <> <> <> <> <> <> <> <> <> TileBoxes: PROC [self: SampleMap, boxes: BoxGenerator, tile: SampleMap, s0, f0: INT _ 0, phase: NAT _ 0, function: Function _ nullFunction]; <> <> <> <<};>> <> <<>> Trim: PROC [self: SampleMap, box: Box _ maxBox, background: Sample _ 0] RETURNS [Box]; <> <> IsAll: PROC [self: SampleMap, box: Box _ maxBox, value: Sample _ 0] RETURNS [BOOL]; <> <<>> Equal: PROC [map1: SampleMap, box1: Box _ maxBox, map2: SampleMap, box2: Box _ maxBox] RETURNS [BOOL]; <> <<>> <> PixelProc: TYPE ~ PROC [i: NAT] RETURNS [Sample]; PixelBuffer: TYPE ~ REF PixelBufferRep; PixelBufferRep: TYPE ~ RECORD [ length: NAT, sampleBuffers: SEQUENCE samplesPerPixel: NAT OF SampleBuffer ]; NewPixels: PROC [samplesPerPixel: NAT, length: NAT, scratch: PixelBuffer _ NIL] RETURNS [PixelBuffer]; ObtainScratchPixels: PROC [samplesPerPixel: NAT, length: NAT] RETURNS [PixelBuffer]; <<>> ReleaseScratchPixels: PROC [pixels: PixelBuffer]; DoWithScratchPixels: PROC [samplesPerPixel: NAT, length: NAT, action: PROC [PixelBuffer]]; PixelMap: TYPE ~ REF PixelMapRep; PixelMapRep: TYPE ~ RECORD [ size: Vec, sampleMaps: SEQUENCE samplesPerPixel: NAT OF SampleMap ]; NewPixelMap: PROC [samplesPerPixel: NAT, size: Vec, maxSample: PixelProc, scratch: PixelMap _ NIL] RETURNS [PixelMap]; GetPixels: PROC [self: PixelMap, min: Vec _ zeroVec, delta: Vec _ [s: 0, f: 1], pixels: PixelBuffer, start: NAT _ 0, count: NAT _ maxCount]; <> <> <> <> PutPixels: PROC [self: PixelMap, min: Vec _ zeroVec, delta: Vec _ [s: 0, f: 1], pixels: PixelBuffer, start: NAT _ 0, count: NAT _ maxCount, function: Function _ nullFunction]; <> <> <> <> ResampleAction: TYPE ~ PROC [pixels: PixelBuffer, min: Vec]; Resample: PROC [self: PixelMap, m: Transformation, interpolate: BOOL, boxes: BoxGenerator, bounds: Box, action: ResampleAction]; END.