-- PDInterpOutputImpl.mesa
-- Copyright (C) 1984, Xerox Corporation.  All rights reserved.
-- Michael Plass, September 14, 1984 9:13:47 am PDT
	-- 
DIRECTORY Environment, PDFileFormat, PDInterpBasic, PDInterpOutput, PDInterpBitmap, RavenSlotDriver, PDInterpSysCalls, PDQueue;
	
PDInterpOutputImpl: PROGRAM
	IMPORTS PDInterpBitmap, RavenSlotDriver, PDInterpSysCalls, PDQueue
	EXPORTS PDInterpOutput
= BEGIN
	
bitsPerWord: NAT = Environment.bitsPerWord;
currentHerald: PDFileFormat.Herald;
currentStartImage: PDFileFormat.StartImage;
currentBandNumber: NAT ← 0;
bandWords: INT ← 0;
band: PDInterpBitmap.BitmapDesc ← [sOrigin: 0, fOrigin: 0, sMin: 0, fMin: 0, sSize: 0, fSize: 0, pointer: NIL, rast: 0, lines: 0];
bandWordsAllocated: INT ← 0;
	
CurrentBandDesc: PROC RETURNS [PDInterpBitmap.BitmapDesc] = {
	band.sOrigin ← currentHerald.bandSSize*(currentBandNumber+currentStartImage.passBands);
	PDInterpBitmap.Clear[band];
	RETURN [band]
	};
	
StartImage: PUBLIC PROC [herald: PDFileFormat.Herald, startImage: PDFileFormat.StartImage]
	RETURNS [PDInterpBitmap.BitmapDesc] = {
	rast: NAT = (startImage.fSizePage+bitsPerWord-1)/bitsPerWord;
	lines: INT = herald.bandSSize;
	words: INT = rast*lines;
	currentHerald ← herald;
	currentStartImage ← startImage;
	currentBandNumber ← 0;
	IF words > bandWordsAllocated THEN {
		IF band.pointer # NIL THEN PDInterpSysCalls.FreeSpace[band.pointer];
		band.pointer ← PDInterpSysCalls.AllocateSpace[words];
		bandWordsAllocated ← words;
		};
	band.sOrigin ← 0;
	band.fOrigin ← startImage.fMinPage;
	band.sMin ← 0;
	band.fMin ← 0;
	band.sSize ← herald.bandSSize;
	band.fSize ← rast*bitsPerWord;
	band.rast ← rast;
	band.lines ← herald.bandSSize;
	bandWords ← words;
	RETURN [CurrentBandDesc[]]
	};
	-- 
EndBand: PUBLIC PROC RETURNS [PDInterpBitmap.BitmapDesc] = {
	RavenSlotDriver.HyperStore[
		sourcePtr: band.pointer,
		destOffset: bandWords*currentBandNumber,
		wordCount: bandWords
		];
	currentBandNumber ← currentBandNumber + 1;
	RETURN [CurrentBandDesc[]]
	};
	
EndImage: PUBLIC PROC = {
	successCode: RavenSlotDriver.SuccessCode;
	slowMargin: CARDINAL ← currentHerald.bandSSize*currentStartImage.passBands;
	fastMargin: CARDINAL ← band.fOrigin;
	numberOfLines: CARDINAL ← currentHerald.bandSSize*currentStartImage.nBands;
	scanLineLength: CARDINAL ← band.fSize;
	FOR copyNum: CARDINAL IN [0..currentHerald.copies) DO
		DO 
			s:RavenSlotDriver.PrinterStatus;
			successCode ← RavenSlotDriver.PrintPage[
				slowMargin: slowMargin,
				fastMargin: fastMargin,
				numberOfLines: numberOfLines,
				scanLineLength: scanLineLength,
				paperSource: top,
				paperStacking: aligned
				];
			SELECT successCode FROM
				warning => EXIT;
				error => {
					WHILE (s←RavenSlotDriver.GetStatus[])#standBy DO
						RavenSlotDriver.DisplayBadStatusInMP[s];
						SELECT s FROM
							registrationJam => PDQueue.LogMessage[" - Registration jam"];
							fuserJam => PDQueue.LogMessage[" - Fuser jam"];
							warming => PDQueue.LogMessage[" - Warming up"];
							feederFault => PDQueue.LogMessage[" - Out of paper"];
							interlockOpen => PDQueue.LogMessage[" - Door open"];
							fuserCold => PDQueue.LogMessage[" - Fuser cold"];
							parityError => PDQueue.LogMessage[" - Parity Error"];
							offLine => PDQueue.LogMessage[" - Offline"];
							ENDCASE => PDQueue.LogMessage[" - Can't feed page"];
						ENDLOOP
					};
				ENDCASE => EXIT; -- ok
			ENDLOOP;
		ENDLOOP;
	};

ReprintLastPage: PUBLIC PROC [copies: CARDINAL] ~ {
	IF currentHerald.password # PDFileFormat.passwordValue THEN RETURN;
	currentHerald.copies ← copies;
	EndImage[];
	};
	
currentHerald.password ← 0;
	
END.