PressReader.mesa
Last Modified by Shore; November 22, 1982 11:47 am
Last Modified by Wyatt; December 1, 1983 4:53 pm
Last Modified by Plass, March 14, 1985 8:18:05 am PST
This is for applications that wish to read Press files
For an explanation of Press files see "Press File Format"
Filed on [Indigo]<PrintingDocs>PressFormat.Press.
The expected way of using it is as follows:
open the press file using OpenPressFile
read the document directory using GetDocumentDirectory
(this can be done at any time once the file is open)
read the parts using GetParts
the PageProc may wish to call GetPage
the EntityProc may wish to call GetCommands
the appropriate command proc gets called for each command
the ShowObjectProc may wish to call GetObject
the appropriate object proc gets called for each object command
the ShowDotsProc may wish to call GetDots
the appropriate dot proc gets called for each dot command
the FontDirectoryProc may wish to call GetFonts
the FontEntryProc gets called for each font in the font directory
the FontEntryProc may wish to call GetObject for a graphically defined font
the appropriate object proc gets called for each object command
close the press file with ClosePressFile
note that GetFonts can actually be called at any time after the file is open
DIRECTORY
FS USING [OpenFile],
IO USING [STREAM],
Rope USING [ROPE];
PressReader: CEDAR DEFINITIONS = BEGIN
ROPE: TYPE = Rope.ROPE;
Handle: TYPE = REF PressReaderRec;
PressReaderRec: TYPE;
DocumentDirectory: PUBLIC TYPE = REF DocumentDirectoryRec;
DocumentDirectoryRec: PUBLIC TYPE = RECORD [
passwd: INT,
nRecs: INT,
nParts: INT,
pdStart: INT,
pdRecs: INT,
backP: INT,
date: LONG CARDINAL,
fCopy: INT,
lCopy: INT,
fPage: INT,
lPage: INT,
fileName: ROPE,
creator: ROPE,
dateText: ROPE
];
PartDirectoryEntry: PUBLIC TYPE = RECORD [
partType: PartType,
typeNumber: INT,
partStart: INT,
partRecs: INT,
padding: INT
];
PartType: PUBLIC TYPE = { private, printedPage, fontDirectory, other };
FontDirectoryEntry: PUBLIC TYPE = RECORD [
length: INT,
fontSet: INT,
font: INT,
firstChar: INT,
lastChar: INT,
family: ROPE,
face: FontFace,
source: INT,
size: INT,
rotation: INT
];
FontFace: PUBLIC TYPE = RECORD [
encoding: INT,
texDesignSize: REAL,
weight: {medium, bold, light, none},
slope: {regular, italic, none},
expansion: {regular, condensed, expanded, none}
];
EntityTrailer: PUBLIC TYPE = RECORD [
entityType: INT,
fontSet: INT,
dataStart: INT,
dataLength: INT,
Xe: INT,
Ye: INT,
xLeft: INT,
yBottom: INT,
width: INT,
height: INT,
length:INT
];
Dots: TYPE = RECORD [
file: IO.STREAM,
numberPages: NAT,
pageNumber: NAT,
byteOffset: INT,
length: INT
];
OpenPressFile: PROC [name: ROPE] RETURNS [handle: Handle];
Opens file for reading, checks that it is a Press file
ERRORS: FS.Error, PressReaderError
];
FileNotAPressFile, AbortedBecauseGetFailed]
FromOpenFile: PROC [openFile: FS.OpenFile] RETURNS [handle: Handle];
ERRORS: PressReaderError
];
FileNotAPressFile, AbortedBecauseGetFailed]
GetDocumentDirectory: PROC [Handle] RETURNS [DocumentDirectory];
Returns the file's Document Directory
ERRORS: PressReaderError
];
BadHandle, AbortedBecauseGetFailed]
GetParts: PUBLIC PROC [handle: Handle, partNumber: INT, pageProc: PageProc ← NIL, fontDirectoryProc: FontDirectoryProc ← NIL];
calls pageProc or fontDirectoryProc (depending on part type) for the specified part,
if partNumber = 0 then pageProc is called for each Printed Page part and
fontDirectoryProc for the Font Directory in the order in which they occur in the Press file
ERRORS: PressReaderError
];
BadHandle, BadPartType, PartNotFound, AbortedBecauseGetFailed]
GetFonts: PUBLIC PROC [handle: Handle, fontEntryProc: FontEntryProc];
calls fontEntryProc for each Font Entry in the Font Directory
may call objectProcs for a graphically defined font
ERRORS: PressReaderError
];
BadHandle, NoFontDirectoryPart, AbortedBecauseGetFailed]
GetPage: PUBLIC PROC [handle: Handle, entityProc: EntityProc];
calls entityProc for each entity in the (current) printed page,
thus, GetPage should be called from within a GetParts pageProc
ERRORS: PressReaderError
];
BadHandle, CurrentPartNotAPage, AbortedBecauseGetFailed]
GetCommands: PUBLIC PROC [
handle: Handle,
showCharactersProc: ShowCharactersProc ← NIL,
skipProc: SkipProc ← NIL,
spacingProc: SpacingProc ← NIL,
spaceProc: SpaceProc ← NIL,
positionProc: PositionProc ← NIL,
colorProc: ColorProc ← NIL,
fontProc: FontProc ← NIL,
noOpProc: NoOpProc ← NIL,
showRectangleProc: ShowRectangleProc ← NIL,
showObjectProc: ShowObjectProc ← NIL,
showDotsProc: ShowDotsProc ← NIL,
copyProc: CopyProc ← NIL,
alternativeProc: AlternativeProc ← NIL,
badProc: BadProc ← NIL
];
calls members of commandProcs for each command in the (current) entity,
thus GetCommands should be called from within a GetPage entityProc, else NoEntity is raised
ERRORS: PressReaderError
];
BadHandle, NoEntity, AbortedBecauseGetFailed]
GetObject: PROC [
handle: Handle,
moveToProc: MoveToProc ← NIL,
drawToProc: DrawToProc ← NIL,
drawCurveProc: DrawCurveProc ← NIL
];
calls supplied procs for each object command,
thus GetObject should be called from within a GetCommands showObjectProc
ERRORS: PressReaderError[BadHandle, NotAtObject, AbortedBecauseGetFailed];
GetDots: PROC [
handle: Handle,
setCoding: SetCodingProc ← NIL,
setMode: SetModeProc ← NIL,
setWindow: SetWindowProc ← NIL,
setSize: SetSizeProc ← NIL,
setSamplingProperties: SetSamplingPropertiesProc ← NIL,
dotsFollow: DotsFollowProc ← NIL
];
calls supplied procs for each dots command,
thus GetDots should be called from within a GetCommands showDotsProc
passUpDots allows the dots in the file to be skipped
ERRORS: PressReaderError[BadHandle, NotAtDots, AbortedBecauseGetFailed];
ClosePressFile: PROC [Handle];
called when Press file reading is complete
PageProc: TYPE = PROC [handle: Handle, partDirectoryEntry: PartDirectoryEntry];
called (from GetParts) for each printedPage part
FontDirectoryProc: TYPE = PROC [handle: Handle, partDirectoryEntry: PartDirectoryEntry];
called (from GetParts) for the fontDirectory part
FontEntryProc: TYPE = PROC [fontDirectoryEntry: FontDirectoryEntry];
called (from GetFonts) for each font directory entry
EntityProc: TYPE = PROC [handle: Handle, entityTrailer: EntityTrailer];
called (from GetPage) for each entity on a page
the following procedure types are for parameters of GetCommands, and are called for the entity commands
ShowCharactersProc: TYPE = PROC [
opCode: {showCharactersShort, showCharactersAndSkip, showCharacters, showCharacterImmediate},
length: INT,
text: ROPE
];
SkipProc: TYPE = PROC [
opCode: {skipCharacters, skipControlBytes, skipControlBytesImmediate, skipCharactersShort},
length: INT
];
SpacingProc: TYPE = PROC [
opCode: {setSpaceX, setSpaceY, setSpaceXShort, setSpaceYShort, resetSpace},
value: INT
];
SpaceProc: TYPE = PROC;
PositionProc: TYPE = PROC [opCode: {setX, setY}, value: INT];
ColorProc: TYPE = PROC [opCode: {setHue, setSaturation, setBrightness}, value: INT];
FontProc: TYPE = PROC [font: INT];
NoOpProc: TYPE = PROC;
ShowRectangleProc: TYPE = PROC [width, height: INT];
CopyProc: TYPE = PROC [value: INT];
AlternativeProc: TYPE = PROC [types: CARDINAL, elBytes, dlBytes: INT];
ShowObjectProc: TYPE = PROC [handle: Handle, length: INT];
ShowDotsProc: TYPE = PROC [handle: Handle, opCode: {showDots, showDotsOpaque}, length: INT];
BadProc: TYPE = PROC [opCode, command, data: INT];
MoveToProc: TYPE = PROC [x,y: INT];
DrawToProc: TYPE = PROC [x,y: INT];
DrawCurveProc: TYPE = PROC [cX, cY, bX, bY, aX, aY: REAL];
SetCodingProc: TYPE = PROC [code, dots, lines: INT];
SetModeProc: TYPE = PROC [mode: INT];
SetWindowProc: TYPE = PROC [pd,dd,pl,dl: INT];
SetSizeProc: TYPE = PROC [width, height: INT];
DotsFollowProc: TYPE = PROC [dots: Dots];
SetSamplingPropertiesProc: TYPE ~ PROC [samplingProperties: LIST OF SamplingProperty];
SamplingProperty: TYPE ~ REF;
One of the following:
SSPInputIntensity: TYPE ~ REF SSPInputIntensityRep;
SSPInputIntensityRep: TYPE ~ MACHINE DEPENDENT RECORD [
min: INTEGER,
max: INTEGER
];
SSPOutputIntensity: TYPE ~ REF SSPOutputIntensityRep;
SSPOutputIntensityRep: TYPE ~ MACHINE DEPENDENT RECORD [
minBrightness, minHue, minSaturation, maxBrightness, maxHue, maxSaturation: [0..255]
];
-- not used in any known press files
SSPScreen: TYPE ~ REF SSPScreenRep;
SSPScreenRep: TYPE ~ MACHINE DEPENDENT RECORD [
angle, amplitude, frequency: INTEGER
];
SSPDot: TYPE ~ REF SSPDotRep;
SSPDotRep: TYPE ~ MACHINE DEPENDENT RECORD [
nCells: CARDINAL,
nLines: CARDINAL,
nShifts: CARDINAL,
thresholds: SEQUENCE COMPUTED CARDINAL OF CARDINAL
];
PressReaderError: ERROR [errorCode: ErrorCode];
ErrorCode: PUBLIC TYPE = {
FileNotAPressFile,
BadHandle,
BadPartType,
PartNotFound,
NoFontDirectoryPart,
CurrentPartNotAPage,
NoEntity,
NotAtObject,
NotAtDots,
AbortedBecauseGetFailed,
UnexpectedOpCode,
MalformedPressFile,
Unimplemented,
Bug
};
END.
Change Log
Created by Shore; June 1982
Changed by Shore; August 22, 1982 3:28 pm
converted to formatted Tioga file
revisions for Cedar 3.3
Changed by Shore; August 26, 1982 12:29 am
made Dots and Objects one level deeper to permit exit actions by the Commands
Changed by Shore; September 2, 1982 9:08 am
made Parts individually gettable (partNumber parameter to GetParts)
Changed by Shore; September 3, 1982 5:08 pm
now pass up Dots
Changed by Shore; November 14, 1982 2:58 pm
changed to Cedar.Style and added formats
Changed by Plass, March 12, 1985 2:43:57 pm PST
Added SetSamplingProperties
Changed by Michael Plass, March 14, 1985 7:54:30 am PST
Changed GetCommands, GetObject, and GetDots to take the callback procedures directly as parameters, rather than records of procedures (which the compiler thinks are not safe).