DIRECTORY CD, CDDefaults, CDVPrivate, CDVScale, Graphics, RuntimeError, TIPUser, ViewerClasses; CDVSomeCursors: CEDAR PROGRAM IMPORTS CDDefaults, CDVPrivate, CDVScale, Graphics, RuntimeError, TIPUser = BEGIN ViewerPos2: PROC [me: CDVPrivate.MyGraphicRef] RETURNS [CD.Position] = INLINE { RETURN [CDVScale.DesignToViewerPosition[me.scale, me.stopVC]]; }; ViewerPos1: PROC [me: CDVPrivate.MyGraphicRef] RETURNS [CD.Position] = INLINE { RETURN [CDVScale.DesignToViewerPosition[me.scale, me.startVC]]; }; SetModeInvertBlack: PROC[me: CDVPrivate.MyGraphicRef] = INLINE { Graphics.SetColor[me.viewerContext, Graphics.black]; [] _ Graphics.SetPaintMode[me.viewerContext, invert]; }; DefaultCursor: PUBLIC PROC[me: CDVPrivate.MyGraphicRef] = BEGIN p2: CD.Position~ViewerPos2[me]; CDVPrivate.InvertArea[me, p2.x-8, p2.y, p2.x+8, p2.y]; CDVPrivate.InvertArea[me, p2.x, p2.y-8, p2.x, p2.y+8]; END; ArrowCursor: PUBLIC PROC[me: CDVPrivate.MyGraphicRef] = BEGIN p1: CD.Position~ViewerPos1[me]; p2: CD.Position~ViewerPos2[me]; SetModeInvertBlack[me]; Graphics.SetCP[me.viewerContext, p1.x, p1.y]; Graphics.DrawTo[me.viewerContext, p2.x, p2.y]; END; RectCursor: PUBLIC PROC[me: CDVPrivate.MyGraphicRef] = BEGIN ENABLE RuntimeError.UNCAUGHT => { IF CDVPrivate.catchAnyWhichDeadlock THEN GOTO SomeError ELSE REJECT; }; p1: CD.Position~ViewerPos1[me]; p2: CD.Position~ViewerPos2[me]; CDVPrivate.InvertArea[me, p1.x, p1.y, p1.x, p2.y]; CDVPrivate.InvertArea[me, p1.x, p2.y, p2.x, p2.y]; CDVPrivate.InvertArea[me, p2.x, p2.y, p2.x, p1.y]; CDVPrivate.InvertArea[me, p2.x, p1.y, p1.x, p1.y]; EXITS SomeError => NULL; END; LCursor: PUBLIC PROC[me: CDVPrivate.MyGraphicRef] = BEGIN ENABLE RuntimeError.UNCAUGHT => { IF CDVPrivate.catchAnyWhichDeadlock THEN GOTO SomeError ELSE REJECT; }; yi, yo, xi, xo: INT; --i=inner, o=outer, if p1 considered center wireWidth: CD.Number = MAX[CDVScale.DesignToViewerScalar[me.scale, me.defaultWidthVC], 1]; p1: CD.Position = ViewerPos1[me]; p2: CD.Position = ViewerPos2[me]; IF me.firstHorizontalVC THEN { IF p2.x<=p1.x AND p2.x>=p1.x-wireWidth AND (p2.yp1.y+wireWidth) THEN { -- sorry, only vertical, p2.x ignored CDVPrivate.InvertArea[me, p1.x, p2.y, p1.x, p1.y]; CDVPrivate.InvertArea[me, p1.x, p1.y, p1.x+wireWidth, p1.y]; CDVPrivate.InvertArea[me, p1.x+wireWidth, p1.y, p1.x+wireWidth, p2.y]; CDVPrivate.InvertArea[me, p1.x+wireWidth, p2.y, p1.x, p2.y]; RETURN }; IF p2.x>=p1.x THEN {xi _ p2.x; xo _ xi+wireWidth} ELSE {xo _ p2.x; xi _ xo+wireWidth}; IF p2.yp1.y+wireWidth THEN { -- L shaped, up CDVPrivate.InvertArea[me, p1.x, p1.y, xo, p1.y]; CDVPrivate.InvertArea[me, xo, p1.y, xo, p2.y]; CDVPrivate.InvertArea[me, xo, p2.y, xi, p2.y]; CDVPrivate.InvertArea[me, xi, p2.y, xi, p1.y+wireWidth]; CDVPrivate.InvertArea[me, xi, p1.y+wireWidth, p1.x, p1.y+wireWidth]; CDVPrivate.InvertArea[me, p1.x, p1.y+wireWidth, p1.x, p1.y]; RETURN }; CDVPrivate.InvertArea[me, p1.x, p1.y, p2.x, p1.y]; CDVPrivate.InvertArea[me, p2.x, p1.y, p2.x, p1.y+wireWidth]; CDVPrivate.InvertArea[me, p2.x, p1.y+wireWidth, p1.x, p1.y+wireWidth]; CDVPrivate.InvertArea[me, p1.x, p1.y+wireWidth, p1.x, p1.y]; } ELSE -- NOT me.firstHorizontalVC -- { IF p2.y<=p1.y AND p2.y>=p1.y-wireWidth AND (p2.xp1.x+wireWidth) THEN { -- sorry, only horizontal, p2.y ignored CDVPrivate.InvertArea[me, p2.x, p1.y, p1.x, p1.y]; CDVPrivate.InvertArea[me, p1.x, p1.y, p1.x, p1.y+wireWidth]; CDVPrivate.InvertArea[me, p1.x, p1.y+wireWidth, p2.x, p1.y+wireWidth]; CDVPrivate.InvertArea[me, p2.x, p1.y+wireWidth, p2.x, p1.y]; RETURN }; IF p2.y>=p1.y THEN {yi _ p2.y; yo _ yi+wireWidth} ELSE {yo _ p2.y; yi _ yo+wireWidth}; IF p2.xp1.x+wireWidth THEN { -- L shaped, right CDVPrivate.InvertArea[me, p1.x, p1.y, p1.x, yo]; CDVPrivate.InvertArea[me, p1.x, yo, p2.x, yo]; CDVPrivate.InvertArea[me, p2.x, yo, p2.x, yi]; CDVPrivate.InvertArea[me, p2.x, yi, p1.x+wireWidth, yi]; CDVPrivate.InvertArea[me, p1.x+wireWidth, yi, p1.x+wireWidth, p1.y]; CDVPrivate.InvertArea[me, p1.x+wireWidth, p1.y, p1.x, p1.y]; RETURN }; -- only vertical CDVPrivate.InvertArea[me, p1.x, p1.y, p1.x, p2.y]; CDVPrivate.InvertArea[me, p1.x, p2.y, p1.x+wireWidth, p2.y]; CDVPrivate.InvertArea[me, p1.x+wireWidth, p2.y, p1.x+wireWidth, p1.y]; CDVPrivate.InvertArea[me, p1.x+wireWidth, p1.y, p1.x, p1.y]; }; EXITS SomeError => NULL; END; UseWireCursor: CDVPrivate.CursorModeProc = { l: CD.Level = CDDefaults.CurrentLevel[me.actualDesign]; w: CD.DesignNumber = CDDefaults.LevelWidth[me.actualDesign, l]; me.designRec.outlineProcLC _ IF w>0 THEN LCursor ELSE RectCursor; me.designRec.usedCursor _ $wire; }; UseRectCursor: CDVPrivate.CursorModeProc = { me.designRec.usedCursor _ mode; me.designRec.outlineProcLC _ RectCursor }; UseArrowCursor: CDVPrivate.CursorModeProc = { me.designRec.usedCursor _ mode; me.designRec.outlineProcLC _ ArrowCursor }; UseDefaultCursor: CDVPrivate.CursorModeProc = { me.designRec.usedCursor _ NIL; me.designRec.outlineProcLC _ DefaultCursor }; DoThePartialAdvance: CDVPrivate.CursorModeProc = { UseWireCursor[me, $wire]; IF me.designRec.firstHLC THEN me.designRec.startLC.x _ me.designRec.stopLC.x ELSE me.designRec.startLC.y _ me.designRec.stopLC.y; me.designRec.firstHLC _ NOT me.designRec.firstHLC; me.designRec.startLCValid _ TRUE; }; DoFlipCursor: CDVPrivate.CursorModeProc = { UseWireCursor[me, $wire]; me.designRec.firstHLC _ NOT me.designRec.firstHLC }; IsTheCursor: PROC [usedCursor: REF] RETURNS [yes: BOOL_FALSE] = INLINE BEGIN ENABLE RuntimeError.UNCAUGHT => {--must have not yet been initialized-- GOTO deny}; IF CDVPrivate.cursoredCDViewer#NIL THEN RETURN [NARROW[CDVPrivate.cursoredCDViewer.data, CDVPrivate.MyGraphicRef].designRec.usedCursor=usedCursor]; EXITS deny => RETURN [FALSE] END; IsWire: PROC RETURNS [BOOL] = {RETURN [IsTheCursor[$wire]]}; IsRect: PROC RETURNS [BOOL] = {RETURN [IsTheCursor[$rect]]}; IsArrow: PROC RETURNS [BOOL] = {RETURN [IsTheCursor[$arrow]]}; IsDefault: PROC RETURNS [BOOL] = {RETURN [IsTheCursor[NIL]]}; CDVPrivate.ImplementACursor[NIL, UseDefaultCursor]; --overwrites the default CDVPrivate.ImplementACursor[$wire, UseWireCursor]; CDVPrivate.ImplementACursor[$rect, UseRectCursor]; CDVPrivate.ImplementACursor[$arrow, UseArrowCursor]; CDVPrivate.ImplementACursor[$default, UseDefaultCursor]; CDVPrivate.ImplementACursor[$PartialWireAdvance, DoThePartialAdvance]; CDVPrivate.ImplementACursor[$FlipWire, DoFlipCursor]; TIPUser.RegisterTIPPredicate[key: $ChipndaleWireCursor, p: IsWire]; TIPUser.RegisterTIPPredicate[key: $ChipndaleRectCursor, p: IsRect]; TIPUser.RegisterTIPPredicate[key: $ChipndaleArrowCursor, p: IsArrow]; TIPUser.RegisterTIPPredicate[key: $ChipndaleDefaultCursor, p: IsDefault]; END. öCDVSomeCursors.mesa Copyright c 1983, 1984 by Xerox Corporation. All rights reserved. by Christian Jacobi August 5, 1983 11:07 am last edited by Christian Jacobi October 22, 1984 9:42:09 am PDT XCursor: PUBLIC PROC[me: CDVPrivate.MyGraphicRef] = BEGIN p2: CD.Position~ViewerPos2[me]; SetModeInvertBlack[me]; Graphics.SetCP[me.viewerContext, p2.x-8, p2.y-8]; Graphics.DrawTo[me.viewerContext, p2.x+8, p2.y+8]; Graphics.SetCP[me.viewerContext, p2.x+8, p2.y-8]; Graphics.DrawTo[me.viewerContext, p2.x-8, p2.y+8]; END; PlusCursor: PUBLIC PROC[me: CDVPrivate.MyGraphicRef] = BEGIN p2: CD.Position~ViewerPos2[me]; CDVPrivate.InvertArea[me, p2.x-3, p2.y, p2.x+3, p2.y]; CDVPrivate.InvertArea[me, p2.x, p2.y-3, p2.x, p2.y+3]; END; -- only horizontal ÊÚ˜šœ™Jšœ Ïmœ7™BJšœ.™.JšœA™A—J˜šÏk ˜ Jšžœ˜Jšœ ˜ Jšœ ˜ J˜ J˜ J˜ Jšœ˜Jšœ˜J˜—šÏnœžœž˜JšžœG˜N—Jšž˜J˜š Ÿ œžœžœžœ žœ˜OJšžœ8˜>J˜J˜—š Ÿ œžœžœžœ žœ˜OJšžœ9˜?J˜J˜—šŸœžœ žœ˜@J˜4J˜5Jšœ˜J˜—šŸœžœžœ ™4Jšž™Jšœžœ™Jšœ™J™1J™2J™1J™2Jšžœ™J™—šŸ œžœžœ ™7Jšž™Jšœžœ™Jšœ6™6Jšœ6™6Jšžœ™J™—šŸ œžœžœ ˜:Jšž˜Jšœžœ˜Jšœ6˜6Jšœ6˜6Jšžœ˜J˜—šŸ œžœžœ ˜8Jšž˜Jšœžœ˜Jšœžœ˜Jšœ˜J˜-J˜.Jšžœ˜J˜—šŸ œžœžœ ˜7Jšž˜šžœžœ˜!Jš žœ"žœžœ žœžœ˜DJ˜—Jšœžœ˜Jšœžœ˜Jšœ2˜2Jšœ2˜2Jšœ2˜2Jšœ2˜2šž˜Jšœ žœ˜—Jšžœ˜J˜—šŸœžœžœ ˜4Jšž˜šžœžœ˜!Jš žœ"žœžœ žœžœ˜DJ˜—JšœžœÏc+˜Ašœ žœ ˜Jšžœ@˜C—Jšœžœ˜!Jšœžœ˜!šžœžœ˜šžœ žœ˜&Jšžœ žœž %˜SJšœ2˜2Jšœ<˜Jš Ÿ œžœžœžœžœžœ˜=J˜Jšœžœ ˜LJšœ2˜2Jšœ2˜2Jšœ4˜4Jšœ8˜8JšœF˜FJšœ5˜5JšœC˜CJšœC˜CJšœE˜EJšœI˜IJšžœ˜J˜—…—'Ø