<> <> <> DIRECTORY IPOperatorOut, IPEncodingOut, IPVariables USING [FrameVariable, ImagerVariable, StrokeEnd], Rope USING [ROPE, Find, IsEmpty, Length, MaxLen]; IPOperatorOutImpl: CEDAR PROGRAM IMPORTS IPOperatorOut, IPEncodingOut, Rope EXPORTS IPOperatorOut = BEGIN OPEN IPOperatorOut; <> BeginMaster: PUBLIC PROCEDURE [name: Rope.ROPE] RETURNS [ip: Handle] = { ip _ Handle[IPEncodingOut.OpenOutputMaster[name ! IPEncodingOut.Error => Error[FileNotAvailable]]]; ip.AppendOp[beginBlock]; }; EndMaster: PUBLIC PROCEDURE [ip: Handle] = { ip.AppendOp[endBlock]; ip.CloseMaster[]; }; <> Get: PUBLIC PROCEDURE [ip: Handle, n: INT] = { ip.AppendInteger[n]; ip.AppendOp[get]; }; MakeVec: PUBLIC PROCEDURE [ip: Handle, n: INT] = { ip.AppendInteger[n]; ip.AppendOp[makevec]; }; MakeVecLU: PUBLIC PROCEDURE [ip: Handle, l, u : INT] = { ip.AppendInteger[l]; ip.AppendInteger[u]; ip.AppendOp[makeveclu]; }; <> FGet: PUBLIC PROCEDURE [ip: Handle, n: IPVariables.FrameVariable] = { ip.AppendInteger[n]; ip.AppendOp[fget]; }; FSet: PUBLIC PROCEDURE [ip: Handle, x: Number, n: IPVariables.FrameVariable] = { ip.AppendNumber[x]; ip.AppendInteger[n]; ip.AppendOp[fset]; }; <> BeginMakeSimpleCO: PUBLIC PROCEDURE [ip: Handle] = { ip.AppendOp[makesimpleco]; ip.BeginBody[]; }; BeginDoSaveSimpleBody: PUBLIC PROCEDURE [ip: Handle] = { ip.AppendOp[dosavesimplebody]; ip.BeginBody[]; }; BeginCorrect: PUBLIC PROCEDURE [ip: Handle] = { ip.AppendOp[correct]; ip.BeginBody[]; }; BeginIf: PUBLIC PROCEDURE [ip: Handle] = { ip.AppendOp[if]; ip.BeginBody[]; }; BeginIfElse: PUBLIC PROCEDURE [ip: Handle] = { ip.AppendOp[ifelse]; ip.BeginBody[]; }; BeginIfCopy: PUBLIC PROCEDURE [ip: Handle] = { ip.AppendOp[ifcopy]; ip.BeginBody[]; }; EndMakeSimpleCO, EndDoSaveSimpleBody, EndCorrect, EndIf, EndIfElse, EndIfCopy: PUBLIC PROCEDURE [ip: Handle] = {ip.EndBody[];}; <> IGet: PUBLIC PROCEDURE [ip: Handle, n: IPVariables.ImagerVariable] = { ip.AppendInteger[LOOPHOLE[n, CARDINAL]]; ip.AppendOp[iget]; }; ISet: PUBLIC PROCEDURE [ip: Handle, x: Number, n: IPVariables.ImagerVariable] = { ip.AppendNumber[x]; ip.AppendInteger[LOOPHOLE[n, CARDINAL]]; ip.AppendOp[iset]; }; SetStrokeWidth: PUBLIC PROCEDURE [ip: Handle, width: Number] = { ip.ISet[LOOPHOLE[width], IPVariables.ImagerVariable[strokeWidth]]; }; SetStrokeEnd: PUBLIC PROCEDURE [ip: Handle, end: IPVariables.StrokeEnd] = { ip.ISet[Number[integer[LOOPHOLE[end, CARDINAL]]], IPVariables.ImagerVariable[strokeEnd]]; }; SetAmplifySpace: PUBLIC PROCEDURE [ip: Handle, amplify: Number] = { ip.ISet[amplify, IPVariables.ImagerVariable[amplifySpace]]; }; SetPriorityImportant: PUBLIC PROCEDURE [ip: Handle, on: BOOLEAN _ FALSE] = { ip.ISet[Number[integer[IF on THEN 1 ELSE 0]], IPVariables.ImagerVariable[priorityImportant]]; }; <> Translate: PUBLIC PROCEDURE [ip: Handle, x, y: Number, concatT: BOOLEAN _ TRUE] = { ip.AppendNumber[x]; ip.AppendNumber[y]; ip.AppendOp[translate]; IF concatT THEN ip.AppendOp[concatt]; }; Rotate: PUBLIC PROCEDURE [ip: Handle, alpha: Number, concatT: BOOLEAN _ TRUE] = { ip.AppendNumber[alpha]; ip.AppendOp[rotate]; IF concatT THEN ip.AppendOp[concatt]; }; Scale: PUBLIC PROCEDURE [ip: Handle, s: Number, concatT: BOOLEAN _ TRUE] = { ip.AppendNumber[s]; ip.AppendOp[scale]; IF concatT THEN ip.AppendOp[concatt]; }; Scale2: PUBLIC PROCEDURE [ip: Handle, sx, sy: Number, concatT: BOOLEAN _ TRUE] = { ip.AppendNumber[sx]; ip.AppendNumber[sy]; ip.AppendOp[scale2]; IF concatT THEN ip.AppendOp[concatt]; }; Show: PUBLIC PROCEDURE [ip: Handle, text: Rope.ROPE _ NIL, start: INT _ 0, len: INT _ Rope.MaxLen] = { IF (text # NIL) AND NOT Rope.IsEmpty[text] THEN { ip.AppendRope[text, start, len]; ip.AppendOp[show]; }; }; <> SetXY: PUBLIC PROCEDURE [ip: Handle, x, y: Number] = { ip.AppendNumber[x]; ip.AppendNumber[y]; ip.AppendOp[setxy]; }; SetXYRel: PUBLIC PROCEDURE [ip: Handle, x, y: Number] = { xFound, yFound: BOOL _ FALSE; IF NOT NumberIsZero[x] THEN { ip.AppendNumber[x]; xFound _ TRUE; }; IF NOT NumberIsZero[y] THEN { ip.AppendNumber[y]; yFound _ TRUE; }; IF xFound AND yFound THEN ip.AppendOp[setxyrel] ELSE IF xFound THEN ip.AppendOp[setxrel] ELSE IF yFound THEN ip.AppendOp[setyrel]; }; SetXRel: PUBLIC PROCEDURE [ip: Handle, x: Number] = { ip.AppendNumber[x]; ip.AppendOp[setxrel]; }; SetYRel: PUBLIC PROCEDURE [ip: Handle, y: Number] = { ip.AppendNumber[y]; ip.AppendOp[setyrel]; }; PushCP: PUBLIC PROCEDURE [ip: Handle] = { ip.IGet[IPVariables.ImagerVariable[DCScpx]]; ip.IGet[IPVariables.ImagerVariable[DCScpy]]; }; PopCP: PUBLIC PROCEDURE [ip: Handle] = { ip.AppendInteger[LOOPHOLE[IPVariables.ImagerVariable[DCScpy], CARDINAL]]; ip.AppendOp[iset]; ip.AppendInteger[LOOPHOLE[IPVariables.ImagerVariable[DCScpx], CARDINAL]]; ip.AppendOp[iset]; }; <> SetGray: PUBLIC PROCEDURE [ip: Handle, f: Number] = { ip.AppendNumber[f]; ip.AppendOp[setgray]; }; <> MoveTo: PUBLIC PROCEDURE [ip: Handle, x, y: Number] = { ip.AppendNumber[x]; ip.AppendNumber[y]; ip.AppendOp[moveto]; }; LineTo: PUBLIC PROCEDURE [ip: Handle, x, y: Number] = { ip.AppendNumber[x]; ip.AppendNumber[y]; ip.AppendOp[lineto]; }; LineToX: PUBLIC PROCEDURE [ip: Handle, x: Number] = { ip.AppendNumber[x]; ip.AppendOp[linetox]; }; LineToY: PUBLIC PROCEDURE [ip: Handle, y: Number] = { ip.AppendNumber[y]; ip.AppendOp[linetoy]; }; MaskRectangle: PUBLIC PROCEDURE [ip: Handle, x, y, w, h: Number] = { ip.AppendNumber[x]; ip.AppendNumber[y]; ip.AppendNumber[w]; ip.AppendNumber[h]; ip.AppendOp[maskrectangle]; }; MaskUnderline: PUBLIC PROCEDURE [ip: Handle, dy, h: Number] = { ip.AppendNumber[dy]; ip.AppendNumber[h]; ip.AppendOp[maskunderline]; }; MaskVector: PUBLIC PROCEDURE [ip: Handle, x1, y1, x2, y2: Number] = { ip.MoveTo[x1, y1]; IF NumbersAreEqual[x1, x2] THEN ip.LineToY[y2] ELSE IF NumbersAreEqual[y1, y2] THEN ip.LineToX[x2] ELSE ip.LineTo[x2, y2]; ip.AppendOp[maskstroke]; }; <> SetFont: PUBLIC PROCEDURE [ip: Handle, font: IPVariables.FrameVariable] = { ip.AppendInteger[font]; ip.AppendOp[setfont]; }; <> CorrectSpace: PUBLIC PROCEDURE [ip: Handle, x, y: Number] = { ip.AppendNumber[x]; ip.AppendNumber[y]; ip.AppendOp[correctspace]; }; SetCorrectMeasure: PUBLIC PROCEDURE [ip: Handle, x, y: Number] = { ip.AppendNumber[x]; ip.AppendNumber[y]; ip.AppendOp[setcorrectmeasure]; }; SetCorrectTolerance: PUBLIC PROCEDURE [ip: Handle, x, y: Number] = { ip.AppendNumber[x]; ip.AppendNumber[y]; ip.AppendOp[setcorrecttolerance]; }; Space: PUBLIC PROCEDURE [ip: Handle, x: Number] = { ip.AppendNumber[x]; ip.AppendOp[space]; }; PushAndDisableCorrection: PUBLIC PROCEDURE [ip: Handle] = { ip.IGet[IPVariables.ImagerVariable[correctPass]]; ip.ISet[int[0], IPVariables.ImagerVariable[correctPass]]; }; PopAndRestoreCorrection: PUBLIC PROCEDURE [ip: Handle] = { ip.AppendInteger[LOOPHOLE[IPVariables.ImagerVariable[correctPass], CARDINAL]]; ip.AppendOp[iset]; }; <> SetUpFont: PUBLIC PROCEDURE [ip: Handle, fontNumber: IPVariables.FrameVariable, name: Rope.ROPE, scale: Number, rotation: Number _ int[0], putInFrame: BOOLEAN _ TRUE] = { ip.AppendHierarchicalName[name]; ip.AppendOp[findfont]; ip.Scale[s: scale, concatT: FALSE]; IF NOT NumberIsZero[rotation] THEN { ip.Rotate[alpha: rotation, concatT: FALSE]; ip.AppendOp[concat]; }; ip.AppendOp[modifyfont]; IF putInFrame THEN { ip.AppendInteger[fontNumber]; ip.AppendOp[fset]; }; }; AppendHierarchicalName: PUBLIC PROCEDURE [ip: Handle, name: Rope.ROPE, start: INT _ 0, len: INT _ Rope.MaxLen] = { first: INT _ start; pos: INT; length: INT _ MIN[len, Rope.Length[name]-start]; identifierCount: INT _ 1; <> WHILE (pos _ name.Find[s2: "/", pos1: first, case: FALSE]) # -1 DO ip.AppendIdentifier[id: name, start: first, len: pos-first]; identifierCount _ identifierCount+1; first _ pos+1; ENDLOOP; ip.AppendIdentifier[id: name, start: first, len: length-first]; ip.MakeVec[identifierCount]; }; NumberIsZero: PUBLIC PROCEDURE [n: Number] RETURNS [BOOLEAN] = { WITH n SELECT FROM integer => RETURN [value = 0]; rational => IF j = 0 THEN ERROR ELSE RETURN [i = 0]; real => RETURN [value = 0.0]; ENDCASE => ERROR; }; NumbersAreEqual: PROCEDURE [n1, n2: Number] RETURNS [BOOLEAN] = { WITH na: n1 SELECT FROM integer => WITH nb: n2 SELECT FROM integer => RETURN [na = nb]; rational => RETURN [REAL[na.value] = REAL[nb.i]/REAL[nb.j]]; real => RETURN [REAL[na.value] = nb.value]; ENDCASE => ERROR; rational => WITH nb: n2 SELECT FROM integer => RETURN [REAL[nb.value] = REAL[na.i]/REAL[na.j]]; rational => RETURN [na = nb]; real => RETURN [nb.value = REAL[na.i]/REAL[na.j]]; ENDCASE => ERROR; real => WITH nb: n2 SELECT FROM integer => RETURN [REAL[nb.value] = na.value]; rational => RETURN [na.value = REAL[nb.i]/REAL[nb.j]]; real => RETURN [na = nb]; ENDCASE => ERROR; ENDCASE => ERROR; }; <> CurveTo: PUBLIC PROCEDURE [ip: Handle, x1, y1, x2, y2, x3, y3: Number] = { ip.AppendNumber[x1]; ip.AppendNumber[y1]; ip.AppendNumber[x2]; ip.AppendNumber[y2]; ip.AppendNumber[x3]; ip.AppendNumber[y3]; ip.AppendOp[curveto]; }; Error: PUBLIC ERROR [errorCode: ErrorCode] = CODE; END. <> <> <<>> <> <> <<>> <> <> <<>> <> <> <<>> <> <> <<>> <> <> <<>> <> <>