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:
ATOM ←
NIL]
RETURNS[Master] ~ {
stream: STREAM ~ FS.StreamOpen[fileName, $create];
RETURN[OpenMasterFromStream[stream, encoding]];
};
OpenMasterFromStream:
PUBLIC
PROC[stream:
STREAM, encoding:
ATOM ←
NIL]
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.