IPOutputImpl.mesa
Copyright © 1984 Xerox Corporation. All rights reserved.
Doug Wyatt, August 13, 1984 3:56:13 pm PDT
An "operator interface" for writing Interpress masters.
See the Introduction to Interpress, chapter 7.
DIRECTORY
FS USING [StreamOpen],
IO USING [STREAM],
IPBasic USING [ImagerVariable, Op, StrokeEnd],
IPWriter USING [Close, Create, PutHeader, PutIdentifier, PutInt, PutOp, PutReal, PutString, Writer],
IPOutput USING [Master, MasterRep],
Rope USING [Index, ROPE, Size, Substr];
IPOutputImpl: CEDAR PROGRAM
IMPORTS FS, IPWriter, Rope
EXPORTS IPOutput
~ BEGIN
ROPE: TYPE ~ Rope.ROPE;
STREAM: TYPE ~ IO.STREAM;
Writer: TYPE ~ IPWriter.Writer;
Op: TYPE ~ IPBasic.Op;
Master: TYPE ~ IPOutput.Master;
Error: PUBLIC ERROR[explanation: ROPE] ~ CODE;
OpenMaster: PUBLIC PROC[fileName: ROPE, encoding: ATOMNIL]
RETURNS[Master] ~ {
stream: STREAM ~ FS.StreamOpen[fileName, $create];
RETURN[OpenMasterFromStream[stream, encoding]];
};
OpenMasterFromStream: PUBLIC PROC[stream: STREAM, encoding: ATOMNIL]
RETURNS[Master] ~ {
writer: IPWriter.Writer ~ IPWriter.Create[stream, IF encoding=NIL THEN $Xerox ELSE encoding];
writer.PutHeader[];
writer.PutOp[$beginBlock];
RETURN[NEW[IPOutput.MasterRep ← [writer: writer, state: new, page: 0]]];
};
BeginPreamble: PUBLIC PROC[self: Master] ~ {
IF self.state=new THEN {
self.writer.PutOp[$beginBody];
self.state ← begin;
}
ELSE ERROR Error["BeginPreamble out of sequence."];
};
EndPreamble: PUBLIC PROC[self: Master] ~ {
IF self.state=begin AND self.page=0 THEN {
self.writer.PutOp[$endBody];
self.state ← end;
}
ELSE ERROR Error["EndPreamble out of sequence."];
};
BeginPage: PUBLIC PROC[self: Master] ~ {
IF self.state=end THEN {
self.writer.PutOp[$beginBody];
self.state ← begin;
self.page ← self.page+1;
}
ELSE ERROR Error["BeginPage out of sequence."];
};
EndPage: PUBLIC PROC[self: Master] ~ {
IF self.state=begin AND self.page>0 THEN {
self.writer.PutOp[$endBody];
self.state ← end;
}
ELSE ERROR Error["EndPage out of sequence."];
};
Close: PUBLIC PROC[self: Master] ~ {
IF self.state=end AND self.page>0 THEN {
self.writer.PutOp[$endBlock];
self.writer.Close[];
self.state ← closed;
}
ELSE ERROR Error["Close out of sequence."];
};
PutOp: PUBLIC PROC[self: Master, op: Op] ~ {
self.writer.PutOp[op];
};
PutInt: PUBLIC PROC[self: Master, int: INT] ~ {
self.writer.PutInt[int];
};
PutReal: PUBLIC PROC[self: Master, real: REAL] ~ {
self.writer.PutReal[real];
};
PutIdentifier: PUBLIC PROC[self: Master, identifier: ROPE] ~ {
self.writer.PutIdentifier[identifier];
};
PutName: PUBLIC PROC[self: Master, name: ROPE] ~ {
size: INT ~ name.Size[];
start: INT ← 0;
n: INT ← 0;
DO
stop: INT ~ name.Index[pos1: start, s2: "/"];
id: ROPE ~ name.Substr[start: start, len: stop-start];
self.writer.PutIdentifier[id]; n ← n+1;
IF stop<size THEN start ← stop+1 ELSE EXIT;
ENDLOOP;
self.writer.PutInt[n];
self.writer.PutOp[$makevec];
};
PutChar: PUBLIC PROC[self: Master, char: CARDINAL] ~ {
ERROR;
};
PutRope: PUBLIC PROC[self: Master, rope: ROPE, start, len: INT] ~ {
self.writer.PutString[rope.Substr[start, len]];
};
PutText: PUBLIC PROC[self: Master, text: REF READONLY TEXT, start, len: NAT] ~ {
ERROR;
};
Get: PUBLIC PROC[self: Master, j: INT] ~ {
writer: Writer ~ self.writer;
writer.PutInt[j]; writer.PutOp[$get];
};
MakeVecLU: PUBLIC PROC[self: Master, l, u: INT] ~ {
writer: Writer ~ self.writer;
writer.PutInt[l]; writer.PutInt[u]; writer.PutOp[$makeveclu];
};
MakeVec: PUBLIC PROC[self: Master, n: INT] ~ {
writer: Writer ~ self.writer;
writer.PutInt[n]; writer.PutOp[$makevec];
};
Shape: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$shape];
};
OpenVec: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$openvec];
};
GetProp: PUBLIC PROC[self: Master, id: ROPE] ~ {
writer: Writer ~ self.writer;
writer.PutIdentifier[id]; writer.PutOp[$getprop];
};
GetP: PUBLIC PROC[self: Master, id: ROPE] ~ {
writer: Writer ~ self.writer;
writer.PutIdentifier[id]; writer.PutOp[$getp];
};
MergeProp: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$mergeprop];
};
Frame: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$frame];
};
FGet: PUBLIC PROC[self: Master, j: INT] ~ {
writer: Writer ~ self.writer;
writer.PutInt[j]; writer.PutOp[$fget];
};
FSet: PUBLIC PROC[self: Master, j: INT] ~ {
writer: Writer ~ self.writer;
writer.PutInt[j]; writer.PutOp[$fset];
};
PoolOp: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$poolop];
};
Pool: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$pool];
};
PGet: PUBLIC PROC[self: Master, j: INT] ~ {
writer: Writer ~ self.writer;
writer.PutInt[j]; writer.PutOp[$pget];
};
PSet: PUBLIC PROC[self: Master, j: INT] ~ {
writer: Writer ~ self.writer;
writer.PutInt[j]; writer.PutOp[$pset];
};
Env: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$env];
};
MakePool: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$makepool];
};
NoPool: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$nopool];
};
BodyOp: PROC[self: Master, op: Op, body: PROC] ~ {
writer: Writer ~ self.writer;
prefix: BOOL ~ TRUE;
IF prefix THEN writer.PutOp[op];
writer.PutOp[$beginBody];
body[];
writer.PutOp[$endBody];
IF NOT prefix THEN writer.PutOp[op];
};
MakeCO: PUBLIC PROC[self: Master, body: PROC] ~ {
BodyOp[self, $makeco, body];
};
MakeSimpleCO: PUBLIC PROC[self: Master, body: PROC] ~ {
BodyOp[self, $makesimpleco, body];
};
Do: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$do];
};
DoSave: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$dosave];
};
DoSaveAll: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$dosaveall];
};
DoBody: PUBLIC PROC[self: Master, body: PROC] ~ {
BodyOp[self, $dobody, body];
};
DoSaveBody: PUBLIC PROC[self: Master, body: PROC] ~ {
BodyOp[self, $dosavebody, body];
};
DoSaveAllBody: PUBLIC PROC[self: Master, body: PROC] ~ {
BodyOp[self, $dosaveallbody, body];
};
DoSaveSimpleBody: PUBLIC PROC[self: Master, body: PROC] ~ {
BodyOp[self, $dosavesimplebody, body];
};
Pop: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$pop];
};
Copy: PUBLIC PROC[self: Master, depth: INT] ~ {
writer: Writer ~ self.writer;
writer.PutInt[depth]; writer.PutOp[$copy];
};
Dup: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$dup];
};
Roll: PUBLIC PROC[self: Master, depth, moveFirst: INT] ~ {
writer: Writer ~ self.writer;
writer.PutInt[depth]; writer.PutInt[moveFirst]; writer.PutOp[$roll];
};
Exch: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$exch];
};
Mark: PUBLIC PROC[self: Master, n: INT] ~ {
writer: Writer ~ self.writer;
writer.PutInt[n]; writer.PutOp[$mark];
};
Unmark: PUBLIC PROC[self: Master, n: INT] ~ {
writer: Writer ~ self.writer;
writer.PutInt[n]; writer.PutOp[$unmark];
};
Unmark0: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$unmark0];
};
Count: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$count];
};
If: PUBLIC PROC[self: Master, body: PROC] ~ {
BodyOp[self, $if, body];
};
IfElse: PUBLIC PROC[self: Master, body: PROC] ~ {
BodyOp[self, $ifelse, body];
};
IfCopy: PUBLIC PROC[self: Master, body: PROC] ~ {
BodyOp[self, $ifcopy, body];
};
IGet: PUBLIC PROC[self: Master, var: IPBasic.ImagerVariable] ~ {
writer: Writer ~ self.writer;
writer.PutInt[var.ORD]; writer.PutOp[$iget];
};
ISet: PUBLIC PROC[self: Master, var: IPBasic.ImagerVariable] ~ {
writer: Writer ~ self.writer;
writer.PutInt[var.ORD]; writer.PutOp[$iset];
};
SetPriorityImportant: PUBLIC PROC[self: Master, priorityImportant: BOOL] ~ {
writer: Writer ~ self.writer;
writer.PutInt[IF priorityImportant THEN 1 ELSE 0]; ISet[self, $priorityImportant];
};
SetStrokeWidth: PUBLIC PROC[self: Master, strokeWidth: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[strokeWidth]; ISet[self, $strokeWidth];
};
SetStrokeEnd: PUBLIC PROC[self: Master, strokeEnd: IPBasic.StrokeEnd] ~ {
writer: Writer ~ self.writer;
writer.PutInt[strokeEnd.ORD]; ISet[self, $strokeEnd];
};
SetAmplifySpace: PUBLIC PROC[self: Master, amplifySpace: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[amplifySpace]; ISet[self, $amplifySpace];
};
SetCorrectShrink: PUBLIC PROC[self: Master, correctShrink: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[correctShrink]; ISet[self, $correctShrink];
};
MakeT: PUBLIC PROC[self: Master, a, b, c, d, e, f: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[a]; writer.PutReal[b]; writer.PutReal[c];
writer.PutReal[d]; writer.PutReal[e]; writer.PutReal[f];
writer.PutOp[$maket];
};
Translate: PUBLIC PROC[self: Master, x, y: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[x]; writer.PutReal[y]; writer.PutOp[$translate];
};
Rotate: PUBLIC PROC[self: Master, a: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[a]; writer.PutOp[$rotate];
};
Scale: PUBLIC PROC[self: Master, s: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[s]; writer.PutOp[$scale];
};
Scale2: PUBLIC PROC[self: Master, sx, sy: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[sx]; writer.PutReal[sy]; writer.PutOp[$scale2];
};
Concat: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$concat];
};
ConcatT: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$concatt];
};
TranslateT: PUBLIC PROC[self: Master, x, y: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[x]; writer.PutReal[y]; writer.PutOp[$translate];
writer.PutOp[$concatt];
};
RotateT: PUBLIC PROC[self: Master, a: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[a]; writer.PutOp[$rotate];
writer.PutOp[$concatt];
};
ScaleT: PUBLIC PROC[self: Master, s: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[s]; writer.PutOp[$scale];
writer.PutOp[$concatt];
};
Scale2T: PUBLIC PROC[self: Master, sx, sy: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[sx]; writer.PutReal[sy]; writer.PutOp[$scale2];
writer.PutOp[$concatt];
};
Move: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$move];
};
Trans: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$trans];
};
Show: PUBLIC PROC[self: Master, string: ROPE] ~ {
writer: Writer ~ self.writer;
writer.PutString[string]; writer.PutOp[$show];
};
ShowAndXRel: PUBLIC PROC[self: Master, string: ROPE] ~ {
writer: Writer ~ self.writer;
writer.PutString[string]; writer.PutOp[$showandxrel];
};
SetXY: PUBLIC PROC[self: Master, x, y: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[x]; writer.PutReal[y]; writer.PutOp[$setxy];
};
SetXYRel: PUBLIC PROC[self: Master, x, y: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[x]; writer.PutReal[y]; writer.PutOp[$setxyrel];
};
SetXRel: PUBLIC PROC[self: Master, x: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[x]; writer.PutOp[$setxrel];
};
SetYRel: PUBLIC PROC[self: Master, y: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[y]; writer.PutOp[$setyrel];
};
MakeGray: PUBLIC PROC[self: Master, f: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[f]; writer.PutOp[$makegray];
};
FindColor: PUBLIC PROC[self: Master, name: ROPE] ~ {
writer: Writer ~ self.writer;
PutName[self, name]; writer.PutOp[$findcolor];
};
FindColorOperator: PUBLIC PROC[self: Master, name: ROPE] ~ {
writer: Writer ~ self.writer;
PutName[self, name]; writer.PutOp[$findcoloroperator];
};
SetGray: PUBLIC PROC[self: Master, f: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[f]; writer.PutOp[$setgray];
};
MoveTo: PUBLIC PROC[self: Master, x, y: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[x]; writer.PutReal[y]; writer.PutOp[$moveto];
};
LineTo: PUBLIC PROC[self: Master, x, y: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[x]; writer.PutReal[y]; writer.PutOp[$lineto];
};
LineToX: PUBLIC PROC[self: Master, x: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[x]; writer.PutOp[$linetox];
};
LineToY: PUBLIC PROC[self: Master, y: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[y]; writer.PutOp[$linetoy];
};
CurveTo: PUBLIC PROC[self: Master, x1, y1, x2, y2, x3, y3: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[x1]; writer.PutReal[y1];
writer.PutReal[x2]; writer.PutReal[y2];
writer.PutReal[x3]; writer.PutReal[y3];
writer.PutOp[$curveto];
};
ConicTo: PUBLIC PROC[self: Master, x1, y1, x2, y2: REAL, e: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[x1]; writer.PutReal[y1];
writer.PutReal[x2]; writer.PutReal[y2];
writer.PutReal[e];
writer.PutOp[$conicto];
};
ArcTo: PUBLIC PROC[self: Master, x1, y1, x2, y2: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[x1]; writer.PutReal[y1];
writer.PutReal[x2]; writer.PutReal[y2];
writer.PutOp[$arcto];
};
MakeOutline: PUBLIC PROC[self: Master, n: INT] ~ {
writer: Writer ~ self.writer;
writer.PutInt[n]; writer.PutOp[$makeoutline];
};
MaskFill: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$maskfill];
};
MaskStroke: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$maskstroke];
};
MaskStrokeClosed: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$maskstrokeclosed];
};
MaskVector: PUBLIC PROC[self: Master, x1, y1, x2, y2: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[x1]; writer.PutReal[y1];
writer.PutReal[x2]; writer.PutReal[y2];
writer.PutOp[$maskvector];
};
MaskRectangle: PUBLIC PROC[self: Master, x, y, w, h: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[x]; writer.PutReal[y];
writer.PutReal[w]; writer.PutReal[h];
writer.PutOp[$maskrectangle];
};
StartUnderline: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$startunderline];
};
MaskUnderline: PUBLIC PROC[self: Master, dy, h: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[dy]; writer.PutReal[h]; writer.PutOp[$maskunderline];
};
FindFont: PUBLIC PROC[self: Master, name: ROPE] ~ {
writer: Writer ~ self.writer;
PutName[self, name]; writer.PutOp[$findfont];
};
ModifyFont: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$modifyfont];
};
SetupFont: PUBLIC PROC[self: Master, n: INT, name: ROPE, scale: REAL] ~ {
writer: Writer ~ self.writer;
PutName[self, name]; writer.PutOp[$findfont];
writer.PutReal[scale]; writer.PutOp[$scale]; writer.PutOp[$modifyfont];
writer.PutInt[n]; writer.PutOp[$fset];
};
SetFont: PUBLIC PROC[self: Master, n: INT] ~ {
writer: Writer ~ self.writer;
writer.PutInt[n]; writer.PutOp[$setfont];
};
CorrectMask: PUBLIC PROC[self: Master] ~ {
writer: Writer ~ self.writer;
writer.PutOp[$correctmask];
};
CorrectSpace: PUBLIC PROC[self: Master, x, y: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[x]; writer.PutReal[y]; writer.PutOp[$correctspace];
};
Correct: PUBLIC PROC[self: Master, body: PROC] ~ {
BodyOp[self, $correct, body];
};
SetCorrectMeasure: PUBLIC PROC[self: Master, x, y: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[x]; writer.PutReal[y]; writer.PutOp[$setcorrectmeasure];
};
SetCorrectTolerance: PUBLIC PROC[self: Master, x, y: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[x]; writer.PutReal[y]; writer.PutOp[$setcorrecttolerance];
};
Space: PUBLIC PROC[self: Master, x: REAL] ~ {
writer: Writer ~ self.writer;
writer.PutReal[x]; writer.PutOp[$space];
};
END.