-- PressDefs.mesa
-- Written by Joe Maleson
-- Last changed by Doug Wyatt, April 9, 1981  4:40 PM
-- Last changed by Schmidt (conversion to Pilot),  1-Jul-81 16:05:38

DIRECTORY
	File USING [Capability],
	Stream USING [Handle -- , DiskHandle -- ]; -- ,
	--DiscoDefs USING [DiskPosition];

PressDefs: DEFINITIONS = {

-- standard press file procedural interface

InitPressFileDescriptor: PUBLIC PROC [
	p: LONG POINTER TO PressFileDescriptor, filename: LONG STRING];

SetSpaceX: PROC [p: LONG POINTER TO PressFileDescriptor, micaX: CARDINAL];

SetSpaceY: PROC [p: LONG POINTER TO PressFileDescriptor, micaY: CARDINAL];

ResetSpace: PROC [p: LONG POINTER TO PressFileDescriptor];

PutSpace: PROC [p: LONG POINTER TO PressFileDescriptor];

SetColor: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor, 
	hue,sat,bright: [0..256)];

SetHue: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor,hue: [0..256)];

SetSaturation: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor,sat: [0..256)];

SetBrightness: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor,
	bright: [0..256)];

SetFont: PUBLIC PROC [p: LONG POINTER TO PressDefs.PressFileDescriptor,
	Name: LONG STRING,PointSize: CARDINAL,Face: CARDINAL ← 0,
	Rotation: CARDINAL ← 0];

PutText: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor,str: LONG STRING,
	xleft,ybase: CARDINAL];

PutRectangle: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor,
	 xstart,ystart,xlen,ylen: CARDINAL];

PutTextHere: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor,
	str: LONG STRING];

PutRectangleHere: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor, 
	xlen,ylen: CARDINAL];

StartOutline: PUBLIC PROC[p: LONG POINTER TO PressFileDescriptor,x0,y0: CARDINAL];

PutMoveTo: PUBLIC PROC[p: LONG POINTER TO PressFileDescriptor,
	xend,yend: CARDINAL];

PutDrawTo: PUBLIC PROC[p: LONG POINTER TO PressFileDescriptor,
	xend,yend: CARDINAL];

PutCubic: PUBLIC PROC[p: LONG POINTER TO PressFileDescriptor,
	x1,y1,x2,y2,x3,y3: REAL];
--Extend outline by cubic relative to current position
--xi is x coefficient of t↑i, etc.

EndOutline: PUBLIC PROC[p: LONG POINTER TO PressFileDescriptor];

PutAltoDots: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor,
	x,y,nDots,nScanLines: CARDINAL,dots: LONG POINTER];

PutPressDotsData: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor,
	x,y: CARDINAL,dotsData: LONG POINTER TO PressDotsData,
	nextScanLine: PROC RETURNS [LONG POINTER]];

PutDots: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor,
	x,y,nPixels,nScanLines,bitsPerPixel,width,height: CARDINAL,dots: LONG POINTER,
	screenFrequency: CARDINAL ← 0,screenAngle: CARDINAL ← 45];

PutComputedDots: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor,
	x,y,nPixels,nScanLines,bitsPerPixel,width,height: CARDINAL,
	nextScanLine: PROC RETURNS [LONG POINTER],
	screenFrequency: CARDINAL ← 0, screenAngle: CARDINAL ← 45,
	min,max: CARDINAL ← 0];

PutDotsFromFile: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor,
	x,y,nPixels,nScanLines,bitsPerPixel,width,height: CARDINAL,dots: LONG STRING,
	screenFrequency: CARDINAL ← 0,screenAngle: CARDINAL ← 45,
	min,max: CARDINAL ← 0];

WritePage: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor];

ClosePressFile: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor];

--low level utility functions

MulDiv: PUBLIC PROC [a,b,c:CARDINAL] RETURNS [CARDINAL];

