GriffinHitTestImpl: CEDAR PROGRAM IMPORTS Encoding EXPORTS GriffinHitTest ~ BEGIN GetObjectHandle: PUBLIC PROCEDURE [pt: PointDefs.ScrPt] RETURNS [ObjectHandle] = BEGIN new: ObjectHandle _ GetObjectHandleBetweenObjects[pt, NIL,NIL]; IF new#NIL THEN WITH type: new SELECT FROM selectToken => RETURN[type.selectedObj]; ENDCASE; RETURN[new]; END; GetObjectHandleBetweenObjects: PUBLIC PROCEDURE [pt: PointDefs.ScrPt, topObject,bottomObject: ObjectHandle] RETURNS [ObjectHandle] = BEGIN OPEN EncodingDefs; obj: REF Object; tol: INTEGER; IF topObject=NIL THEN topObject _ tailObject; IF bottomObject=NIL THEN bottomObject _ headObject; FOR obj _ topObject, obj.backLink UNTIL obj = bottomObject DO IF ~Visible[obj] THEN LOOP; IF NOT obj.validEncoding THEN WITH obj SELECT FROM object: REF Object[shape] => { EncodingDefs.DeleteChainEncoding[object.chainEncoding]; EncodingDefs.DeleteAreaEncoding[object.areaEncoding]; EncodeTrajectory[object,object.closed]; IF object.closed THEN EncodeArea[object]; }; ENDCASE => ERROR; IF pt[X]obj.br[X] OR pt[Y]obj.br[Y] THEN LOOP; WITH object: obj SELECT FROM shape => BEGIN tol _ MAX[1,ObjValToScrVal[object.style.width/2]]; IF TestTraj[pt,object.chainEncoding,tol] THEN RETURN[obj] ELSE IF obj.style.filled AND TestArea[pt,object.areaEncoding,tol] THEN RETURN[obj]; END; caption,token,menu, selectToken => RETURN[obj]; ENDCASE; ENDLOOP; RETURN[NIL]; END; TestTraj: PROCEDURE[pt: ScrPt, encoding: EncodingDefs.ChainHandle,tol: INTEGER] RETURNS[BOOLEAN]= BEGIN flag: BOOLEAN _ FALSE; SetFlag: PROCEDURE[found: PointDefs.ScrPt] RETURNS[stop: BOOLEAN] = BEGIN IF ABS[found[X]-pt[X]] > tol OR ABS[found[Y]-pt[Y]] > tol THEN RETURN[FALSE] ELSE {flag _ TRUE; RETURN[TRUE]}; END; UNTIL encoding=NIL DO IF NOT ((pt[X] encoding.br[X]+tol) OR (pt[Y] encoding.br[Y]+tol)) THEN EncodingDefs.TestChainChunk[encoding,SetFlag]; IF flag THEN RETURN[TRUE]; encoding _ encoding.link; ENDLOOP; RETURN[FALSE]; END; TestArea: PROCEDURE[pt: ScrPt, encoding: EncodingDefs.AreaHandle,tol: INTEGER] RETURNS[BOOLEAN]= BEGIN flag: BOOLEAN _ FALSE; SetFlag: PROCEDURE[y,lx,dx: INTEGER] RETURNS[stop: BOOLEAN] = BEGIN rx: INTEGER _ lx+dx+tol; lx _ lx-tol; IF pt[Y]=y AND pt[X] IN [lx..rx] THEN {flag _ TRUE; RETURN[TRUE] } ELSE RETURN[FALSE]; END; UNTIL encoding=NIL DO IF NOT ((pt[X] encoding.br[X]+tol) OR (pt[Y] encoding.br[Y]+tol)) THEN EncodingDefs.TestAreaChunk[encoding,SetFlag]; IF flag THEN RETURN[TRUE]; encoding _ encoding.link; ENDLOOP; RETURN[FALSE]; END; END. ΜGriffinHitTestImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Maureen Stone July 4, 1985 2:21:23 pm PDT hit test obj may be touched is now a possibility is now a possibility Κ…˜Icode˜šœ™Kšœ Οmœ1™—JšŸœŸœ˜JšœŸœ˜JšœŸœ˜ JšŸœ ŸœŸœ˜-JšŸœŸœŸœ˜3šŸœŸœŸ˜=JšŸœŸœŸœ˜š ŸœŸœŸœŸœŸœŸ˜2šœŸœ˜J˜7J˜5Jšœ'˜'JšŸœŸœ˜)J˜—JšŸœŸœ˜—Jš ŸœŸœŸœŸœŸœŸœ˜VJšœ™šŸœ ŸœŸ˜šœ Ÿ˜JšœŸœ)˜2JšŸœ&ŸœŸœ˜9Jš ŸœŸœŸœ%ŸœŸœ˜SJšŸœ˜—Jšœ#Ÿœ˜/JšŸœ˜—JšŸœ˜—JšŸœŸœ˜ JšŸœ˜J˜Jš  œŸ œ4ŸœŸœŸœ˜aJšŸ˜JšœŸœŸœ˜š  œŸ œŸœŸœŸ˜JJšŸœŸœŸœŸœŸœŸœŸœ˜LJšŸœ ŸœŸœŸœ˜!JšŸœ˜—šŸœ ŸœŸ˜šŸœŸœŸœ˜CJšŸœŸœ˜@——šœ™JšŸœ/˜3JšŸœŸœŸœŸœ˜J˜JšŸœ˜—JšŸœŸœ˜JšŸœ˜J˜Jš  œŸ œ3ŸœŸœŸœ˜`JšŸ˜JšœŸœŸœ˜š  œŸ œ ŸœŸœŸœŸ˜DJšœŸœ ˜J˜ JšŸœ ŸœŸœ Ÿœ ŸœŸœŸœ˜BJšŸœŸœŸœ˜JšŸœ˜—šŸœ ŸœŸ˜šŸœŸœŸœ˜CJšŸœŸœ˜@——šœ™JšŸœ.˜2JšŸœŸœŸœŸœ˜J˜JšŸœ˜—JšŸœŸœ˜JšŸœ˜J˜—K˜KšŸœ˜—…— j»