home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 200-299 / ff239.lzh / JGoodies / Mandelbrot / mandelevmenus.jf < prev    next >
Text File  |  1989-08-21  |  12KB  |  397 lines

  1. \ Copyright 1989 NerveWare
  2. \ No portion of this code may used for commercial purposes,
  3. \ nor may any executable version of this code be disributed for 
  4. \ commercial purposes without the author's express written permission.
  5. \ This code is shareware, all rights reserved.
  6. \ Nick Didkovsky  Oct. 6, 1988
  7.  
  8. \                                  MandelEvMenus.JF
  9.  
  10. \ This file sets the menu events.
  11.  
  12. \ MOD: added custom screen. ND 12/16/88
  13. \ MOD: added ezmenus for restart, color cycle, and quit. ND 12/17/88
  14. \ MOD: added region selection/calculation/gr.highlight   ND 12/18/88
  15. \ MOD: added FastWritePixel, 3drop, skip Mandelbrot point plot ND 12/18/88
  16. \ MOD: added support for IFF Mandelbrot image, restores on restart. ND 12/20/88
  17. \ MOD: Changed scaling from 10000 to 16384.  Superduper speed! ND 12/20/88
  18. \ MOD: Changed MandelMax from 35 to 100 ND 12/21/88
  19. \ MOD: Added "Title?" choice to menu, hides titlebar ND 12/21/88
  20. \ MOD: Full borderless drawing screen ND 12/21/88
  21. \ MOD: Title hides automatically on new region, shows on restart ND 12/22/88
  22. \ MOD: New IFF image ... full screen, no title bar! ND 12/22/88
  23. \ MOD: Max iterations changed from 100 to 254 ND 12/21/88
  24. \      Speed note: full startup image takes 6:02 min to generate point by point
  25. \ MOD: put gr.highlight in "PlotOne" so it flashes once when black. ND 1/26/89
  26. \ MOD: using PICTURE structures now, from JForth v.omega1       ND 2/4/89
  27. \ MOD: forget it.  Using pure bitmaps again, and they work great.  ND 2/5/89
  28. \ MOD: include variable resolution screens now                     ND 2/8/89
  29. \ MOD: calc.new.values uses screen resolutions                     ND 2/9/89
  30. \ MOD: moved MandelMax out of here and into MandelShift2.ASM,
  31. \      MandelMax is now 350                       ND 2/11/89
  32. \ MOD: free mandelbrot-menu in cleanup                             ND 2/14/89
  33. \ MOD: added Mandelbrot-Menu-2 for various screen resolutions      ND 2/16/89
  34. \ MOD: reorganized menus for coherence                   ND 2/17/89
  35. \ MOD: added 3rd menu to change color cycle speed               ND 2/18/89
  36. \ MOD: Adjusted menu widths with menuitem-defwidth.                  ND 3/24/89
  37. \ MOD: using ILBM_WRITE.ND2 to save IFF, uses small buffer       ND 3/28/89
  38. \ MOD: added wait.for.click                    6/11/89
  39. \ MOD: removed gr.move from handle.mandelbrot.event        6/11/89
  40.  
  41. decimal
  42.  
  43. getmodule includes
  44.  
  45. include? gr.init ju:amiga_graph 
  46. include? ev.getclass ju:amiga_events
  47. include? ezmenu ju:amiga_menus
  48. include? quick.guts MandelShift2.ASM ( uses 16384 scaling, not 10000!!!)
  49. include? open.mandelscreen VariScreen.JF
  50. include? load.bm.to.screen MandelBitMap.JF
  51. include? FastWritePixel FastWritePixel.JF
  52. include? make.next.filename $filenext.JF
  53. include? $screen>iff.ND ILBM_WRITE.ND2
  54. include? wait.pointer MandelMouse.JF
  55.  
  56. anew task_Mandel_menus_events
  57.  
  58. decimal
  59.  
  60.  
  61. ezmenu Mandelbrot-Menu-1
  62. ezmenu Mandelbrot-Menu-2
  63. ezmenu Mandelbrot-Menu-3
  64.  
  65. variable cycle?
  66. variable quit?
  67. variable restart? 
  68. variable new-values? ( true when mousedown events block off new region)
  69. variable only-a-single-click? ( protect against accidental new region)
  70. variable image-loaded?
  71. variable show-title?
  72. variable new-screen?
  73.  
  74.  
  75. image-loaded? off
  76.  
  77. USER IF-DOWN  ( Keep track of whether mouse button is down. )
  78.  
  79. variable top-x
  80. variable top-y
  81. variable bot-x
  82. variable bot-y
  83. variable real-lower-right
  84. variable imag-lower-right
  85.  
  86. \ Infinitesimally faster than drop 2drop. ND
  87.  
  88. ASM 3drop
  89.     addq.l    #$8,dsp
  90.     move.l  (dsp)+,tos
  91. end-code
  92.  
  93. \ Reset the region to cover entire mandelset
  94. \ note: integer values scaled by 16384 
  95. \ ... represent -2.125, 1.1972, 0.0101, and 0.0120
  96.  
  97.  
  98. : INIT.MANDELBROT ( -- )
  99.      -34816 acorner ! ( -2.125)
  100.       19615 bcorner ! ( 1.1972)
  101.       165 xgap !      ( 0.0101 )
  102.       197 ygap !      ( 0.0120 )
  103.    ." re-initialized values, Mandelbrot restarting" cr
  104. ;
  105.  
  106. : INFORM.THE.CUSTOMER ( -- )
  107.   cr
  108.   ." ********************** USER SELECTED NEW REGION *************************"
  109.   cr cr
  110.   ." VALUES RESCALED TO LOOK NICE ( 1.0000 = 10000)" cr
  111.   ." acorner =" space acorner @ 10000 16384 */ . space
  112.   ." bcorner =" space bcorner @ 10000 16384 */ . cr
  113.   ." xgap =" space xgap @ 10000 16384 */ 1 max . space ." ten-thousandths" cr
  114.   ." ygap =" space ygap @ 10000 16384 */ 1 max . space ." ten-thousandths" cr cr
  115.   ." *************************************************************************"
  116.   cr
  117. ;
  118.  
  119. : SAVE.OLD.VALUES ( -- )
  120.   acorner @ xgap @ mandel-width @ * + real-lower-right !
  121.   bcorner @ ygap @ mandel-height @ * - imag-lower-right !
  122. ;
  123.   
  124. : CALC.NEW.VALUES ( -- )
  125.   top-x @ bot-x @ 2sort bot-x ! top-x !
  126.   top-y @ bot-y @ 2sort bot-y ! top-y !
  127.   top-x @ xgap @ * acorner @ + acorner !
  128.   bcorner @ top-y @ ygap @ * - bcorner !
  129.   bot-x @ xgap @ * top-x @ xgap @ * - mandel-width @  / 1 max xgap !
  130.   bot-y @ ygap @ * top-y @ ygap @ * - mandel-height @  / 1 max ygap !
  131.   inform.the.customer
  132. ;
  133.  
  134. : RECALCULATE.VALUES ( -- )
  135.   real-lower-right @ acorner @ - mandel-width @ / 1 max xgap !
  136.   bcorner @ imag-lower-right @ - mandel-height @ / 1 max ygap !
  137. ;
  138.  
  139. \ *************************** PROJECT MENU-1  **********************************
  140.  
  141. defer ..toggle.title
  142.  
  143. : QUIT.MANDEL
  144.   Quit? on
  145. ;
  146.  
  147. : SAVE.IFF ( -- )
  148.   wait.pointer
  149.   Show-title? @ if ..toggle.title then ( make sure no title bar showing)
  150.   ." SAVING SCREEN TO" space          ( your workbench screen back )
  151.   make.next.filename ." ..." flushemit
  152.   new mscreen-ptr @ curr-filename @ $screen>iff.nd
  153.   ." ... saved!" cr
  154.   crosshairs.pointer
  155. ;
  156.  
  157. : CLEANUP
  158.   restore.color.table
  159.   close.mandelscreen
  160.   free.mandelbitmap
  161.   Mandelbrot-Menu-1 ezmenu.free
  162.   Mandelbrot-Menu-2 ezmenu.free
  163.   Mandelbrot-Menu-3 ezmenu.free
  164.   cr ." closed screen, freed bitmap and menus ... bye bye" cr
  165. ;
  166.  
  167. : RESTART.MANDEL
  168.   init.mandelbrot
  169.   restart? on
  170. ;
  171.  
  172. : STARTING.IMAGE
  173.   gr.clear
  174.   show-title? @ IF ..toggle.title THEN ( hide title)
  175.   restore.mandel
  176.   ..toggle.title                       ( show title)
  177. ;
  178.  
  179.  
  180. : Mandelbrot-Menu-1.INIT
  181.   150 menuitem-defwidth !
  182.   3 Mandelbrot-Menu-1 ezmenu.alloc
  183.   0" project" 0 Mandelbrot-Menu-1 ezmenu.setup
  184. \ define text
  185.   0" Restart"    0 Mandelbrot-Menu-1 ezmenu.text!
  186.   0" Save IFF"   1 Mandelbrot-Menu-1 ezmenu.text!
  187.   0" Quit"       2 Mandelbrot-Menu-1 ezmenu.text!
  188. \ load stack with cfa's
  189.   ' quit.mandel ' save.IFF  ' restart.mandel 
  190.   3 0 do i Mandelbrot-Menu-1 ezmenu.cfa[] ! loop      ( unload stack)
  191.  
  192.   ascii R 0 Mandelbrot-Menu-1 ezmenu.commseq!  
  193.   ascii S 1 Mandelbrot-Menu-1 ezmenu.commseq! 
  194.   ascii Q 2 Mandelbrot-Menu-1 ezmenu.commseq!
  195.  
  196.   quit? off
  197.   cycle? off
  198.   restart? on
  199.   new-values? off
  200.   only-a-single-click? off
  201.   show-title? on
  202. ;
  203.  
  204. \ ******************************** SCREEN MENU 2 ******************************
  205.  
  206.  
  207. : TOGGLE.TITLE
  208.   Show-title? @ not Show-title? !
  209.   Mscreen-ptr @ Show-title? @ Showtitle()
  210. ;
  211.  
  212. ' toggle.title IS ..toggle.title
  213.  
  214. : CHOOSE.640x400  ( -- )
  215.   ." User selected 640x400 interlace, 16 colors" cr
  216.   save.old.values
  217.   set.640x400
  218.   recalculate.values
  219.   new-screen? on
  220. ;
  221.  
  222. : CHOOSE.320x200 ( -- )
  223.   ." User selected 320x200, 32 colors" cr
  224.   save.old.values
  225.   set.320x200
  226.   recalculate.values
  227.   new-screen? on
  228. ;
  229.  
  230. : CHOOSE.320x400 ( -- )
  231.   ." User selected 320x400 interlace, 32 colors" cr
  232.   save.old.values
  233.   set.320x400
  234.   recalculate.values
  235.   new-screen? on
  236. ;
  237.  
  238. : MANDELBROT-MENU-2.INIT
  239.   4 Mandelbrot-Menu-2 ezmenu.alloc
  240.   0" screen" 1 Mandelbrot-Menu-2 ezmenu.setup
  241. \ define text
  242.   0" 320x200"    0 Mandelbrot-Menu-2 ezmenu.text!
  243.   0" 320x400"    1 Mandelbrot-Menu-2 ezmenu.text!
  244.   0" 640x400"    2 Mandelbrot-Menu-2 ezmenu.text!
  245.   0" Title Bar?" 3 Mandelbrot-Menu-2 ezmenu.text!
  246. \ load stack with cfa's
  247.   ' toggle.title ' choose.640x400 ' choose.320x400 ' choose.320x200
  248.   4 0 do i Mandelbrot-Menu-2 ezmenu.cfa[] ! loop      ( unload stack)
  249.  
  250.   $ 06 0 Mandelbrot-Menu-2 ezmenu.exclude!
  251.   $ 05 1 Mandelbrot-Menu-2 ezmenu.exclude!
  252.   $ 03 2 Mandelbrot-Menu-2 ezmenu.exclude!
  253.  
  254.   ascii L 0 Mandelbrot-Menu-2 ezmenu.commseq!
  255.   ascii M 1 Mandelbrot-Menu-2 ezmenu.commseq!
  256.   ascii H 2 Mandelbrot-Menu-2 ezmenu.commseq!
  257.   ascii T 3 Mandelbrot-Menu-2 ezmenu.commseq! 
  258.  
  259.   CHECKED 0 Mandelbrot-Menu-2 ezmenu.set.flag  
  260. ;
  261.  
  262. \ **************************** CYCLE MENU 3 *******************************
  263.  
  264. : TOGGLE.CYCLE.FLAG ( -- )
  265.   Cycle? @ not cycle? !
  266.   cycle? @ not if restore.color.table then
  267. ;
  268.  
  269. : CYCLE.FAST ( -- )
  270.   0 cycle-speed !
  271. ;
  272.  
  273. : CYCLE.MEDIUM ( -- )
  274.   25 cycle-speed !
  275. ;
  276.  
  277. : CYCLE.SLOW ( -- )
  278.   50 cycle-speed !
  279. ;
  280.  
  281. : MANDELBROT-MENU-3.INIT
  282.   90 menuitem-defwidth !
  283.   4 Mandelbrot-Menu-3 ezmenu.alloc
  284.   0" cycle" 2 Mandelbrot-Menu-3 ezmenu.setup
  285. \ define text
  286.   0" cycle"     0 Mandelbrot-Menu-3 ezmenu.text!
  287.   0" slow"      1 Mandelbrot-Menu-3 ezmenu.text!
  288.   0" med"       2 Mandelbrot-Menu-3 ezmenu.text!
  289.   0" fast"      3 Mandelbrot-Menu-3 ezmenu.text!
  290. \ load stack with cfa's
  291.   ' cycle.fast ' cycle.medium ' cycle.slow ' toggle.cycle.flag 
  292.   4 0 do i Mandelbrot-Menu-3 ezmenu.cfa[] ! loop      ( unload stack)
  293.  
  294.   $ 01 0 Mandelbrot-Menu-3 ezmenu.exclude!
  295.   $ 0C 1 Mandelbrot-Menu-3 ezmenu.exclude!
  296.   $ 0A 2 Mandelbrot-Menu-3 ezmenu.exclude!
  297.   $ 06 3 Mandelbrot-Menu-3 ezmenu.exclude!
  298.  
  299.   ascii C 0 Mandelbrot-Menu-3 ezmenu.commseq!
  300.   CHECKED 3 Mandelbrot-Menu-3 ezmenu.set.flag
  301.   0 cycle-speed ! ( default to fast)
  302. ;
  303.  
  304. \ ****************************** init **************************************
  305.  
  306. : INIT.LINK.MENUS ( -- )
  307.   Mandelbrot-Menu-1.init
  308.   Mandelbrot-Menu-2.init
  309.   Mandelbrot-Menu-3.init
  310.   Mandelbrot-Menu-1 Mandelbrot-Menu-2 menu.linkto
  311.   Mandelbrot-Menu-2 Mandelbrot-Menu-3 menu.linkto
  312. ;
  313.   
  314. \ ******************************** EVENTS **********************************
  315.  
  316. : HANDLE.MANDELBROT.EVENT ( ev -- )
  317.   CASE
  318.  
  319.         MOUSEBUTTONS OF   ( check for up or down )
  320.                ev-last-code @ SELECTDOWN =
  321.                IF if-down on
  322.                   only-a-single-click? on
  323.                   ev.getxy00
  324.                   11 + ( adjust y, no title bar anymore) 
  325.                   swap 4 + swap ( adjust x too)
  326. \                  2dup  gr.move         ( DON'T WANT THIS!)
  327.                   2dup top-y ! top-x ! bot-y ! bot-x ! 
  328.                   top-x @ top-y @ bot-x @ bot-y @ gr.highlight
  329.                ELSE if-down off  ( released button!)
  330.                      only-a-single-click? @ 
  331.                      NOT IF new-values? on 
  332.                      ELSE top-x @ top-y @ bot-x @ bot-y @ gr.dehighlight
  333.                           new-values? off ( redundant but safe)
  334.                      THEN
  335.                THEN
  336.         ENDOF
  337.  
  338.         MOUSEMOVE OF if-down @
  339.            IF
  340.                only-a-single-click? off
  341.                top-x @ bot-x @ 2sort
  342.                top-y @ bot-y @ 2sort
  343.                >r swap r> gr.dehighlight
  344.                ev.getxy00               
  345.                11 + bot-y !   ( offsets for mouse position)
  346.                4 + bot-x !  
  347.                top-x @ bot-x @ 2sort
  348.                top-y @ bot-y @ 2sort
  349.                >r swap r> gr.highlight
  350.        THEN
  351.         ENDOF
  352.  
  353.     MENUPICK
  354.     OF ev-last-code @ Mandelbrot-Menu-1 ezmenu.exec
  355.     ENDOF
  356.  
  357.     CLOSEWINDOW ( take this out, or get the closebox happening!)
  358.      OF Quit? on
  359.     ENDOF
  360.  
  361.    ENDCASE
  362. ;
  363.  
  364. \ When one screen is generated, keep checking for menu events!
  365. : MANDELBROT.EV.LOOP
  366.   BEGIN
  367.         cycle? @ if Cycle.Colors.Once then
  368.     gr-curwindow @ ev.getclass ?dup
  369.       IF handle.mandelbrot.event
  370.     THEN
  371.     new-values? @ quit? @ OR restart? @ OR new-screen? @ OR 
  372.   UNTIL 
  373. ;
  374.  
  375. \ hang until mouse button clicked
  376. : WAIT.FOR.CLICK ( -- )
  377.   BEGIN
  378.     gr-curwindow @ ev.getclass ?dup
  379.     IF 
  380.     MOUSEBUTTONS = 
  381.      IF ev-last-code @ SELECTDOWN = 
  382.      ELSE false 
  383.      THEN    
  384.     ELSE false
  385.     THEN
  386.   UNTIL
  387. ;
  388.  
  389. : TEST.CLICK ( -- )
  390.   open.mandelscreen
  391.   wait.for.click
  392.   ." got the first one" cr
  393.   wait.for.click
  394.   ." got the second one" cr
  395.   close.mandelscreen
  396. ;
  397.