CDVPrivate.mesa (Viewer definitions for ChipNDale)
Copyright © 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
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
-- Non public ChipNDale interface defining viewer handling.
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];
--can be called to assign debugging procedures
--proc is called from critical places; any IO can wedge the machine
ShallContinue:
PROC [ref:
REF←
NIL, wedge:
BOOL←
FALSE, msg: Rope.
ROPE←
NIL]
RETURNS [
BOOL];
--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
VRef: TYPE = REF VRec; -- for NEW use only New
VRec:
TYPE =
RECORD [
viewer: ViewerClasses.Viewer ← NIL,
-----------
--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)
pBBptr: PrincOps.BBptr ← NIL, -- used for painting exclusively
xBBptr: PrincOps.BBptr ← NIL, -- used for all other purposes
frame: Terminal.FrameBuffer,
--speedups for frame^
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,
--further drawings
painterList: PainterList ← NIL,
--cursor tracking information (Visible Cursors)
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
];
--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.
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;
--xx list xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
allVRefs:
READONLY
LIST
OF VRef;
--New and Destroy are the only methods to modify allVRefs
New: PRIVATE PROC [design: CD.Design] RETURNS [VRef];
Destroy: PRIVATE PROC [VRef];
--xx Drawing xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
CreateDrawInformation:
PRIVATE PROC [me: VRef];
--callable from within viewer paintproc only
RepaintRectAreaInViewer:
PRIVATE PROC[me: VRef, rect:
CD.Rect, eraseFirst:
BOOL];
--monitored by: called from "viewer" loop only
--(re)draws everything
--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
--Cursor's
OutLineProc:
TYPE =
PROC[me: VRef];
--type of cursoring procedure
DefaultOutLine: OutLineProc;
ImplementACursor:
PROC[mode:
ATOM, proc: CursorModeProc];
--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)
CursorModeProc: TYPE = PROC[me: VRef, mode: REF];
SetCursorMode:
PRIVATE PROC[me: VRef, mode:
REF];
--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
cursoredCDViewer:
READONLY ViewerClasses.Viewer;
--viewer which has the ChipNDale cursor
--(it does not need to have the input focus)
InvertArea:
PROC[me: VRef, x1, y1, x2, y2:
INT];
--x1, y1, x2, y2 in viewers coordinates;
--handy procedure for several cursor implementors
--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
CreateViewer:
PROC [design:
CD.Design]
RETURNS [ViewerClasses.Viewer];
--the data field has type VRef
LastViewer: PROC[] RETURNS [ViewerClasses.Viewer];
CheckPriority: CD.CheckPriorityProc;
DoInsideMonitor:
PRIVATE PROC [proc:
PROC [VRef], vRef: VRef];
--the monitor protecting the bit-blit data
END.