-- VersatectoPacked.mesa - April 1980 -- Replacement versatec module to generate packed bitmap files -- Updated: July 21, 1981 11:08 AM by R. Pasco --file format: -- 1st word: # bits per scanline -- s --where is runlength encoded in bytes: -- DIRECTORY InlineDefs: FROM "InlineDefs" USING [LongCOPY, HighByte, LowByte], StreamDefs: FROM "StreamDefs" USING [StreamHandle, NewByteStream, Write, Append], SystemDefs: FROM "SystemDefs" USING [AllocateHeapNode, FreeHeapNode], VersatecDefs: FROM "VersatecDefs"; Versatec: PROGRAM IMPORTS InlineDefs, StreamDefs, SystemDefs EXPORTS VersatecDefs = BEGIN OPEN InlineDefs, StreamDefs, SystemDefs; StartVersatecPlot: PUBLIC PROCEDURE[fileName: STRING, width,height: CARDINAL] = BEGIN ScanLineBits _ ((width+3)/4)*4; ScanLineLength _ (width+15)/16; ScanLine _ AllocateHeapNode[ScanLineLength]; LineNumber _ 0; Stream _ NewByteStream[fileName, Write + Append]; Stream.put[Stream,HighByte[ScanLineBits]]; Stream.put[Stream,LowByte[ScanLineBits]]; END; EndVersatecPlot: PUBLIC PROCEDURE = BEGIN FreeHeapNode[ScanLine]; Stream.destroy[Stream]; END; Word: TYPE = POINTER TO WordRecord; WordRecord: TYPE = MACHINE DEPENDENT RECORD [n1,n2,n3,n4: [0..15]]; WriteVersatecLine: PUBLIC PROCEDURE [line: LONG POINTER, nBytes: CARDINAL] = BEGIN word: Word _ ScanLine; nCount: INTEGER _ 0; nBits: INTEGER _ 0; byte,pattern,nybble: INTEGER; GetNybble: PROC RETURNS[nybble: INTEGER] = BEGIN nCount _ nCount + 1; nBits _ nBits + 4; SELECT nCount FROM 1 => nybble _ word.n1; 2 => nybble _ word.n2; 3 => nybble _ word.n3; 4 => { nybble _ word.n4; word _ word + 1; nCount _ 0; }; ENDCASE; END; LongCOPY[line, ScanLineLength, ScanLine]; byte _ pattern _ GetNybble[]; WHILE nBits