-- GraphicsDefs.mesa
-- Written by Joe Maleson
-- Last changed by Doug Wyatt, April 9, 1981  4:15 PM

DIRECTORY
	BitBltDefs USING [BBoperation, BBsourcetype];

GraphicsDefs: DEFINITIONS =
BEGIN
Bitmap: TYPE = RECORD
 [	bank: [0..7], --3 bits for Box (idiotic space optimization)
	nWords: [0..1777B],
	nBits,nLines: CARDINAL,
	nBitsPerPixel: [0..256) ← 1,
	portraitMode: BOOLEAN ← TRUE,
	scaleFactor: [0..128) ← 10,
	bits: POINTER TO ARRAY [0..0) OF CARDINAL
 ];
Rectangle: TYPE = RECORD
 [	x1,y1,x2,y2: INTEGER --with x1<x2, y1<y2
 ];
BoxType: TYPE = {normal,outline,gray};
Box: TYPE = RECORD
	[boxBitmap: Bitmap,
	 savedBits: POINTER TO ARRAY [0..0) OF CARDINAL, --used when moving around
	 displayBitmap: POINTER TO Bitmap,
	 displayX,displayY: CARDINAL, 
	 displayed: BOOLEAN,	--1 bit	(i.e.,whether displayX,Y are valid)
	 savedBank: [0..7], --3 bits 
	 function: BitBltDefs.BBoperation,	--2 bits
	 type: BoxType,	--2 bits
	 gray: [0..256)	--8 bits
	];

StrikeFont: TYPE = RECORD
	[oneBit,index,fixed: [0..1],
	 bank: [0..77B],
	 minCode,maxCode: CARDINAL,
	 maxWidth: CARDINAL,
	 strikeBodyWordLength: CARDINAL,
	 ascent,descent: CARDINAL,
	 wordsPerScanLine: CARDINAL,
	 bitmap: POINTER TO ARRAY [0..0) OF CARDINAL,
	 xInSegment: POINTER TO ARRAY [0..0) OF CARDINAL
	];
textMode: TYPE = [0..3];
normal: textMode = 0;
italic: textMode = 1;
bold: textMode=2;

--routines exported by BitmapFns

SetDefaultBitmap: PROCEDURE [width,height: CARDINAL];
TurnOnGraphics: PROCEDURE [bitsPerPixel: CARDINAL ← 1,portraitMode: BOOLEAN ← TRUE,scalePercent: CARDINAL ← 100] RETURNS [POINTER TO Bitmap];
GetDefaultBitmapHandle: PROCEDURE RETURNS [POINTER TO Bitmap];
SetXMAlloc: PROCEDURE [Allocate: PROCEDURE [nwords: CARDINAL] RETURNS [LONG POINTER],Free: PROCEDURE [LONG POINTER]];
GetXMAlloc: PROCEDURE RETURNS [Allocate: PROCEDURE [nwords: CARDINAL] RETURNS [LONG POINTER],Free: PROCEDURE [LONG POINTER]];

PutPoint: PROCEDURE [x,y: CARDINAL,b: POINTER TO Bitmap ← NIL];
ErasePoint: PROCEDURE [x,y: CARDINAL,b: POINTER TO Bitmap ← NIL];
XorPoint: PROCEDURE [x,y: CARDINAL,b: POINTER TO Bitmap ← NIL];

PutLine: PROCEDURE [x1,y1,x2,y2: CARDINAL,b: POINTER TO Bitmap ← NIL];
EraseLine: PROCEDURE [x1,y1,x2,y2: CARDINAL,b: POINTER TO Bitmap ← NIL];
XorLine: PROCEDURE [x1,y1,x2,y2: CARDINAL,b: POINTER TO Bitmap ← NIL];

PutArea: PROCEDURE [x1,y1,x2,y2: CARDINAL,b: POINTER TO Bitmap ← NIL];
EraseArea: PROCEDURE [x1,y1,x2,y2: CARDINAL,b: POINTER TO Bitmap ← NIL];
XorArea: PROCEDURE [x1,y1,x2,y2: CARDINAL,b: POINTER TO Bitmap ← NIL];
ReplaceArea: PROCEDURE [x1,y1,x2,y2: CARDINAL,b: POINTER TO Bitmap ← NIL];

PutGray: PROCEDURE [x1,y1,x2,y2: CARDINAL,b: POINTER TO Bitmap ← NIL];
EraseGray: PROCEDURE [x1,y1,x2,y2: CARDINAL,b: POINTER TO Bitmap ← NIL];
XorGray: PROCEDURE [x1,y1,x2,y2: CARDINAL,b: POINTER TO Bitmap ← NIL];
ReplaceGray: PROCEDURE [x1,y1,x2,y2: CARDINAL,b: POINTER TO Bitmap ← NIL];
MaskGray: PROCEDURE [x1,y1,x2,y2: CARDINAL,b: POINTER TO Bitmap ← NIL];

PutBitmap: PROCEDURE [b: POINTER TO Bitmap,x,y: CARDINAL,dest: POINTER TO Bitmap ← NIL];
EraseBitmap: PROCEDURE [b: POINTER TO Bitmap,x,y: CARDINAL,dest: POINTER TO Bitmap ← NIL];
XorBitmap: PROCEDURE [b: POINTER TO Bitmap,x,y: CARDINAL,dest: POINTER TO Bitmap ← NIL];
ReplaceBitmap: PROCEDURE [b: POINTER TO Bitmap,x,y: CARDINAL,dest: POINTER TO Bitmap ← NIL];

