GriffinGridImpl.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Created by: Maureen Stone July 4, 1985 1:41:30 pm PDT
Last Edited by: Ken Pier, November 13, 1985 4:40:42 pm PST
DIRECTORY
GriffinData USING [DataRec],
GriffinGrid USING [frameXSize, frameYSize],
GriffinKernel USING [Data, DataRec],
GriffinObject USING [ForAllObjectsReversed, Object, ObjectProc, StartObject],
GriffinPoint USING [ScrPt, ScrToObj, ScrValToObjVal, X, Y],
GriffinRefresh USING [EraseAndSave, MarkObject, RestoreScreen],
GriffinStyle USING [CopyCurrentStyle];
GriffinGridImpl: CEDAR PROGRAM
IMPORTS GriffinGrid, GriffinObject, GriffinPoint, GriffinRefresh, GriffinStyle
EXPORTS GriffinGrid, GriffinKernel = BEGIN
Data: TYPE = REF DataRec;
DataRec: PUBLIC TYPE = GriffinData.DataRec;
X: NAT = GriffinPoint.X;
Y: NAT = GriffinPoint.Y;
gridX: PUBLIC INTEGER ← 8;
gridY: PUBLIC INTEGER ← 8; -- constants
frameXSize: PUBLIC INTEGER ← 612; -- 8.5 inches * 72 pointsPerInch
frameYSize: PUBLIC INTEGER ← 792; -- 11.0 inches * 72 pointsPerInch
Grid: PUBLIC PROC [data: Data, pt: GriffinPoint.ScrPt] RETURNS [GriffinPoint.ScrPt] = {
IF data.gridsOn THEN RETURN[GridInternal[pt]] ELSE RETURN[pt];
};
ForceGrid: PUBLIC PROC [data: Data, pt: GriffinPoint.ScrPt] RETURNS [GriffinPoint.ScrPt] = {
RETURN[GridInternal[pt]];
};
GridOff: PUBLIC PROC [data: Data] = {
hG, vG: REF GriffinObject.Object[token];
[hG, vG] ← GetGrids[data];
hG.visible ← vG.visible ← data.gridsOn ← FALSE;
GriffinRefresh.EraseAndSave[hG];
GriffinRefresh.EraseAndSave[vG];
GriffinRefresh.RestoreScreen[data];
};
GridOn: PUBLIC PROC [data: Data] = {
hG, vG: REF GriffinObject.Object[token];
[hG, vG] ← GetGrids[data];
hG.visible ← vG.visible ← data.gridsOn ← TRUE;
GriffinRefresh.MarkObject[hG];
GriffinRefresh.MarkObject[vG];
GriffinRefresh.RestoreScreen[data];
};
GetGrids: PUBLIC PROC [data: Data] RETURNS [hG, vG: REF GriffinObject.Object[token]] = {
IsGrid: GriffinObject.ObjectProc = {
WITH object SELECT FROM
token: REF GriffinObject.Object[token] =>
SELECT token.tokenType FROM
hgrid => hG ← token;
vgrid => vG ← token;
ENDCASE;
ENDCASE;
RETURN[hG#NIL AND vG#NIL];
};
hG ← vG ← NIL;
GriffinObject.ForAllObjectsReversed[data, IsGrid];
};
InitializeGrid: PUBLIC PROC [data: Data] = { -- fills in grid data
hGrid, vGrid: REF GriffinObject.Object[token];
center: GriffinPoint.ScrPt ← GridInternal[[(608/2), (808/2)]];
hGrid ← NARROW[GriffinObject.StartObject[data, token]];
hGrid.tokenType ← hgrid;
vGrid ← NARROW[GriffinObject.StartObject[data, token]];
vGrid.tokenType ← vgrid;
hGrid.p0 ← vGrid.p0 ← GriffinPoint.ScrToObj[center];
hGrid.tl ← [0, center[Y]+2];
hGrid.br ← [1024, center[Y]-2];
vGrid.tl ← [center[X]-2, 1024];
vGrid.br ← [center[X]+2, 0];
hGrid.visible ← vGrid.visible ← FALSE;
hGrid.validEncoding ← vGrid.validEncoding ← TRUE;
};
MoveGrid: PUBLIC PROC [grid: REF GriffinObject.Object[token], dx, dy: INT] = {
IF grid.tokenType=vgrid THEN {
grid.tl[X] ← grid.tl[X]+dx;
grid.br[X] ← grid.br[X]+dx;
grid.p0[X] ← grid.p0[X]+GriffinPoint.ScrValToObjVal[dx];
}
ELSE {
grid.tl[Y] ← grid.tl[Y]+dy;
grid.br[Y] ← grid.br[Y]+dy;
grid.p0[Y] ← grid.p0[Y]+GriffinPoint.ScrValToObjVal[dy];
};
};
GridInternal: PROC [pt: GriffinPoint.ScrPt] RETURNS[GriffinPoint.ScrPt] = {
will be unconvincing if grid < 2;
dx, dy: INTEGER;
dx ← pt[X] MOD gridX;
pt[X] ← pt[X]-dx;
IF dx > gridX/2 THEN pt[X] ← pt[X]+gridX;
dy ← pt[Y] MOD gridY;
pt[Y] ← pt[Y]-dy;
IF dy > gridY/2 THEN pt[Y] ← pt[Y]+gridY;
RETURN[pt];
};
FrameOff: PUBLIC PROC [data: Data] = {
frame: REF GriffinObject.Object[token] ← GetFrame[data];
frame.visible ← FALSE;
GriffinRefresh.EraseAndSave[frame];
GriffinRefresh.RestoreScreen[data];
};
FrameOn: PUBLIC PROC [data: Data] = {
frame: REF GriffinObject.Object[token] ← GetFrame[data];
frame.visible ← TRUE;
GriffinRefresh.MarkObject[frame];
GriffinRefresh.RestoreScreen[data];
};
GetFrame: PUBLIC PROC [data: Data] RETURNS [frame: REF GriffinObject.Object[token] ← NIL] = {
IsFrame: GriffinObject.ObjectProc = {
WITH object SELECT FROM
token: REF GriffinObject.Object[token] =>
SELECT token.tokenType FROM
frame => frame ← token;
ENDCASE;
ENDCASE;
RETURN[frame#NIL];
};
GriffinObject.ForAllObjectsReversed[data, IsFrame];
};
InitializeFrame: PUBLIC PROC [data: Data] = {
frame: REF GriffinObject.Object[token];
center: GriffinPoint.ScrPt ← GridInternal[[(608/2), (808/2)]]; -- same as grid center
frame ← NARROW[GriffinObject.StartObject[data, token]];
frame.tokenType ← frame;
frame.p0 ← GriffinPoint.ScrToObj[center];
frame.tl ← [center[X]-GriffinGrid.frameXSize/2, center[Y]+GriffinGrid.frameYSize/2];
frame.br ← [center[X]+GriffinGrid.frameXSize/2, center[Y]-GriffinGrid.frameYSize/2];
frame.visible ← FALSE;
frame.validEncoding ← TRUE;
frame.style ← GriffinStyle.CopyCurrentStyle[data];
frame.style^ ← [
color: [0, 0, 0], --major color
dashed: undashed,
firstend: [flat, 0, 0, 0, 0, 0],
lastend: [flat, 0, 0, 0, 0, 0],
junctiontype: square,
width: 128.0, -- 128 micas = 4 points
fillcolor: [0, 0, 0],
filled: FALSE,
outlined: TRUE,
fillbackgnd: FALSE,
backgndcolor: [0, 0, 0]
];
};
MoveFrame: PUBLIC PROC [frame: REF GriffinObject.Object[token], dx, dy: INT] = {
frame.tl[X] ← frame.tl[X]+dx;
frame.br[X] ← frame.br[X]+dx;
frame.p0[X] ← frame.p0[X]+GriffinPoint.ScrValToObjVal[dx];
frame.tl[Y] ← frame.tl[Y]+dy;
frame.br[Y] ← frame.br[Y]+dy;
frame.p0[Y] ← frame.p0[Y]+GriffinPoint.ScrValToObjVal[dy];
};
END.