<> <> <> <> <> <> <> DIRECTORY TextLooks USING [Looks]; NodeStyle: CEDAR DEFINITIONS = BEGIN <> Ref: TYPE = REF StyleBody; StyleBody: TYPE = RECORD [ fontFace: FontFace _ Regular, -- 2 bits fontAlphabets: FontAlphabets _ CapsAndLower, -- 2 bits strikeout: FontUnderlining _ None, -- 2 bits underlining: FontUnderlining _ None, -- 2 bits lineFormatting: LineFormatting _ FlushLeft, -- 2 bits lastLineFormatting: LineFormatting _ FlushLeft, -- 2 bits pathType: PathType _ Filled, -- 2 bits print: BOOL _ FALSE, -- true if using the hardcopy style rules isComment: BOOL _ FALSE, -- set to node.comment; readonly for style rules fixedTabs: BOOL _ FALSE, -- true if stops at fixed locations. else relative to left margin nestingLevel: [0..MaxNestingLevel] _ 0, -- node level in tree; readonly for style rules numTabStops: [0..64) _ 0, -- length of the tabStops list name: ARRAY NameParam OF ATOM, real: PACKED ARRAY RealParam OF RealCode, defaultTabStops: TabStop, -- if NIL, use 0.5 in flushLeft blank defaultTabStops tabStops: LIST OF TabStop, -- kept sorted by decreasing location, i.e., from right to left on page <> dataList: DataList -- for special parameters ]; MaxNestingLevel: INTEGER = 31; -- 5 bits NameParam: TYPE = { style, -- name of the style, such as "TechicalNote" fontFamily -- name of the font family, such as "Helvetica" }; DataList: TYPE = REF DataEntry; OfEntry: TYPE = { object, real, tab }; DataEntry: TYPE = RECORD [ next: DataList, data: SELECT kind:OfEntry FROM object => [ name: ATOM, -- name of the parameter object: NameSymbolTable.Object -- value of the parameter ], real => [ -- for real values which overflow the table of common values param: RealParam, -- which one it is value: REAL _ 0.0, -- the value valueI: INTEGER -- the value rounded to an integer ], tab => [ -- for real values from tabspecs which overflow the table of common values tabStop: TabStop, -- which tab stop it is which: TabRealParam, -- which value for the tab stop it is value: REAL _ 0.0, -- the value valueI: INTEGER -- the value rounded to an integer ] ENDCASE ]; TabRealParam: TYPE = { loc, spacing, weight, vshift }; TabStop: TYPE = REF TabStopRec; LeaderTabStop: TYPE = REF leaders TabStopRec; RuleTabStop: TYPE = REF rule TabStopRec; RulesTabStop: TYPE = REF rules TabStopRec; TabStopRec: TYPE = RECORD [ looks: TextLooks.Looks, -- the default looks for the stop loc: RealCode, -- the location of the stop alignment: TabAlign _ FlushLeft, -- how the tab is aligned alignmentChar: CHAR _ 0C, -- only of interest if alignment=Character breakIfPast: BOOL _ FALSE, -- what to do if you are already beyond the tab stop fill: SELECT fillKind:OfTabFill FROM blank => [], leaders => [ congruent: BOOL _ TRUE, -- otherwise, centered char: CHAR _ 0C, -- the character to be repeated spacing: RealCode -- the distance between repetitions ], rule => [ weight: RealCode, -- the thickness of the rule vshift: RealCode -- the distance up from the baseline to the bottom of the rule ], rules => [ rules: TabArray -- array of records with weight and vshift for each rule ], ENDCASE ]; TabAlign: TYPE = { FlushLeft, FlushRight, Centered, Character }; OfTabFill: TYPE = { blank, leaders, rule, rules }; TabArray: TYPE = REF TabArrayRec; TabArrayRec: TYPE = RECORD[ array: SEQUENCE length: CARDINAL OF RECORD[weight, vshift: RealCode] ]; FontFace: TYPE = { Regular, Bold, Italic, BoldItalic }; FontAlphabets: TYPE = { CapsAndLower, CapsAndSmallCaps, LowerOnly, CapsOnly }; FontUnderlining: TYPE = { None, LettersAndDigits, Visible, All }; LineFormatting: TYPE = { FlushLeft, FlushRight, Justified, Centered }; PathType: TYPE = { Filled, Outlined, FilledAndOutlined }; RealParam: TYPE = { <> freeVar, <> fontSize, -- in points hshift, -- distance to offset text, positive to the right vshift, -- distance to raise text above baseline (can be negative) tabStops, -- tab spacing in points minLineGap, -- min distance between line top and previous bottom (can be negative) letterspacing, -- distance added between each character letterspacingStretch, letterspacingShrink, <> leftIndent, -- all lines indent this much on left rightIndent, -- all lines indent this much on right firstIndent, -- first line indent this much more on left firstIndentRight, -- first line indent this much more on the right restIndent, -- other lines indent this much more on left runaroundLeft, -- depth of first indent on the left runaroundRight, -- depth of first indent on the right topIndent, -- top line at least this much down from top of viewer/page bottomIndent, -- bottom baseline at least this up from bottom of page <> leading, -- distance between baselines leadingStretch, leadingShrink, topLeading, -- min distance from first baseline to previous topLeadingStretch, topLeadingShrink, bottomLeading, -- min distance from last baseline to next bottomLeadingStretch, bottomLeadingShrink, <> areaHue, -- color for filled areas areaSaturation, areaBrightness, outlineHue, -- color for outlines outlineSaturation, outlineBrightness, textHue, -- color for text textSaturation, textBrightness, textRotation, lineWeight, -- width of graphics lines <> pageWidth, pageLength, leftMargin, rightMargin, topMargin, bottomMargin, headerMargin, footerMargin, bindingMargin, lineLength, column, -- number of columns pagebreak, -- glue added between pages (well sort of) pagebreakStretch, pagebreakShrink, <> pageBreakPenalty, -- penalty for breaking inside node pageBreakAfterFirstLinePenalty, -- penalty for breaking node after its first line pageBreakBeforeLastLinePenalty, -- penalty for breaking node before its last line pageBreakBeforeFirstLinePenalty, -- penalty for breaking before first line of node pageBreakAfterLastLinePenalty, -- penalty for breaking after last line of node <> underlineThickness, -- width of the rule drawn under characters underlineDescent, -- positive offset to position bottom of underline below the baseline underlineHue, -- color for underlines underlineSaturation, underlineBrightness, <> strikeoutThickness, -- width of the rule drawn through characters strikeoutAscent, -- positive offset to position bottom of strikeout above the baseline strikeoutHue, -- color for strikeouts strikeoutSaturation, strikeoutBrightness, <> backgroundAscent, -- positive offset to position top of background above the baseline backgroundDescent, -- positive offset to position bottom of background below the baseline backgroundHue, -- color for backgrounds backgroundSaturation, backgroundBrightness, <> outlineboxThickness, -- width of the rule drawn around text outlineboxBearoff, -- positive distance between the font box for text and the outline outlineboxHue, -- color for outlinebox outlineboxSaturation, outlineboxBrightness }; RealCode: TYPE = [0..255] _ 0; zero: RealCode = 0; PointsPerPica: REAL; PointsPerInch: REAL; PointsPerCentimeter: REAL; PointsPerMillimeter: REAL; PointsPerDidot: REAL; PointsPerFil: REAL; PointsPerFill: REAL; PointsPerFilll: REAL; <> GetStyleName: PROC [s:Ref] RETURNS [ATOM] = INLINE { RETURN [s.name[style]] }; GetFontFamily: PROC [s:Ref] RETURNS [ATOM] = INLINE { RETURN [s.name[fontFamily]] }; GetFontFace: PROC [s:Ref] RETURNS [FontFace] = INLINE { <> RETURN [s.fontFace] }; GetFontAlphabets: PROC [s:Ref] RETURNS [FontAlphabets] = INLINE { <> RETURN [s.fontAlphabets] }; GetUnderlining: PROC [s:Ref] RETURNS [FontUnderlining] = INLINE { <> RETURN [s.underlining] }; GetStrikeout: PROC [s:Ref] RETURNS [FontUnderlining] = INLINE { <> RETURN [s.strikeout] }; GetLineFormatting: PROC [s:Ref] RETURNS [LineFormatting] = INLINE { <> RETURN [s.lineFormatting] }; GetPathType: PROC [s:Ref] RETURNS [PathType] = INLINE { <> RETURN [s.pathType] }; <> GetFontSize: PROC [s:Ref] RETURNS [REAL] = INLINE { -- in points RETURN [GetReal[s,fontSize]] }; GetFontSizeI: PROC [s:Ref] RETURNS [INTEGER] = INLINE { RETURN [GetInt[s,fontSize]] }; GetVShift: PROC [s:Ref] RETURNS [REAL] = INLINE { <> RETURN [GetReal[s,vshift]] }; GetVShiftI: PROC [s:Ref] RETURNS [INTEGER] = INLINE { RETURN [GetInt[s,vshift]] }; GetTabStops: PROC [s:Ref] RETURNS [REAL] = INLINE { <> RETURN [GetReal[s,tabStops]] }; GetTabStopsI: PROC [s:Ref] RETURNS [INTEGER] = INLINE { RETURN [GetInt[s,tabStops]] }; GetMinLineGap: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,minLineGap]] }; GetMinLineGapI: PROC [s:Ref] RETURNS [INTEGER] = INLINE { RETURN [GetInt[s,minLineGap]] }; GetTextRotation: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,textRotation]] }; GetLineWeight: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,lineWeight]] }; <> GetLeftIndent: PROC [s:Ref] RETURNS [REAL] = INLINE { <> RETURN [GetReal[s,leftIndent]] }; GetLeftIndentI: PROC [s:Ref] RETURNS [INTEGER] = INLINE { RETURN [GetInt[s,leftIndent]] }; GetRightIndent: PROC [s:Ref] RETURNS [REAL] = INLINE { <> RETURN [GetReal[s,rightIndent]] }; GetRightIndentI: PROC [s:Ref] RETURNS [INTEGER] = INLINE { RETURN [GetInt[s,rightIndent]] }; GetFirstIndent: PROC [s:Ref] RETURNS [REAL] = INLINE { <> RETURN [GetReal[s,firstIndent]] }; GetFirstIndentI: PROC [s:Ref] RETURNS [INTEGER] = INLINE { RETURN [GetInt[s,firstIndent]] }; GetRestIndent: PROC [s:Ref] RETURNS [REAL] = INLINE { <> RETURN [GetReal[s,restIndent]] }; GetRestIndentI: PROC [s:Ref] RETURNS [INTEGER] = INLINE { RETURN [GetInt[s,restIndent]] }; GetBodyIndent: PROC [s:Ref] RETURNS [REAL] = INLINE { <> RETURN [GetReal[s,restIndent]] }; GetBodyIndentI: PROC [s:Ref] RETURNS [INTEGER] = INLINE { RETURN [GetInt[s,restIndent]] }; GetTopIndent: PROC [s:Ref] RETURNS [REAL] = INLINE { <> RETURN [GetReal[s,topIndent]] }; GetTopIndentI: PROC [s:Ref] RETURNS [INTEGER] = INLINE { RETURN [GetInt[s,topIndent]] }; GetBottomIndent: PROC [s:Ref] RETURNS [REAL] = INLINE { <> RETURN [GetReal[s,bottomIndent]] }; GetBottomIndentI: PROC [s:Ref] RETURNS [INTEGER] = INLINE { RETURN [GetInt[s,bottomIndent]] }; <> GetLeading: PROC [s:Ref] RETURNS [REAL] = INLINE { <> RETURN [GetReal[s,leading]] }; GetLeadingI: PROC [s:Ref] RETURNS [INTEGER] = INLINE { RETURN [GetInt[s,leading]] }; GetLeadingStretch: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,leadingStretch]] }; GetLeadingShrink: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,leadingShrink]] }; GetTopLeading: PROC [s:Ref] RETURNS [REAL] = INLINE { <> RETURN [GetReal[s,topLeading]] }; GetTopLeadingI: PROC [s:Ref] RETURNS [INTEGER] = INLINE { RETURN [GetInt[s,topLeading]] }; GetTopLeadingStretch: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,topLeadingStretch]] }; GetTopLeadingShrink: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,topLeadingShrink]] }; GetBottomLeading: PROC [s:Ref] RETURNS [REAL] = INLINE { <> RETURN [GetReal[s,bottomLeading]] }; GetBottomLeadingI: PROC [s:Ref] RETURNS [INTEGER] = INLINE { RETURN [GetInt[s,bottomLeading]] }; GetBottomLeadingStretch: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,bottomLeadingStretch]] }; GetBottomLeadingShrink: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,bottomLeadingShrink]] }; <> GetPageWidth: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,pageWidth]] }; GetPageLength: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,pageLength]] }; GetLeftMargin: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,leftMargin]] }; GetRightMargin: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,rightMargin]] }; GetTopMargin: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,topMargin]] }; GetBottomMargin: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,bottomMargin]] }; GetHeaderMargin: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,headerMargin]] }; GetFooterMargin: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,footerMargin]] }; GetBindingMargin: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,bindingMargin]] }; GetLineLength: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,lineLength]] }; GetColumns: PROC [s:Ref] RETURNS [INTEGER] = INLINE { RETURN [GetInt[s,column]] }; <> GetPageBreakPenalty: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,pageBreakPenalty]] }; GetPageBreakAfterFirstLinePenalty: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,pageBreakAfterFirstLinePenalty]] }; GetPageBreakBeforeLastLinePenalty: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,pageBreakBeforeLastLinePenalty]] }; GetPageBreakBeforeFirstLinePenalty: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,pageBreakBeforeFirstLinePenalty]] }; GetPageBreakAfterLastLinePenalty: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,pageBreakAfterLastLinePenalty]] }; <> GetAreaHue: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,areaHue]] }; GetAreaSaturation: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,areaSaturation]] }; GetAreaBrightness: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,areaBrightness]] }; GetOutlineHue: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,outlineHue]] }; GetOutlineSaturation: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,outlineSaturation]] }; GetOutlineBrightness: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,outlineBrightness]] }; GetTextHue: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,textHue]] }; GetTextSaturation: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,textSaturation]] }; GetTextBrightness: PROC [s:Ref] RETURNS [REAL] = INLINE { RETURN [GetReal[s,textBrightness]] }; <> GetTabLoc: PROC [stop: TabStop, s:Ref] RETURNS [REAL]; GetTabLocI: PROC [stop: TabStop, s:Ref] RETURNS [INTEGER]; GetTabLeaderSpacing: PROC [stop: LeaderTabStop, s:Ref] RETURNS [REAL]; GetTabLeaderSpacingI: PROC [stop: LeaderTabStop, s:Ref] RETURNS [INTEGER]; <<>> GetTabRuleWeight: PROC [stop: RuleTabStop, s:Ref] RETURNS [REAL]; GetTabRuleWeightI: PROC [stop: RuleTabStop, s:Ref] RETURNS [INTEGER]; <<>> GetTabRuleVShift: PROC [stop: RuleTabStop, s:Ref] RETURNS [REAL]; GetTabRuleVShiftI: PROC [stop: RuleTabStop, s:Ref] RETURNS [INTEGER]; <<>> GetTabRealCode: PROC [ref: Ref, stop: TabStop, which: TabRealParam, value: REAL _ 0.0] RETURNS [code: RealCode]; GetRulesTabCount: PROC [stop: RulesTabStop] RETURNS [count: INTEGER]; -- number of rules GetRulesTabInfo: PROC [stop: RulesTabStop, num: INTEGER] RETURNS [weight, vshift: REAL]; <> GetRulesTabInfoI: PROC [stop: RulesTabStop, num: INTEGER] RETURNS [weight, vshift: INTEGER]; <> <> <<>> GetScreenSpaceWidth: PROC[style: Ref] RETURNS[REAL]; <> GetPrintSpaceWidth: PROC[style: Ref] RETURNS[REAL]; <> <> GetReal: PROC [ref: Ref, param: RealParam] RETURNS [REAL]; GetInt: PROC [ref: Ref, param: RealParam] RETURNS [value: INTEGER]; RealInit0: TYPE ~ REAL _ 0.0; realArray: REF ARRAY RealCode OF RealInit0; -- array of distances intArray: REF ARRAY RealCode OF INTEGER; overflow: RealCode = LAST[RealCode]; realTableOverflow: ERROR; IntegerValue: PROC [value: REAL _ 0.0] RETURNS [INTEGER]; EnterReal: PROC [value: REAL _ 0.0] RETURNS [code: RealCode]; SetReal: PROC [ref: Ref, param: RealParam, value: REAL _ 0.0]; END.