<> <> <> <> <> <> <> <> <> <<>> DIRECTORY Ascii USING [Lower], Atom USING [GetPName, MakeAtom], Checksum USING [ComputeChecksum], Convert USING [RopeFromInt], NodeProps USING [Is], NodeStyle USING [DataEntry, DataList, GetStyleName, IntegerValue, MaxNestingLevel, RealCode, Style, SetReal, StyleBody], NodeStyleOps USING [ExtObjPair, LocalStyle, LocalStyleRec, OfStyle], NodeStyleWorks USING [BadStyleFile, ExecuteLooksInStyle, ExecuteNameInStyle, ExecuteObjectInStyle, FreeFrame, GetFrame, GetStyleDict, RunStyle, StyleParamKey], Rope USING [Cat, Concat, ROPE, Translate], Tioga, TiogaPrivate USING [AddEditNotifyProc, Change, ChangeSet], TJaM USING [Frame, NumberRep, Object, TryToLoad]; NodeStyleOpsImpl: CEDAR MONITOR LOCKS env USING env: Env IMPORTS Ascii, Atom, Checksum, Convert, NodeProps, NodeStyle, NodeStyleWorks, Rope, Tioga, TiogaPrivate, TJaM EXPORTS NodeStyleOps ~ BEGIN OPEN NodeStyle, NodeStyleOps; <<>> ROPE: TYPE ~ Rope.ROPE; Frame: TYPE ~ TJaM.Frame; Object: TYPE ~ TJaM.Object; <> <> lastIntAsReal: REAL _ LAST[INT]; firstIntAsReal: REAL _ FIRST[INT]; <<>> IntegerValue: PUBLIC PROC [value: REAL _ 0.0] RETURNS [INT] ~ { RETURN [SELECT value FROM > lastIntAsReal => LAST[INT], < firstIntAsReal => FIRST[INT], ENDCASE => Real.Round[value]]; }; realArray: REF ARRAY RealCode OF REAL ~ NEW[ARRAY RealCode OF REAL _ ALL[0.0]]; <> nextFreeRealCode: RealCode _ 1; <> <> overflowCount: INT _ 0; EnterReal: ENTRY PROC [value: REAL _ 0.0] RETURNS [code: RealCode] ~ { ENABLE UNWIND => NULL; FOR code _ RealCode.FIRST, code+1 UNTIL code=nextFreeRealCode DO IF realArray[code]=value THEN RETURN; -- value already in realArray ENDLOOP; IF code=overflow THEN overflowCount _ overflowCount+1 -- realArray is full ELSE { realArray[code] _ value; nextFreeRealCode _ code+1 }; -- enter in realArray }; SetReal: PUBLIC PROC [s: Style, param: RealParam, value: REAL _ 0.0] ~ { code: RealCode ~ EnterReal[value]; IF code=overflow THEN s.dataList _ NEW[DataEntry _ [s.dataList, real[param, value]]]; s.real[param] _ code; }; GetReal: PUBLIC PROC [s: Style, param: RealParam] RETURNS [value: REAL _ 0.0] ~ { code: RealCode ~ s.real[param]; IF code#overflow THEN RETURN[realArray[code]] ELSE { FOR entry: REF DataEntry _ s.dataList, entry.next UNTIL entry=NIL DO WITH entry SELECT FROM e: REF DataEntry.real => IF e.param=param THEN RETURN[e.value]; ENDCASE; ENDLOOP; ERROR; -- failed to find it on the data list -- }; }; <> GetTabLoc: PUBLIC PROC [stop: TabStop, s:Style] RETURNS [REAL _ 0.0] ~ { code: RealCode; IF (code _ stop.loc) # overflow THEN RETURN [realArray[code]]; RETURN [GetTabOverflow[s,stop,loc]]; }; GetTabLeaderSpacing: PUBLIC PROC [stop: LeaderTabStop, s:Style] RETURNS [REAL _ 0.0] ~ { code: RealCode; IF (code _ stop.spacing) # overflow THEN RETURN [realArray[code]]; RETURN [GetTabOverflow[s,stop,spacing]]; }; <<>> GetTabRuleWeight: PUBLIC PROC [stop: RuleTabStop, s:Style] RETURNS [REAL _ 0.0] ~ { code: RealCode; IF (code _ stop.weight) # overflow THEN RETURN [realArray[code]]; RETURN [GetTabOverflow[s,stop,weight]]; }; <<>> GetTabRuleVShift: PUBLIC PROC [stop: RuleTabStop, s:Style] RETURNS [REAL _ 0.0] ~ { code: RealCode; IF (code _ stop.vshift) # overflow THEN RETURN [realArray[code]]; RETURN [GetTabOverflow[s,stop,vshift]]; }; <<>> GetTabRealCode: PUBLIC PROC [s: Style, stop: TabStop, which: TabRealParam, value: REAL _ 0.0] RETURNS [code: RealCode] ~ { code _ EnterReal[value]; IF code=overflow THEN s.dataList _ NEW[DataEntry _ [s.dataList, tab[stop, which, value]]]; }; GetRulesTabCount: PUBLIC PROC [stop: RulesTabStop] RETURNS [count: INT] ~ { RETURN [stop.rules.length]; }; GetRulesTabInfo: PUBLIC PROC [stop: RulesTabStop, num: INT] RETURNS [weight, vshift: REAL] ~ { <> weight _ stop.rules.array[num].weight; vshift _ stop.rules.array[num].vshift; }; GetTabOverflow: PROC [s: Style, stop: TabStop, which: TabRealParam] RETURNS [value: REAL _ 0.0] ~ { FOR x: DataList _ s.dataList, x.next UNTIL x=NIL DO WITH x SELECT FROM xx: REF DataEntry.tab => IF xx.tabStop=stop AND xx.which=which THEN RETURN [xx.value]; ENDCASE; ENDLOOP; ERROR -- failed to find it on the data list -- }; <> pointsPerPica: PUBLIC REAL _ 12.0; pointsPerInch: PUBLIC REAL _ 1.0/0.0138370; -- 72.27 pointsPerCentimeter: PUBLIC REAL _ pointsPerInch/2.540; pointsPerMillimeter: PUBLIC REAL _ pointsPerCentimeter/10; pointsPerDidot: PUBLIC REAL _ pointsPerCentimeter/26.60; pointsPerFil: PUBLIC REAL _ 10000.0; pointsPerFill: PUBLIC REAL _ pointsPerFil*pointsPerFil; pointsPerFilll: PUBLIC REAL _ pointsPerFill*pointsPerFil; <> <