GriffinDisplayImpl.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Maureen Stone September 19, 1985 1:55:05 pm PDT
DIRECTORY
Rope USING [ROPE, Length],
PointDefs USING [ScrPt, ScrRealPt, X, Y, ObjValToScrVal],
StyleDefs USING [StyleHandle],
GriffinEncoding USING [EdgeEncoding, WalkEdge],
GriffinColor USING [ColorToConstantColor],
GriffinGrid USING [Grid],
GriffinDisplay,
Real USING [RoundI],
Imager,
ImagerBackdoor USING [DrawBits, invert, DoIfVisible, GetBounds],
ImagerFont USING [RopeWidth, FontBoundingBox],
Vector2 USING [VEC];
GriffinDisplayImpl: CEDAR PROGRAM
IMPORTS Imager, ImagerBackdoor, ImagerFont, GriffinColor, GriffinEncoding, GriffinGrid, Real, Rope, PointDefs
EXPORTS GriffinDisplay
~ BEGIN
Context: TYPE = Imager.Context;
ROPE: TYPE = Rope.ROPE;
ScrPt: TYPE = PointDefs.ScrPt;
X: NAT = PointDefs.X;
Y: NAT = PointDefs.Y;
ScrRealPt: TYPE = PointDefs.ScrRealPt;
StyleHandle: TYPE = StyleDefs.StyleHandle;
EdgeEncoding: TYPE = GriffinEncoding.EdgeEncoding;
TokenType: TYPE = GriffinDisplay.TokenType; --{cp, open};
DrawFastStroke: PUBLIC PROC[edge: EdgeEncoding, dc: Context] = {
pathProc: Imager.PathProc = {GriffinEncoding.WalkEdge[edge, moveTo, lineTo, curveTo]};
proc: PROC = TRUSTED {
Imager.SetStrokeWidth[dc, 0];
IF clip THEN Imager.ClipRectangleI[dc, cc.x, cc.y, cc.w, cc.h];
Imager.MaskStroke[dc, pathProc, FALSE];
};
Imager.DoSave[dc, proc];
};
Width: PROC[style: StyleHandle] RETURNS [REAL] = {
RETURN[PointDefs.ObjValToScrVal[style.width]];
};
DrawStroke: PUBLIC PROC[edge: EdgeEncoding, style: StyleHandle, dc: Context] = {
pathProc: Imager.PathProc = {GriffinEncoding.WalkEdge[edge, moveTo, lineTo, curveTo]};
proc: PROC = {
Imager.SetStrokeEnd[dc, round];
Imager.SetStrokeJoint[dc, round];
Imager.SetStrokeWidth[dc, Width[style]];
IF clip THEN Imager.ClipRectangleI[dc, cc.x, cc.y, cc.w, cc.h];
Imager.SetColor[dc, GriffinColor.ColorToConstantColor[style.color]];
Imager.MaskStroke[dc, pathProc, FALSE];
};
Imager.DoSave[dc, proc];
};
DrawArea: PUBLIC PROC[edge: EdgeEncoding, style: StyleHandle, dc: Context] = {
pathProc: Imager.PathProc = {GriffinEncoding.WalkEdge[edge, moveTo, lineTo, curveTo]};
proc: PROC = {
IF clip THEN Imager.ClipRectangleI[dc, cc.x, cc.y, cc.w, cc.h];
IF style.filled THEN {
Imager.SetColor[dc, GriffinColor.ColorToConstantColor[style.fillcolor]];
Imager.MaskFill[dc, pathProc];
};
IF style.outlined THEN {
Imager.SetStrokeEnd[dc, round];
Imager.SetStrokeJoint[dc, round];
Imager.SetStrokeWidth[dc, Width[style]];
Imager.SetColor[dc, GriffinColor.ColorToConstantColor[style.color]];
Imager.MaskStroke[dc, pathProc, TRUE];
};
};
Imager.DoSave[dc, proc];
};
DrawCaption: PUBLIC PROC[anchor: ScrRealPt, rope: ROPE, style: StyleHandle, dc: Context] = {
width: Vector2.VEC ← ImagerFont.RopeWidth[style.font, rope];
ascent: REAL ← ImagerFont.FontBoundingBox[style.font].ascent;
point: Vector2.VECSELECT style.anchor FROM
left => [anchor[X], anchor[Y]-ascent],
center => [anchor[X]-width.x/2.0, anchor[Y]-ascent],
right => [anchor[X]-width.x, anchor[Y]-ascent],
ENDCASE => ERROR;
proc: PROC = {
IF clip THEN Imager.ClipRectangleI[dc, cc.x, cc.y, cc.w, cc.h];
Imager.SetColor[dc, GriffinColor.ColorToConstantColor[style.color]];
Do all the different styles here
Imager.SetXY[dc, point];
Imager.SetFont[dc, style.font];
Imager.ShowRope[context: dc, rope: rope, len: Rope.Length[rope]];
};
Imager.DoSave[dc, proc];
};
ClearScreen: PUBLIC PROC[dc: Context] = {
proc: PROC = {
IF clip THEN Imager.ClipRectangleI[dc, cc.x, cc.y, cc.w, cc.h];
Imager.SetColor[dc, Imager.white];
Imager.MaskRectangleI[dc, 0,0, 2000, 2000];
};
Imager.DoSave[dc, proc];
};
The following work in Screen Points. Partial pixels would only be a nuisance for us.
cc: RECORD [x,y,w,h: INTEGER];
clip: BOOLEANFALSE;
SetClipEdges: PUBLIC PROC[tl,br: ScrPt] = {
cc.x ← tl[X];
cc.y ← br[Y];
cc.w ← br[X]-tl[X];
cc.h ← tl[Y] - br[Y];
clip ← TRUE;
};
ResetClipEdges: PUBLIC PROC = {
clip ← FALSE;
};
IsCull: PUBLIC PROC[tl, br: ScrPt, dc: Context] RETURNS [cull: BOOLEAN] = {
action: PROC = {cull ← FALSE};
IF clip AND (cc.x+cc.w < tl[X] OR cc.x > br[X] OR cc.y+cc.h < br[Y] OR cc.y > tl[Y])
THEN RETURN[TRUE]; --test for inside current local clipper, if enabled
cull ← TRUE;
ImagerBackdoor.DoIfVisible[dc, [x: tl[X], y: br[Y], w: br[X]-tl[X], h: tl[Y]-br[Y]], action];
RETURN[cull];
};
EraseBox: PUBLIC PROC[tl,br: ScrPt, dc: Context] = {
proc: PROC = {
IF clip THEN Imager.ClipRectangleI[dc, cc.x, cc.y, cc.w, cc.h];
Imager.SetColor[dc, Imager.white];
Imager.MaskRectangleI[context: dc, x: tl[X], y: br[Y], w: br[X]-tl[X], h: tl[Y] - br[Y]];
};
Imager.DoSave[dc, proc];
};
DrawToken: PUBLIC PROC[pt: ScrPt, type: TokenType, dc: Context] = {
proc: PROC = TRUSTED {
IF clip THEN Imager.ClipRectangleI[dc, cc.x, cc.y, cc.w, cc.h];
ImagerBackdoor.DrawBits[context: dc,
base: IF type=cp THEN @RuntimeBitmaps[0] ELSE @RuntimeBitmaps[1],
wordsPerLine: 1,
sMin: 0, fMin: 0,
sSize: 9, fSize: 9,
tx: pt[X]-4, ty: pt[Y]+4];
};
Imager.DoSave[dc, proc];
};
DrawHGrid: PUBLIC PROC[pt: ScrPt, dc: Context] = {
lx: INTEGER ← 0;
ty: INTEGER ← GriffinGrid.Grid[pt][Y]+1;
ngridpieces: INTEGER ← Real.RoundI[ImagerBackdoor.GetBounds[dc].w/8.0]+1;
proc: PROC = TRUSTED {
IF clip THEN Imager.ClipRectangleI[dc, cc.x, cc.y, cc.w, cc.h];
THROUGH [0..ngridpieces] DO
Imager.MaskBits[context: dc,
base: BASE[hgridbits],
wordsPerLine: 1,
sMin: 0, fMin: 0,
sSize: 3, fSize: 8,
tx: lx, ty: ty];
lx ← lx+8;
ENDLOOP;
};
Imager.DoSave[dc, proc];
};
DrawVGrid: PUBLIC PROC[pt: ScrPt, dc: Context] = {
ty: INTEGER ← 8;
lx: INTEGER ← GriffinGrid.Grid[pt][X]-1;
ngridpieces: INTEGER ← Real.RoundI[ImagerBackdoor.GetBounds[dc].h/8.0]+1;
proc: PROC = TRUSTED {
IF clip THEN Imager.ClipRectangleI[dc, cc.x, cc.y, cc.w, cc.h];
THROUGH [0..ngridpieces] DO
Imager.MaskBits[context: dc,
base: BASE[vgridbits],
wordsPerLine: 1,
sMin: 0, fMin: 0,
sSize: 8, fSize: 3,
tx: lx, ty: ty];
ty ← ty+8;
ENDLOOP;
};
Imager.DoSave[dc, proc];
};
DrawSelection: PUBLIC PROC[pt: ScrPt, covered, clustered: BOOLEAN, dc: Context] = {
base: LONG POINTER;
proc: PROC = TRUSTED {
SELECT TRUE FROM
NOT covered AND NOT clustered => base ← @SelectBitmaps[0];
covered AND NOT clustered => base ← @SelectBitmaps[1];
NOT covered AND clustered => base ← @SelectBitmaps[2];
covered AND clustered => base ← @SelectBitmaps[3];
ENDCASE => ERROR;
IF clip THEN Imager.ClipRectangleI[dc, cc.x, cc.y, cc.w, cc.h];
ImagerBackdoor.DrawBits[context: dc,
base: base,
wordsPerLine: 1,
sMin: 0, fMin: 3,
sSize: 10, fSize: 10,
tx: pt[X]-5, ty: pt[Y]+5];
};
Imager.DoSave[dc, proc];
};
Only for the menus
BoxFill: PUBLIC PROC[tl,br: ScrPt, color: Imager.ConstantColor, dc: Context] = {
proc: PROC = {
IF clip THEN Imager.ClipRectangleI[dc, cc.x, cc.y, cc.w, cc.h];
Imager.SetColor[dc, color];
Imager.MaskRectangleI[dc, tl[X], br[Y], br[X]-tl[X], tl[Y] - br[Y]];
};
Imager.DoSave[dc, proc];
};
InvertBox: PUBLIC PROC[tl,br: ScrPt, dc: Context] = {
proc: PROC = {
IF clip THEN Imager.ClipRectangleI[dc, cc.x, cc.y, cc.w, cc.h];
Imager.SetColor[dc, ImagerBackdoor.invert];
Imager.MaskRectangleI[dc, tl[X], br[Y], br[X]-tl[X], tl[Y] - br[Y]];
};
Imager.DoSave[dc, proc];
};
From ShowObjects
RuntimeBitmaps: ARRAY [0..3] OF ARRAY [0..8] OF CARDINAL;
Token: ScreenDefs.BlockPtr ← CZone.NEW[ScreenDefs.Block ← [NIL,1,0,0,9,9]];
SelectBitmaps: ARRAY [0..3] OF ARRAY [0..15] OF CARDINAL;
SelectToken: ScreenDefs.BlockPtr ← CZone.NEW[ScreenDefs.Block ← [NIL,1,3,3,10,10]];
vgridbits: PACKED ARRAY [0..8) OF CARDINALALL[040000B];
hgridbits: PACKED ARRAY [0..4) OF CARDINALALL[100200B];
vgridBlock ← NEW[Block ← [@vgridbits,1,0,0,3,8]];
hgridBlock ← NEW[Block ← [@hgridbits,1,0,0,8,3]];
vgridbits[0] ← 120000B; --rest are "040000B"
hgridbits[1] ← 77577B; --rest are "100200B"
RuntimeBitmaps[0] ←
[16000B,12000B,12000B,173600B,104200B,173600B,12000B,12000B,16000B]; --CP
RuntimeBitmaps[1] ← [37000B,61400B,140600B,100200B,104200B,100200B,140600B,61400B,37000B]; --open
SelectBitmaps[0] ← [17770B,17770B,14030B,14030B,14630B,14630B,14030B,
14030B,17770B,17770B,0,0,0,0,0,0]; --selected not hidden.
SelectBitmaps[1] ← [17770B,17770B,17030B,17430B,15630B,14730B,14370B,
14170B,17770B,17770B,0,0,0,0,0,0]; --selected and hidden.
SelectBitmaps[2] ← [17770B,17770B,14030B,15730B,15030B,15030B,15730B,
14030B,17770B,17770B,0,0,0,0,0,0]; --selected not hidden cluster.
SelectBitmaps[3] ← [17770B,17770B,14070B,15730B,15230B,15430B,15730B,
16030B,17770B,17770B,0,0,0,0,0,0]; --selected and hidden cluster.
END.