<> <> <> <<>> DIRECTORY ControllerMenuDefs USING [SetStyleMenus], Convert USING [RopeFromInt], GriffinDefs USING [ShowUserMessage], GriffinStyle, GriffinColor USING [StringToColor], GriffinFontDefs, Imager USING [Error], ImagerFont USING [Find, Modify], ImagerTransformation USING [Rotate, Scale, Transformation, FactoredTransformation, Factor, Concat], ObjectDefs USING [ObjectProc, ForAllPictureObjects], Real USING [RoundC], Rope USING [ROPE, Cat, SkipOver, Find, Substr, Equal], StyleDefs; GriffinStyleImpl: CEDAR PROGRAM IMPORTS ControllerMenuDefs, Convert, GriffinDefs, GriffinColor, Imager, ImagerFont, ImagerTransformation, ObjectDefs, Real, Rope EXPORTS GriffinStyle ~ BEGIN OPEN GriffinStyle, StyleDefs; ROPE: TYPE = Rope.ROPE; currentStyle: StyleHandle; currentNumber: INT _ 0; CurrentStyle: PUBLIC PROCEDURE RETURNS [StyleHandle] = { RETURN[currentStyle]; }; CopyCurrentStyle: PUBLIC PROCEDURE RETURNS [StyleHandle] = { new: StyleHandle _ NEW[Style]; new^ _ currentStyle^; IF new.font=NIL THEN ERROR; new.name _ NextName[]; RETURN[new]; }; SetCurrentStyle: PUBLIC PROC[style: StyleHandle] = { currentStyle^ _ style^; ControllerMenuDefs.SetStyleMenus[style]; }; NextName: PUBLIC PROCEDURE RETURNS [ROPE] = { name: ROPE _ Rope.Cat["Style", Convert.RopeFromInt[currentNumber]]; currentNumber _ currentNumber+1; RETURN[name]; }; Initialize: PUBLIC PROC = { currentStyle _ NEW[Style]; currentStyle.color _ GriffinColor.StringToColor["black"]; currentStyle.dashed _ undashed; currentStyle.firstend _ LineEnd [round, 0, 0, 0, 0, 0]; currentStyle.lastend _ LineEnd [round, 0, 0, 0, 0, 0]; currentStyle.junctiontype _ round; currentStyle.width _ 64; currentStyle.fillcolor _ GriffinColor.StringToColor["grey"]; currentStyle.filled _ TRUE; currentStyle.outlined _ TRUE; currentStyle.anchor _ left; currentStyle.stringRotation _ or0; currentStyle.stringType _ normal; currentStyle.font _ NIL; --will be initialized by ControllerMenus currentStyle.fillbackgnd _ FALSE; currentStyle.backgndcolor _ GriffinColor.StringToColor["white"]; currentStyle.name _ NextName[]; }; <> <> <> <> <> <> CreateStyleList: PUBLIC PROC RETURNS[styles: StyleSequence] = { next: NAT _ 0; allStyles: StyleSequence _ NEW[StyleSequenceRec[currentNumber-1]]; proc: ObjectDefs.ObjectProc = { IF obj.deleted THEN RETURN; IF FindEquivalentStyle[obj.style, allStyles] = NIL THEN { allStyles[next] _ obj.style; next _ next+1; }; }; IF currentNumber > 1 THEN { --one style for the menus ObjectDefs.ForAllPictureObjects[proc]; styles _ NEW[StyleSequenceRec[next]]; FOR i: NAT IN [0..styles.length) DO styles[i] _ allStyles[i]; ENDLOOP; }; }; CreateFontList: PUBLIC PROC[styles: StyleSequence] RETURNS[fonts: FontSequence] = { allFonts: FontSequence _ NEW[FontSequenceRec[styles.length]]; next: NAT _ 0; IF styles=NIL THEN RETURN[NIL]; FOR i: NAT IN [0..allFonts.length) DO dup: BOOL _ FALSE; FOR j: NAT IN [0..next) DO IF styles[i].font=allFonts[j] THEN {dup _ TRUE; EXIT}; ENDLOOP; IF NOT dup THEN {allFonts[next] _ styles[i].font; next _ next+1}; ENDLOOP; fonts _ NEW[FontSequenceRec[next]]; FOR i: NAT IN [0..fonts.length) DO fonts[i] _ allFonts[i]; ENDLOOP; RETURN[fonts] }; NumberOfStyle: PUBLIC PROC[style: StyleHandle, styles: StyleSequence] RETURNS [CARDINAL] = { found: BOOLEAN _ FALSE; styleNum: NAT; FOR styleNum IN [0..styles.length) DO IF style=styles[styleNum] THEN {found _ TRUE; EXIT}; ENDLOOP; RETURN[styleNum+1]; }; NumberOfFont: PUBLIC PROC[font: Font, fonts: FontSequence] RETURNS[CARDINAL] = { found: BOOLEAN _ FALSE; fontNum: NAT; FOR fontNum IN [0..fonts.length) DO IF font=fonts[fontNum] THEN {found _ TRUE; EXIT}; ENDLOOP; RETURN[fontNum+1]; }; FindEquivalentStyle: PUBLIC PROC[style: StyleHandle, styles: StyleSequence] RETURNS [StyleHandle] = { IF style=NIL OR styles=NIL THEN RETURN[NIL]; FOR i: NAT IN [0..styles.length) DO IF styles[i]=NIL THEN EXIT; IF EquivalentStyles[style, styles[i]] THEN RETURN[styles[i]]; ENDLOOP; RETURN[NIL]; }; EquivalentStyles: PROC[style1, style2: StyleHandle] RETURNS[BOOLEAN] = { equal: BOOL _ FALSE; IF style1#NIL AND style2#NIL THEN { name1: ROPE _ style1.name; name2: ROPE _ style2.name; style1.name _ style2.name _ NIL; equal _ style1^=style2^; style1.name _ name1; style2.name _ name2; }; RETURN[equal]; }; InternalFontFromFont: PUBLIC PROC[font: Font] RETURNS[InternalFont] = { factors: ImagerTransformation.FactoredTransformation _ ImagerTransformation.Factor[font.charToClient]; ifont: InternalFont _ NEW[GriffinFontDefs.FontDescriptor]; startName: INT _ Rope.SkipOver[s: font.name, skip: "Xerox/PressFonts/"]; startFace: INT _ Rope.Find[s1: font.name, s2: "-"]+1; faceCode: ROPE _ Rope.Substr[base: font.name, start: startFace, len: 3]; ifont.name _ Rope.Substr[base: font.name, start: startName, len: startFace-startName-1]; ifont.face _ SELECT TRUE FROM Rope.Equal[faceCode, "MRR", FALSE] => GriffinFontDefs.Regular, Rope.Equal[faceCode, "MIR", FALSE] => GriffinFontDefs.Italic, Rope.Equal[faceCode, "BRR", FALSE] => GriffinFontDefs.Bold, Rope.Equal[faceCode, "BIR", FALSE] => GriffinFontDefs.BoldItalic, ENDCASE => ERROR; ifont.rotation _ SELECT Real.RoundC[factors.r1+factors.r2] FROM 0 => GriffinFontDefs.Rot0Degrees, 90 => GriffinFontDefs.Rot90Degrees, 180 => GriffinFontDefs.Rot180Degrees, 270 => GriffinFontDefs.Rot270Degrees, ENDCASE => ERROR; ifont.points _ Real.RoundC[factors.s.x]; RETURN[ifont]; }; FontFromInternalFont: PUBLIC PROC[ifont: InternalFont] RETURNS[Font] = { <> <> transformation: ImagerTransformation.Transformation; face: ROPE _ SELECT ifont.face FROM GriffinFontDefs.Regular => "-MRR", GriffinFontDefs.Italic => "-MIR", GriffinFontDefs.Bold => "-BRR", GriffinFontDefs.BoldItalic => "-BIR", ENDCASE => ERROR; name: ROPE _ Rope.Cat["Xerox/PressFonts/",ifont.name, face]; font: StyleDefs.Font _ ImagerFont.Find[name ! Imager.Error => { GriffinDefs.ShowUserMessage[error.explanation]; GOTO error; }]; transformation _ SELECT ifont.rotation FROM GriffinFontDefs.Rot0Degrees => ImagerTransformation.Rotate[0], GriffinFontDefs.Rot90Degrees => ImagerTransformation.Rotate[90], GriffinFontDefs.Rot180Degrees => ImagerTransformation.Rotate[180], GriffinFontDefs.Rot270Degrees => ImagerTransformation.Rotate[270], ENDCASE => ERROR; transformation _ ImagerTransformation.Concat[transformation, ImagerTransformation.Scale[ifont.points]]; font _ ImagerFont.Modify[font, transformation]; RETURN[font]; EXITS error => RETURN[NIL]; }; ComputeStringType: PUBLIC PROC[stringRotation: StyleDefs.StringRotation,font: StyleDefs.Font] RETURNS[StyleDefs.StringType] = { ifont: InternalFont _ InternalFontFromFont[font]; stringR: INT _ SELECT stringRotation FROM or0 =>0, or90 => 90, or180 => 180, or270 => 270, ENDCASE => ERROR; fontR: INT _ SELECT ifont.rotation FROM GriffinFontDefs.Rot0Degrees => 0, GriffinFontDefs.Rot90Degrees => 90, GriffinFontDefs.Rot180Degrees => 180, GriffinFontDefs.Rot270Degrees => 270, ENDCASE => ERROR; IF stringR=fontR THEN RETURN[normal] ELSE RETURN[stack]; }; END.