DIRECTORY Basics USING [bitsPerWord, LongNumber, RawWords], ImagerTransformation USING [Transformation], PrincOps USING [SrcFunc, DstFunc] ; ImagerSample: CEDAR DEFINITIONS ~ BEGIN Transformation: TYPE ~ ImagerTransformation.Transformation; Sample: TYPE ~ WORD; maxBitsPerSample: NAT ~ Basics.bitsPerWord; RawSamples: TYPE ~ Basics.RawWords; UnsafeSamples: TYPE ~ LONG POINTER TO RawSamples; SampleBuffer: TYPE ~ REF SampleBufferRep; SampleBufferRep: TYPE ~ RECORD [ iSize, jSize: NAT, samples: SEQUENCE size: NAT OF Sample ]; NewBuffer: PROC [iSize, jSize: NAT, scratch: SampleBuffer _ NIL] RETURNS [SampleBuffer]; ObtainScratchBuffer: PROC [iSize, jSize: NAT] RETURNS [SampleBuffer]; ReleaseScratchBuffer: PROC [buffer: SampleBuffer]; DoWithScratchBuffer: PROC [iSize, jSize: NAT, action: PROC [SampleBuffer]]; GetSample: PROC [buffer: SampleBuffer, i, j: NAT] RETURNS [Sample]; PutSample: PROC [buffer: SampleBuffer, i, j: NAT, sample: Sample]; GetPointer: PROC [buffer: SampleBuffer, i, j, count: NAT] RETURNS [UnsafeSamples]; UnsafeAdd: UNSAFE PROC [src1, src2, dst: UnsafeSamples, count: NAT]; UnsafeSub: UNSAFE PROC [src1, src2, dst: UnsafeSamples, count: NAT]; UnsafeLookup: UNSAFE PROC [tbl, src, dst: UnsafeSamples, count: NAT]; AddSamples: PROC [samples: SampleBuffer, si, sj: NAT _ 0, buffer: SampleBuffer, bi, bj: NAT _ 0, count: NAT]; SubSamples: PROC [samples: SampleBuffer, si, sj: NAT _ 0, buffer: SampleBuffer, bi, bj: NAT _ 0, count: NAT]; LookupSamples: PROC [table: SampleBuffer, samples: SampleBuffer, si, sj: NAT _ 0, buffer: SampleBuffer, bi, bj: NAT _ 0, count: NAT]; LookupPixels: PROC [tables: SampleBuffer, pixels: SampleBuffer, pj: NAT _ 0, buffer: SampleBuffer, bi, bj: NAT _ 0, count: NAT]; BitsPerSample: TYPE ~ [0..maxBitsPerSample]; UnsafeGetF: UNSAFE PROC [samples: UnsafeSamples, count: NAT, s, f: NAT _ 0, base: LONG POINTER, wordsPerLine: NAT, bitsPerSample: BitsPerSample]; UnsafePutF: UNSAFE PROC [samples: UnsafeSamples, count: NAT, s, f: NAT _ 0, base: LONG POINTER, wordsPerLine: NAT, bitsPerSample: BitsPerSample, srcFunc: PrincOps.SrcFunc _ null, dstFunc: PrincOps.DstFunc _ null]; UnsafePutFSign: UNSAFE PROC [samples: UnsafeSamples, count: NAT, s, f: NAT _ 0, base: LONG POINTER, wordsPerLine: NAT]; UnsafeGetS: UNSAFE PROC [samples: UnsafeSamples, count: NAT, s, f: NAT _ 0, base: LONG POINTER, wordsPerLine: NAT, bitsPerSample: BitsPerSample]; UnsafePutS: UNSAFE PROC [samples: UnsafeSamples, count: NAT, s, f: NAT _ 0, base: LONG POINTER, wordsPerLine: NAT, bitsPerSample: BitsPerSample, srcFunc: PrincOps.SrcFunc _ null, dstFunc: PrincOps.DstFunc _ null]; Sampler: TYPE ~ REF SamplerRep; SamplerRep: TYPE ~ RECORD [ base: LONG POINTER _ NIL, -- source base address wordsPerLine: CARDINAL _ 0, -- source words per scan line bitsPerSample: BitsPerSample _ 0, -- source bits per sample sSize: CARDINAL _ 0, -- source size in slow (scan line) direction fSize: CARDINAL _ 0, -- source size in fast (pixel) direction sMin: CARDINAL _ 0, -- source origin in slow (scan line) direction fMin: CARDINAL _ 0, -- source origin in fast (pixel) direction sfDelta: Basics.LongNumber _ [lc[0]], -- source delta s for destination f increment ffDelta: Basics.LongNumber _ [lc[0]], -- source delta f for destination f increment ssDelta: Basics.LongNumber _ [lc[0]], -- source delta s for destination s increment fsDelta: Basics.LongNumber _ [lc[0]], -- source delta f for destination s increment sSource: Basics.LongNumber _ [lc[0]], -- initial source s (corresponding to sDest, fDest) fSource: Basics.LongNumber _ [lc[0]], -- initial source f (corresponding to sDest, fDest) sDest: CARDINAL _ 0, -- initial destination s fDest: CARDINAL _ 0 -- initial destination f ]; SetSamplerIncrements: PROC [sampler: Sampler, m: Transformation]; SetSamplerPosition: PROC [sampler: Sampler, m: Transformation, s, f: CARDINAL]; GetPointSamples: PROC [sampler: Sampler, s, f: CARDINAL, buffer: SampleBuffer, bi, bj: NAT _ 0, count: NAT]; GetInterpolatedSamples: PROC [sampler: Sampler, s, f: CARDINAL, buffer: SampleBuffer, i, j: NAT _ 0, count: NAT]; END. ξImagerSample.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Doug Wyatt, May 28, 1985 11:47:19 am PDT Michael Plass, June 3, 1985 11:11:41 am PDT Sample buffers SampleBuffer operations FOR k: NAT IN[0..count) DO dst[k] _ src1[k]+src2[k] ENDLOOP; FOR k: NAT IN[0..count) DO dst[k] _ src1[k]-src2[k] ENDLOOP; FOR k: NAT IN[0..count) DO dst[k] _ tbl[src[k]] ENDLOOP; FOR k: NAT IN[0..count) DO buffer.PutSample[bi, bj+k, buffer.GetSample[bi, bj+k]+samples.GetSample[si, sj+k]] ENDLOOP; FOR k: NAT IN[0..count) DO buffer.PutSample[bi, bj+k, buffer.GetSample[bi, bj+k]-samples.GetSample[si, sj+k]] ENDLOOP; FOR k: NAT IN[0..count) DO buffer.PutSample[bi, bj+k, table.GetSample[0, samples.GetSample[si, sj+k]]] ENDLOOP; FOR k: NAT IN[0..count) DO sum: Sample _ 0; FOR i: NAT IN[0..tables.iSize) DO sum _ sum+tables.GetSample[i, pixels.GetSample[i, pj+k]]; ENDLOOP; buffer.PutSample[bi, bj+k, sum]; ENDLOOP; Packing and unpacking samples[k] _ array[s, f+k], for k IN[0..count) array[s, f+k] _ Func[array[s, f+k], samples[k]], for k IN[0..count) bitArray[s, f+k] _ SignBit[samples[k]], for k IN[0..count). Useful for halftoning. samples[k] _ array[s+k, f], for k IN[0..count) array[s+k, f] _ Func[array[s+k, f], samples[k]], for k IN[0..count) Sampling Sets sfDelta, ffDelta, ssDelta, fsDelta. Sets initial destination position. buffer[bi, bj+k] _ [s, f+k], for k IN[0..count) Similar to GetPointSamples, but interpolates four surrounding samples to get result. Κ˜codešœ™Kšœ Οmœ1™Kšœ&‘-˜SKšœ&‘-˜SKšœ&‘-˜SKšœ&‘-˜SKšœ&‘3˜YKšœ&‘3˜YKšœžœ‘˜-Kšœžœ‘˜-Kšœ˜K˜—K˜š œžœ'˜AKšœ(™(K˜—š œžœ-žœ˜OKšœ"™"K˜—š  œžœžœ!žœ žœ˜mKšœ;žœ ™GK™—š  œžœžœžœ žœ˜rK™TK™——K˜Kšžœ˜—…—