SignedMulDiv: PUBLIC PROC [a,b,c:INTEGER] RETURNS [INTEGER];

SetBlock: PUBLIC PROC [buf: LONG POINTER TO ARRAY [0..0) OF INTEGER,
	val,len: INTEGER];

WriteCommand: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor,
	Command: CARDINAL, Param: POINTER TO ARRAY [0..6) OF CARDINAL];

WriteDirectory: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor];

WritePartDirectory: PUBLIC PROC [p: LONG POINTER TO PressFileDescriptor];

--font operations (from FontWidth)

EncodeFace: PUBLIC PROC [weight,slope,expansion: CHARACTER] RETURNS [INTEGER];

LookupFontName: PROC [s:  Stream.Handle,famstr: LONG STRING,
	face,siz,rot: INTEGER,
	bufx,bufy: LONG POINTER TO ARRAY [0..256) OF INTEGER,
	boundbox: LONG POINTER TO ARRAY [0..4) OF INTEGER]  RETURNS[BOOLEAN];

missingWidth: INTEGER = LOOPHOLE[100000B]; -- width for missing character

--press object functions and data structures

OpenPressFile: PUBLIC PROC [fileName: LONG STRING,
	pfp: LONG POINTER TO PressFilePointers] RETURNS [nPages: CARDINAL];
OpenPressFileFromCap: PUBLIC PROC [cap: File.Capability,
	pfp: LONG POINTER TO PressFilePointers] RETURNS [nPages: CARDINAL];

--userProc is really PROC[p: LONG POINTER TO PressPage];
--  it is called once for each object on the page
GetPressPageFromCap: PUBLIC PROC[cap: File.Capability,
	pageNumber: CARDINAL,p: LONG POINTER TO PressPage,userProc: UNSPECIFIED ← 0];
ReadPressPage: PROC [pfp: LONG POINTER TO PressFilePointers,
	pageNumber: CARDINAL,p: LONG POINTER TO PressPage,
	userProc: UNSPECIFIED ← 0];

ReleasePressFilePointers: PUBLIC PROC [pfp: LONG POINTER TO PressFilePointers];

GetPressPage: PROC[fileName: LONG STRING,pageNumber: CARDINAL,
	p: LONG POINTER TO PressPage];	

GetPressDotsData: PROC [obj: LONG POINTER TO PressObject,
	dots: LONG POINTER TO PressDotsData];

ReleasePressPage: PROC[p: LONG POINTER TO PressPage];	

PutPressPage: PROC[pfd: LONG POINTER TO PressFileDescriptor,
	p: LONG POINTER TO PressPage,dx: CARDINAL ← 0,dy: CARDINAL ← 0];	

PressObject: TYPE = RECORD
 [	link: LONG POINTER TO PressObject,
	micaX,micaY: CARDINAL,
	command: PressDefs.ELCommand,

	--to keep this data type autonomous, include all global state
	hue,sat,br: [0..377B],
	spaceX,spaceY: CARDINAL,
	font: [0..17B],

	--and stuff to get data from input stream
	nDataBytes: [0..7777B] --,
	-- diskPosition: DiscoDefs.DiskPosition
 ];

PressDotsData: TYPE = RECORD
 [	nBitsPerPixel,nPixels,nLines: CARDINAL,
	passPixels,displayPixels,passLines,displayLines: CARDINAL,
	micaWidth,micaHeight: CARDINAL,
	min,max: CARDINAL,
	angle,frequency: CARDINAL,
	opaque: BOOLEAN,
	haveDot: BOOLEAN,	--whether dotPosition is relevant
	mode: [0..15],
	fileName: LONG STRING,	--in case GetDotsFromFile
	dotPosition,diskPosition: CARDINAL -- DiscoDefs.DiskPosition
 ];

