-- 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.