DIRECTORY Imager USING [black, Context, MaskFill, SetColor, VEC, white], ImagerOps USING [ImagerFromGraphics], ImagerPath USING [PathProc], PieViewers USING [PieViewer], Real USING [RoundI, SqRt], RealFns USING [Cos, Sin, Tan], ViewerClasses USING [PaintProc, Viewer, ViewerClass, ViewerClassRec], ViewerOps USING [CreateViewer, PaintViewer, RegisterViewerClass]; PieViewersImpl: CEDAR PROGRAM IMPORTS Imager, ImagerOps, Real, RealFns, ViewerOps EXPORTS PieViewers = BEGIN PieViewer: TYPE = PieViewers.PieViewer; DataRec: TYPE = RECORD [ total: REAL, -- what the entire circle is worth amount: REAL, -- what amount is currently on granularity: REAL -- display will not change if the new amount is of the same grain ]; Create: PUBLIC PROC [parent: ViewerClasses.Viewer, x, y: INTEGER _ 0, diameter: INTEGER _ 16, total: REAL _ 100, divisions: NAT _ 25] RETURNS [pieViewer: PieViewer] = TRUSTED { data: REF DataRec _ NEW[DataRec]; data.total _ total; data.granularity _ total/divisions; pieViewer _ ViewerOps.CreateViewer[flavor: $PieViewer, info: [parent: parent, wx: x, wy: y, ww: diameter, wh: diameter, data: data, border: FALSE], paint: FALSE]; Set[pieViewer, 0]; }; Set: PUBLIC PROC [pieViewer: PieViewer, amount: REAL] = BEGIN ENABLE ANY => GOTO Quit; d: REF DataRec _ NARROW[pieViewer.data]; IF amount=d.total OR amount=0 OR Real.RoundI[d.amount/d.granularity] # Real.RoundI[amount/d.granularity] THEN BEGIN d.amount _ amount; TRUSTED{ViewerOps.PaintViewer[pieViewer, client, FALSE, $Update]}; END; EXITS Quit => {} END; PieViewerPaint: ViewerClasses.PaintProc = BEGIN imager: Imager.Context ~ ImagerOps.ImagerFromGraphics[context]; d: REF DataRec _ NARROW[self.data]; diameter: REAL _ self.ww; radius: REAL _ diameter/2; center: VEC ~ [radius, radius]; blackPart: ImagerPath.PathProc ~ { p: VEC ~ [radius, diameter-0.51]; moveTo[center]; lineTo[p]; ArcAround[curveTo, p, center, TwoPi*d.amount/d.total]; lineTo[center]; }; whitePart: ImagerPath.PathProc ~ { p: VEC ~ [radius, diameter]; moveTo[center]; lineTo[p]; ArcAround[curveTo, p, center, TwoPi*(d.amount/d.total-1)]; lineTo[center]; }; Imager.SetColor[imager, Imager.black]; Imager.MaskFill[imager, blackPart]; Imager.SetColor[imager, Imager.white]; Imager.MaskFill[imager, whitePart]; END; TwoPi: REAL = 2*3.14159265; VEC: TYPE = Imager.VEC; Abs: PROCEDURE [a: VEC] RETURNS [REAL] = INLINE {RETURN[Real.SqRt[a.x*a.x+a.y*a.y]]}; Mul: PROCEDURE [a: VEC, b: VEC] RETURNS [VEC] = INLINE {RETURN[[(a.x*b.x - a.y*b.y), (a.x*b.y + a.y*b.x)]]}; -- complex product Add: PROCEDURE [a: VEC, b: VEC] RETURNS [VEC] = INLINE {RETURN[[a.x+b.x,a.y+b.y]]}; -- same as vector sum Sub: PROCEDURE [a: VEC, b: VEC] RETURNS [VEC] = INLINE {RETURN[[a.x-b.x,a.y-b.y]]}; -- same as vector difference ShortArcAround: PROC [curveTo: PROC[p1, p2, p3: VEC], p0: VEC, center: VEC, angle: REAL] RETURNS[VEC] = BEGIN -- good for angles of less than about a quarter circle init: VEC _ Sub[p0, center]; IF angle#0 THEN BEGIN final: VEC _ Mul[init, [RealFns.Cos[angle], RealFns.Sin[angle]]]; velocityRatio: REAL _ (4.0/3.0)*RealFns.Tan[angle/4]; b1: VEC _ Add[center, Add[init, Mul[init, [0,velocityRatio]]]]; b2: VEC _ Add[center, Add[final, Mul[final, [0,-velocityRatio]]]]; final _ Add[center, final]; curveTo[b1, b2, final]; RETURN[final]; END ELSE RETURN[p0]; END; MaxSmallArc: REAL = 3.14159265/2.0; ArcAround: PROC [curveTo: PROC[p1, p2, p3: VEC], p0: VEC, center: VEC, angle: REAL] = BEGIN delta: REAL _ IF angle>0 THEN MaxSmallArc ELSE - MaxSmallArc; WHILE ABS[angle]>MaxSmallArc DO p0 _ ShortArcAround[curveTo, p0, center, delta]; angle _ angle - delta; ENDLOOP; [] _ ShortArcAround[curveTo, p0, center, angle]; END; pieViewer: ViewerClasses.ViewerClass _ NEW[ViewerClasses.ViewerClassRec _ [ paint: PieViewerPaint, tipTable: NIL ]]; ViewerOps.RegisterViewerClass[$PieViewer, pieViewer]; -- plug in to Viewers END. Michael Plass, November 2, 1982 10:57 am. CEDARized. δPieViewersImpl.mesa Copyright c 1982, 1983, 1984 Xerox Corporation. All rights reserved. Michael Plass, November 2, 1982 10:56 am Last Edited by: Beach, May 24, 1983 9:13 am Doug Wyatt, September 5, 1984 3:45:51 pm PDT Κτ– "cedar" style˜šœ™Jšœ Οmœ:™EJšœ)™)J™+J™,J™—šΟk ˜ Jšœžœ&žœ ˜>Jšœ žœ˜%Jšœ žœ ˜Jšœ žœ ˜Jšœžœ˜Jšœžœ˜Jšœžœ2˜EJšœ žœ2˜AJ˜—Jšœžœž˜Jšžœ,˜3Jšžœ ˜Jšœž˜J˜Jšœ žœ˜'J˜šœ žœžœ˜JšœžœΟc"˜/JšœžœŸ˜,Jšœ žœŸA˜SJ˜J˜—šΟnœžœžœ&žœžœžœžœ˜…Jšžœžœ˜*Jšœžœ žœ ˜!J˜J˜#JšœŒžœ žœ˜’J˜J˜J˜—š œžœžœ žœ˜7Jšžœžœžœžœ˜Jšœžœ žœ˜(šžœžœ žœJž˜nJšž˜J˜Jšžœ*žœ ˜BJšžœ˜—Jšžœ ˜Jšžœ˜J˜—šœ*ž˜/J˜?Jšœžœ žœ ˜#Jšœ žœ ˜Jšœžœ˜Jšœžœ˜˜"Jšœžœ˜!Jšœ˜J˜ J˜6Jšœ˜J˜—˜"Jšœžœ˜Jšœ˜J˜ J˜:Jšœ˜J˜—J˜&J˜#J˜&J˜#Jšžœ˜J˜—Jšœžœ˜Jšžœžœ žœ˜š  œž œžœžœžœž˜/Jšœžœ˜%—š  œž œžœžœžœžœž˜6Jšœžœ/Ÿ˜H—š  œž œžœžœžœžœž˜6JšœžœŸ˜3—š  œž œžœžœžœžœž˜6JšœžœŸ˜:J˜—š œžœ žœ žœžœ žœ žœ˜XJšžœžœ˜JšžœŸ6˜