PressFont: TYPE = RECORD
 [	Family: LONG STRING,
	PointSize,Face,Rotation: CARDINAL,
	Widths: LONG POINTER TO ARRAY CHARACTER [0C..377C] OF INTEGER
 ];

PressPage: TYPE = RECORD
 [	leftX,bottomY,rightX,topY: CARDINAL,	--bounding box in micas for page
	ObjectList: LONG POINTER TO PressObject,	--linked list
	FontDir: ARRAY[0..16] OF LONG POINTER TO PressFont --allows 16 fonts+NIL trailer
 ];

PressFilePointers: TYPE = RECORD
 [	FontDir: LONG POINTER TO ARRAY [0..0) OF PressFontEntry,
	PartDir: LONG POINTER TO ARRAY [0..0) OF PartEntry --,
	-- vDAs: LONG POINTER TO ARRAY [0..0) OF AltoFileDefs.vDA,
	-- fontWidthsStream: StreamDefs.DiskHandle
 ];

--data structures and constants

EntityDef: TYPE = RECORD
 [	trailer: LONG POINTER TO EntityCommandTrailer,
	commands: LONG POINTER TO PACKED ARRAY [0..0) OF ELCommand
 ];

Byte: TYPE = [0..377B];
PressPassword: CARDINAL = 27183;

PressFileDescriptor: TYPE = RECORD
 [ outStream: Stream.Handle,
   fontDir: LONG POINTER TO FontDir,
   partDir: LONG POINTER TO PartDir,
	EntityCommandLen: CARDINAL,
	EntityCommandMaxLen: CARDINAL,
	EntityCommands: POINTER TO PACKED ARRAY [0..2048) OF [0..256),
	RecordStart: CARDINAL,
	fontLen: CARDINAL,
	partLen: CARDINAL,
	numParts: CARDINAL,
	numFonts: CARDINAL,
	FirstCopy: CARDINAL,
	LastCopy: CARDINAL,
	solidCode: CHARACTER,
	PressFileName: LONG STRING,
	UserName: LONG STRING,
	DateString: LONG STRING,
	--general page params
	TopMarg,BottomMarg,LeftMarg,RightMarg: INTEGER,
	--some stuff to do with current font etc.
	CurSpaceX,CurSpaceY: CARDINAL,
	CurHue,CurSat,CurBright: [0..256)
 ];

FontDir: TYPE = ARRAY [0..128) OF LONG POINTER; -- to FontEntry or FontCharacter
PartDir: TYPE = ARRAY [0..128) OF PartEntry;
DocDir: TYPE = MACHINE DEPENDENT RECORD
 [ Password: CARDINAL,
   nRecs: CARDINAL,
   nParts: CARDINAL,
   partDirStart: CARDINAL,
   partLength: CARDINAL,
   spare1: CARDINAL,
   date: LONG INTEGER,
   firstCopy: INTEGER,
   lastCopy: INTEGER,
   firstPage: INTEGER,
   lastPage: INTEGER,
   spare2: Byte,
   solidCode: CHARACTER,
   spare3: ARRAY [13D..177B] OF CARDINAL,
   fileName: PACKED ARRAY [ 0..51] OF CHARACTER,
   userName: PACKED ARRAY [0..31] OF CHARACTER,
   dateString: PACKED ARRAY [0..39] OF CHARACTER,
   spare4: ARRAY [276B..377B] OF CARDINAL
 ];

PartType: TYPE = CARDINAL;
Page: PartType = 0;
Font: PartType = 1;
ExternalFileDirectory: PartType = 2;
PartEntry: TYPE = MACHINE DEPENDENT RECORD
 [ Type: PartType,
   RecordStart: CARDINAL,
   RecordLength: CARDINAL,
   PaddingLength: CARDINAL
 ];

PressFontEntry: TYPE = MACHINE DEPENDENT RECORD
 [ EntryLength: CARDINAL,
   FontSet: Byte,
   Font: Byte,
   M: Byte,
   N: Byte,
   Family: PACKED ARRAY [0..20) OF CHARACTER,
   Face: Byte,
   Source: Byte,
   Size: CARDINAL,
   Rotation: CARDINAL
 ];
