DIRECTORY AIS, Imager, ImagerBasic, Rope, Scaled ; ImagerAISImpl: CEDAR PROGRAM IMPORTS AIS, Rope, Scaled EXPORTS Imager ~ BEGIN TriColor: TYPE ~ REF TriColorRep; TriColorRep: TYPE ~ RECORD [ red, green, blue: Array ]; Array: TYPE ~ REF ArrayRep; ArrayRep: TYPE ~ RECORD [ SEQUENCE yPixels: NAT OF Row ]; Row: TYPE ~ REF RowRep; RowRep: TYPE ~ RECORD [ PACKED SEQUENCE xPixels: NAT OF [0..256) ]; LoadAISData: PROC [aisName: Rope.ROPE] RETURNS [array: Array] ~ TRUSTED { text: Rope.Text _ aisName.Flatten; ais: AIS.FRef _ AIS.OpenFile[LOOPHOLE[text], FALSE]; window: AIS.WRef _ AIS.OpenWindow[ais]; xPixels: NAT; yPixels: NAT; pixelArray: ImagerBasic.PixelArray _ NEW[ImagerBasic.PixelArrayRep]; color: ImagerBasic.SampledColor _ NEW[ImagerBasic.SampledColorRep]; curLine, curPixel, xNextLine, xNextPixel, yNextLine, yNextPixel: INTEGER; SELECT ais.raster.scanMode FROM ru, lu, rd, ld => {xPixels _ ais.raster.scanLength; yPixels _ ais.raster.scanCount}; ur, ul, dr, dl => {xPixels _ ais.raster.scanCount; yPixels _ ais.raster.scanLength}; ENDCASE => ERROR; SELECT ais.raster.scanMode FROM ru => {curLine_0; curPixel_0; xNextLine_0; xNextPixel_1; yNextLine_1; yNextPixel_0}; ul => {curLine_xPixels-1; curPixel_0; xNextLine_-1; xNextPixel_0; yNextLine_0; yNextPixel_1}; ld => {curLine_yPixels-1; curPixel_xPixels-1; xNextLine_0; xNextPixel_-1; yNextLine_-1; yNextPixel_0}; dr => {curLine_0; curPixel_yPixels-1; xNextLine_1; xNextPixel_0; yNextLine_0; yNextPixel_-1}; rd => {curLine_yPixels-1; curPixel_0; xNextLine_0; xNextPixel_1; yNextLine_-1; yNextPixel_0}; ur => {curLine_0; curPixel_0; xNextLine_1; xNextPixel_0; yNextLine_0; yNextPixel_1}; lu => {curLine_0; curPixel_xPixels-1; xNextLine_0; xNextPixel_-1; yNextLine_1; yNextPixel_0}; dl => {curLine_curLine_xPixels-1; curPixel_yPixels-1; xNextLine_-1; xNextPixel_0; yNextLine_0; yNextPixel_-1}; ENDCASE => ERROR; array _ NEW[ArrayRep[yPixels]]; FOR y: NAT IN [0..yPixels) DO row: Row _ array[y] _ NEW[RowRep[xPixels]]; savedLine: NAT _ curLine; savedPixel: NAT _ curPixel; FOR x: NAT IN [0..xPixels) DO row[x] _ window.ReadSample[curLine, curPixel]; curLine _ curLine + xNextLine; curPixel _ curPixel + xNextPixel; ENDLOOP; curLine _ savedLine + yNextLine; curPixel _ savedPixel + yNextPixel; ENDLOOP; ais.CloseFile; }; AISToColor: PUBLIC PROC [aisName: Rope.ROPE] RETURNS [ImagerBasic.Color] ~ { pixelArray: ImagerBasic.PixelArray _ NEW[ImagerBasic.PixelArrayRep]; color: ImagerBasic.SampledColor _ NEW[ImagerBasic.SampledColorRep]; array: Array _ LoadAISData[aisName]; pixelArray.xPixels _ array[0].xPixels; pixelArray.yPixels _ array.yPixels; pixelArray.maxSampleValue _ 255; pixelArray.samplesPerPixel _ 1; pixelArray.get _ GetOne; pixelArray.data _ array; color.transparent _ FALSE; color.pa _ pixelArray; color.m _ [1, 0, 0, 0, 1, 0, identity]; color.colorMap _ $Intensity8bpp; RETURN [color]; }; GetOne: PROC [self: ImagerBasic.PixelArray, buffer: ImagerBasic.PixelBuffer, nSamples: NAT, layer: INT, xStart, yStart: Scaled.Value, xDelta, yDelta: Scaled.Value] ~ { array: Array _ NARROW[self.data]; yMax: INTEGER _ self.yPixels - 1; xMax: INTEGER _ self.xPixels - 1; FOR i: NAT IN [0..nSamples) DO y: INTEGER _ yStart.Floor; x: INTEGER _ xStart.Floor; buffer[i] _ IF x IN [0..xMax] AND y IN [0..yMax] THEN array[y][x] ELSE 0; xStart _ xStart.PLUS[xDelta]; yStart _ yStart.PLUS[yDelta]; ENDLOOP; }; END.  ImagerAISImpl.mesa Michael Plass, July 12, 1983 1:45 pm This is more or less just a stub implementation; slow and dirty, but it should work for testing. Êá˜J™J™$J˜šÏk ˜ Jšœ˜J˜Jšœ ˜ Jšœ˜J˜J˜—šœ ˜Jšœœ˜Jšœ˜Jšœ˜—J™`Jšœ œœ ˜!šœ œœ˜Jšœ˜Jšœ˜—Jšœœœ ˜šœ œœ˜Jšœ œœ˜Jšœ˜—Jšœœœ˜šœœœ˜Jšœœ œœ ˜(Jšœ˜—š Ïn œœœœœ˜IJšœ"˜"Jš œœœ œœ˜4Jšœœœ˜'Jšœ œ˜ Jšœ œ˜ Jšœ%œ˜DJšœ"œ˜CJšœAœ˜Išœ˜JšœT˜TJšœT˜TJšœœ˜—šœ˜JšœT˜TJšœ]˜]Jšœf˜fJšœ]˜]Jšœ]˜]JšœT˜TJšœ]˜]Jšœn˜nJšœœ˜—Jšœœ˜šœœœ˜Jšœœ˜+Jšœ œ ˜Jšœ œ ˜šœœœ˜Jšœ.˜.Jšœ˜Jšœ!˜!Jšœ˜—Jšœ ˜ Jšœ#˜#Jšœ˜—J˜Jšœ˜—š ž œœœœœ˜LJšœ%œ˜DJšœ"œ˜CJšœ$˜$Jšœ&˜&Jšœ#˜#Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœœ˜Jšœ˜Jšœ'˜'Jšœ ˜ Jšœ ˜Jšœ˜—šžœœKœ œA˜§Jšœœ ˜!Jšœœ˜!Jšœœ˜!šœœœ˜Jšœœ˜Jšœœ˜Jš œ œœ œœ œ œ˜IJšœœ ˜Jšœœ ˜Jšœ˜—Jšœ˜—Jšœ˜—…— *«