-- TAStyleImpl.mesa
-- written by Beach,
July 3, 1982 4:54 pm
-- modified by Beach, November 26, 1982 12:58 pm

DIRECTORY
 JaMBasic USING [Object],
 JaMInternal USING [Frame],
 JaMOps USING [AGet, defaultFrame, Execute, MakeString, PopArray, PopReal, Push, StringToName],
 NameSymbolTable USING [MakeName, Name],
 NodeStyle USING [GetStyleName, GetReal, OfStyle, PathType, Ref],
 NodeStyleExtra USING [GetFrame, GetStyleParam, NameToObject],
 TAStyle;

TAStyleImpl
: PROGRAM
 IMPORTS JaMOps, NameSymbolTable, NodeStyle, NodeStyleExtra
 EXPORTS TAStyle = {

Name: TYPE = NameSymbolTable.Name;

penStyle: Name = NameSymbolTable.MakeName["penStyle"];
penSlant: Name = NameSymbolTable.MakeName["penSlant"];
penWidth: Name = NameSymbolTable.MakeName["penWidth"];
penHeight: Name = NameSymbolTable.MakeName["penHeight"];
shadowType: Name = NameSymbolTable.MakeName["shadowType"];
shadowDirection: Name = NameSymbolTable.MakeName["shadowDirection"];
shadowWeight: Name = NameSymbolTable.MakeName["shadowWeight"];
shadowAngle: Name = NameSymbolTable.MakeName["shadowAngle"];
shadowOffsetAmount: Name = NameSymbolTable.MakeName["shadowOffsetAmount"];
shadowPathType: Name = NameSymbolTable.MakeName["shadowPathType"];
shadowAreaHue: Name = NameSymbolTable.MakeName["shadowAreaHue"];
shadowAreaSaturation: Name = NameSymbolTable.MakeName["shadowAreaSaturation"];
shadowAreaBrightness: Name = NameSymbolTable.MakeName["shadowAreaBrightness"];
shadowOutlineHue: Name = NameSymbolTable.MakeName["shadowOutlineHue"];
shadowOutlineSaturation: Name = NameSymbolTable.MakeName["shadowOutlineSaturation"];
shadowOutlineBrightness: Name = NameSymbolTable.MakeName["shadowOutlineBrightness"];
captionFormatting: Name = NameSymbolTable.MakeName["captionFormatting"];
captionAlignment: Name = NameSymbolTable.MakeName["captionAlignment"];

filled: Name = NameSymbolTable.MakeName["filled"];
outlined: Name = NameSymbolTable.MakeName["outlined"];
filledAndOutlined: Name = NameSymbolTable.MakeName["filled+outlined"];
round: Name = NameSymbolTable.MakeName["round"];
square: Name = NameSymbolTable.MakeName["square"];
rectangular: Name = NameSymbolTable.MakeName["rectangular"];
italic: Name = NameSymbolTable.MakeName["italic"];
elliptical: Name = NameSymbolTable.MakeName["elliptical"];
drop: Name = NameSymbolTable.MakeName["drop"];
offset: Name = NameSymbolTable.MakeName["offset"];
none: Name = NameSymbolTable.MakeName["none"];
upLeft: Name = NameSymbolTable.MakeName["upLeft"];
upRight: Name = NameSymbolTable.MakeName["upRight"];
downLeft: Name = NameSymbolTable.MakeName["downLeft"];
downRight: Name = NameSymbolTable.MakeName["downRight"];
flushLeft: Name = NameSymbolTable.MakeName["flushLeft"];
flushRight: Name = NameSymbolTable.MakeName["flushRight"];
centered: Name = NameSymbolTable.MakeName["centered"];
flushTop: Name = NameSymbolTable.MakeName["flushTop"];
flushBottom: Name = NameSymbolTable.MakeName["flushBottom"];
baseline: Name = NameSymbolTable.MakeName["baseline"];

KludgeGetStyleParam: PROCEDURE[s: NodeStyle.Ref, name: Name, styleName: Name, kind: NodeStyle.OfStyle] RETURNS [obj: JaMBasic.Object] = {
 key: JaMBasic.Object;
 paramObject: array JaMBasic.Object;
 frame: JaMInternal.Frame ← NodeStyleExtra.GetFrame[s, styleName, kind];
 JaMOps.Push[frame.opstk, NodeStyleExtra.NameToObject[name]];
 JaMOps.Execute[frame, load];
 paramObject ← JaMOps.PopArray[frame.opstk];
 key ← JaMOps.AGet[paramObject, 0];
 WITH x:key SELECT FROM
  name => obj ← NodeStyleExtra.GetStyleParam[s, LOOPHOLE[x.id.index], styleName, kind];
  ENDCASE => ERROR;
 };
load: JaMBasic.Object = JaMOps.MakeString[".load", X];

ObjectNotAName: SIGNAL = CODE;

ObjectToName: PROCEDURE[obj: JaMBasic.Object] RETURNS[name: Name] = {
 WITH x:obj SELECT FROM
  name => RETURN [LOOPHOLE[x.id]];
  string => {
   nameObj: name JaMBasic.Object ← JaMOps.StringToName[x];
   RETURN[LOOPHOLE[nameObj.id]]};
  ENDCASE => SIGNAL ObjectNotAName;
 };

GetLineWeight: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[REAL] = {
 RETURN[NodeStyle.GetReal[s,lineWeight]]};

GetPenStyle: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[TAStyle.PenStyle] = {
 -- determine the pen style from the style applicable to this node
 penStyleName: Name ← ObjectToName[NodeStyleExtra.GetStyleParam[s, penStyle, NodeStyle.GetStyleName[s], screen]];
 RETURN[SELECT penStyleName FROM
  round => Round,
  square => Square,
  rectangular => Rectangular,
  italic => Italic,
  elliptical => Elliptical,
  ENDCASE => ERROR]};

GetPenSlant: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[REAL] = {
 -- determine the rotation in degrees from vertical; positive is clockwise
 frame: JaMInternal.Frame ← JaMOps.defaultFrame;
 JaMOps.Push[frame.opstk, NodeStyleExtra.GetStyleParam[s, penSlant, NodeStyle.GetStyleName[s], screen]];
 RETURN[JaMOps.PopReal[frame.opstk]]};

GetPenWidth: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[REAL] = {
 -- return the width of the pen in points
 frame: JaMInternal.Frame ← JaMOps.defaultFrame;
 JaMOps.Push[frame.opstk, NodeStyleExtra.GetStyleParam[s, penWidth, NodeStyle.GetStyleName[s], screen]];
 RETURN[JaMOps.PopReal[frame.opstk]]};

GetPenHeight: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[REAL] = {
 -- return the height of the pen in points
 frame: JaMInternal.Frame ← JaMOps.defaultFrame;
 JaMOps.Push[frame.opstk, NodeStyleExtra.GetStyleParam[s, penHeight, NodeStyle.GetStyleName[s], screen]];
 RETURN[JaMOps.PopReal[frame.opstk]]};

GetShadowType: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[TAStyle.ShadowType] = {
 -- return the type of shadow to apply
 shadowTypeName: Name ← ObjectToName[NodeStyleExtra.GetStyleParam[s, shadowType, NodeStyle.GetStyleName[s], screen]];
 RETURN[SELECT shadowTypeName FROM
  drop => Drop,
  offset => Offset,
  none => None,
  ENDCASE => ERROR]};

GetShadowDirection: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[TAStyle.ShadowDirection] = {
 -- return the direction of the shadow from the original path
 shadowDirectionName: Name ← ObjectToName[NodeStyleExtra.GetStyleParam[s, shadowDirection, NodeStyle.GetStyleName[s], screen]];
 RETURN[SELECT shadowDirectionName FROM
  upLeft => UpLeft,
  upRight => UpRight,
  downLeft => DownLeft,
  downRight => DownRight,
  ENDCASE => ERROR]};

GetShadowAngle: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[REAL] = {
 -- return the angle of the shadow from the original path
 frame: JaMInternal.Frame ← JaMOps.defaultFrame;
 JaMOps.Push[frame.opstk, NodeStyleExtra.GetStyleParam[s, shadowAngle, NodeStyle.GetStyleName[s], screen]];
 RETURN[JaMOps.PopReal[frame.opstk]]};

GetShadowWeight: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[REAL] = {
 -- return the weight of the shadow outline
 frame: JaMInternal.Frame ← JaMOps.defaultFrame;
 JaMOps.Push[frame.opstk, NodeStyleExtra.GetStyleParam[s, shadowWeight, NodeStyle.GetStyleName[s], screen]];
 RETURN[JaMOps.PopReal[frame.opstk]]};

GetShadowOffsetAmount: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[REAL] = {
 -- return the distance the shadow is offset from the original path
 frame: JaMInternal.Frame ← JaMOps.defaultFrame;
 JaMOps.Push[frame.opstk, NodeStyleExtra.GetStyleParam[s, shadowOffsetAmount, NodeStyle.GetStyleName[s], screen]];
 RETURN[JaMOps.PopReal[frame.opstk]]};

GetShadowPathType: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[NodeStyle.PathType] = {
 -- return the kind of path to use to draw the shadow
 shadowPathTypeName: Name ← ObjectToName[NodeStyleExtra.GetStyleParam[s, shadowPathType, NodeStyle.GetStyleName[s], screen]];
 RETURN[SELECT shadowPathTypeName FROM
  filled => Filled,
  outlined => Outlined,
  filledAndOutlined => FilledAndOutlined,
  ENDCASE => ERROR]};

GetShadowAreaHue: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[REAL] = {
 -- return the hue[0-255] of the shadow area
 frame: JaMInternal.Frame ← JaMOps.defaultFrame;
 JaMOps.Push[frame.opstk, NodeStyleExtra.GetStyleParam[s, shadowAreaHue, NodeStyle.GetStyleName[s], screen]];
 RETURN[JaMOps.PopReal[frame.opstk]]};


GetShadowAreaSaturation: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[REAL] = {
 -- return the saturation[0-255] of the shadow area
 frame: JaMInternal.Frame ← JaMOps.defaultFrame;
 JaMOps.Push[frame.opstk, NodeStyleExtra.GetStyleParam[s, shadowAreaSaturation, NodeStyle.GetStyleName[s], screen]];
 RETURN[JaMOps.PopReal[frame.opstk]]};


GetShadowAreaBrightness: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[REAL] = {
 -- return the brightness[0-255] of the shadow area
 frame: JaMInternal.Frame ← JaMOps.defaultFrame;
 JaMOps.Push[frame.opstk, NodeStyleExtra.GetStyleParam[s, shadowAreaBrightness, NodeStyle.GetStyleName[s], screen]];
 RETURN[JaMOps.PopReal[frame.opstk]]};


GetShadowOutlineHue: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[REAL] = {
 -- return the hue[0-255] of the shadow outline
 frame: JaMInternal.Frame ← JaMOps.defaultFrame;
 JaMOps.Push[frame.opstk, NodeStyleExtra.GetStyleParam[s, shadowOutlineHue, NodeStyle.GetStyleName[s], screen]];
 RETURN[JaMOps.PopReal[frame.opstk]]};


GetShadowOutlineSaturation: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[REAL] = {
 -- return the saturation[0-255] of the shadow outline
 frame: JaMInternal.Frame ← JaMOps.defaultFrame;
 JaMOps.Push[frame.opstk, NodeStyleExtra.GetStyleParam[s, shadowOutlineSaturation, NodeStyle.GetStyleName[s], screen]];
 RETURN[JaMOps.PopReal[frame.opstk]]};


GetShadowOutlineBrightness: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[REAL] = {
 -- return the brightness[0-255] of the shadow outline
 frame: JaMInternal.Frame ← JaMOps.defaultFrame;
 JaMOps.Push[frame.opstk, NodeStyleExtra.GetStyleParam[s, shadowOutlineBrightness, NodeStyle.GetStyleName[s], screen]];
 RETURN[JaMOps.PopReal[frame.opstk]]};

GetCaptionFormatting: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[TAStyle.CaptionFormatting] = {
 -- determine the horizontal justification for the text caption in this node
 captionFormattingName: Name ← ObjectToName[NodeStyleExtra.GetStyleParam[s, captionFormatting, NodeStyle.GetStyleName[s], screen]];
 RETURN[SELECT captionFormattingName FROM
  flushLeft => FlushLeft,
  flushRight => FlushRight,
  centered => Centered,
  ENDCASE => ERROR]};

GetCaptionAlignment: PUBLIC PROCEDURE[s: NodeStyle.Ref] RETURNS[TAStyle.CaptionAlignment] = {
 -- determine the vertical justification for the text caption in this node
 captionAlignmentName: Name ← ObjectToName[NodeStyleExtra.GetStyleParam[s, captionAlignment, NodeStyle.GetStyleName[s], screen]];
 RETURN[SELECT captionAlignmentName FROM
  flushTop => FlushTop,
  flushBottom => FlushBottom,
  baseline => Baseline,
  centered => Centered,
  ENDCASE => ERROR]};


}.

Rick Beach, November 26, 1982, add caption styles