-- PDInterpOutputRavenImpl.mesa -- Copyright (C) 1984, Xerox Corporation. All rights reserved. -- Michael Plass, 20-Sep-84 12:34:40 -- DIRECTORY Environment, PDFileFormat, PDInterpBasic, PDInterpOutput, PDInterpBitmap, RavenSlotDriver, PDInterpSysCalls, PDQueue, Process; PDInterpOutputRavenImpl: PROGRAM IMPORTS PDInterpBitmap, RavenSlotDriver, PDInterpSysCalls, PDQueue, Process 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, request: PDQueue.Request] 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 [request: PDQueue.Request] = { PrintPage[]; }; PrintPage: 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 IF s = warming THEN Process.Pause[Process.MsecToTicks[10000]]; ENDLOOP }; ENDCASE => EXIT; -- ok ENDLOOP; ENDLOOP; }; ReprintLastPage: PUBLIC PROC [copies: CARDINAL] = { IF currentHerald.password # PDFileFormat.passwordValue THEN RETURN; currentHerald.copies ← copies; PrintPage[]; }; currentHerald.password ← 0; END.