DIRECTORY Basics, ImagerPixelMaps, ImagerBasic, AIS, Rope, Scaled, ImagerTransform, ImagerAISUtil; ImagerAISUtilImpl: CEDAR PROGRAM IMPORTS Basics, ImagerPixelMaps, AIS, Scaled, ImagerTransform EXPORTS ImagerAISUtil ~ BEGIN ROPE: TYPE ~ Rope.ROPE; PixelMapFromAIS: PUBLIC PROC [aisName: ROPE] RETURNS [pixelMap: ImagerPixelMaps.PixelMap, raster: AIS.Raster] ~ TRUSTED { ais: AIS.FRef _ AIS.OpenFile[aisName]; window: AIS.WRef _ AIS.OpenWindow[ais]; lgBitsPerPixel: [0..4] _ SELECT (raster _ AIS.ReadRaster[ais]).bitsPerPixel FROM 0, 1 => 0, 2 => 1, 4 => 2, 8 => 3, 16 => 4, ENDCASE => ERROR; lineMap: ImagerPixelMaps.PixelMap _ ImagerPixelMaps.Create[lgBitsPerPixel, [0, 0, 1, raster.scanLength]]; lineBufferDesc: AIS.Buffer _ [length: lineMap.refRep.words, addr: lineMap.refRep.pointer]; pixelMap _ ImagerPixelMaps.Create[lgBitsPerPixel, [0, 0, raster.scanCount, raster.scanLength]]; FOR i: NAT IN [0..raster.scanCount) DO AIS.UnsafeReadLine[window, lineBufferDesc, i]; pixelMap.Transfer[lineMap]; lineMap.sOrigin _ lineMap.sOrigin + 1; ENDLOOP; AIS.CloseWindow[window]; AIS.CloseFile[ais]; }; TransformationFromScanMode: PROC [scanMode: AIS.ScanMode, lines, pixelsPerLine: INT] RETURNS [ImagerTransform.Transformation] ~ { pixelDeltaX: REAL _ SELECT scanMode FROM ru, rd => 1, lu, ld => -1, ENDCASE => 0; pixelDeltaY: REAL _ SELECT scanMode FROM ul, ur => 1, dr, dl => -1, ENDCASE => 0; lineDeltaX: REAL _ SELECT scanMode FROM dr, ur => 1, ul, dl => -1, ENDCASE => 0; lineDeltaY: REAL _ SELECT scanMode FROM ru, lu => 1, ld, rd => -1, ENDCASE => 0; t: ImagerTransform.TransformationRec _ [ a: lineDeltaX, b: pixelDeltaX, c: MAX[-(pixelDeltaX*pixelsPerLine + lineDeltaX*lines), 0], d: lineDeltaY, e: pixelDeltaY, f: MAX[-(pixelDeltaY*pixelsPerLine + lineDeltaY*lines), 0] ]; RETURN [ImagerTransform.FromRec[t]] }; AISToColor: PUBLIC PROC [aisName: Rope.ROPE] RETURNS [ImagerBasic.SampledColor] ~ { pixelArray: ImagerBasic.PixelArray _ NEW[ImagerBasic.PixelArrayRep]; color: ImagerBasic.SampledColor _ NEW[ImagerBasic.ColorRep.sampled]; pixelMap: ImagerPixelMaps.PixelMap; raster: AIS.Raster; [pixelMap, raster] _ PixelMapFromAIS[aisName]; IF ABS[pixelMap.sOrigin]+ABS[pixelMap.sMin]+ABS[pixelMap.fOrigin]+ABS[pixelMap.fMin] # 0 THEN ERROR; pixelArray.xPixels _ pixelMap.sSize; pixelArray.yPixels _ pixelMap.fSize; pixelArray.m _ TransformationFromScanMode[raster.scanMode, pixelMap.sSize, pixelMap.fSize]; pixelArray.maxSampleValue _ Basics.BITSHIFT[1, Basics.BITSHIFT[1, pixelMap.refRep.lgBitsPerPixel]]-1; pixelArray.samplesPerPixel _ 1; pixelArray.get _ SELECT pixelMap.refRep.lgBitsPerPixel FROM 0 => GetBitPixels, 3 => GetBytePixels, ENDCASE => GetPixels; pixelArray.data _ NEW[ImagerPixelMaps.PixelMap _ pixelMap]; color.transparent _ FALSE; color.pa _ pixelArray; color.m _ ImagerTransform.Rotate[0]; color.colorOperator _ IF raster.bitsPerPixel = 0 THEN $SampledBlack ELSE $Intensity; RETURN [color]; }; GetBitPixels: PROC [self: ImagerBasic.PixelArray, buffer: ImagerBasic.PixelBuffer, nSamples: NAT, layer: INT, xStart, yStart: Scaled.Value, xDelta, yDelta: Scaled.Value] ~ { pixelArrayRef: REF ImagerPixelMaps.PixelMap ~ NARROW[self.data]; pixelArray: ImagerPixelMaps.PixelMap ~ pixelArrayRef^; IF layer#0 THEN ERROR; FOR i: NAT IN [0..nSamples) DO WHILE yStart.Floor < 0 DO yStart _ yStart.PLUS[Scaled.FromInt[pixelArray.fSize]]; ENDLOOP; WHILE yStart.Floor >= pixelArray.fSize DO yStart _ yStart.MINUS[Scaled.FromInt[pixelArray.fSize]]; ENDLOOP; WHILE xStart.Floor < 0 DO xStart _ xStart.PLUS[Scaled.FromInt[pixelArray.sSize]]; ENDLOOP; WHILE xStart.Floor >= pixelArray.sSize DO xStart _ xStart.MINUS[Scaled.FromInt[pixelArray.sSize]]; ENDLOOP; buffer[i] _ pixelArray.GetBit[xStart.Floor, yStart.Floor]; xStart _ xStart.PLUS[xDelta]; yStart _ yStart.PLUS[yDelta]; ENDLOOP; }; GetBytePixels: PROC [self: ImagerBasic.PixelArray, buffer: ImagerBasic.PixelBuffer, nSamples: NAT, layer: INT, xStart, yStart: Scaled.Value, xDelta, yDelta: Scaled.Value] ~ { pixelArrayRef: REF ImagerPixelMaps.PixelMap ~ NARROW[self.data]; pixelArray: ImagerPixelMaps.PixelMap ~ pixelArrayRef^; IF layer#0 THEN ERROR; IF xDelta = Scaled.zero THEN TRUSTED { p: LONG POINTER TO RECORD[PACKED SEQUENCE COMPUTED CARDINAL OF [0..256)]; WHILE xStart.Floor < 0 DO xStart _ xStart.PLUS[Scaled.FromInt[pixelArray.sSize]]; ENDLOOP; WHILE xStart.Floor >= pixelArray.sSize DO xStart _ xStart.MINUS[Scaled.FromInt[pixelArray.sSize]]; ENDLOOP; p _ pixelArray.refRep.pointer + Basics.LongMult[(xStart.Floor - pixelArray.sOrigin), pixelArray.refRep.rast]; FOR i: NAT IN [0..nSamples) DO WHILE yStart.Floor < 0 DO yStart _ yStart.PLUS[Scaled.FromInt[pixelArray.fSize]]; ENDLOOP; WHILE yStart.Floor >= pixelArray.fSize DO yStart _ yStart.MINUS[Scaled.FromInt[pixelArray.fSize]]; ENDLOOP; buffer[i] _ p[yStart.Floor - pixelArray.fOrigin]; yStart _ yStart.PLUS[yDelta]; ENDLOOP; } ELSE { FOR i: NAT IN [0..nSamples) DO WHILE yStart.Floor < 0 DO yStart _ yStart.PLUS[Scaled.FromInt[pixelArray.fSize]]; ENDLOOP; WHILE yStart.Floor >= pixelArray.fSize DO yStart _ yStart.MINUS[Scaled.FromInt[pixelArray.fSize]]; ENDLOOP; WHILE xStart.Floor < 0 DO xStart _ xStart.PLUS[Scaled.FromInt[pixelArray.sSize]]; ENDLOOP; WHILE xStart.Floor >= pixelArray.sSize DO xStart _ xStart.MINUS[Scaled.FromInt[pixelArray.sSize]]; ENDLOOP; buffer[i] _ pixelArray.Get8Bits[xStart.Floor, yStart.Floor]; xStart _ xStart.PLUS[xDelta]; yStart _ yStart.PLUS[yDelta]; ENDLOOP; }; }; GetPixels: PROC [self: ImagerBasic.PixelArray, buffer: ImagerBasic.PixelBuffer, nSamples: NAT, layer: INT, xStart, yStart: Scaled.Value, xDelta, yDelta: Scaled.Value] ~ { pixelArrayRef: REF ImagerPixelMaps.PixelMap ~ NARROW[self.data]; pixelArray: ImagerPixelMaps.PixelMap ~ pixelArrayRef^; IF layer#0 THEN ERROR; FOR i: NAT IN [0..nSamples) DO WHILE yStart.Floor < 0 DO yStart _ yStart.PLUS[Scaled.FromInt[pixelArray.fSize]]; ENDLOOP; WHILE yStart.Floor >= pixelArray.fSize DO yStart _ yStart.MINUS[Scaled.FromInt[pixelArray.fSize]]; ENDLOOP; WHILE xStart.Floor < 0 DO xStart _ xStart.PLUS[Scaled.FromInt[pixelArray.sSize]]; ENDLOOP; WHILE xStart.Floor >= pixelArray.sSize DO xStart _ xStart.MINUS[Scaled.FromInt[pixelArray.sSize]]; ENDLOOP; buffer[i] _ pixelArray.GetPixel[xStart.Floor, yStart.Floor]; xStart _ xStart.PLUS[xDelta]; yStart _ yStart.PLUS[yDelta]; ENDLOOP; }; END. ˆImagerAISUtilImpl.mesa Copyright (C) 1984, Xerox Corporation. All rights reserved. Michael Plass, January 3, 1985 4:01:34 pm PST Ê[˜J™J™<™-J˜—šÏk œY˜bJ˜—šœœ˜ Jšœ6˜=Jšœ˜Jšœ˜šœœœ˜J˜—šÏnœœœ œœ.œ œ˜yJšœ&˜&Jšœ'˜'šœœ-˜PJ˜ J˜J˜J˜J˜Jšœœ˜—Jšœi˜iJšœœG˜ZJšœ_˜_šœœœ˜&Jšœ+˜.Jšœ˜Jšœ&˜&Jš˜—Jšœ˜Jšœ˜Jšœ˜J˜—š žœœ œ!œœ%˜šœ œœ ˜(Jšœ ˜ Jšœ ˜ Jšœ˜ —šœ œœ ˜(Jšœ ˜ Jšœ ˜ Jšœ˜ —šœ œœ ˜'Jšœ ˜ Jšœ ˜ Jšœ˜ —šœ œœ ˜'Jšœ ˜ Jšœ ˜ Jšœ˜ —šœ(˜(Jšœ˜Jšœ˜Jšœœ5˜;Jšœ˜Jšœ˜Jšœœ4˜:Jšœ˜—Jšœ˜#Jšœ˜J˜—š ž œœœœœ˜SJšœ%œ˜DJšœ"œ˜DJšœ,œ˜7Jšœ.˜.Jšœœœœœœœ˜dJšœ$˜$Jšœ$˜$Jšœ[˜[Jšœ#œ œ'˜eJšœ˜šœ˜šœ ˜*Jšœ˜Jšœ˜Jšœ˜——Jšœœ&˜;Jšœœ˜Jšœ˜Jšœ$˜$Jšœœœœ ˜TJšœ ˜Jšœ˜J˜—šž œœKœ œA˜­Jšœœœ ˜@Jšœ6˜6Jšœ œœ˜šœœœ˜šœ˜Jšœœ#˜7Jšœ˜—šœ"˜)Jšœœ#˜8Jšœ˜—šœ˜Jšœœ#˜7Jšœ˜—šœ"˜)Jšœœ#˜8Jšœ˜—Jšœ:˜:Jšœœ ˜Jšœœ ˜Jšœ˜—J˜J˜—šž œœKœ œA˜®Jšœœœ ˜@Jšœ6˜6Jšœ œœ˜šœœœ˜&Jšœœœœœœœœœœ ˜Išœ˜Jšœœ#˜7Jšœ˜—šœ"˜)Jšœœ#˜8Jšœ˜—Jšœm˜mšœœœ˜šœ˜Jšœœ#˜7Jšœ˜—šœ"˜)Jšœœ#˜8Jšœ˜—Jšœ1˜1Jšœœ ˜Jšœ˜—Jšœ˜—šœ˜šœœœ˜šœ˜Jšœœ#˜7Jšœ˜—šœ"˜)Jšœœ#˜8Jšœ˜—šœ˜Jšœœ#˜7Jšœ˜—šœ"˜)Jšœœ#˜8Jšœ˜—Jšœ<˜