-- Copyright (C) 1983 by Xerox Corporation. All rights reserved. -- DisplayGlueImpl.mesa - last edited by -- Rick 16-Nov-83 19:43:06 -- Bruce 24-Feb-83 16:07:32 DIRECTORY BitBlt USING [BitBltFlags], Display USING [], DisplayInternal USING [Circle, Conic, SpecialCircle, SpecialConic], SpecialDisplay USING [ defaultContext, LineStyle, OrthogonalLine, NegativeShallowLine, NegativeSteepLine, Negative45Line, PositiveShallowLine, PositiveSteepLine, Positive45Line, Special, SpOrthoLine, SpNegativeShallowLine, SpNegativeSteepLine, SpNegative45Line, SpPositiveShallowLine, SpPositiveSteepLine, SpPositive45Line], Window USING [Box, BoxHandle, Handle, Place]; DisplayGlueImpl: PROGRAM -- implements routines in Display and SpecialDisplay that call routines -- implemented in DisplayImpl* IMPORTS DisplayInternal, SpecialDisplay EXPORTS Display, SpecialDisplay = BEGIN -- copied types because John doesn't like them LineStyle: TYPE = SpecialDisplay.LineStyle; Special: TYPE = SpecialDisplay.Special; -- circles Circle: PUBLIC PROC [ -- exported to Display window: Window.Handle, place: Window.Place, radius: INTEGER, bounds: Window.BoxHandle ← NIL] = { DisplayInternal.Circle[window, place, radius, ALL[FALSE], bounds]}; SpCircle: PUBLIC PROC [ -- exported to SpecialDisplay window: Window.Handle, place: Window.Place, radius: INTEGER, bounds: Window.BoxHandle, dashes: LineStyle, flags: BitBlt.BitBltFlags, context: Special ← SpecialDisplay.defaultContext] = { DisplayInternal.SpecialCircle[ window, place, radius, ALL[FALSE], bounds, dashes, flags, context]}; -- conics Conic: PUBLIC PROC [ -- exported to Display window: Window.Handle, a, b, c, d, e, errorTerm: LONG INTEGER, start, stop, errorRef: Window.Place, sharpCornered, unboundedStart, unboundedStop: BOOLEAN, bounds: Window.BoxHandle ← NIL] = { DisplayInternal.Conic[ window, a, b, c, d, e, errorTerm, start, stop, errorRef, sharpCornered, bounds]}; SpConic: PUBLIC PROC [ -- exported to SpecialDisplay window: Window.Handle, a, b, c, d, e, errorTerm: LONG INTEGER, start, stop, errorRef: Window.Place, sharpCornered: BOOLEAN, bounds: Window.BoxHandle, dashes: LineStyle, flags: BitBlt.BitBltFlags, context: Special ← SpecialDisplay.defaultContext] = { DisplayInternal.SpecialConic[ window, a, b, c, d, e, errorTerm, start, stop, errorRef, sharpCornered, bounds, dashes, flags, context]}; -- lines Line: PUBLIC PROC [ -- exported to Display window: Window.Handle, start, stop: Window.Place, bounds: Window.BoxHandle ← NIL] = { box: Window.Box; IF bounds = NIL THEN { box ← [ place: [x: MIN[start.x, stop.x], y: MIN[start.y, stop.y]], dims: [w: ABS[start.x - stop.x] + 1, h: ABS[start.y - stop.y] + 1]]; bounds ← @box}; SELECT TRUE FROM start.y = stop.y => -- horizontal SpecialDisplay.OrthogonalLine[window, bounds↑]; start.x = stop.x => -- vertical SpecialDisplay.OrthogonalLine[window, bounds↑]; ENDCASE => { -- diagonals positive: BOOLEAN; dx, dy: INTEGER; IF stop.y > start.y THEN { -- always start at bottom temp: Window.Place = start; start ← stop; stop ← temp}; dx ← stop.x - start.x; dy ← start.y - stop.y; -- dy always positive IF ~(positive ← dx > 0) THEN dx ← -dx; -- now dx positive SELECT dx FROM < dy => IF positive THEN SpecialDisplay.PositiveSteepLine[window, start, stop, bounds] ELSE SpecialDisplay.NegativeSteepLine[window, start, stop, bounds]; = dy => IF positive THEN SpecialDisplay.Positive45Line[window, start, stop.x, bounds] ELSE SpecialDisplay.Negative45Line[window, start, stop.x, bounds]; ENDCASE => IF positive THEN SpecialDisplay.PositiveShallowLine[window, start, stop, bounds] ELSE SpecialDisplay.NegativeShallowLine[window, start, stop,bounds]}}; SpecialLine: PUBLIC PROC [ -- exported to SpecialDisplay window: Window.Handle, start, stop: Window.Place, bounds: Window.BoxHandle, dashes: LineStyle, flags: BitBlt.BitBltFlags, context: Special ← SpecialDisplay.defaultContext] = { box: Window.Box; IF bounds = NIL THEN { highWidth: CARDINAL = dashes.thickness/2; box ← [ place: [x: MIN[start.x, stop.x], y: MIN[start.y, stop.y]], dims: [w: ABS[start.x - stop.x] + 1, h: ABS[start.y - stop.y] + 1]]; IF ABS[start.x - stop.x] >= ABS[start.y - stop.y] THEN { -- shallow box.place.y ← box.place.y - highWidth; box.dims.h ← box.dims.h + dashes.thickness - 1} ELSE { box.place.x ← box.place.x - highWidth; box.dims.w ← box.dims.w + dashes.thickness - 1}; bounds ← @box}; SELECT TRUE FROM start.y = stop.y => -- horizontal SpecialDisplay.SpOrthoLine[window, bounds↑, dashes, flags, context]; start.x = stop.x => -- vertical SpecialDisplay.SpOrthoLine[window, bounds↑, dashes, flags, context]; ENDCASE => { -- diagonals positive: BOOLEAN; dx, dy: INTEGER; IF stop.y > start.y THEN { -- always start at bottom temp: Window.Place = start; start ← stop; stop ← temp}; dx ← stop.x - start.x; dy ← start.y - stop.y; -- dy always positive IF ~(positive ← dx > 0) THEN dx ← -dx; -- now dx positive SELECT dx FROM < dy => IF positive THEN SpecialDisplay.SpPositiveSteepLine[ window, start, stop, bounds, dashes, flags, context] ELSE SpecialDisplay.SpNegativeSteepLine[ window, start, stop, bounds, dashes, flags, context]; = dy => IF positive THEN SpecialDisplay.SpPositive45Line[ window, start, stop.x, bounds, dashes, flags, context] ELSE SpecialDisplay.SpNegative45Line[ window, start, stop.x, bounds, dashes, flags, context]; ENDCASE => IF positive THEN SpecialDisplay.SpPositiveShallowLine[ window, start, stop, bounds, dashes, flags, context] ELSE SpecialDisplay.SpNegativeShallowLine[ window, start, stop, bounds, dashes, flags, context]}}; END.