<< --GriffinToTANodesImpl.mesa -- Beach, July 3, 1982 3:53 pm -- Stone November 26, 1982 7:08 pm>> DIRECTORY GFileFormatDefs, GriffinToTA, GriffinToTANodes, GriffinToTAPrivate, IO, NameSymbolTable USING [Name, RopeFromName], PairList, PutGet USING [ToFile], Rope, SplineDefs, StyleDefs, TAProperties USING [SetArtworkProp, SetArtworkPathProp, SetBoundingBoxProp, SetOriginProp], TextEdit USING [AppendRope, ChangeStyle, ChangeType, DocFromNode, FromRope], TextNode USING [Ref, RefTextNode], UserExec USING [GetNameAndPassword], GraphicsBasic USING [Vec], CGPath USING [Generate]; GriffinToTANodesImpl: PROGRAM IMPORTS GriffinToTA, GriffinToTAPrivate, IO, NameSymbolTable, PairList, PutGet, Rope, TAProperties, TextEdit, UserExec, CGPath EXPORTS GriffinToTANodes = { OPEN GriffinToTA, GriffinToTAPrivate; ROPE: TYPE = Rope.ROPE; topScreenCoord: INTEGER = 808; -- Griffin Font definitions taken from GriffinFontDefs Regular: CARDINAL = 0; Italic: CARDINAL = 1; Bold: CARDINAL = 2; BoldItalic: CARDINAL = Bold + Italic; Rot0Degrees: CARDINAL = 0; Rot90Degrees: CARDINAL = 5400; Rot180Degrees: CARDINAL = 10800; Rot270Degrees: CARDINAL = 16200; PutClusters: PUBLIC PROCEDURE[fileName: ROPE] = { thisCluster: CARDINAL; clusterNumber: CARDINAL _ 0; figureName: ROPE _ Rope.Substr[fileName, 0, Rope.Find[fileName, "."]]; figureRoot: TextNode.Ref; figureNode, clusterNode: TextNode.RefTextNode; clusterX, clusterY: INTEGER _ LAST[INTEGER]; objectBBox: PROC[leftPart, rightPart: REF ANY] = { IF NARROW[leftPart, REF CARDINAL]^=thisCluster THEN { refObjectId: REF CARDINAL _ NARROW[rightPart]; griffinObject: ObjectRef _ NARROW[PairList.Right[objectMap, EqualCardinals, refObjectId]]; clusterX _ MIN[clusterX, griffinObject^.bleft]; clusterY _ MIN[clusterY, topScreenCoord-griffinObject^.bbottom]; }; }; doObject: PROC[leftPart, rightPart: REF ANY] = { IF NARROW[leftPart, REF CARDINAL]^=thisCluster THEN { IF clusterNode=NIL THEN { clusterNumber _ clusterNumber+1; clusterNode _ PutClusterNode[figureRoot, figureNode, clusterNumber, clusterX, clusterY]}; PutObjectNode[figureRoot, clusterNode, NARROW[rightPart, REF CARDINAL], clusterX, clusterY]}; }; figureNode _ PutFigureNode[figureName]; figureRoot _ TextEdit.DocFromNode[figureNode]; TextEdit.ChangeStyle[figureRoot, figureName]; TAProperties.SetArtworkProp[figureRoot]; FOR thisCluster IN [firstCluster .. lastCluster] DO clusterNode _ NIL; clusterX _ clusterY _ LAST[INTEGER]; PairList.ForAllPairs[clusterMap, objectBBox]; PairList.ForAllPairs[clusterMap, doObject]; ENDLOOP; [] _ PutGet.ToFile[fileName, figureRoot]; }; PutFigureNode: PROCEDURE[figureName: ROPE] RETURNS[node: TextNode.RefTextNode] = { rope: ROPE _ Rope.Cat["% Tioga Artwork figure for ", figureName]; node _ TextEdit.FromRope[rope]; TAProperties.SetArtworkProp[node]; RETURN[node]; }; PutClusterNode: PROCEDURE[figureRoot: TextNode.Ref, figureNode: TextNode.RefTextNode, cluster: CARDINAL, clusterX, clusterY: INTEGER] RETURNS[node: TextNode.RefTextNode] = { node _ InsertNodeAfterChildrenOf[figureNode]; [] _ TextEdit.AppendRope[figureRoot, node, IO.PutFToRope["%% Cluster %d*n%d %d .translate", IO.card[cluster], IO.int[clusterX], IO.int[clusterY]]]; TAProperties.SetArtworkProp[node]; RETURN[node]; }; PutObjectNode: PROCEDURE[figureRoot: TextNode.Ref, clusterNode: TextNode.RefTextNode, refObjectId: REF CARDINAL, clusterX, clusterY: INTEGER] = { griffinObject: ObjectRef _ NARROW[PairList.Right[objectMap, EqualCardinals, refObjectId]]; objectNode: TextNode.RefTextNode _ InsertNodeAfterChildrenOf[clusterNode]; [] _ TextEdit.AppendRope[figureRoot, objectNode, IO.PutFToRope["%% Object %d", IO.card[refObjectId^]]]; SELECT griffinObject^.objtype FROM GFileFormatDefs.typeCurveObject, GFileFormatDefs.typeAreaObject => PutPathNode[figureRoot, objectNode, griffinObject, refObjectId, clusterX, clusterY]; GFileFormatDefs.typeCaptionObject => PutCaptionNode[figureRoot, objectNode, griffinObject, refObjectId, clusterX, clusterY]; ENDCASE; TAProperties.SetArtworkProp[objectNode]; }; PutPathNode: PROCEDURE[figureRoot: TextNode.Ref, objectNode: TextNode.RefTextNode, griffinObject: ObjectRef, refObjectId: REF CARDINAL, clusterX, clusterY: INTEGER] = { pathNode: TextNode.RefTextNode _ InsertNodeAfterChildrenOf[objectNode]; refStyleId: REF CARDINAL _ NEW[CARDINAL _ griffinObject^.style]; griffinStyle: StyleRef _ NARROW[PairList.Right[styleMap, EqualCardinals, refStyleId]]; areaColor, outlineColor: ColorRef _ NIL; pathType: ROPE _ NIL; lineWeight: REAL _ 0; pathStyle: PathStyleRef; pathRef: PathRef; SELECT griffinObject^.objtype FROM GFileFormatDefs.typeAreaObject => { IF griffinStyle^.afilled THEN { areaColor _ FindColor[griffinStyle^.ahue, griffinStyle^.asaturation, griffinStyle^.abrightness]; pathType _ "filled"}; IF griffinStyle^.aoutlined THEN { outlineColor _ FindColor[griffinStyle^.hue, griffinStyle^.saturation, griffinStyle^.brightness]; pathType _ IF griffinStyle^.afilled THEN "filled+outlined" ELSE "outlined"; lineWeight _ GriffinToTAPrivate.ScalePressToScreenCoord[griffinStyle^.thickness]}}; GFileFormatDefs.typeCurveObject => { outlineColor _ FindColor[griffinStyle^.hue, griffinStyle^.saturation, griffinStyle^.brightness]; pathType _ "outlined"; lineWeight _ GriffinToTAPrivate.ScalePressToScreenCoord[griffinStyle^.thickness]}; ENDCASE; pathStyle _ FindPathStyle[areaColor, outlineColor, pathType, lineWeight]; [] _ TextEdit.AppendRope[figureRoot, objectNode, IO.PutFToRope["\n%d %d .translate", IO.int[griffinObject^.bleft-clusterX], IO.int[topScreenCoord-griffinObject^.bbottom-clusterY]]]; --can't use a NARROW as pathRef is opaque, and that construct is not implemented --this should be pretty safe pathRef _ LOOPHOLE[PairList.Right[pathMap, EqualCardinals, refObjectId]]; [] _ TextEdit.AppendRope[figureRoot, pathNode,PathToRope[pathRef]]; TextEdit.ChangeType[pathNode, pathStyle^.name]; TAProperties.SetArtworkProp[pathNode]; TAProperties.SetArtworkPathProp[pathNode]; TAProperties.SetBoundingBoxProp[pathNode, griffinObject^.bright-griffinObject^.bleft, griffinObject^.bbottom-griffinObject^.btop]; TAProperties.SetOriginProp[pathNode, 0, 0]; }; PutCaptionNode: PROCEDURE[figureRoot: TextNode.Ref, objectNode: TextNode.RefTextNode, griffinObject: ObjectRef, refObjectId: REF CARDINAL, clusterX, clusterY: INTEGER] = { captionNode: TextNode.RefTextNode _ InsertNodeAfterChildrenOf[objectNode]; captionStyle: CaptionStyleRef; caption: CaptionRef _ NARROW[PairList.Right[captionMap, EqualCardinals, refObjectId]]; refStyleId: REF CARDINAL _ NEW[CARDINAL _ griffinObject^.style]; griffinStyle: StyleRef _ NARROW[PairList.Right[styleMap, EqualCardinals, refStyleId]]; refFontId: REF CARDINAL _ NEW[CARDINAL _ griffinStyle^.fontid]; griffinFont: FontRef _ NARROW[PairList.Right[fontMap, EqualCardinals, refFontId]]; family, face, charRotation, lineFormatting: ROPE; size: REAL; textRotation: INTEGER; textColor: ColorRef; i: CARDINAL; bold, italic: BOOLEAN _ FALSE; FOR i IN [1 .. LOOPHOLE[griffinFont^.char[0],CARDINAL]] DO family _ Rope.Cat[family, Rope.FromChar[griffinFont^.char[i]]]; ENDLOOP; size _ griffinFont^.points; SELECT griffinFont^.face FROM Regular => face _ "regular"; Italic => {face _ "italic"; italic _ TRUE}; Bold => {face _ "bold"; bold _ TRUE}; BoldItalic => {face _ "bold+italic"; bold _ TRUE; italic _ TRUE}; ENDCASE=> face _ "regular"; charRotation _ SELECT griffinFont^.rotation FROM Rot0Degrees => "0", Rot90Degrees => "90", Rot180Degrees => "180", Rot270Degrees => "270", ENDCASE => "0"; lineFormatting _ SELECT griffinStyle^.anchor FROM GFileFormatDefs.typeLeftAnchor => "flushLeft", GFileFormatDefs.typeCenterAnchor => "centered", GFileFormatDefs.typeRightAnchor => "flushRight", ENDCASE => "flushLeft"; captionStyle _ FindCaptionStyle[family, size, face, charRotation, lineFormatting]; textRotation _ SELECT griffinStyle^.torient FROM GFileFormatDefs.typeRot0 => 0, GFileFormatDefs.typeRot90 => 90, GFileFormatDefs.typeRot180 => 180, GFileFormatDefs.typeRot270 => 270, ENDCASE => 0; textColor _ FindColor[griffinStyle^.hue, griffinStyle^.saturation, griffinStyle^.brightness]; [] _ TextEdit.AppendRope[figureRoot, objectNode, IO.PutFToRope["\n%d %d .translate %d .rotate", IO.real[caption^.position.x-clusterX], IO.real[caption^.position.y-clusterY], IO.int[textRotation]]]; [] _ TextEdit.AppendRope[figureRoot, captionNode, caption^.text]; TextEdit.ChangeType[captionNode, captionStyle^.name]; }; PutStyles: PUBLIC PROCEDURE[fileName: ROPE] = { OPEN IO; userName, password: ROPE; styleRope: ROPE; p, pp, pTemp: PathStyleRef; c, cc, cTemp: CaptionStyleRef; node: TextNode.RefTextNode; root: TextNode.Ref; [userName, password] _ UserExec.GetNameAndPassword[]; userName_ Rope.Substr[userName, 0, Rope.Find[userName, "."]]; styleRope _ PutFToRope["%% %s\n%% %s, %g\n\n", rope[fileName], rope[userName], time[]]; styleRope _ Rope.Cat[styleRope, "BeginStyle\n\n(BasicGraphics) AttachStyle\n\n(Cedar) AttachStyle\n\n"]; p _ pathStyles; pp _ NIL; WHILE p#NIL DO -- reverse the styles list pTemp _ p.next; p.next _ pp; pp _ p; p _ pTemp; ENDLOOP; p _ pathStyles _ pp; WHILE p#NIL DO styleRope _ Rope.Cat[styleRope, PathStyleToRope[p]]; p _ p.next; ENDLOOP; c _ captionStyles; cc _ NIL; WHILE c#NIL DO -- reverse the styles list cTemp _ c.next; c.next _ cc; cc _ c; c _ cTemp; ENDLOOP; c _ captionStyles _ cc; WHILE c#NIL DO styleRope _ Rope.Cat[styleRope, CaptionStyleToRope[c]]; c _ c.next; ENDLOOP; styleRope _ Rope.Cat[styleRope, "EndStyle\n"]; node _ TextEdit.FromRope[styleRope]; root _ TextEdit.DocFromNode[node]; [] _ PutGet.ToFile[fileName, root]; }; PathStyleToRope: PUBLIC PROCEDURE[p: PathStyleRef] RETURNS[styleRope: ROPE] = { OPEN IO; styleRope _ PutFToRope["(%s) \". . .\" {\n", rope[NameSymbolTable.RopeFromName[p.name]]]; IF p.areaColor#NIL THEN styleRope _ Rope.Cat[styleRope, PutFToRope["\t%s areaColor\n", rope[p.areaColor.name]]]; IF p.outlineColor#NIL THEN styleRope _ Rope.Cat[styleRope, PutFToRope["\t%s outlineColor\n", rope[p.outlineColor.name]]]; styleRope _ Rope.Cat[styleRope, PutFToRope["\t%s pathType\n", rope[p.pathType]]]; IF p.lineWeight#0 THEN styleRope _ Rope.Cat[styleRope, PutFToRope["\t%g pt lineWeight\n", real[p.lineWeight]]]; styleRope _ Rope.Cat[styleRope, "\t} StyleRule\n\n"]; }; CaptionStyleToRope: PUBLIC PROCEDURE[p: CaptionStyleRef] RETURNS[styleRope: ROPE] = { OPEN IO; styleRope _ Rope.Cat[ PutFToRope["(%s) \". . .\" {\n", rope[NameSymbolTable.RopeFromName[p.name]]], PutFToRope["\t\"%s\" family\n", rope[p.family]], PutFToRope["\t%g bp size\n", real[p.size]], PutFToRope["\t%s face\n", rope[p.face]], PutFToRope["\t%% %s charRotation\n", rope[p.charRotation]], PutFToRope["\t%s captionFormatting\n\tflushTop captionAlignment\n\t0 left.indent\n\t} StyleRule\n\n", rope[p.lineFormatting]]]; }; PathToRope: PROC [path: PathRef] RETURNS [ROPE] = { rope: ROPE; move: SAFE PROC[p: GraphicsBasic.Vec] = CHECKED { rope _ Rope.Cat[rope,IO.PutFToRope["%f %f %s ", IO.real[p.x], IO.real[p.y], IO.rope[" .moveto "]]]; }; line: SAFE PROC[p: GraphicsBasic.Vec] = CHECKED { rope _ Rope.Cat[rope,IO.PutFToRope["%f %f %s ", IO.real[p.x], IO.real[p.y], IO.rope[" .lineto "]]]; }; curve: SAFE PROC[b1,b2,b3: GraphicsBasic.Vec] = CHECKED { rope _ Rope.Cat[rope, IO.PutFToRope["%f %f %f %f ", IO.real[b1.x], IO.real[b1.y], IO.real[b2.x], IO.real[b2.y]]]; rope _ Rope.Cat[rope, IO.PutFToRope["%f %f %s", IO.real[b3.x], IO.real[b3.y], IO.rope[" .curveto "]]]; }; CGPath.Generate[path,move,line,curve]; RETURN[rope]; }; }.