PDInterpStubImpl.mesa
Michael Plass, November 11, 1983 4:54 pm
DIRECTORY BitBlt, IO, Environment, FileIO, MessageWindow, PDFileFormat, PDInterpBasic, PDInterpInput, PDInterpOutput, PDInterpControl, PDInterpBitmap, UserTerminal;
PDInterpStubImpl: PROGRAM
IMPORTS IO, FileIO, MessageWindow, PDInterpControl, PDInterpBitmap, UserTerminal
EXPORTS PDInterpInput, PDInterpOutput
~ BEGIN
Rep: PUBLIC TYPE ~ RECORD[foo: NAT];
stream: IO.STREAM ← FileIO.Open["banded.pd"];
ReOpen: PROC ~ {IO.Close[stream]; stream ← FileIO.Open["banded.pd"]};
aborted: BOOLEANFALSE;
GetBlock: PUBLIC PROC [handle: PDInterpInput.Handle, dest: LONG POINTER, sourceIndex: INT, words: INT] RETURNS [wordsRead: INT] ~ {
wordsRead ← 0;
stream.SetIndex[sourceIndex*2];
WHILE words-wordsRead > 1000 DO
wordsThisBlock: INT ← (stream.UnsafeGetBlock[[dest, 0, 1000*2]])/2;
wordsRead ← wordsRead + wordsThisBlock;
dest ← dest + wordsThisBlock;
IF wordsThisBlock < 1000 THEN EXIT;
ENDLOOP;
wordsRead ← wordsRead + (stream.UnsafeGetBlock[[dest, 0, (words-wordsRead)*2]])/2;
};
mess: CARDINAL ← 0;
ReportStatus: PUBLIC PROC [handle: PDInterpInput.Handle, status: PDInterpBasic.Status, queueSize: NAT, queuePosition: NAT, page, pass, sourceIndex: INT] RETURNS [abort: BOOLEAN] ~ {
s: IO.STREAMIO.CreateOutputStreamToRope[];
s.Put[IO.refAny[NEW[PDInterpBasic.Status ← status]]];
s.PutRope[", "];
MessageWindow.Append[IO.GetOutputStreamRope[s], mess MOD 4 = 0];
mess ← mess + 1;
s.Close[];
abort ← aborted;
};
currentHerald: PDFileFormat.Herald;
currentStartImage: PDFileFormat.StartImage;
currentBandNumber: NAT ← 0;
screen: PDInterpBitmap.BitmapDesc ← ScreenDesc[];
ScreenDesc: PROC RETURNS [display: PDInterpBitmap.BitmapDesc] ~ {
bb: BitBlt.BBTable;
[] ← UserTerminal.SetState[on];
bb ← UserTerminal.GetBitBltTable[];
display ← [sOrigin: 0, fOrigin: 0, sMin: 0, fMin: 0,
sSize: bb.height,
fSize: bb.width,
pointer: bb.dst.word,
rast: bb.width/Environment.bitsPerWord,
lines: bb.height
];
display ← display.ShiftMap[-18, -1];
display ← display.Clip[[0, 0, 720, 598]];
PDInterpBitmap.Fill[display, [0,0,10000,10000], 1];
display.sOrigin ← display.sOrigin + 384;
display.fOrigin ← display.fOrigin + 384;
};
CurrentBandDesc: PROC RETURNS [bitmapDesc: PDInterpBitmap.BitmapDesc] ~ {
rectangle: PDInterpBitmap.Rectangle ← [
sMin: currentHerald.bandSSize*(currentBandNumber+currentStartImage.passBands),
fMin: currentStartImage.fMinPage,
sSize: currentHerald.bandSSize,
fSize: currentStartImage.fSizePage
];
bitmapDesc ← screen.Clip[rectangle];
PDInterpBitmap.Fill[bitmapDesc, rectangle, 0];
};
StartImage: PUBLIC PROC [herald: PDFileFormat.Herald, startImage: PDFileFormat.StartImage]
RETURNS [PDInterpBitmap.BitmapDesc] ~ {
currentHerald ← herald;
currentStartImage ← startImage;
currentBandNumber ← 0;
RETURN [CurrentBandDesc[]]
};
EndBand: PUBLIC PROC RETURNS [PDInterpBitmap.BitmapDesc] ~ {
currentBandNumber ← currentBandNumber + 1;
RETURN [CurrentBandDesc[]]
};
EndImage: PUBLIC PROC ~ {MessageWindow.Append["Page Done. ", FALSE]};
DoIt: PROC ~ {
pageSpec: PDInterpControl.PageSpec;
pageSpec[0] ← [0, LAST[NAT]];
PDInterpControl.RequestService[NIL, pageSpec];
};
END.