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.