-- Compiler ObjectXForms -- Stone May 2, 1981 1:09 PM -- Last Edited by: Stone, January 28, 1983 6:43 pm DIRECTORY ObjectDefs: FROM "ObjectDefs", PointDefs: FROM "PointDefs", EncodingDefs: FROM "EncodingDefs", MenuDefs: FROM "MenuDefs", XFormDefs: FROM "XFormDefs", GriffinMemoryDefs USING [CZone]; ObjectXForms: PROGRAM IMPORTS ObjectDefs,XFormDefs,PointDefs,MenuDefs, GriffinMemoryDefs EXPORTS ObjectDefs = BEGIN OPEN ObjectDefs,XFormDefs,GriffinMemoryDefs,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 transmatrix: XFMDescriptor _ CZone.NEW[XFormMatrix]; 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: EncodingDefs.ChainHandle; aptr: EncodingDefs.AreaHandle; 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: REF 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: PointDefs.ObjPtSequence,xform: XFMDescriptor] = BEGIN i: INTEGER; FOR i IN [0..array.length) DO array[i] _ XFormPt[array[i],xform]; ENDLOOP; END; END.