-- Compiler ObjectXForms -- Stone May 2, 1981 1:09 PM DIRECTORY ObjectDefs: FROM "ObjectDefs", PointDefs: FROM "PointDefs", EncodingDefs: FROM "EncodingDefs", GriffinStartDefs: FROM "GriffinStartDefs", MenuDefs: FROM "MenuDefs", XFormDefs: FROM "XFormDefs"; ObjectXForms: PROGRAM IMPORTS ObjectDefs,XFormDefs,PointDefs,MenuDefs EXPORTS ObjectDefs, GriffinStartDefs = BEGIN OPEN ObjectDefs,XFormDefs,PointDefs; --does a translation on all control points and on the encoding MoveObject: PUBLIC PROCEDURE[object: ObjectHandle, from,to: ScrPt]= BEGIN token: ObjectHandle _ ReturnSelected[object]; Move[object,from,to]; IF token # NIL THEN Move[token,from,to]; END; Move: PROCEDURE[object: ObjectHandle, from,to: ScrPt]= BEGIN m1: XFormMatrix; transmatrix: XFMDescriptor _ DESCRIPTOR[m1]; hgrid,vgrid: BOOLEAN _ FALSE; objfrom,objto,dist: ObjPt; dx,dy: INTEGER; dx _ to[X]-from[X]; dy _ to[Y]-from[Y]; --move bounding box --bounding boxes on the grid move only in one dimension WITH objtype: object SELECT FROM token => {hgrid _ objtype.tokenType=hgrid; vgrid _ objtype.tokenType=vgrid}; ENDCASE; IF ~hgrid THEN object.tl[X] _ object.tl[X]+dx; IF ~vgrid THEN object.tl[Y] _ object.tl[Y]+dy; IF ~hgrid THEN object.br[X] _ object.br[X]+dx; IF ~vgrid THEN object.br[Y] _ object.br[Y]+dy; --move encoding in screen space WITH objtype: object SELECT FROM shape => BEGIN cptr: POINTER TO EncodingDefs.ChainEncoding; aptr: POINTER TO EncodingDefs.AreaEncoding; FOR cptr _ objtype.chainEncoding, cptr.link UNTIL cptr=NIL DO cptr.p0[X] _ cptr.p0[X]+dx; cptr.p0[Y] _ cptr.p0[Y]+dy; cptr.tl[X] _ cptr.tl[X]+dx; cptr.tl[Y] _ cptr.tl[Y]+dy; cptr.br[X] _ cptr.br[X]+dx; cptr.br[Y] _ cptr.br[Y]+dy; ENDLOOP; FOR aptr _ objtype.areaEncoding, aptr.link UNTIL aptr=NIL DO aptr.tl[X] _ aptr.tl[X]+dx; aptr.tl[Y] _ aptr.tl[Y]+dy; aptr.br[X] _ aptr.br[X]+dx; aptr.br[Y] _ aptr.br[Y]+dy; ENDLOOP; END; menu => BEGIN OPEN MenuDefs; MoveMenuItem: MenuProc = BEGIN item.tl [X] _ item.tl [X] + dx; item.tl [Y] _ item.tl [Y] + dy; item.br [X] _ item.br [X] + dx; item.br [Y] _ item.br [Y] + dy; END; ForAllMenuItems [@objtype, MoveMenuItem]; END; ENDCASE; --move the object in object space objfrom _ ScrToObj[from]; objto _ ScrToObj[to]; dist[X] _ objto[X]-objfrom[X]; dist[Y] _ objto[Y]-objfrom[Y]; InitXForms[transmatrix]; Translate[dist,transmatrix]; XForm[object,transmatrix]; END; XFormObject: PUBLIC PROCEDURE [object: ObjectHandle,matrix: XFMDescriptor] = BEGIN token: ObjectHandle _ ReturnSelected[object]; XForm[object,matrix]; IF token # NIL THEN BEGIN XForm[token,matrix]; token.validEncoding _ FALSE; END; object.validEncoding _ FALSE; END; XForm: PROCEDURE [object: ObjectHandle,matrix: XFMDescriptor] = BEGIN WITH objtype: object SELECT FROM shape => WITH traj: objtype.trajectory SELECT FROM linked => BEGIN link: POINTER TO Link _ traj.links; UNTIL link=NIL DO XFormArray[link.knots,matrix]; link _ link.link; ENDLOOP; END; cyclic => XFormArray[traj.knots,matrix]; ENDCASE; --captions and tokens don't do much except on translate caption => objtype.p0 _ XFormPt[objtype.p0,matrix]; token => objtype.p0 _ XFormPt[objtype.p0,matrix]; ENDCASE; END; XFormArray: PROCEDURE [array: DESCRIPTOR FOR ARRAY OF ObjPt,xform: XFMDescriptor] = BEGIN i: INTEGER; FOR i IN [0..LENGTH[array]) DO array[i] _ XFormPt[array[i],xform]; ENDLOOP; END; END. (847)