DIRECTORY CD, CDDrawQueue USING [DrawQueue], CDBasics USING [empty], CDColors, CDVScale USING [ScaleRec], ViewerClasses USING [Viewer], Imager USING [Context], PrincOps USING [BBptr], Rope USING [ROPE], Terminal USING [FrameBuffer]; CDVPrivate: CEDAR DEFINITIONS = BEGIN notSupportedColorMode: ERROR; --catched by viewer paintproc DebugProc: TYPE = PROC [ref: REF_NIL, wedge: BOOL_FALSE, msg: Rope.ROPE_NIL] RETURNS [BOOL_FALSE]; UseDebug: PROC [proc: DebugProc]; ShallContinue: PROC [ref: REF_NIL, wedge: BOOL_FALSE, msg: Rope.ROPE_NIL] RETURNS [BOOL]; VRef: TYPE = REF VRec; -- for NEW use only New VRec: TYPE = RECORD [ viewer: ViewerClasses.Viewer _ NIL, pBBptr: PrincOps.BBptr _ NIL, -- used for painting exclusively xBBptr: PrincOps.BBptr _ NIL, -- used for all other purposes frame: Terminal.FrameBuffer, screen: LONG POINTER _ NIL, bpp: CARDINAL _ 1, -- bits per pixel (1, 4, 8) logbpp: CARDINAL _ 0, display: CDColors.DisplayType _ bw, scWidthWords: CARDINAL _ 0, -- Screen width in words vx: CARDINAL _ 0, --distance from left of screen to left most pixel vy: CARDINAL _ 0, --distance from top of screen to bottom most pixel vh: CARDINAL _ 0, --copied from viewer, to avoid race conditions vw: CARDINAL _ 0, --copied from viewer, to avoid race conditions dClip: CD.Rect _ CDBasics.empty, -- no point outside is visible on viewer scale: CDVScale.ScaleRec, personalColors: REF CDColors.ColorDefinition, colorTable: REF CDColors.ColorTable, --switch between fore- and back- ground viewContext: Imager.Context _ NIL, ct: CDDrawQueue.DrawQueue _ NIL, deviceDrawRef: CD.DrawRef _ NIL, actualDesign: CD.Design _ NIL, stoprequest: REF BOOL, check: BOOL _ FALSE, hurryUp: BOOL _ FALSE, slowDown: BOOL _ FALSE, running: BOOL _ FALSE, environment: BOOL _ TRUE, symbolics: BOOL _ TRUE, specialFonts: BOOL _ FALSE, borders: BOOL _ FALSE, checkPriority: BOOL _ TRUE, b4: BOOL _ TRUE, b5: BOOL _ TRUE, suppressFactorForCells: REAL _ 1.0, contextFilter: REF CD.ContextFilter, painterList: PainterList _ NIL, usedCursor: OutLineProc, startVC, stopVC: CD.Position _ [0, 0], onVC: BOOL _ FALSE, cursorInhibitations: CARDINAL _ 0, -- MONITORED firstHorizontalVC: BOOL _ TRUE, defaultWidthVC: CD.Number _ 0, -- width of cursored wire intendedScale: CDVScale.ScaleRec, designRec: REF VPrivatePerDesign, --never assign nil properties: CD.PropRef _ --registration is expected ]; VPrivatePerDesign: TYPE = RECORD [ startLCValid: BOOL _ FALSE, -- Logical Cursors startLC: CD.Position _ [0,0], stopLC: CD.Position _ [0,0], firstHLC: BOOL _ FALSE, widthLC: CD.Number _ 0, currentLayer: CD.Layer, usedCursor: REF _ NIL, --key designating outlineProcLC outlineProcLC: OutLineProc, --if a new cursor is used, this one will be used; never assign nil xMode: BOOL _ FALSE, -- usefull for wiring-, pendingdelete-modes..., but only 1 mode per tip table mark: CD.Position _ [0, 0] -- reserved for usage as logical mark, independent of visibility ]; IncludeAPainterRec: PROC [me: VRef, pr: REF PainterRec]; RemoveAPainterRec: PROC [me: VRef, pr: REF PainterRec]; PainterRec: TYPE = RECORD [ rect: CD.Rect _ CDBasics.empty, proc: PainterProc _ NIL, -- the painterproc data: REF _ NIL ]; PainterProc: TYPE = PROC [me: VRef, paintRef: REF PainterRec, interrestRect: CD.Rect]; PainterList: TYPE = LIST OF REF PainterRec; allVRefs: READONLY LIST OF VRef; New: PRIVATE PROC [design: CD.Design] RETURNS [VRef]; Destroy: PRIVATE PROC [VRef]; CreateDrawInformation: PRIVATE PROC [me: VRef]; RepaintRectAreaInViewer: PRIVATE PROC[me: VRef, rect: CD.Rect, eraseFirst: BOOL]; OutLineProc: TYPE = PROC[me: VRef]; --type of cursoring procedure DefaultOutLine: OutLineProc; ImplementACursor: PROC[mode: ATOM, proc: CursorModeProc]; CursorModeProc: TYPE = PROC[me: VRef, mode: REF]; SetCursorMode: PRIVATE PROC[me: VRef, mode: REF]; cursoredCDViewer: READONLY ViewerClasses.Viewer; InvertArea: PROC[me: VRef, x1, y1, x2, y2: INT]; --xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx CreateViewer: PROC [design: CD.Design] RETURNS [ViewerClasses.Viewer]; LastViewer: PROC[] RETURNS [ViewerClasses.Viewer]; CheckPriority: CD.CheckPriorityProc; DoInsideMonitor: PRIVATE PROC [proc: PROC [VRef], vRef: VRef]; END. ΈCDVPrivate.mesa (Viewer definitions for ChipNDale) Copyright c 1983, 1986 by Xerox Corporation. All rights reserved. by Christian Jacobi, July 15, 1983 11:16 am last edited by Christian Jacobi, March 20, 1986 4:20:35 pm PST -- Non public ChipNDale interface defining viewer handling. --can be called to assign debugging procedures --proc is called from critical places; any IO can wedge the machine --on errors in critical places, use --! RuntimeError.UNCAUGHT => IF ShallContinue[...] THEN CONTINUE --in addition to catching UNWIND --deadlock: TRUE in places which would deadlock if CONTINUE isn't called --xx Data xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ----------- --all the data for bit-blit must be used inside the monitor --which sets these values up. Soo bitblit is consistent. -- (or proper catch-phrases must be used) --speedups for frame^ ----------- --further drawings --cursor tracking information (Visible Cursors) --PainterList's xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -- a viewer record has a list of PainterRec's, a record with a rectangle and a procedure. -- Whenever a rectangle is (re)drawn, all intersecting PainterRec's will be applied. Its -- interrestRect will be set to the intersection of the registered rect and some clip boundary. -- -- This allows to independently implement drawing further area dependent features. -- The PainterRec's proc will be called inside the "viewer main loop" only. --xx list xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --New and Destroy are the only methods to modify allVRefs --xx Drawing xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --callable from within viewer paintproc only --monitored by: called from "viewer" loop only --(re)draws everything --xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --Cursor's --Registers a proc to be called from the tip table (Supposed the tip Notify proc --calls SetCursorMode; hopefully implemented!, but not by this interface) --Most proc's are used only to install the procedure to be used for subsequent cursoring -- (they set the viewers (VPrivatePerDesign) fields usedCursor and outlineProcLC) --To be called by the viewers Notify proc only; its call should be caused by --a tip table entry. --The registered (ImplementACursor) CursorModeProc will be called; --and typically installs the procedure to be used for subsequent cursoring --viewer which has the ChipNDale cursor --(it does not need to have the input focus) --x1, y1, x2, y2 in viewers coordinates; --handy procedure for several cursor implementors --the data field has type VRef --the monitor protecting the bit-blit data ΚŠ˜codešœ9™9Kšœ Οmœ7™BKšœ,™,Kšœ>™>K˜—šΟk ˜ Kšžœ˜Kšœ žœ ˜Kšœ žœ ˜Kšœ ˜ Kšœ žœ ˜Kšœžœ ˜Kšœžœ ˜Kšœ žœ ˜Kšœ˜Kšœ žœ˜—K˜KšΠln œžœž œ˜Kšž˜K˜Kšœ>™>KšœžœΟc˜;K˜Kšœ žœžœžœžœ žœžœ žœžœžœžœžœ˜bK˜šΟnœžœ˜"K™/KšœD™DK˜—š‘ œžœžœžœ žœžœ žœžœžœžœ˜YK™$Kšœ@™@K™ KšœH™H—K™KšœL™LK˜Kšœžœžœ  ˜0šœžœžœ˜Kšœžœ˜#Kšœ ™ K™Kšœžœ ˜<šœ˜Kšœ™Kšœžœžœžœ˜Kšœžœ ˜0Kšœžœ˜K˜#Kšœžœ ˜4—Kšœžœ 1˜CKšœžœ 2˜DKšœžœ .˜@Kšœžœ .˜@Kšœžœ (˜IKšœ˜Kšœ ™ Kšœžœ˜-Kšœ žœ '˜LKšœžœ˜#Kšœžœ˜ Kšœžœ žœ˜ Kšœžœ žœ˜Kšœ žœžœ˜Kšœžœžœ˜Kšœ žœžœ˜Kšœ žœžœ˜Kšœ žœžœ˜Kšœ žœžœ˜Kšœ žœžœ˜Kšœžœžœ˜Kšœ žœžœ˜Kšœžœžœ˜Kšœžœžœ˜Kšœžœžœ˜Kšœžœ˜#Kšœžœžœ˜$K™Kšœ™Kšœžœ˜K™Kšœ0™0K˜Kšœžœ˜&Kšœžœžœ˜Kšœž œ  ˜/Kšœžœžœ˜Kšœžœ  ˜8K™Kšœ!˜!Kšœ žœ ˜4Kšœ žœ  ˜3K˜K˜—šœžœžœ˜"Kšœžœžœ ˜0Kšœ žœ˜Kšœžœ˜Kšœ žœžœ˜Kšœ žœ ˜Kšœžœ˜Kšœ žœžœ ˜6Kšœ B˜^Kšœžœžœ M˜bKšœžœ @˜[K˜K˜—KšœR™RK™KšœY™YKšœY™YKšœ_™_Kšœ™KšœR™RšœK™KK˜—Kš‘œžœžœ ˜8Kš‘œžœžœ ˜7K˜šœ žœžœ˜Kšœžœ˜Kšœžœ ˜,Kšœžœž˜K˜—Kš œ žœžœžœžœ˜VKš œ žœžœžœžœ ˜+K˜K˜KšœL™LK˜šœ žœžœžœ˜"Kšœ9™9—K˜Kš‘œž œ žœ žœ˜5Kš‘œž œ˜K˜KšœO™OK˜š‘œž œ ˜/Kšœ,™,—K˜š‘œž œžœžœ˜QKšœ.™.Kšœ™—K˜K˜KšœD™DKšœ ™ K˜šœ žœžœ ˜$Kš ˜—KšΟbœ˜K˜š‘œžœžœ˜9KšœQ™QKšœI™IKšœO  ™XKšœR™R—˜Kšœžœžœžœ˜1K˜š‘ œž œžœ˜1KšœM™MKšœ™KšœB™BKšœA  ™JK™—K™—šœžœ˜0Kšœ)™)Kšœ.™.—K˜š‘ œžœžœ˜0Kšœ)™)Kšœ1™1K˜—KšœD˜DK˜š‘ œžœ žœ žœ˜FKšœ™—K˜Kš‘ œžœžœ˜2K˜Kš’ œžœ˜%K˜š‘œž œžœ˜>K™*—K˜Kšžœ˜K˜K˜K˜—…—Š"Μ