<> <> <> <> <<>> <> <> <> <> <<>> DIRECTORY Rope USING [Equal, Fetch, FromChar, Length, ROPE, ToRefText, FromRefText, Cat, Substr], CedarProcess USING [CheckAbort], OptronicsTape, <> <> FS USING [ComponentPositions, Error, ExpandName, FileInfo, StreamOpen], CommandTool USING [ArgumentVector, NumArgs, Parse], Commander USING [CommandProc, Register], Convert USING [CardFromRope, RopeFromTime], BasicTime USING [Now], AIS USING [CloseFile, CloseWindow, CreateFile, FRef, OpenWindow, Raster, RasterPart, WRef, WriteSample], UnixTapeOps USING[BackSpaceFile, CloseDrive, CloseOpenConnections, Density, ForwardSpaceFile, OpenDrive, ReadRecord, Rewind, TapeHandle, WriteFileMark, WriteRecord ], ImagerPixel USING [GetPixels, NewPixels, PixelBuffer, PixelMap, PixelMapRep], ImagerSample USING [GetBox], SF USING [SizeF, SizeS], IO USING [EndOfStream, GetLineRope, PutRope, SP, STREAM], UserCredentials USING [Get], ConvertRasterObject USING [SampleMapFromAIS], TapesCommon USING [FileHandleList, FileHandle, FileHandleRep]; OptronicsTapeImpl: CEDAR PROGRAM IMPORTS BasicTime, CedarProcess, Commander, CommandTool, Convert, ConvertRasterObject, FS, ImagerPixel, ImagerSample, SF, UnixTapeOps, Rope, AIS, IO, -- Real, RealFns, -- UserCredentials EXPORTS OptronicsTape ~ BEGIN OPEN OptronicsTape; TapeError: PUBLIC SIGNAL [reason: ErrorDesc] = CODE; ROPE: TYPE ~ Rope.ROPE; TapeHandle: TYPE ~ UnixTapeOps.TapeHandle; FileHandleList: TYPE ~ TapesCommon.FileHandleList; FileHandle: TYPE ~ TapesCommon.FileHandle; FileHandleRep: TYPE ~ TapesCommon.FileHandleRep; PixelBuffer: TYPE ~ ImagerPixel.PixelBuffer; PixelMap: TYPE ~ ImagerPixel.PixelMap; sizeHeader: NAT _ 512; red: NAT = 0; green: NAT = 1; blue: NAT = 2; State: TYPE ~ REF StateRep; StateRep: TYPE ~ RECORD [ interleaved: BOOLEAN, tapeHandle: TapeHandle _ NIL, buffer: REF TEXT _ NIL, linesLeftInFile: INT, rgbToDensity: TRCTable _ NIL ]; maxColorD: REAL _ 1.5; maxGrayD: REAL _ 2.0; <> WriteTape: PUBLIC PROC [tapeHandle: TapeHandle, header: ROPE, files: FileSpecList] RETURNS [TapesCommon.FileHandleList] = { <> <> <> <> fileHandleList: FileHandleList _ NIL; makeFileHandle: PROC [interleaved: BOOLEAN, rgbToDensity: TRCTable, pixels,lines: INT] RETURNS[fileHandle: FileHandle] ~ { state: State _ NEW[StateRep _ [ interleaved: interleaved, tapeHandle: tapeHandle, buffer: NEW[TEXT[pixels]], linesLeftInFile: lines, rgbToDensity: rgbToDensity ]]; fileHandle _ NEW[FileHandleRep _ [newLine: WriteNewLine, data: state]]; }; reverse: PROC[files: FileHandleList] RETURNS[r: FileHandleList] = { r _ NIL; FOR f: FileHandleList _ files, f.rest UNTIL f=NIL DO r _ CONS[f.first, r]; ENDLOOP; }; FOR f: FileSpecList _ files, f.rest UNTIL f=NIL DO fileSpec: FileSpec _ f.first; ppl: INT _ fileSpec.nPixels; lines: INT _ fileSpec.nLines; rgbToDensity: TRCTable _ MakeRGBToDensity[255,255, fileSpec.maxD]; fileHandleList _ CONS[makeFileHandle[fileSpec.rgbInterleaved,rgbToDensity,ppl,lines],fileHandleList]; ENDLOOP; WriteTapeHeader[tapeHandle]; fileHandleList _ reverse[fileHandleList]; RETURN[fileHandleList]; }; << >> GetTapeHandle: PROC [] RETURNS [TapeHandle] ~ { tapeHandle: TapeHandle _ UnixTapeOps.OpenDrive["Chroma"]; RETURN[tapeHandle]; }; WriteTapeHeader: PROC [tapeHandle: TapeHandle] ~ { <> headerAsText: REF TEXT; headerAsText _ Rope.ToRefText[ Rope.Cat[ "Written by ", UserCredentials.Get[].name, " at ", Convert.RopeFromTime[BasicTime.Now[]] ]]; UnixTapeOps.Rewind[tapeHandle]; UnixTapeOps.WriteRecord[tapeHandle, headerAsText]; UnixTapeOps.WriteFileMark[tapeHandle]; }; <> <