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.
VEC ←
SELECT 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: BOOLEAN ← FALSE;
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 CARDINAL ← ALL[040000B];
hgridbits: PACKED ARRAY [0..4) OF CARDINAL ← ALL[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.