#! /usr/openwin/bin/psh

%!PS
/NeWS 3 0 findpackage beginpackage
/TNTCore 3 0 findpackage beginpackage
/TNT 3 0 findpackage beginpackage

statusdict begin 500 setjobtimeout end

/DrawSquiggle {
  newpath
  nextx nexty moveto

  steepness minPoints maxPoints expRandomBetween {
    nextx nexty
    nextx nexty
    nextx nexty
    curveto
  } repeat

  closepath

  gsave
    random random random rgbcolor setcolor
    eofill
  grestore

  random 0.5 gt {
    % random colour for the stroke
    % random 1 random random mul 1 random random mul sub hsbcolor setcolor
    random random random rgbcolor setcolor
    % very occasionally, use a much thicker line...
    gsave
     random 4 { random mul } repeat
     300 mul dup /SquiggleBorder exch def setlinewidth
     stroke
    grestore
    gsave
      /SquiggleBorder2 random random mul random mul random mul 100 mul def
      SquiggleBorder 1 sub SquiggleBorder2 gt SquiggleBorder2 0.001 gt and {
	SquiggleBorder2 setlinewidth
	random random random hsbcolor setcolor
	stroke
      } if
    grestore
  } if
} readonly def

%% Random distributions
/MAX 0 def
/MIN 0 def
% min max random
/randomBetween {
      /MAX exch 1 add def
      /MIN exch def
      random  MAX MIN sub  mul  MIN add  cvi
} readonly def
/expRandomBetween {
      /MAX exch 1 add def
      /MIN exch def
      /E 1 def
      { /E E random mul def } repeat E  MAX MIN sub  mul  MIN add  cvi
} readonly def
/nexty { 0 canvasHeight randomBetween} readonly def
/nextx { 0 canvasWidth randomBetween} readonly def

/SquiggleCanvas ClassCanvas
dictbegin
    /canvasWidth 800 def
    /canvasHeight 800 def

    %% Properties dialogue
    % not done yet

    %% curve parameters
    /maxPoints 150 def
    /minPoints 3 def
    /steepness 2 def

    %% Draw the curve:
dictend
classbegin
    %% default window size
    /preferredsize { canvasWidth canvasHeight } def

    %% Input events (key presses):
    /StandardKeyUp {
	/Name get 113 eq {
	    currentprocess killprocess
	} if
	/PaintAll self send
    } def

    /FunctionKeyUp {
	/Name get /FunctionL3 eq {
	    % Props. I wish I got a "Properties" event instead, though
	    /showprops self send
	} if
    } def

    /KeyStart { [ /StandardKeyUp /FunctionKeyUp ] true} def

    %% Startup code:
    /NewInit {
        /NewInit super send
	% Arrange to be allowed focus:
	true setkeyable
    } def

    %% The squiggles
    /Paint {
	(Drawing squiggles...) ( ) /setfooter window1 send
	/Busy /setvisualstate window1 send
	% random newRand % no srand...
	% squiggleSetRand

	% find the canvas size: (TNT 3.0 Ref. p. 49)
	bbox /canvasHeight exch def /canvasWidth exch def pop pop

	% A random background color - the 2nd colour is saturation, and we
	% make that lower to get a better background color; also, a high
	% brightness is good:
	random
	random random mul random mul
	1 random random mul random mul sub
	hsbcolor dup setcolor FillCanvas

	% Now a squiggle:
	DrawSquiggle

	% and maybe some more:
	random .8 gt {
	    DrawSquiggle
	    random .8 gt {
		DrawSquiggle
	    } if
	} if
	( ) ( ) /setfooter window1 send
	/Active /setvisualstate window1 send
    } def

classend def


/canvas1 framebuffer /new SquiggleCanvas send def
/window1 canvas1 framebuffer /new ClassBaseWindow send def
(Liam's Squiggles) /setlabel window1 send
{
    /PaintIcon {
	/maxPoints 15 def
	/minPoints 2 def
	/steepness 2 def % almost always only one
	/canvasWidth 64 def
	/canvasHeight 64 def
	random % hue
	random random mul random mul 0.7 mul % low saturation
	1 random random mul random mul 0.7 mul sub % high brightness
	3 copy
	hsbcolor
	FillCanvas
	DrawSquiggle
	gsave
	    1 sub 1 3 roll
	    1 sub 1 3 roll
	    1 sub 1 3 roll
	    hsbcolor setcolor
	    6 setrasteropcode
	    10 20 60 {
		dup 0 exch moveto
		60 div setgray
		(Squiggles) show
	    } for
	    12 setrasteropcode % restore default
	grestore
    } def
} window1 send

/new ClassEventMgr send dup /ProcessName (Squiggle) put

/menu /Grid framebuffer /new ClassMenu send def

[
    [(3) {
	{
	    /maxPoints 3 def
	} canvas1 send
	/PaintAll canvas1 send
    }]
    [(5) {
	{
	    /maxPoints 5 def
	} canvas1 send
	/PaintAll canvas1 send
    }]
    [(7) {
	{
	    /maxPoints 70 def
	} canvas1 send
	/PaintAll canvas1 send
    }]
    [(10) {
	{
	    /maxPoints 10 def
	} canvas1 send
	/PaintAll canvas1 send
    }]
    [(20) {
	{
	    /maxPoints 20 def
	} canvas1 send
	/PaintAll canvas1 send
    }]
    [(50) {
	{
	    /maxPoints 50 def
	} canvas1 send
	/PaintAll canvas1 send
    }]
    [(100) {
	{
	    /maxPoints 100 def
	} canvas1 send
	/PaintAll canvas1 send
    }]
    [(150) {
	{
	    /maxPoints 150 def
	} canvas1 send
	/PaintAll canvas1 send
    }]
    [(175) {
	{
	    /maxPoints 175 def
	} canvas1 send
	/PaintAll canvas1 send
    }]
    [(200) {
	{
	    /maxPoints 200 def
	} canvas1 send
	/PaintAll canvas1 send
    }]
    [(400) {
	{
	    /maxPoints 400 def
	} canvas1 send
	/PaintAll canvas1 send
    }]
    [(1000) {
	{
	    /maxPoints 1000 def
	} canvas1 send
	/PaintAll canvas1 send
    }]
] /setitemlist menu send

true /setpinnable menu send
(Complexity) /setlabel menu send
menu /setmenu canvas1 send
true /setmenuable canvas1 send
(squiggles.info:maincanvas) /sethelpkeyword canvas1 send
true /sethelpable canvas1 send


/activate window1 send
window1 /Retained true put
/place window1 send
/map window1 send
