-- ALEOps.mesa -- Edited by Sweet, January 26, 1981 1:28 PM DIRECTORY AltoDisplay, String, Table, Window, WindowFont; ALEOps: DEFINITIONS = BEGIN -- copied symbol table stuff Password: CARDINAL = 8201; nTables: CARDINAL = 7; HVLength: PRIVATE CARDINAL = 71; HVIndex: TYPE = CARDINAL [0..HVLength); HTRecord: TYPE = RECORD [ anyInternal, anyPublic: BOOLEAN, link: HTIndex, ssIndex: CARDINAL]; HTIndex: TYPE = CARDINAL [0..Table.Limit/2); HTNull: HTIndex = FIRST[HTIndex]; htType: Table.Selector = 2; ssType: Table.Selector = 3; -- points, lines, etc. FontSize: TYPE = {small, large}; LabelMode: TYPE = {portrait, landscape}; Label: TYPE = RECORD [ free: BOOLEAN ← FALSE, selected: BOOLEAN ← TRUE, font: FontSize ← small, hti: HTIndex, mode: LabelMode ← portrait, thread: LBIndex ← LBNull, selNext: LBIndex ← LBNull, pos: APosition]; LBIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO Label; LBHandle: TYPE = POINTER TO Label; LBNull: LBIndex = LAST[LBIndex]; lbType: Table.Selector = 4; ALEHeader: TYPE = RECORD [ --rework asap diagLines: LTIndex ← LTNull, labels: LBIndex ← LBNull, freePoint: PTIndex ← PTNull, freeLine: LTIndex ← LTNull, freeLabel: LBIndex ← LBNull, selectedLines: LTIndex ← LTNull, selectedPoints, nextSelPoint: PTIndex ← PTNull, selectedLabels: LBIndex ← LBNull]; State: TYPE = RECORD [ displayTicks: BOOLEAN, showingLabels: BOOLEAN, grain: [0..4], magnify: [-3..4], minMagnify: [-3..4], currentWidth: LineWidth, currentTexture: LineTexture, currentLabelMode: LabelMode, currentFont: FontSize, sixteenthsPerFoot: [1..16], blowup: [1..4]]; Coordinate: TYPE = AltoDisplay.Coordinate; ADistance: TYPE = LONG INTEGER; APosition: TYPE = RECORD [x,y: ADistance]; RPosition: TYPE = RECORD [x,y: ADistance]; ABox: TYPE = RECORD [x1, x2, y1, y2: ADistance]; inch: ADistance = 16; Point: TYPE = RECORD [ free, selected: BOOLEAN ← FALSE, lines: LTIndex ← LTNull, thread: PTIndex ← PTNull, selNext: PTIndex ← PTNull, pos: APosition]; PTIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO Point; PTHandle: TYPE = POINTER TO Point; PTNull: PTIndex = LAST[PTIndex]; ptType: Table.Selector = 0; ltType: Table.Selector = 1; LineColor: TYPE = {white, grey, black}; GreyColor: ARRAY LineColor OF Window.GreyArray = [ [0, 0, 0, 0], [125252B,52525B,125252B, 52525B], [177777B, 177777B, 177777B, 177777B]]; LineWidth: TYPE = [1..4]; LineTexture: TYPE = {d2, d4, d6, solid}; LineClass: TYPE = {horiz, shallow, steep, vert}; Line: TYPE = RECORD [ free: BOOLEAN ← FALSE, selected: BOOLEAN ← TRUE, p1: PTIndex, width: LineWidth, p2: PTIndex, texture: LineTexture, p1Chain: LTIndex, class: LineClass, p2Chain: LTIndex, thread: LTIndex ← LTNull, selNext: LTIndex ← LTNull]; LTIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO Line; LTHandle: TYPE = POINTER TO Line; LTNull: LTIndex = LAST[LTIndex]; FreeNode: TYPE = RECORD [ free: BOOLEAN ← TRUE, fill: [0..1] ← NULL, next: Table.Base RELATIVE POINTER [0..Table.Limit)]; -- TO UNSPECIFIED FNIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO FreeNode; FNNull: FNIndex = LAST[FNIndex]; Bounds: TYPE = RECORD [min, max: ADistance]; HorizRec: TYPE = RECORD [ maxW: LineWidth ← 1, lines: LTIndex ← LTNull, points: PTIndex ← PTNull, l, p: Bounds ← [min: LAST[ADistance], max: 0], y: ADistance]; hrType: Table.Selector = 5; VertRec: TYPE = RECORD [ maxW: LineWidth ← 1, lines: LTIndex ← LTNull, l: Bounds ← [min: LAST[ADistance], max: 0], x: ADistance]; vrType: Table.Selector = 6; RedrawObject: TYPE = RECORD [ next: Redraw, var: SELECT tag: * FROM label => [font: FontSize, mode: LabelMode, hti: HTIndex, pos: APosition], line => [width: LineWidth, texture: LineTexture, pos1, pos2: APosition], ENDCASE]; Redraw: TYPE = POINTER TO RedrawObject; PointScan: TYPE = PROCEDURE [p: PTIndex, pth: PTHandle] RETURNS [stop: BOOLEAN]; LineScan: TYPE = PROCEDURE [l: LTIndex, lth: LTHandle] RETURNS [stop: BOOLEAN]; LabelScan: TYPE = PROCEDURE [lb: LBIndex, lbh: LBHandle] RETURNS [stop: BOOLEAN]; CursorShape: TYPE = {point, source, dest, select, origin, upper, lower, selPt}; PaddleRec: TYPE = MACHINE DEPENDENT RECORD [ alpha(0): BOOLEAN, beta(1): BOOLEAN, move(2): BOOLEAN, draw(3): BOOLEAN, adj(4): BOOLEAN]; MouseState: TYPE = {clear, red, yellow, blue, upper, lower, sourceN, sourceE, sourceS, sourceW, destN, destE, destS, destW}; TrackMode: TYPE = {fast, slow, inch, fine}; SelectionMode: TYPE = {new, add, sub, box}; MaxX: INTEGER = AltoDisplay.MaxBitsPerLine; MaxY: INTEGER = AltoDisplay.MaxScanLines; FeedbackBox: Window.Box = [[x: 0, y: 0], [w: 576, h: 32]]; FrameBox: Window.Box = [[x: 0, y: 32], [w: 576, h: 736]]; PictureBox: Window.Box = [[x: 0, y: 0], [w: 20000, h: 20000]]; originBox: Window.Box = [[x: -5, y: -5], [w: 11, h: 11]]; sourceBox: Window.Box = [[x: 0, y: 0], [w: 8, h: 9]]; destBox: Window.Box = [[x: 0, y: 0], [w: 8, h: 9]]; upperBox, lowerBox: Window.Box = [[0,0], [8,8]]; Opcode: TYPE = { drawSource, drawDest, drawOrigin, undrawSource, undrawDest, setGrain, setMinMagnify, showTicks, draw, drawRect, move, copy, delete, undelete, zoomIn, zoomOut, setOrigin, sourceToClose, destToClose, newSelection, addSelection, subSelection, boxSelection, readIn, writeOut, pressOut, collectLabel, slide, mergeIn, reset, repaint, drawUpper, drawLower, undrawUpper, undrawLower, redrawSelections, xlateAndRotate, dimensionSelection, jamOut}; Operation: TYPE = RECORD [ SELECT op: Opcode FROM drawUpper, drawLower, drawSource, drawDest, drawOrigin => [place: Window.Place], delete, undelete, zoomOut, undrawSource, undrawDest, showTicks, reset, undrawUpper, undrawLower, repaint, redrawSelections => [], setOrigin, slide => [pos: APosition], move, copy => [delta: APosition], zoomIn => [p1, p2: APosition], sourceToClose, destToClose => [pos: APosition], newSelection, addSelection, subSelection => [pos: APosition], draw, drawRect => [from, to: APosition], boxSelection => [pos1, pos2: APosition], xlateAndRotate => [source, dest: APosition], dimensionSelection => [pos: APosition, feet: BOOLEAN], setGrain, setMinMagnify => [val: CARDINAL], collectLabel => [c: CHARACTER, pos: APosition], readIn, writeOut, mergeIn, pressOut, jamOut => [file: STRING], ENDCASE]; state: State; Short: PROC [ADistance] RETURNS [INTEGER]; MulDiv: PROC [a, b, c: LONG INTEGER] RETURNS [LONG INTEGER]; Hypot: PROC [a, b: LONG INTEGER] RETURNS [LONG INTEGER]; GiveBackKeys: PUBLIC PROC; Confirm: PROC RETURNS [BOOLEAN]; Cursors: ARRAY CursorShape OF AltoDisplay.CursorBits; Relative: PROC [aPos: APosition] RETURNS [RPosition]; Absolute: PROC [rPos: RPosition] RETURNS [APosition]; PicturePlace: PROC [aPos: APosition] RETURNS [Window.Place]; APosForPlace: PROC [place: Window.Place] RETURNS [APosition]; ADistanceForDots: PROC [dots: INTEGER, mag: [-3..4] ← state.magnify] RETURNS [ADistance]; DotsForADistance: PROC [dist: ADistance, mag: [-3..4] ← state.magnify] RETURNS [INTEGER]; ARoundToInch: PROC [aPos: APosition] RETURNS [APosition]; GetOriginPos: PROC [BOOLEAN] RETURNS [APosition]; ASetOriginPos: PROC [APosition]; GetSourcePos: PROC [BOOLEAN] RETURNS [RPosition]; ASetSourcePos: PROC [APosition]; GetDestPos: PROC [BOOLEAN] RETURNS [RPosition]; ASetDestPos: PROC [APosition]; GetCmd: PROC RETURNS [cmd: Operation]; cornerPos: APosition; StartMouseHandler: PROC; StartDisplay: PROC; BitmapBox: Window.Box; feedbackWindow, frameWindow, pictureWindow: Window.Handle; originWindow, sourceWindow, destWindow, upperWindow, lowerWindow: Window.Handle; originValueBox, sourceValueBox, destValueBox, textBox: Window.Box; Disjoint: PROC [b1, b2: POINTER TO Window.Box] RETURNS [BOOLEAN]; ZoomDetail: PROC [pos1, pos2: APosition]; ZoomGlobal: PROC; DisplayBoxTicks: PUBLIC PROC [on: BOOLEAN]; SlideCorner: PROC [pos: APosition]; MarksIn: PROC; MarksOut: PROC; smallFontAscent: INTEGER; largeFontAscent: INTEGER; smallFont, largeFont: WindowFont.Handle; Rubout: SIGNAL; PaintText: PROC; ReadChar: PROC RETURNS [CHARACTER]; OutChar: PROC [CHARACTER]; OutString: PROC [STRING]; ReadString: PROC [STRING]; ClearText: PROC; CollectLabel: PROC [c: CHARACTER, pos: APosition]; AllLabels: PROC [action: LabelScan] RETURNS [LBIndex]; PosOfLabel: PROC [lb: LBIndex] RETURNS [APosition]; SSDrawLabel: PUBLIC PROC [ss: String.SubString, pos: APosition, font: FontSize, mode: LabelMode]; DrawLabel: PROC [s: STRING, pos: APosition]; InsertLabel: PROC [hti: HTIndex, pos: APosition, font: FontSize, mode: LabelMode] RETURNS [LBIndex]; BoxForLabel: PROC [lb: LBIndex] RETURNS [Window.Box]; PaintLabel: PROC [lb: LBIndex]; DeleteLabel: PROC [lb: LBIndex]; ResetHash: PROC; InitHash: PROC; SubStringForLabel: PROC [ss: String.SubString, lb: LBIndex]; ReadPicture: PROC [file: STRING]; WritePicture: PROC [file: STRING]; pictureChanged: BOOLEAN; SetupLand: PROC; InitLines: PROC; ResetLines: PROC; ResetPicture: PROC; Load: PROC [file: STRING]; Store: PROC [file: STRING]; header: ALEHeader; hArray: DESCRIPTOR FOR ARRAY OF HorizRec; vArray: DESCRIPTOR FOR ARRAY OF VertRec; lastH, lastV: INTEGER; FindHList: PROC [y: ADistance, addNew: BOOLEAN ← FALSE] RETURNS [hi: INTEGER]; FindVList: PROC [x: ADistance, addNew: BOOLEAN ← FALSE] RETURNS [vi: INTEGER]; LinesInABox: PROC [box: POINTER TO ABox, action: LineScan, completely: BOOLEAN ← FALSE] RETURNS [LTIndex]; AllPoints: PROC [action: PointScan] RETURNS [PTIndex]; AllLines: PROC [action: LineScan] RETURNS [LTIndex]; SelectedPoints: PROC [action: PointScan] RETURNS [PTIndex]; SelectedLines: PROC [action: LineScan] RETURNS [LTIndex]; SelectedLabels: PROC [action: LabelScan] RETURNS [LBIndex]; UnSelChainLabel: PROC [lb: LBIndex]; ABoxForBox: PUBLIC PROC [box: Window.Box] RETURNS [ABox]; LinesThru: PROC [p: PTIndex, action: LineScan] RETURNS [LTIndex]; BoxForLine: PROC [l: LTIndex] RETURNS [Window.Box]; DimSelection: PROC [pos: APosition, feet: BOOLEAN]; DisplayLine: PROC [l: LTIndex, box: Window.Box]; MaybeDisplayLine: PROC [l: LTIndex]; DrawLine: PROC [pos1, pos2: APosition, selected: BOOLEAN ← TRUE]; ClearSelections: PROC; PosOf: PUBLIC PROC [p: PTIndex] RETURNS [APosition]; BoxForPoint: PROC [p: PTIndex] RETURNS [Window.Box]; PointsOf: PUBLIC PROC [l: LTIndex] RETURNS [p1, p2: PTIndex]; WidthOf: PUBLIC PROC [l: LTIndex] RETURNS [[1..4]]; AddSelection: PROC [pos: APosition]; SubSelection: PROC [pos: APosition]; DeleteSelections: PROC; SourceToClosePoint: PROC [pos: APosition]; DestToClosePoint: PROC [pos: APosition]; SelectInBox: PROC [pos1, pos2: APosition]; MoveSelections: PROC [delta: APosition]; MoveAndRotate: PROC [source, dest: APosition]; CopySelections: PROC [delta: APosition]; UndeleteItems: PROC; RedrawItems: PROC [Redraw]; RedrawSelections: PROC; DeleteLine: PROC [l: LTIndex]; ChopUpLine: PROC [l: LTIndex, box: POINTER TO ABox, pproc: PROC [ pos1, pos2: APosition, class: LineClass, color: LineColor, lWidth: LineWidth, lengthen: [0..4], box: POINTER TO ABox]]; ALELinesBNotify: Table.Notifier; ShouldLengthen: PROC [LTIndex] RETURNS [[0..4]]; PressPicture: PROC [STRING]; PressPictureInABox: PROC [STRING, ABox]; Sqrt: PROC [LONG CARDINAL] RETURNS [CARDINAL]; JamPicture: PROC [file: STRING]; Helvetica8, Helvetica14, Gacha10: PROGRAM; END.