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]]; 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]; }; 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]; }; 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]; }; RuntimeBitmaps: ARRAY [0..3] OF ARRAY [0..8] OF CARDINAL; SelectBitmaps: ARRAY [0..3] OF ARRAY [0..15] OF CARDINAL; vgridbits: PACKED ARRAY [0..8) OF CARDINAL _ ALL[040000B]; hgridbits: PACKED ARRAY [0..4) OF CARDINAL _ ALL[100200B]; 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. *GriffinDisplayImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Maureen Stone September 19, 1985 1:55:05 pm PDT Do all the different styles here The following work in Screen Points. Partial pixels would only be a nuisance for us. Only for the menus From ShowObjects Token: ScreenDefs.BlockPtr _ CZone.NEW[ScreenDefs.Block _ [NIL,1,0,0,9,9]]; SelectToken: ScreenDefs.BlockPtr _ CZone.NEW[ScreenDefs.Block _ [NIL,1,3,3,10,10]]; vgridBlock _ NEW[Block _ [@vgridbits,1,0,0,3,8]]; hgridBlock _ NEW[Block _ [@hgridbits,1,0,0,8,3]]; Κ{˜code™Kšœ Οmœ1™