FontEntry: TYPE = RECORD
 [ EntryLength: CARDINAL,
   FontSet: Byte,
   Font: Byte,
   M: Byte,
   N: Byte,
   Family: LONG STRING,
   Face: Byte,
   Source: Byte,
   Size: CARDINAL,
   Rotation: CARDINAL
 ];
FontCharacter: TYPE = MACHINE DEPENDENT RECORD
 [ EntryLength: CARDINAL,
   FontSet: Byte,
   Font: Byte,
   M: Byte,
   AllOnes: Byte,
   Zero: CARDINAL,
   ObjectList: LONG POINTER
 ];

MRR: Byte = 0;
MIR: Byte = 1;
BRR: Byte = 2;
BIR: Byte = 3;
EntityCommandTrailer: TYPE = MACHINE DEPENDENT RECORD
[
Type: Byte,
FontSet: Byte,
BeginByte,ByteLen: ARRAY[0..1] OF CARDINAL,
Xe,Ye,Left,Bottom,Width,Height,EntityLen: CARDINAL
];

	--General constants
MicasPerInch: INTEGER=2540;
PointsPerInch: INTEGER=72;
MicaHeight: INTEGER = MicasPerInch*11;
MicaWidth: INTEGER = (MicasPerInch/2)*17;
maxFonts: CARDINAL = 16;
   --Entity list commands;
ELCommand: TYPE = [0..377B];
ELShowCharactersShort: ELCommand = 0;
ELSkipCharactersShort: ELCommand = 40B;
ELShowCharactersAndSkip: ELCommand = 100B;
ELSetSpaceXShort: ELCommand = 140B;
ELSetSpaceYShort: ELCommand = 150B;
ELFont: ELCommand = 160B;
ELSkipControlBytesImmediate: ELCommand = 353B;
ELAlternative: ELCommand = 354B;
ELOnlyOnCopy: ELCommand = 355B;
ELSetX: ELCommand = 356B;
ELSetY: ELCommand = 357B;
ELShowCharacters: ELCommand = 360B;
ELSkipCharacters: ELCommand = 361B;
ELSkipControlBytes: ELCommand = 362B;
ELShowCharacterImmediate: ELCommand = 363B;
ELSetSpaceX: ELCommand = 364B;
ELSetSpaceY: ELCommand = 365B;
ELResetSpace: ELCommand = 366B;
ELSpace: ELCommand = 367B;
ELSetBrightness: ELCommand = 370B;
ELSetHue: ELCommand = 371B;
ELSetSaturation: ELCommand = 372B;
ELShowObject: ELCommand = 373B;
ELShowDots: ELCommand = 374B;
ELShowDotsOpaque: ELCommand = 375B;
ELShowRectangle: ELCommand = 376B;
ELNop: ELCommand = 377B;

--Data list commands;
DLMoveTo: CARDINAL = 0;
DLDrawTo: CARDINAL = 1;
DLDrawCurve: CARDINAL = 2;

DLSetCoding: CARDINAL = 1;		--byte
DLSetWindow: CARDINAL = 1;	--word
DLSetMode: CARDINAL = 2;	--byte
DLSetSize: CARDINAL = 2;	--word
DLDotsFollow: CARDINAL = 3;	--word
DLGetDotsFromFile: CARDINAL = 4;	--word
DLGetDotsFromPressFile: CARDINAL = 5;	--word
DLSetSamplingProperties: CARDINAL = 6;	--word

DLSSPInputIntensity: CARDINAL = 0;	--word
DLSSPOutputIntensity: CARDINAL = 1;	--word
DLSSPScreen: CARDINAL = 2;	--word
DLSSPDot: CARDINAL = 3;	--word
}.