-- AIS.mesa
-- Last changed by Maureen Stone, 17-Nov-81 14:11:11
-- Last changed by Doug Wyatt, 18-Aug-81 17:46:12

DIRECTORY
	File,
	Space,
	AISFormat;
	
AIS: DEFINITIONS = {

-- Types --

FRef: TYPE = LONG POINTER TO FRep; -- AIS File
FRep: TYPE = RECORD [
  file: File.Capability, -- the AIS file
  write: BOOLEAN ← FALSE,
  abase: File.PageNumber ← 0, -- first page of attribute part
  rbase: File.PageNumber ← 0, -- first page of raster part
  raster: Raster,	 -- the raster information
  wordsPerLine: CARDINAL ← 0, -- words per scan line
  buffersize: Space.PageCount ← 0	--raster buffer size
  ];

WRef: TYPE = LONG POINTER TO WRep; -- AIS Window
WRep: TYPE = RECORD [
  fref: FRef ← NIL,	--file descriptor
  bref: BRef ← NIL,	--file buffer descriptor (mess with this at your own risk!)
  firstScan: CARDINAL ← 0,
  lastScan: CARDINAL ← 0,
  firstPixel: CARDINAL ← 0,
  lastPixel: CARDINAL ← 0,
  wordsPerLine: CARDINAL ← 0,	--the number of words for one windowed scan line
  pixelsPerWord: CARDINAL ← 0,
  nextScanLine: CARDINAL ← 0,
  currline:CARDINAL←177777B,
  clineaddr:LONG POINTER←NIL];

BRef: TYPE = LONG POINTER TO BRep;	--AIS file buffer
BRep: TYPE = RECORD [
  space: Space.Handle,
  addr: LONG POINTER ← NIL, -- points to first scan line
  first,last: CARDINAL ← 0 -- first and last scan line numbers
  ];

ScanMode: TYPE = {ru, ul, ld, dr, rd, ur, lu, dl};
-- Scan direction for pixels and lines; for example, "rd" means:
--  successive pixels move rightward in the image
--  successive scanlines move downward in the image

--attribute definitions	
Raster: TYPE = LONG POINTER TO RasterPart;
RasterPart: TYPE = RECORD [
  scanCount: CARDINAL, -- number of scan lines
  scanLength: CARDINAL, -- number of pixels per scan line
  scanMode: ScanMode, -- scanning directions
  bitsPerPixel: [0..16], -- number of bits per pixel
  linesPerBlock: INTEGER,  -- for blocked AIS files.  -1=no blocks
  paddingPerBlock: CARDINAL  --in words
  ];

Placement: TYPE = LONG POINTER TO PlacementPart;
PlacementPart: TYPE = RECORD [
  xLeft: INTEGER,
  yBottom: INTEGER,
  xWidth: INTEGER,
  yHeight: INTEGER
  ];

Photometry: TYPE = LONG POINTER TO PhotometryPart;
PhotometryPart: TYPE = RECORD [
  signal: AISFormat.SignalType,  
  sense: AISFormat.Sense,  
  scaleType: AISFormat.ScaleType,
  pointA: AISFormat.Point,
  pointB: AISFormat.Point,
  pointC: AISFormat.Point,
  spotType: AISFormat.SpotType,
  spotWidth: INTEGER, -- in units of 100*(width in pixels)
  spotLength: INTEGER, -- in units of 100*(length in scanlines)
  sampleMin: INTEGER,  
  sampleMax: INTEGER,
  histogramLength: INTEGER	--0 or -1 means no histogram
  ];

Histogram: TYPE = LONG POINTER TO RECORD[SEQUENCE len: CARDINAL OF INTEGER];

-- Errors --

Error: SIGNAL[type: ErrorType];
ErrorType: TYPE = {invalidFileName, fileAlreadyExists, fileNotFound,
  invalidFile, readOnlyFile, bufferTooSmall, outOfRange,
  invalidParameter, notImplemented,badWindow, volumeFull};


-- File operations --

CreateFile: PROC[name: LONG STRING, raster: Raster,
  overwrite: BOOLEAN ← FALSE, attributeLength: CARDINAL ← 0] RETURNS[f: FRef];

DeleteFile: PROC[name: LONG STRING] RETURNS[success: BOOLEAN];

OpenFile: PROC[name: LONG STRING, write: BOOLEAN ← FALSE] RETURNS[f: FRef];

--DON'T reuse this FRef
CloseFile: PROC[f: FRef];

--read and write attribute information
--For everthing but raster, client passes pointers to records of the correct type.
--A RETURN of FALSE from a Read indicates that the attribute was not present
maxComment: CARDINAL = 256;
--If string buffer is too short, will truncate
ReadComment: PROC[f: FRef, s: LONG STRING] RETURNS[BOOLEAN];
WriteComment: PROC[f: FRef, s: LONG STRING];

ReadPlacement: PROC[f: FRef, placement: Placement] RETURNS[BOOLEAN];
WritePlacement: PROC[f: FRef, placement: Placement];

--histogram is separate from the rest of the photometry info because it is variable length
--Histogram Length is in Photometry.  (0 or -1 means no histogram)
ReadPhotometry: PROC[f: FRef, photometry: Photometry] RETURNS[BOOLEAN];	
--if histogram buffer is too short, will truncate
ReadHistogram: PROC[f: FRef, histogram: Histogram] RETURNS[BOOLEAN];	
--Error is histogram  length # photometry.histogramLength
WritePhotometry: PROC[f: FRef, photometry: Photometry, histogram: Histogram ← NIL];


--raster info always present
--raster info can only be written when doing a CreateFile;
ReadRaster: PROC[f: FRef, raster: Raster];

-- Window operations --

--values will default to file values
OpenWindow: PROC[f: FRef, firstScan: CARDINAL ← 0, lastScan: CARDINAL ← LAST[CARDINAL],
  firstPixel: CARDINAL ← 0, lastPixel: CARDINAL ← LAST[CARDINAL]]
  RETURNS[w: WRef];

--do NOT reuse this WRef
CloseWindow: PROC[w: WRef];

GetWindowParams: PROC[w: WRef] RETURNS[firstScan: CARDINAL, lastScan: CARDINAL,
  firstPixel: CARDINAL, lastPixel: CARDINAL];

--the minimum number of words in a scan line buffer for a given window
MinBufferSize: PROC[w: WRef] RETURNS[length: CARDINAL];

--returns TRUE if the current scan line is the last scan line in the window
EndOfWindow: PROC[w: WRef] RETURNS[BOOLEAN];	
	
Buffer: TYPE = RECORD [length: LONG CARDINAL, addr: LONG POINTER];
ReadLine: PROC[w: WRef, buffer: Buffer, line: INTEGER ← -1];
WriteLine: PROC[w: WRef, buffer: Buffer, line: INTEGER ← -1];

ReadLines: PROC[w: WRef, buffer: Buffer,
  line: INTEGER ← -1, count: CARDINAL ← 1]
  RETURNS[numberRead: CARDINAL];

WriteLines: PROC[w: WRef, buffer: Buffer,
  line: INTEGER ← -1, count: CARDINAL ← 1]
  RETURNS[numberWritten: CARDINAL];

ReadSample: PROC[w: WRef, line,pixel: CARDINAL] RETURNS[value: CARDINAL];
WriteSample: PROC[w: WRef, value: CARDINAL, line,pixel: CARDINAL];

-- CreatePattern might be handy, but isn't implemented yet.

AISImpl: PROGRAM;

}.