-- TJaMGraphicsViewer.mesa -- Last change by Bill Paxton, October 5, 1982 3:19 pm -- Last change by McGregor, June 15, 1982 10:05 am -- Last Edited by: Stone, March 28, 1983 4:21 pm DIRECTORY Graphics, GraphicsOps, CGVector, GL USING [ Start], Rope USING [Concat], InputFocus USING [CaptureButtons, ReleaseButtons], Real USING [RoundI], Spline USING [New], TIPUser USING [InstantiateNewTIPTable, TIPScreenCoords], Cursors USING [SetCursor], WindowManager USING [RestoreCursor], Menus USING [Menu, MenuProc, CreateEntry, CreateMenu, InsertMenuEntry], ViewerClasses USING [Viewer, ViewerClass, ViewerClassRec, NotifyProc], ViewerOps USING [DestroyViewer, RegisterViewerClass, CreateViewer], JaMTypeScript USING [GetTypeScript, NotifyBeforeDestroy, SetMouseProc, DoAtom, DoButton], JaMOps USING [SetAbort, defaultFrame, RegisterExplicit, PushReal, PopBoolean], TJaMGraphics, TJaMGraphicsInfo, TJaMGraphicsContexts, UserTerminal USING [BlinkDisplay]; TJaMGraphicsViewer: MONITOR LOCKS info USING info:TJaMGraphicsInfo.Info IMPORTS Graphics, Real, JaMTypeScript, TJaMGraphicsInfo, Rope, UserTerminal, InputFocus, TIPUser, Cursors, Menus, ViewerOps, WindowManager, Spline, JaMOps, GraphicsOps, TJaMGraphics, GL, TJaMGraphicsContexts EXPORTS TJaMGraphics, TJaMGraphicsInfo, TJaMGraphicsContexts = BEGIN OPEN TJaMGraphicsInfo, J: JaMOps, G: Graphics, E: GraphicsOps, Vector: CGVector, TJaMGraphics, TDC: TJaMGraphicsContexts; jamGraphicsClass: ViewerClasses.ViewerClass _ NEW[ViewerClasses.ViewerClassRec _ [ paint: TJaMGraphicsInfo.Paint, notify: InputNotify, destroy: AboutToDestroy, tipTable: TIPUser.InstantiateNewTIPTable["JaMGraphics.TIP"] ]]; JReloadTIP: PROC [frame: Frame] = { ReloadTIP[] }; ReloadTIP: PUBLIC PROC = { jamGraphicsClass.tipTable _ TIPUser.InstantiateNewTIPTable["JaMGraphics.TIP"] }; JGetViewer: PROC [frame: Frame] = { tool: ViewerClasses.Viewer _ JaMTypeScript.GetTypeScript[frame]; IF tool=NIL THEN RETURN; -- error [] _ Create[frame,tool]; }; InitGL: PROC RETURNS[Graphics.Context] = {RETURN[GL.Start[NIL]]}; Create: PUBLIC PROC [ frame: Frame, typescript: ViewerClasses.Viewer, iconic: BOOLEAN _ FALSE] RETURNS [viewer: ViewerClasses.Viewer] = { info: Info; menu: Menus.Menu; bmw,bmh: CARDINAL; { -- extra block to make info defined in scope of UNWIND ENABLE UNWIND => -- something went wrong while creating the viewer IF viewer#NIL THEN DestroyViewer[viewer] ELSE IF info#NIL THEN ForgetInfo[frame]; IF (info _ GetInfo[frame]) # NIL THEN RETURN; info _ CreateInfo[frame]; info.path _ G.NewPath[]; [bmw,bmh] _ GetBitmapSize[]; info.bitmap _ E.NewBitmap[bmw,bmh]; info.spline _ Spline.New[]; info.font _ E.DefaultFont[]; info.text _ NEW[TEXT[256]]; menu _ Menus.CreateMenu[]; Menus.InsertMenuEntry[menu, Menus.CreateEntry["Reset", Reset]]; Menus.InsertMenuEntry[menu, Menus.CreateEntry["Mouse", CaptureFocusButton]]; Menus.InsertMenuEntry[menu, Menus.CreateEntry["Interrupt", InterruptButton]]; viewer _ ViewerOps.CreateViewer[flavor: $JaMGraphics, info: [data: info, name: Rope.Concat[typescript.name,"Graphics "], menu: menu, iconic: iconic, scrollable: FALSE]]; info.viewer _ viewer; info.typescript _ typescript; info.vdc _ NIL; info.vinitdc _ NIL; info.venabled _ TRUE; TDC.AddContext[frame: frame, init: InitGL,name: $GList, enabled: FALSE, initOnErase: TRUE]; info.gl _ NIL; info.drawGL _ FALSE; JaMTypeScript.NotifyBeforeDestroy[typescript,JDestroyViewer]; }}; Reset: Menus.MenuProc = TRUSTED { viewer: ViewerClasses.Viewer _ NARROW[parent]; frame: Frame _ NARROW[viewer.data,Info].frame; InitDC[frame]; JErase[frame] }; CaptureFocusButton: Menus.MenuProc = TRUSTED { viewer: ViewerClasses.Viewer _ NARROW[parent]; info: Info _ NARROW[viewer.data]; frame: Frame _ info.frame; JCaptureButtons[frame] }; InterruptButton: Menus.MenuProc = TRUSTED { viewer: ViewerClasses.Viewer _ NARROW[parent]; info: Info _ NARROW[viewer.data]; frame: Frame _ info.frame; J.SetAbort[frame,TRUE]; SetPlace[info,0,0]; SetBug[info,0,0] }; JDestroyViewer: PROCEDURE [frame: Frame] = { -- returns true if already have a viewer for this frame info: Info _ GetInfo[frame]; IF info = NIL THEN RETURN; DestroyViewer[info.viewer]; }; DestroyViewer: PROC [viewer: ViewerClasses.Viewer] = { AboutToDestroy[viewer]; ViewerOps.DestroyViewer[viewer]; }; AboutToDestroy: SAFE PROC [self: ViewerClasses.Viewer] = TRUSTED { info: Info _ NARROW[self.data]; ForgetInfo[info.frame]; }; JCaptureButtons: PROCEDURE [frame: Frame] = { info: Info _ GetInfo[frame]; InputFocus.CaptureButtons[info.viewer.class.notify, info.viewer.tipTable, info.viewer]; info.capturedButtons _ TRUE; Cursors.SetCursor[textPointer] }; JReleaseButtons: PROCEDURE [frame: Frame] = { info: Info _ GetInfo[frame]; InputFocus.ReleaseButtons[]; WindowManager.RestoreCursor; info.capturedButtons _ FALSE }; InitDC: PROCEDURE [frame: Frame] = { info: Info _ GetInfo[frame]; IF info.venabled THEN info.vdc _ G.CopyContext[info.vinitdc]; FOR l: TDC.DCList _ info.dcList, l.next UNTIL l=NIL DO IF l.enabled THEN l.dc _ l.init[]; ENDLOOP; info.gl _ NIL; }; JErase: PROCEDURE [frame: Frame] = { info: Info _ GetInfo[frame]; paint: TDC.GProc ={ mark: G.Mark _ G.Save[dc]; G.SetColor[dc, G.white]; G.DrawBox[dc,G.GetBounds[dc]]; G.Restore[dc,mark]; }; Painter[paint,frame]; FOR l: TDC.DCList _ info.dcList, l.next UNTIL l=NIL DO IF l.initOnErase AND l.enabled THEN l.dc _ l.init[]; ENDLOOP; info.gl _ NIL; }; EnableViewer: PUBLIC PROC [frame: Frame] = { info: Info _ GetInfo[frame]; info.venabled _ TRUE; }; DisableViewer: PUBLIC PROC [frame: Frame] = { info: Info _ GetInfo[frame]; info.venabled _ FALSE; }; KeepGL: PUBLIC PROC [frame: Frame] = { info: Info _ GetInfo[frame]; b: BOOLEAN _ J.PopBoolean[frame.opstk]; FOR l: TDC.DCList _ info.dcList, l.next UNTIL l=NIL DO IF l.name=$GList THEN l.enabled _ b; ENDLOOP; IF b=FALSE THEN {info.drawGL _ FALSE; info.gl _ NIL}; }; DoRefresh: PUBLIC PROC [frame: Frame] = { info: Info _ GetInfo[frame]; b: BOOLEAN _ J.PopBoolean[frame.opstk]; IF b=TRUE THEN {FOR l: TDC.DCList _ info.dcList, l.next UNTIL l=NIL DO IF l.name=$GList THEN l.enabled _ b; --must have an active GList to use it for refresh ENDLOOP; } ELSE info.gl _ NIL; --destroy old list info.drawGL _ b; }; MouseToUser: PROCEDURE[frame: Frame, x,y:REAL] = { J.PushReal[frame.opstk,x]; J.PushReal[frame.opstk,y]; }; ViewerMouse: PUBLIC PROCEDURE[frame: Frame, click: BOOLEAN] RETURNS[x,y: INTEGER] = { rx, ry: REAL; [rx, ry] _ RealViewerMouse[frame, click]; x _ Real.RoundI[x]; y _ Real.RoundI[y] }; RealViewerMouse: PUBLIC PROCEDURE[frame: Frame, click: BOOLEAN] RETURNS[x,y: REAL] = { info: Info _ GetInfo[frame]; IF info=NIL THEN RETURN [0,0]; IF click THEN [x,y] _ GetBug[info] ELSE [x,y] _ GetPlace[info]; }; GetBug: ENTRY PROC [info: Info] RETURNS[x,y: REAL] = { OPEN info; ENABLE UNWIND => NULL; bugflag _ FALSE; UNTIL viewer.destroyed OR bugflag DO WAIT bugged ENDLOOP; IF viewer.destroyed THEN x _ y _ 0 ELSE { x _ bugX; y _ bugY; bugflag _ FALSE }; }; SetBug: PUBLIC ENTRY PROC [info: Info, x,y: REAL] = { OPEN info; ENABLE UNWIND => NULL; bugflag _ TRUE; bugX _ x; bugY _ y; NOTIFY bugged }; GetPlace: ENTRY PROC [info: Info] RETURNS[x,y: REAL] = { OPEN info; ENABLE UNWIND => NULL; mouseflag _ FALSE; UNTIL viewer.destroyed OR mouseflag DO WAIT mouse ENDLOOP; IF viewer.destroyed THEN x _ y _ 0 ELSE { x _ mouseX; y _ mouseY; mouseflag _ FALSE }; }; SetPlace: PUBLIC ENTRY PROC [info: Info, x,y: REAL] = { OPEN info; ENABLE UNWIND => NULL; mouseflag _ TRUE; mouseX _ x; mouseY _ y; NOTIFY mouse; }; --[self: ViewerClasses.Viewer, input: LIST OF REF ANY] InputNotify: PUBLIC ViewerClasses.NotifyProc = TRUSTED { Do: PROC [button: ATOM] = { JaMTypeScript.DoButton[NARROW[self.data,Info].typescript,button,x,y] }; ReleaseButtons: PROC = { info: Info _ NARROW[self.data]; IF ~info.capturedButtons THEN RETURN; InputFocus.ReleaseButtons[]; info.capturedButtons _ FALSE }; AdjustCoords: PROC = { info: Info _ NARROW[self.data]; IF ~info.capturedButtons THEN -- get screen coordinates [x, y] _ Graphics.UserToWorld[info.vinitdc, mx, my] ELSE { x _ mx; y _ my }; -- already in screen coordinates [x, y] _ Graphics.WorldToUser[info.vdc, x, y]; -- convert using current dc }; mx, my: INTEGER; x, y: REAL; Place: PROC = { SetPlace[NARROW[self.data,Info],x,y] }; FOR l: LIST OF REF ANY _ input, l.rest UNTIL l = NIL DO WITH l.first SELECT FROM z: ATOM => SELECT z FROM $RedDown, $CtrlRedDown, $ShiftRedDown, $CtrlShiftRedDown => { SetBug[NARROW[self.data,Info],x,y]; Place[]; Do[z] }; $YellowDown, $CtrlYellowDown, $ShiftYellowDown, $CtrlShiftYellowDown, $BlueDown, $CtrlBlueDown, $ShiftBlueDown, $CtrlShiftBlueDown, $Track, $CtrlTrack, $ShiftTrack, $CtrlShiftTrack => Do[z]; $RedUp, $CtrlRedUp, $ShiftRedUp, $CtrlShiftRedUp, $YellowUp, $CtrlYellowUp, $ShiftYellowUp, $CtrlShiftYellowUp, $BlueUp, $CtrlBlueUp, $ShiftBlueUp, $CtrlShiftBlueUp => { Do[z]; ReleaseButtons[] }; $Place => Place[]; ENDCASE => JaMTypeScript.DoAtom[NARROW[self.data,Info].typescript,z]; z: TIPUser.TIPScreenCoords => { [mx, ----, my] _ z^; AdjustCoords[] }; ENDCASE => UserTerminal.BlinkDisplay; ENDLOOP; }; Init: PROC = { frame: Frame _ J.defaultFrame; [] _ JaMTypeScript.SetMouseProc[MouseToUser]; ViewerOps.RegisterViewerClass[$JaMGraphics, jamGraphicsClass]; J.RegisterExplicit[frame,".erase"L,JErase]; J.RegisterExplicit[frame,".initdc"L,InitDC]; J.RegisterExplicit[frame,".destroyviewer"L,JDestroyViewer]; J.RegisterExplicit[frame,".getviewer"L,JGetViewer]; J.RegisterExplicit[frame,".capturebuttons"L,JCaptureButtons]; J.RegisterExplicit[frame,".releasebuttons"L,JReleaseButtons]; J.RegisterExplicit[frame,".reloadTIP"L,JReloadTIP]; J.RegisterExplicit[frame,".enableviewer"L,EnableViewer]; J.RegisterExplicit[frame,".disableviewer"L,DisableViewer]; J.RegisterExplicit[frame,".keepgl"L,KeepGL]; J.RegisterExplicit[frame,".dorefresh"L,DoRefresh]; }; Init; END... สค– "Mesa" style˜Iprocšฐฯcกœœฯk œ,žœžœžœžœ*žœžœžœ6žœžœžœMžœ@žœEžœPžœŽžœ(žœžœžœžœฒžœžœ:žœžœžœ žœ žœ1žœIžœตฯn œžœ$Ÿ œžœžœXŸ œžœYžœžœžœžœ œ"ŸœžœžœžœžœžœŸœžœžœ=žœžœžœQžœ7œžœžœ2œžœžœžœžœžœžœžœžœžœžœžœ,žœ;žœAžœžœžœฌžœIžœžœžœžœ<žœžœžœžœažœ$žœžœbžœ$žœžœkžœ$žœžœ.žœžœ0Ÿœž œ8œ!žœžœžœžœ&Ÿ œžœgŸœžœžœ žœžœ-Ÿœž œฆžœ'Ÿœž œŠžœŸœž œ5žœžœ žœžœžœžœžœžœžœ žœžœžœŸœž œ:žœžœžœ žœžœ žœ žœžœ0žœžœžœžœžœžœžœ žœžœ žœŸ œžœžœCžœŸ œžœžœCžœะbnœžœžœ6žœžœžœžœžœžœžœžœžœžœžœžœžœžœ žœ Ÿ œžœžœ6žœžœžœžœžœžœžœžœžœžœžœžœ2œžœžœ žœœŸ œž œžœžœžœ Ÿ œžœž œžœžœžœžœ[Ÿœžœž œžœžœžœ'žœžœžœžœ žœžœžœŸœžœžœžœžœžœ žœžœžœžœžœžœ žœžœžœžœžœ žœ!žœ Ÿœžœžœžœžœžœ žœžœžœžœžœ Ÿœžœžœžœžœžœ žœžœžœžœžœžœ žœžœžœžœžœ žœ'žœ Ÿœžœžœžœžœžœ žœžœžœžœžœะci7œ žœžœŸœžœ žœ!žœ-Ÿœžœžœžœžœžœ;žœŸ œžœžœžœžœœ7žœ!œ0œžœ žœŸœžœžœžœžœžœžœžœžœžœžœžœ žœžœ žœžœžœKžœีžœžœKœ$žœ#žœŸœžœžœ‚žœ-žœ.žœ=žœ5žœ?žœ?žœ5žœ:žœ<žœ.žœ=žœ˜ฆP—…—((-า