<> <> <> <> DIRECTORY BasicTime, Convert, Icons, Imager, ImagerBackdoor, ImagerFont, ImagerPath, ImagerTransformation, RandomDemo, Real, RealFns, Rope, Terminal; RandomDemoClient1: CEDAR PROGRAM IMPORTS BasicTime, Convert, Icons, Imager, ImagerBackdoor, ImagerFont, ImagerPath, ImagerTransformation, RandomDemo, Real, RealFns, Rope, Terminal = BEGIN RModX: PROC [x: REAL] RETURNS [INTEGER] = INLINE { <<-- maps a real value to screen width>> RETURN [Real.RoundI[x-Real.Fix[x/RandomDemo.screenW]*RandomDemo.screenW]] }; RModY: PROC [y: REAL] RETURNS [INTEGER] = INLINE { <<-- maps a real value to screen height>> RETURN [Real.RoundI[y-Real.Fix[y/RandomDemo.screenH]*RandomDemo.screenH]] }; RandomColor: PROC[allowWhite: BOOL _ FALSE] = { Imager.SetColor[ RandomDemo.context, (SELECT RandomDemo.Rand[8] FROM 0 => Imager.black, 1 => IF allowWhite THEN Imager.white ELSE Imager.black, 2 => ImagerBackdoor.invert, 3 => Imager.MakeGray[MAX[1.0, RandomDemo.Rand[6]/5.0]], 4 => ImagerBackdoor.MakeStipple[RandomDemo.Rand[20000], TRUE], 5 => ImagerBackdoor.MakeStipple[RandomDemo.Rand[20000], FALSE], ENDCASE => Imager.black ) ] }; RandomRotation: PROC[] = { RandomRotate: PROC[] = { Imager.TranslateT[RandomDemo.context, [RandomDemo.screenW/2, RandomDemo.screenH/2]]; Imager.RotateT[RandomDemo.context, RandomDemo.Rand[360]]; Imager.TranslateT[RandomDemo.context, [-RandomDemo.screenW/2, -RandomDemo.screenH/2]]; }; IF RandomDemo.Rand[5]=1 THEN RandomRotate[] }; RandomStrokeThickness: PROC [fifeoff: INT_15] = { IF 5>=RandomDemo.Rand[fifeoff] THEN Imager.SetStrokeWidth[RandomDemo.context, 1.0+RandomDemo.Rand[6]]; }; SwapBackgroundColor: PROC = { backG: Terminal.BWBackground _ Terminal.GetBWBackground[RandomDemo.vt]; backG _ (IF backG=black THEN white ELSE black); [] _ Terminal.SetBWBackground[RandomDemo.vt, backG]; }; LinesDemo: PROC = { x1, x2, y1, y2: INTEGER; x1 _ RandomDemo.Rand[RandomDemo.screenw]; y1 _ RandomDemo.Rand[RandomDemo.screenh]; DO x2 _ x1; y2 _ y1; x1 _ RandomDemo.Rand[RandomDemo.screenw]; y1 _ RandomDemo.Rand[RandomDemo.screenh]; RandomDemo.DrawLine[x1, y1, x2, y2]; RandomDemo.Pause[1]; ENDLOOP; }; RandomDots: PROC = { DO RandomDemo.DrawDot[RandomDemo.Rand[RandomDemo.screenw], RandomDemo.Rand[RandomDemo.screenh], xor]; ENDLOOP; }; RectanglePaintingDemo: PROC = { x: INT _ RandomDemo.Rand[RandomDemo.screenW]; y: INT _ RandomDemo.Rand[RandomDemo.screenH]; newD: BOOL = RandomDemo.Rand[1]=0; newC: BOOL = RandomDemo.Rand[3]=0; dRange: CARDINAL = 2+RandomDemo.Rand[120]; dx: INT; dy: INT; NewD: PROC [] = { dx _ 1+RandomDemo.Rand[dRange]; dy _ 1+RandomDemo.Rand[dRange] }; RandomRotation[]; RandomColor[FALSE]; NewD[]; DO x _ RandomDemo.Rand[RandomDemo.screenW]; y _ RandomDemo.Rand[RandomDemo.screenH]; Imager.MaskBox[RandomDemo.context, [xmin: x-dx, xmax: x+dx, ymin: y-dy, ymax: y+dy]]; RandomDemo.Pause[0]; IF newC THEN RandomColor[TRUE]; IF newD THEN NewD[]; ENDLOOP; }; RandomWalkDemo: PROC = { mid: INTEGER = RandomDemo.Rand[70]+2; step: INTEGER = mid*2; last, this: Imager.VEC; this.x _ RandomDemo.Rand[RandomDemo.screenw]; this.y _ RandomDemo.Rand[RandomDemo.screenh]; RandomStrokeThickness[15]; DO last _ this; this.x _ MAX[MIN[INTEGER[RandomDemo.screenw], last.x+RandomDemo.Rand[step]-mid], 0]; this.y _ MAX[MIN[INTEGER[RandomDemo.screenh], last.y+RandomDemo.Rand[step]-mid], 0]; Imager.MaskVector[RandomDemo.context, last, this]; RandomDemo.Pause[0]; ENDLOOP; }; ParallelLinesDemo: PROC = { notParallel: BOOL _ RandomDemo.Rand[3]=1; off, center: Imager.VEC; off.x _ RandomDemo.Rand[RandomDemo.screenw/2]; off.y _ RandomDemo.Rand[RandomDemo.screenh/2]; RandomStrokeThickness[25]; DO center.x _ RandomDemo.Rand[RandomDemo.screenw]; center.y _ RandomDemo.Rand[RandomDemo.screenh]; Imager.MaskVector[RandomDemo.context, [center.x+off.x, center.y+off.y], [center.x-off.x, center.y-off.y]]; RandomDemo.Pause[0]; IF notParallel THEN { off.x _ RandomDemo.Rand[RandomDemo.screenw/2]; off.y _ RandomDemo.Rand[RandomDemo.screenh/2]; } ENDLOOP; }; PathDemo: PROC = { RandomPath: PROC [s: CARDINAL _ 200, i: CARDINAL _ 5] RETURNS [path: Imager.Trajectory] = { n: INT _ 3+RandomDemo.Rand[3]*5+RandomDemo.Rand[i]; x: CARDINAL; y: CARDINAL; s _ 10+RandomDemo.Rand[s]; x _ RandomDemo.Rand[s]; y _ RandomDemo.Rand[s]; path _ ImagerPath.MoveTo[[x, y]]; FOR i: INT IN [0..n-2) DO path _ ImagerPath.LineTo[path, [RandomDemo.Rand[s], RandomDemo.Rand[s]]] ENDLOOP; path _ ImagerPath.LineTo[path, [x, y]] }; x, y: CARDINAL; big: BOOL _ RandomDemo.Rand[2]=0; fill: BOOL _ RandomDemo.Rand[3]#0; parity: BOOL _ RandomDemo.Rand[2]=0; changeColor: BOOL _ RandomDemo.Rand[2]=0; path: Imager.Trajectory = RandomPath[IF big THEN RandomDemo.screenH ELSE 200]; RandomColor[FALSE]; RandomStrokeThickness[5]; DO x _ RandomDemo.Rand[RandomDemo.screenW]; y _ RandomDemo.Rand[RandomDemo.screenH]; Imager.TranslateT[RandomDemo.context, [x, y]]; IF fill THEN Imager.MaskFillTrajectory[RandomDemo.context, path, parity] ELSE Imager.MaskStrokeTrajectory[RandomDemo.context, path]; Imager.TranslateT[RandomDemo.context, [-x, -y]]; IF changeColor THEN RandomColor[fill]; RandomDemo.Pause[0]; ENDLOOP; }; ScrollOutDemo: PROC = { fromX, fromY, toX, toY, num: INTEGER _ 0; DO toX _ 1-INTEGER[RandomDemo.Rand[2]]; toY _ 1-INTEGER[RandomDemo.Rand[2]]; IF toX#0 OR toY#0 THEN EXIT ENDLOOP; RandomDemo.Pause[RandomDemo.Rand[500]]; Imager.SetColor[RandomDemo.context, Imager.white]; IF RandomDemo.Rand[4]<=2 THEN { <<--don't smir>> Imager.MaskVector[RandomDemo.context, [0, 0], [0, RandomDemo.screenh]]; Imager.MaskVector[RandomDemo.context, [0, 0], [RandomDemo.screenw, 0]]; Imager.MaskVector[RandomDemo.context, [0, RandomDemo.screenh], [RandomDemo.screenw, RandomDemo.screenh]]; Imager.MaskVector[RandomDemo.context, [RandomDemo.screenw, 0], [RandomDemo.screenw, RandomDemo.screenh]]; }; num _ IF toX=0 THEN RandomDemo.screenh ELSE RandomDemo.screenw; FOR i: INT IN [0..num) DO RandomDemo.Pause[0]; ImagerBackdoor.MoveViewRectangle[context: RandomDemo.context, width: RandomDemo.screenw, height: RandomDemo.screenh, fromX: fromX, fromY: fromY, toX: toX, toY: toY ]; ENDLOOP; }; CopyDemo: PROC = { w: INTEGER _ RandomDemo.Rand[RandomDemo.screenw/2]; h: INTEGER _ RandomDemo.Rand[RandomDemo.screenh/2]; fromX: INTEGER _ RandomDemo.Rand[RandomDemo.screenw]; fromY: INTEGER _ RandomDemo.Rand[RandomDemo.screenh]; DO ImagerBackdoor.MoveViewRectangle[context: RandomDemo.context, width: w, height: h, fromX: fromX, fromY: fromY, toX: RandomDemo.Rand[RandomDemo.screenw-w], toY: RandomDemo.Rand[RandomDemo.screenh-h] ]; RandomDemo.Pause[150]; ENDLOOP; }; BisectionDemo: PROC = { toX, toY, temx, temy, temw, temh, stepx, stepy: INTEGER _ 0; toX _ RandomDemo.screenw; toY _ RandomDemo.screenh; DO IF toX>toY THEN { temw _ temx _ toX _ toX/2 ; temy _ 0; temh _ RandomDemo.screenh; } ELSE { temh _ temy _ toY _ toY/2; temx _ 0; temw _ RandomDemo.screenw; }; IF toX<=4 THEN RETURN; stepx _ stepy _ 0; DO stepx _ stepx+temx; stepy _ stepy+temy; IF stepx>=RandomDemo.screenw OR stepy>RandomDemo.screenh THEN EXIT; ImagerBackdoor.MoveViewRectangle[context: RandomDemo.context, width: temw, height: temh, fromX: 0, fromY: 0, toX: stepx, toY: stepy ]; ENDLOOP; RandomDemo.Pause[200]; ENDLOOP; }; LetterSoupDemo: PROC = { RandRope: PROC [] RETURNS [r: Rope.ROPE_NIL] = { n: INT _ RandomDemo.Rand[10]; IF n=10 THEN n _ RandomDemo.Rand[100]; FOR i: INT IN [0..n] DO r _ Rope.Concat[r, Rope.FromChar[RandomDemo.RandChar[]]]; ENDLOOP; }; RandomWords: PROC[] = { r: Rope.ROPE; SELECT RandomDemo.Rand[6] FROM 0 => r _ "random demo"; 1 => r _ "programmed in Cedar"; 2 => r _ RandRope[]; 3 => r _ "Copyright (C) 1985 by Xerox Corporation. All rights reserved."; 4 => r _ Convert.RopeFromTime[from: BasicTime.Now[]]; ENDCASE => r _ "Xerox PARC"; DO Imager.SetXY[RandomDemo.context, [RandomDemo.Rand[RandomDemo.screenw], RandomDemo.Rand[RandomDemo.screenh]]]; Imager.ShowRope[RandomDemo.context, r]; RandomDemo.Pause[0]; ENDLOOP; }; RandomRotation[]; IF RandomDemo.Rand[5]=0 THEN RandomWords[] ELSE { DO Imager.SetXY[RandomDemo.context,[RandomDemo.Rand[RandomDemo.screenw], RandomDemo.Rand[RandomDemo.screenh]]]; Imager.ShowChar[RandomDemo.context, RandomDemo.RandChar[]]; RandomDemo.Pause[0]; ENDLOOP; }; }; BigLetterDemo: PROC = { Scale: PROC [] RETURNS [s: REAL] = { s _ RandomDemo.Rand[RandomDemo.Rand[35]]*RandomDemo.Rand[64]; IF s<=0 THEN s _ 5; }; helvetica: Imager.Font _ ImagerFont.Find["xerox/pressfonts/helvetica-mrr"]; w: Imager.VEC; font: Imager.Font _ ImagerFont.Scale[helvetica, Scale[]]; newScale: BOOL _ RandomDemo.Rand[1]=0; ch: CHAR; DO ch _ RandomDemo.RandChar[]; IF newScale THEN font _ ImagerFont.Scale[helvetica, Scale[]]; RandomColor[]; font _ ImagerFont.Modify[font, ImagerTransformation.Rotate[RandomDemo.Rand[359]]]; w _ ImagerFont.RopeWidth[font: font, rope: Rope.FromChar[ch]]; w.x _ (-w.x/2)+RandomDemo.Rand[RandomDemo.screenw]; w.y _ (-w.y/2)+RandomDemo.Rand[RandomDemo.screenh]; Imager.SetXY[RandomDemo.context, w]; Imager.SetFont[RandomDemo.context, font]; Imager.ShowChar[RandomDemo.context, ch]; ENDLOOP; }; ShuffleLinesDemo: PROC = { x1, x2, y1, y2, dx1, dx2, dy1, dy2: INTEGER; m: RandomDemo.Mode _ IF RandomDemo.Rand[3]=1 THEN set ELSE xor; x1 _ RandomDemo.Rand[RandomDemo.screenw]; x2 _ RandomDemo.Rand[RandomDemo.screenw]; y1 _ RandomDemo.Rand[RandomDemo.screenh]; y2 _ RandomDemo.Rand[RandomDemo.screenh]; dx1 _ 1; dx2 _ 0; dy1 _ RandomDemo.Rand[1]; dy2 _ 1; DO x1 _ x1+dx1; IF x1<0 OR x1>RandomDemo.screenw THEN { x1 _ x1-dx1; dx1 _ -dx1; dy1 _ (dy1+2) MOD 3 -1; }; y1 _ y1+dy1; IF y1<0 OR y1>RandomDemo.screenh THEN { y1 _ y1-dy1; dy1 _ -dy1; dx1 _ (dx1+2) MOD 3 -1; }; x2 _ x2+dx2; IF x2<0 OR x2>RandomDemo.screenw THEN { x2 _ x2-dx2; dx2 _ -dx2; dy2 _ (dy2+5) MOD 5 -2; }; y2 _ y2+dy2; IF y2<0 OR y2>RandomDemo.screenh THEN { y2 _ y2-dy2; dy2 _ -dy2; dx2 _ (dx2+5) MOD 5 -5; }; RandomDemo.DrawLine[x1, y1, x2, y2, m] ENDLOOP; }; LineStarsDemo: PROC = { mid: INTEGER = RandomDemo.Rand[200]+5; step: INTEGER = mid*2; centerx, centery: INTEGER; x, y: INTEGER; n: INTEGER _ 3+RandomDemo.Rand[80]; RandomColor[FALSE]; RandomStrokeThickness[]; DO centerx _ RandomDemo.Rand[RandomDemo.screenw]; centery _ RandomDemo.Rand[RandomDemo.screenh]; FOR i: INTEGER IN [0..n] DO IF RandomDemo.stop THEN EXIT; x _ centerx-mid+RandomDemo.Rand[step]; y _ centery-mid+RandomDemo.Rand[step]; Imager.MaskVectorI[RandomDemo.context, centerx, centery, x, y]; ENDLOOP; ENDLOOP; }; SomeGraphsDemo: PROC = { DoGraphs: PROC [Fx, Fy: PROC[REAL] RETURNS[REAL]] = { w: REAL; last, this: Imager.VEC; RandomColor[FALSE]; w _ RandomDemo.Rand[1000]/55; this.x _ RModX[Fx[w]]; this.y _ RModY[Fy[w]]; DO IF RandomDemo.stop THEN EXIT; w _ w+1; --w is >0 last _ this; this.x _ RModX[Fx[w]]; this.y _ RModY[Fy[w]]; Imager.MaskVector[RandomDemo.context, last, this]; ENDLOOP; }; small1: REAL = 2+RandomDemo.Rand[30]; small2: REAL = 2+RandomDemo.Rand[30]; F1: PROC[x: REAL] RETURNS[f: REAL] = { f _ (1+RealFns.Sin[x/small1])*500 }; F2: PROC[x: REAL] RETURNS[f: REAL] = { f _ (1+RealFns.Sin[1+x/small2])*500 }; F3: PROC[x: REAL] RETURNS[f: REAL] = { f _ (small1+x/small2)*30 }; F4: PROC[x: REAL] RETURNS[f: REAL] = { x _ x/small1; f _ (1+small2*x+x*x)*30 }; RandomStrokeThickness[50]; SELECT RandomDemo.Rand[6] FROM 0 => DoGraphs[F1, F2]; 1 => DoGraphs[F1, F3]; 2 => DoGraphs[F1, F4]; 3 => DoGraphs[F2, F3]; 4 => DoGraphs[F2, F4]; 5 => DoGraphs[F3, F4]; ENDCASE => DoGraphs[F1, F2] }; SlowEraseDemo: PROC = { x, y: INTEGER; d: INTEGER_1; n: INTEGER_1; Imager.SetColor[RandomDemo.context, Imager.white]; DO n _ n+1; IF n>600 THEN {n_0; d _ d*2}; x _ RandomDemo.Rand[RandomDemo.screenw]; y _ RandomDemo.Rand[RandomDemo.screenh]; Imager.MaskBox[RandomDemo.context, [xmin: x-d, xmax: x+d, ymin: y-d, ymax: y+d]]; ENDLOOP; }; DrawIconsDemo: PROC = { maxIcon: CARDINAL _ 14; --by peeking IconsImpl.nextFlavor.. icon: CARDINAL _ RandomDemo.Rand[maxIcon]; newI: BOOL _ RandomDemo.Rand[1]=0; DrawIcon: PROC = { Icons.DrawIcon[flavor: LOOPHOLE[MIN[icon, maxIcon]], context: RandomDemo.context, x: RandomDemo.Rand[RandomDemo.screenW-Icons.iconH], y: RandomDemo.Rand[RandomDemo.screenH-Icons.iconH] ]; }; DO IF newI THEN icon _ RandomDemo.Rand[maxIcon]; Imager.DoSave[RandomDemo.context, DrawIcon]; RandomDemo.Pause[0]; ENDLOOP; }; WalkIconsDemo: PROC = { DrawIcon: PROC = { Icons.DrawIcon[flavor: LOOPHOLE[icon], context: RandomDemo.context, x: x, y: y]; }; c: NAT = 7; maxIcon: CARDINAL _ 14; --by peeking IconsImpl.nextFlavor.. icon: CARDINAL _ RandomDemo.Rand[maxIcon]; w: INTEGER _ RandomDemo.screenW-Icons.iconW-c; --1 spare unit h: INTEGER _ RandomDemo.screenH-Icons.iconH-c; --1 spare unit x, y, nx, ny: INTEGER; --point to position of icon dx, dy: INTEGER; --point to position of icon NewSpeed: PROC [] = { dx _ 1+c-INTEGER[RandomDemo.Rand[2*c-2]]; dy _ 1+c-INTEGER[RandomDemo.Rand[2*c-2]]; IF (dx=0 AND dy=0) OR (ABS[dx]+ABS[dy])>8 THEN dy _ 1; }; x _ c+RandomDemo.Rand[w-c]; y _ c+RandomDemo.Rand[h-c]; NewSpeed[]; Imager.DoSave[RandomDemo.context, DrawIcon]; DO Terminal.WaitForBWVerticalRetrace[RandomDemo.vt]; nx _ x+dx; IF nxw THEN {nx_2*w-nx; dx _ -dx}; ny _ y+dy; IF nyh THEN {nx_2*h-ny; dy _ -dy}; ImagerBackdoor.MoveViewRectangle[context: RandomDemo.context, width: Icons.iconW+c+c, height: Icons.iconH+c+c, fromX: x-c, fromY: y-c, toX: nx-c, toY: ny-c ]; x _ nx; y _ ny; RandomDemo.Pause[0]; ENDLOOP; }; BlinkDemo: PROC = BEGIN bg: Terminal.BWBackground; DO IF RandomDemo.Rand[1]=0 THEN bg _ white ELSE bg _ black; [] _ Terminal.SetBWBackground[RandomDemo.vt, bg]; RandomDemo.Pause[RandomDemo.Rand[100]]; ENDLOOP; END; CircleClear: PROC = { i: INTEGER; s: INTEGER _ IF RandomDemo.Rand[5]<=3 THEN 1 ELSE 2; init: INTEGER _ 0; xc: INTEGER _ 300+RandomDemo.Rand[RandomDemo.screenw-600]; --reduce the range for speed yc: INTEGER _ 200+RandomDemo.Rand[RandomDemo.screenh-400]; DO i _ init; WHILE i