--Interface to low level display stuff
--M. Stone December 4, 1980 4:22 PM
DIRECTORY
SegmentDefs: FROM "SegmentDefs",
PointDefs: FROM "PointDefs" USING[ScrPt],
BitBltDefs: FROM "BitBltDefs";
ScreenDefs: DEFINITIONS =
BEGIN OPEN PointDefs;
BlockPtr: TYPE = POINTER TO Block;
ScreenPtr: TYPE = POINTER TO Screen;
BitmapPtr: TYPE =LONG POINTER TO Bitmap;
Bitmap: TYPE = RECORD
[bank: SegmentDefs.BankIndex,
nWords: [0..377B],
nBits,nLines: CARDINAL,
bits: POINTER
];
Block: TYPE = RECORD --mostly for source blocks
[bitmap: BitmapPtr,
lx,ty,w,h: INTEGER --since usually source, not really a screen point
];
Screen: TYPE = RECORD
[bitmap: Bitmap, --defined on a plane of bits
ty,by,lx,rx: INTEGER --clipping edges
];
GreyType: TYPE = POINTER TO ARRAY [0..3] OF CARDINAL;
ColorMapIndex: TYPE = CARDINAL;
JunctionType: TYPE = {round,square,angled};
EndType: TYPE = RECORD
[type: SELECT xx: * FROM
round,flat => NULL,
angled => [From,To: ScrPt], --clipping edge, keep on right
ENDCASE
];
--routines exported by ScreenFns
RestoreDCBBank: PROCEDURE;
SetScreen: PROCEDURE [screen: ScreenPtr]; --defines the current screen
GetCurrentScreen: PROCEDURE RETURNS[ScreenPtr] ; --returns the current screen
ClearScreen: PROCEDURE;
SetClipEdges: PROCEDURE [tl,br: ScrPt];
--return a box clipped to screen
ClipToScreen: PROCEDURE [tl,br: ScrPt] RETURNS [ScrPt, ScrPt];
ClipPointToScreen: PUBLIC PROC [pt: ScrPt] RETURNS [ScrPt];
ResetClipEdges: PROCEDURE;--changes clipping edges of current screen to size at init
--clip options are because someone higher up might do some culling
ClipperState: TYPE = {clip,cull,inside};
PrimeClipper: PROC [tl,br: PointDefs.ScrPt] RETURNS [ClipperState];
ClipOn: PROCEDURE; --resets PrimeClipper
SetFunction: PROCEDURE [fnc: BitBltDefs.BBoperation];
--All of these assume the current Display state
SetLineParms: PROCEDURE
[junction: JunctionType,
width: INTEGER,
grey: GreyType,
color: ColorMapIndex,
firstEnd,lastEnd: EndType
];
StartLine: PROCEDURE[pt: ScrPt];
DrawTo: PROCEDURE[pt: ScrPt]; --uses junction type
DrawToShort: PROCEDURE[pt: ScrPt]; --splines use this one alot, uses round jnc
EndLine: PROCEDURE;
DrawSingleDot: PROCEDURE[pt: ScrPt];
--draws a round dot
DrawNextDot: PROCEDURE[pt: ScrPt];
-- draws a dot which is part of a line.
-- EndLine must be called for completion
BLTBlockInScreen: PROCEDURE
[src: BlockPtr,
tl: PointDefs.ScrPt,
fnc: BitBltDefs.BBoperation
];
MoveScreenBox: PROCEDURE[tl,br: ScrPt,dx,dy: INTEGER];
EraseBox: PUBLIC PROCEDURE[tl,br: ScrPt];
EraseBoxBW: PUBLIC PROCEDURE[tl,br: PointDefs.ScrPt];
InvertBox: PUBLIC PROCEDURE[tl,br: ScrPt];
--for scan conversion.
SetFillParms: PROCEDURE [grey: GreyType, color: ColorMapIndex];
HFill: PROCEDURE[y,lx,dx: INTEGER];
VFill: PROCEDURE[x,ty,by: INTEGER];
BoxFill: PROCEDURE[tl,br: ScrPt];
GetGridParameters: PROCEDURE
RETURNS[center: ScrPt,hgridlx,hgridrx,vgridty,vgridby,gridt: INTEGER];
BltVGrid: PROCEDURE[lx: INTEGER];
BltHGrid: PROCEDURE[ty: INTEGER];
END.