NodeStyle.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Written by Bill Paxton, January 1981
Last changed by Bill Paxton, December 1, 1982 8:37 am
Plass, March 14, 1985 4:47:24 pm PST
Doug Wyatt, March 2, 1985 5:35:13 pm PST
Beach, March 19, 1985 6:11:52 pm PST
DIRECTORY
TextLooks USING [Looks];
NodeStyle: CEDAR DEFINITIONS
= BEGIN
Declarations
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: BOOLFALSE, -- true if using the hardcopy style rules
isComment: BOOLFALSE, -- set to node.comment; readonly for style rules
fixedTabs: BOOLFALSE, -- 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
this order substantially reduces allocations during the creation of the list since styles tend to define tab stops in increasing order, so can add to start of list and list additions must be non-destructive of the previous list. since length of list is given, can easily find the nth stop.
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: BOOLFALSE, -- what to do if you are already beyond the tab stop
fill: SELECT fillKind:OfTabFill FROM
blank => [],
leaders => [
congruent: BOOLTRUE, -- 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 = {
special variable used for extensions
freeVar,
miscellaneous
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,
indent parameters
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 parameters
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,
parameters for graphics
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
page layout parameters
pageWidth,
pageLength,
leftMargin,
rightMargin,
topMargin,
bottomMargin,
headerMargin,
footerMargin,
bindingMargin,
lineLength,
column, -- number of columns
pagebreak, -- glue added between pages (well sort of)
pagebreakStretch,
pagebreakShrink,
penalty parameters for page layout
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
underline
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,
strikeout
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,
background
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,
outlinebox
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;
Non-numeric style parameters
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 {
enumerated type given above
RETURN [s.fontFace] };
GetFontAlphabets: PROC [s:Ref] RETURNS [FontAlphabets] = INLINE {
enumerated type given above
RETURN [s.fontAlphabets] };
GetUnderlining: PROC [s:Ref] RETURNS [FontUnderlining] = INLINE {
enumerated type given above
RETURN [s.underlining] };
GetStrikeout: PROC [s:Ref] RETURNS [FontUnderlining] = INLINE {
enumerated type given above
RETURN [s.strikeout] };
GetLineFormatting: PROC [s:Ref] RETURNS [LineFormatting] = INLINE {
enumerated type given above
RETURN [s.lineFormatting] };
GetPathType: PROC [s:Ref] RETURNS [PathType] = INLINE {
enumerated type given above
RETURN [s.pathType] };
Miscellaneous real value parameters
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 {
distance to raise text above baseline
RETURN [GetReal[s,vshift]] };
GetVShiftI: PROC [s:Ref] RETURNS [INTEGER] = INLINE {
RETURN [GetInt[s,vshift]] };
GetTabStops: PROC [s:Ref] RETURNS [REAL] = INLINE {
number of spaces equivalent to one tab
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]] };
Indents
GetLeftIndent: PROC [s:Ref] RETURNS [REAL] = INLINE {
all lines indent at least this much on left
RETURN [GetReal[s,leftIndent]] };
GetLeftIndentI: PROC [s:Ref] RETURNS [INTEGER] = INLINE {
RETURN [GetInt[s,leftIndent]] };
GetRightIndent: PROC [s:Ref] RETURNS [REAL] = INLINE {
all lines indent at least this much on right
RETURN [GetReal[s,rightIndent]] };
GetRightIndentI: PROC [s:Ref] RETURNS [INTEGER] = INLINE {
RETURN [GetInt[s,rightIndent]] };
GetFirstIndent: PROC [s:Ref] RETURNS [REAL] = INLINE {
first line indent this much more on left
RETURN [GetReal[s,firstIndent]] };
GetFirstIndentI: PROC [s:Ref] RETURNS [INTEGER] = INLINE {
RETURN [GetInt[s,firstIndent]] };
GetRestIndent: PROC [s:Ref] RETURNS [REAL] = INLINE {
other lines indent this much more on left
RETURN [GetReal[s,restIndent]] };
GetRestIndentI: PROC [s:Ref] RETURNS [INTEGER] = INLINE {
RETURN [GetInt[s,restIndent]] };
GetBodyIndent: PROC [s:Ref] RETURNS [REAL] = INLINE {
For compatibility with old styles
RETURN [GetReal[s,restIndent]] };
GetBodyIndentI: PROC [s:Ref] RETURNS [INTEGER] = INLINE {
RETURN [GetInt[s,restIndent]] };
GetTopIndent: PROC [s:Ref] RETURNS [REAL] = INLINE {
top line at least this much down from top
RETURN [GetReal[s,topIndent]] };
GetTopIndentI: PROC [s:Ref] RETURNS [INTEGER] = INLINE {
RETURN [GetInt[s,topIndent]] };
GetBottomIndent: PROC [s:Ref] RETURNS [REAL] = INLINE {
bottom baseline at least this up from bottom
RETURN [GetReal[s,bottomIndent]] };
GetBottomIndentI: PROC [s:Ref] RETURNS [INTEGER] = INLINE {
RETURN [GetInt[s,bottomIndent]] };
Leadings
GetLeading: PROC [s:Ref] RETURNS [REAL] = INLINE {
distance between baselines
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 {
min distance from first baseline to previous
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 {
min distance from last baseline to next
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]] };
Page layout parameters for typesetter
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]] };
Penalties
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]] };
Colors
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]] };
Tab stop info
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];
For num in [0..RulesTabCount), returns the weight and vshift values for that rule.
GetRulesTabInfoI: PROC [stop: RulesTabStop, num: INTEGER] RETURNS [weight, vshift: INTEGER];
Spaces
Implemented in NodeStyleSpacesImpl
GetScreenSpaceWidth: PROC[style: Ref] RETURNS[REAL];
Returns the width of a space in the screen font for the given style.
GetPrintSpaceWidth: PROC[style: Ref] RETURNS[REAL];
Returns the width of a space in the printing font for the given style.
Generic Numeric Style Parameter routines
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.