PDFileWriter:
CEDAR DEFINITIONS = BEGIN
PDState: TYPE = REF PDStateRec;
PDStateRec: TYPE;
DeviceCode: TYPE = PDFileFormat.DeviceCode;
Toner: TYPE = PDFileFormat.Toner;
LoadReference: TYPE = NAT;
LoadReferenceRep:
TYPE =
RECORD [
assignedLoadAddress: INT ← -1,
sSize, fSize: CARDINAL,
data:
SELECT tag: *
FROM
samples => [],
tile => [],
runGroup => [],
ENDCASE
];
TFlag: TYPE = {opaque, transparent};
Creating a new PD file.
Create: PROC [fileName: Rope.ROPE, deviceCode: DeviceCode, sResolution, fResolution, imageSSize, imageFSize: CARDINAL, nColors: NAT ← 1, bandSSize: CARDINAL ← 16, copies: CARDINAL ← 1, leftOverMode: BOOLEAN ← TRUE, maxLoadWords: INT ← 60000] RETURNS [pdState: PDState];
SetPriorityImportant:
PROC [pdState: PDState, priorityImportant:
BOOLEAN]
RETURNS [previousValue: BOOLEAN];
priorityImportant is initially FALSE
Callback mechanisms for passing variable length items.
The procedures PutColorSamples, PutMaskSamples, LoadSampleArray, PutMaskRunGroup, and LoadRunGroup require a variable amount of data, perhaps a very large amount. To maintain flexibility, a callback mechanism is used to pass the data into these routines. A PDFileWriter routine takes a delivery routine as a parameter; when it needs the data, it calls the delivery routine, passing it a capture routine to call with each unit of data. Note that it is inadvisable for the delivery routine to make any use of the PDState while it has control.
DeliverRunGroupProc: TYPE = PROC [CaptureRunProc];
CaptureRunProc: TYPE = PROC [sMin, fMin, fSize: CARDINAL];
DeliverSampleArrayProc: TYPE = PROC [CaptureScanLineProc];
CaptureScanLineProc: TYPE = PROC [LONG POINTER];
Extracting information from the handle.
GetBounds: PROC [pdState: PDState] RETURNS [sMax, fMax: CARDINAL];
DoForEachToner:
PROC [pdState: PDState, proc:
PROC[Toner]];
Calls the proc for each toner being used.
Setting the current color.
SetColorInk: PROC [pdState: PDState, toner: Toner];
SetColorClear: PROC [pdState: PDState, toner: Toner];
SetColorTile: PROC [pdState: PDState, toner: Toner, tileRef: LoadReference, tFlag: TFlag ← opaque];
Imaging operators.
MaskRectangle: PROC [pdState: PDState, sMin, fMin: CARDINAL, sSize, fSize: CARDINAL];
MaskTrapezoid: PROC [pdState: PDState, sMin, sSize: CARDINAL, fMin, fSize: CARDINAL, fMinLast, fSizeLast: CARDINAL];
MaskSamplesRef: PROC [pdState: PDState, samplesRef: LoadReference, sMin, fMin: CARDINAL];
MaskSamples: PROC [pdState: PDState, sMin, fMin: CARDINAL, sSize, fSize: CARDINAL, deliverProc: DeliverSampleArrayProc];
MaskRunGroupRef: PROC [pdState: PDState, runGroupRef: LoadReference, sMin, fMin: CARDINAL];
MaskRunGroup: PROC [pdState: PDState, deliverProc: DeliverRunGroupProc];
ColorSamples: PROC [pdState: PDState, toner: Toner, sMin, fMin: CARDINAL, sSize, fSize: CARDINAL, deliverProc: DeliverSampleArrayProc, tFlag: TFlag ← opaque];
Load management.
RemainingLoadSize:
PROC [pdState: PDState]
RETURNS [words:
INT];
Tells the amount of load the writer can be sure is available.
LoadRunGroup: PROC [pdState: PDState, deliverProc: DeliverRunGroupProc] RETURNS [loadReference: LoadReference];
LoadContiguousSampleArray: PROC [pdState: PDState, sSize, fSize: CARDINAL, bitsPtr: LONG POINTER] RETURNS [loadReference: LoadReference];
LoadContiguousColorTile: PROC [pdState: PDState, phase: CARDINAL, sMin, fMin: CARDINAL, sSize, fSize: CARDINAL, bitsPtr: LONG POINTER] RETURNS [loadReference: LoadReference];
Terminators.
EndPage: PROC [pdState: PDState];
FlushPage:
PROC [pdState: PDState];
In case the client needs to remove a partially-written page. Note that changes to the load are not flushed.
Close: PROC [pdState: PDState];
END.