-- VersatectoPress.mesa - April 1980
-- Replacement versatec module to generate press files
-- Updated: February 6, 1981 3:26 PM

DIRECTORY
InlineDefs: FROM "InlineDefs" USING [LongCOPY],
PressDefs: FROM "PressDefs" USING[
InitPressFileDescriptor,
ClosePressFile, PressFileDescriptor, PutComputedDots],
ProcessDefs: FROM "ProcessDefs" USING [Detach, Yield],
SystemDefs: FROM "SystemDefs" USING [AllocateHeapNode, FreeHeapNode],
VersatecDefs: FROM "VersatecDefs";

Versatec: PROGRAM
IMPORTS InlineDefs, PressDefs, ProcessDefs, SystemDefs
EXPORTS VersatecDefs =
BEGIN OPEN InlineDefs, PressDefs, ProcessDefs, SystemDefs;

StartVersatecPlot: PUBLIC PROCEDURE[fileName: STRING, width,height: CARDINAL] =
BEGIN
ScanLineLength ← (width+1)/16;
ScanLine ← AllocateHeapNode[ScanLineLength];
ScanLineReady ← TRUE;
Done ← FALSE;
Detach[FORK GeneratePressFile[fileName, width,height]];
WHILE ScanLineReady DO Yield[]; ENDLOOP; --make sure GetLine is waiting
END;

EndVersatecPlot: PUBLIC PROCEDURE =
BEGIN
FreeHeapNode[ScanLine];
ClosePressFile[@pressFileDescriptor];
END;

WriteVersatecLine: PUBLIC PROCEDURE [line: LONG POINTER, nBytes: CARDINAL] =
BEGIN
IF Done THEN RETURN;
WHILE ScanLineReady DO Yield[]; ENDLOOP;
LongCOPY[line, ScanLineLength, ScanLine];
ScanLineReady ← TRUE;
END;

--the following runs as a separate process, since
PutComputedDots insists on having control
GeneratePressFile: PROCEDURE[fileName: STRING, width,height: CARDINAL] =
BEGIN
InitPressFileDescriptor[@pressFileDescriptor,fileName];
PutComputedDots[@pressFileDescriptor,
0,0,width,height,1,width,height,GetLine];
Done ← TRUE;
END;

GetLine: PROCEDURE RETURNS[POINTER] =
BEGIN
ScanLineReady ← FALSE;
UNTIL ScanLineReady DO Yield[]; ENDLOOP;
RETURN[ScanLine];
END;

pressFileDescriptor: PressFileDescriptor;
ScanLine: POINTER ← NIL;
ScanLineLength: CARDINAL;
ScanLineReady: BOOLEAN;
Done: BOOLEAN;

-- *** START CODE ***

END.