CSMonitorImpl.mesa
Copyright © 1984, 1985 by Xerox Corporation. All rights reserved.
Written by Shand, September 20, 1983 11:40 pm
Last Edited by: Shand, July 28, 1984 7:56:25 pm PDT
Last Edited by: Beretta, October 30, 1984 10:31:53 am PST
Last Edited by: Jacobi, December 18, 1984 5:12:50 pm PST
Last Edited by: March 6, 1985 9:58:51 am PST
DIRECTORY
AMBridge USING [TVForATOM, TVForROPE, TVForReferent],
AMTypes USING [TV],
CD USING [Layer, NewLayer, Rect, Position, Design, Technology, RegisterTechnology, lambda, DesignRect],
CDBasics USING [Intersection, SizeOfRect, BaseOfRect],
CDColors,
CDSimpleOps USING [SelectAll],
CDOps USING [CreateDesign, AddAnObject, SetAppList, DelayedRedraw, DoTheDelayedRedraws],
CDProperties USING [RegisterProperty, GetProp, PutProp],
CDRects USING [CreateBareRect],
CDSequencer USING [ImplementCommand, Command],
CDTipEtc,
CDViewer USING [CreateViewer, ViewerList, ViewersOf, ShowAndScale],
CornerStitching USING [Tesselation, EnumerateArea, Value, TilePtr, TileAt, Rect, Area],
CSMonitor,
IO USING [STREAM, Put, PutRope, PutF, PutFR, int, rope, char, ROS, RopeFromROS],
PrintTV USING [Print],
Rope USING [ROPE],
TerminalIO USING [WriteRope];
CSMonitorImpl: CEDAR PROGRAM
IMPORTS AMBridge, CD, CDBasics, CDColors, CDSimpleOps, CDOps, CDProperties, CDRects, CDSequencer, CDTipEtc, CDViewer, CornerStitching, IO, PrintTV, TerminalIO
EXPORTS CSMonitor =
BEGIN
csMonitor: CD.Technology;
solid: CD.Layer;
solidDark: CD.Layer;
space: CD.Layer;
tessProp: REF ATOMNEW[ATOM←$Tesselation];
depth: INT ← 4;
width: INT ← 32;
GetTesselation: PROC [d: CD.Design] RETURNS [plane: REF CornerStitching.Tesselation] =
BEGIN
plane ← NARROW[CDProperties.GetProp[from: d, prop: tessProp]]
END;
Monitor: PUBLIC PROCEDURE [plane: REF CornerStitching.Tesselation, name: Rope.ROPENIL, paintDark: CSMonitor.PaintPredicate ← NIL] =
BEGIN
design: CD.Design = CDOps.CreateDesign[csMonitor];
design.name ← IF name#NIL THEN name ELSE "Tile World";
IF paintDark = NIL THEN paintDark ← DefaultPaintDark;
CDProperties.PutProp[onto: design, prop: tessProp, val: plane];
CDProperties.PutProp[onto: design, prop: $PaintDark, val: NEW[CSMonitor.PaintPredicate ← paintDark]];
ReDisplay[design];
[] ← CDViewer.CreateViewer[design];
END;
DefaultPaintDark: CSMonitor.PaintPredicate =
-- PROC [tileVal: REF ANY] RETURNS [BOOLEAN]
BEGIN
RETURN [ISTYPE[tileVal, ATOM]]
END;
ReDisplay: PROCEDURE [d: CD.Design] =
BEGIN
ChooseColor: PROCEDURE [val: REF ANY] RETURNS [CD.Layer] =
BEGIN
IF val=NIL THEN RETURN [space]
ELSE IF paintDark^[val] THEN RETURN [solidDark]
ELSE RETURN [solid];
END;
IncludeTile: PROCEDURE [tile: CornerStitching.TilePtr, data: REF ANY] =
BEGIN
r: CornerStitching.Rect = CDBasics.Intersection[CornerStitching.Area[tile], displayRegion];
CDOps.AddAnObject[design: d,
ob: CDRects.CreateBareRect[
size: CDBasics.SizeOfRect[r],
l: ChooseColor[CornerStitching.Value[tile]]
],
location: CDBasics.BaseOfRect[r]
]
END;
windowBound: INT = 100000;
displayRegion: CD.Rect = [-windowBound, -windowBound, windowBound, windowBound];
plane: REF CornerStitching.Tesselation = GetTesselation[d];
paintDark: REF CSMonitor.PaintPredicate = NARROW[CDProperties.GetProp[from: d, prop: $PaintDark] ];
CDOps.SetAppList[d, NIL];
CDOps.DelayedRedraw[d];
[] ← CornerStitching.EnumerateArea[
plane: plane,
rect: displayRegion,
backgroundValue: $Nothing,
perTile: IncludeTile
];
CDSimpleOps.SelectAll[d];
CDOps.DoTheDelayedRedraws[d]
END;
PrintingDepth: PROCEDURE [comm: CDSequencer.Command] =
BEGIN
SELECT comm.a FROM
$SuccPrintingDepth => depth ← depth.SUCC;
$PredPrintingDepth => IF depth > 1 THEN depth ← depth.PRED;
ENDCASE;
TerminalIO.WriteRope[IO.PutFR["%g CS Monitor printing depth = %d\n", IO.rope[ comm.design.name], IO.int[ depth]]];
END;
PrintingWidth: PROCEDURE [comm: CDSequencer.Command] =
BEGIN
SELECT comm.a FROM
$SuccPrintingWidth => width ← width.SUCC;
$PredPrintingWidth => IF depth > 1 THEN width ← width.PRED;
ENDCASE;
TerminalIO.WriteRope[IO.PutFR["%g CS Monitor printing width = %d\n", IO.rope[ comm.design.name], IO.int[width]]];
END;
PrintTile: PROCEDURE [comm: CDSequencer.Command] =
BEGIN
WriteWhere: PROCEDURE [strm: IO.STREAM, comm: CDSequencer.Command] =
BEGIN
IO.PutF[strm, "In %g At (%d,%d) ",
IO.rope[comm.design.name],
IO.int[comm.pos.x/CD.lambda],
IO.int[comm.pos.y/CD.lambda]];
END;
GetTV: PROCEDURE [ra: REF ANY] RETURNS [tv: AMTypes.TV] =
BEGIN
WITH ra SELECT FROM
a: ATOM => TRUSTED {tv ← AMBridge.TVForATOM[a]};
r: Rope.ROPE => TRUSTED {tv ← AMBridge.TVForROPE[r]};
ENDCASE => TRUSTED {tv ← AMBridge.TVForReferent[ra]};
END;
GetTile: PROCEDURE [d: CD.Design, at: CD.Position] RETURNS [CornerStitching.TilePtr] =
BEGIN
plane: REF CornerStitching.Tesselation = GetTesselation[comm.design];
tile: CornerStitching.TilePtr ← CornerStitching.TileAt[plane, comm.pos];
IF tile#NIL AND tile.Value=$Nothing THEN tile←NIL;
RETURN [tile]
END;
--PrintTile
ropeStream: IO.STREAMIO.ROS[];
tile: CornerStitching.TilePtr;
WriteWhere[ropeStream, comm];
IO.PutRope[ropeStream, "Tile "];
IF comm.a=$PrintTileValue THEN IO.PutRope[ropeStream, "Value"];
IO.PutRope[ropeStream, " =\n "];
tile ← GetTile[comm.design, comm.pos];
IF tile=NIL THEN IO.PutRope[ropeStream, " background"]
ELSE {
tv: AMTypes.TV;
IF comm.a=$PrintTileValue THEN
tv ← GetTV[tile.Value]
ELSE
tv ← GetTV[tile];
PrintTV.Print[tv: tv, put: ropeStream, depth: depth, width: width];
};
IO.Put[ropeStream, IO.char['\n]];
TerminalIO.WriteRope[IO.RopeFromROS[ropeStream]];
END;
RedisplayComm: PROCEDURE [comm: CDSequencer.Command] =
BEGIN
ReDisplay[comm.design]
END;
showRect: CD.DesignRect ← CD.DesignRect[x1: -10, y1: -10, x2: 100, y2: 100];
CenterComm: PROCEDURE [comm: CDSequencer.Command] =
BEGIN
vl: CDViewer.ViewerList ← CDViewer.ViewersOf[comm.design];
IF vl#NIL THEN {
CDViewer.ShowAndScale[vl.first, showRect]
};
END;
Init: PROCEDURE =
BEGIN
csMonitor ← CD.RegisterTechnology[key: $CSMonitor, name: "CSMonitor"];
solid ← CD.NewLayer[technology: csMonitor, uniqueKey: $SOLID];
solidDark ← CD.NewLayer[technology: csMonitor, uniqueKey: $SOLIDATOM];
space ← CD.NewLayer[technology: csMonitor, uniqueKey: $SP];
[] ← CDProperties.RegisterProperty[tessProp, $IDontCare];
CDTipEtc.SetTipTable[csMonitor, "Standard"];
CDColors.DefineColor[lev: solid, brick: NEW[CDColors.Brick ← [125252B, 0, 52525B, 0]]];
CDColors.DefineColor[lev: solidDark, brick: NEW[CDColors.Brick ← [52525B, 125252B, 52525B, 125252B]]];
CDColors.DefineColor[lev: space, brick: NEW[CDColors.Brick ← [0, 0, 0, 0]]];
CDSequencer.ImplementCommand[$PrintTileValue, PrintTile, csMonitor, doQueue];
CDSequencer.ImplementCommand[$PrintTile, PrintTile, csMonitor, doQueue];
CDSequencer.ImplementCommand[$SuccPrintingDepth, PrintingDepth, csMonitor, doQueue];
CDSequencer.ImplementCommand[$PredPrintingDepth, PrintingDepth, csMonitor, doQueue];
CDSequencer.ImplementCommand[$SuccPrintingWidth, PrintingWidth, csMonitor, doQueue];
CDSequencer.ImplementCommand[$PredPrintingWidth, PrintingWidth, csMonitor, doQueue];
CDSequencer.ImplementCommand[$Redisplay, RedisplayComm, csMonitor, doQueue];
CDSequencer.ImplementCommand[$Center, CenterComm, csMonitor, dontQueue];
TerminalIO.WriteRope["Corner Stitching Monitor loaded\n"];
END;
Init[];
END.