--grey square functions (affect subsequent PutArea commands)
SetGrayThresholds: PROCEDURE [new: POINTER TO ARRAY [0..0) OF CARDINAL,outputDevice: POINTER TO Bitmap ← NIL];
SetGrayLevel: PROCEDURE [intensity: CARDINAL,outputDevice: POINTER TO Bitmap ← NIL]; --set intensity value for area stuff
GetGrayBlock: PROCEDURE RETURNS [gray0,gray1,gray2,gray3: CARDINAL];
PutGrayBitmap: PROCEDURE [b: POINTER TO Bitmap,x,y: CARDINAL,
	dest: POINTER TO Bitmap ← NIL];
SetRed: PROCEDURE[gray: [0..256),newVal: [0..256),outputDevice: POINTER TO Bitmap ← NIL]; 
SetGreen: PROCEDURE[gray: [0..256),newVal: [0..256),outputDevice: POINTER TO Bitmap ← NIL]; 
SetBlue: PROCEDURE[gray: [0..256),newVal: [0..256),outputDevice: POINTER TO Bitmap ← NIL]; 
GetRed: PROCEDURE[gray: [0..256),outputDevice: POINTER TO Bitmap ← NIL] RETURNS [CARDINAL]; 
GetGreen: PROCEDURE[gray: [0..256),outputDevice: POINTER TO Bitmap ← NIL] RETURNS [CARDINAL]; 
GetBlue: PROCEDURE[gray: [0..256),outputDevice: POINTER TO Bitmap ← NIL] RETURNS [CARDINAL]; 

--Area function: copy (with possible rescaling)
TransferRectangle: PROCEDURE [src,dest: POINTER TO Bitmap,
	srcRectangle,destRectangle: POINTER TO Rectangle,
	fn: BitBltDefs.BBoperation ← replace,type: BitBltDefs.BBsourcetype ← block];

--and the real functions
SetPoint: PROCEDURE [x,y: CARDINAL,fn: BitBltDefs.BBoperation,
	b: POINTER TO Bitmap ← NIL];
SetLine: PROCEDURE [x1,y1,x2,y2: CARDINAL,fn: BitBltDefs.BBoperation,
	b: POINTER TO Bitmap ← NIL];
SetArea: PROCEDURE [x1,y1,x2,y2: CARDINAL,fn: BitBltDefs.BBoperation,
	b: POINTER TO Bitmap ← NIL];
SetGray: PROCEDURE [x1,y1,x2,y2: CARDINAL,fn: BitBltDefs.BBoperation,
	b: POINTER TO Bitmap ← NIL];
SetBitmap: PROCEDURE [b: POINTER TO Bitmap,
	x,y: CARDINAL,fn: BitBltDefs.BBoperation,dest: POINTER TO Bitmap ← NIL];

--routines exported by TextFns

GetStrikeHandle: PROCEDURE [fontName: STRING] RETURNS [POINTER TO StrikeFont];
GetFontNameArray: PROCEDURE RETURNS [POINTER TO ARRAY [0..0) OF STRING,CARDINAL];

PutText: PROCEDURE [s: STRING,x,y: CARDINAL,font: POINTER TO StrikeFont,mode: textMode,b: POINTER TO Bitmap ← NIL] RETURNS [nextX: CARDINAL];
ReplaceText: PROCEDURE [s: STRING,x,y: CARDINAL,font: POINTER TO StrikeFont,mode: textMode,b: POINTER TO Bitmap ← NIL] RETURNS [nextX: CARDINAL];
EraseText: PROCEDURE [s: STRING,x,y: CARDINAL,font: POINTER TO StrikeFont,mode: textMode,b: POINTER TO Bitmap ← NIL] RETURNS [nextX: CARDINAL];
XorText: PROCEDURE [s: STRING,x,y: CARDINAL,font: POINTER TO StrikeFont,mode: textMode,b: POINTER TO Bitmap ← NIL] RETURNS [nextX: CARDINAL];

SetText: PROCEDURE [s: STRING,x,y: CARDINAL,fn: BitBltDefs.BBoperation,font: POINTER TO GraphicsDefs.StrikeFont,mode: GraphicsDefs.textMode,b: POINTER TO GraphicsDefs.Bitmap ← NIL]  RETURNS [nextX: CARDINAL];

--routines exported by BoxFns

CreateBox: PROCEDURE [b: POINTER TO Box,width,height: CARDINAL];
DisplayBox: PROCEDURE [b: POINTER TO Box,x,y: CARDINAL,
	bitmap: POINTER TO Bitmap ← NIL];
ReleaseBox: PROCEDURE [b: POINTER TO Box]; --release temp storage for current box
RemoveBox: PROCEDURE [b: POINTER TO Box]; --undisplay
DestroyBox: PROCEDURE [b: POINTER TO Box,restore: BOOLEAN];
CursorInBox: PROCEDURE [b: POINTER TO Box] RETURNS [BOOLEAN];
MoveBox: PROCEDURE [b: POINTER TO Box,cornerX,cornerY: CARDINAL]; 
PaintBox: PROCEDURE [b: POINTER TO Box]; --update current display
END.