11from __future__ import absolute_import , print_function
22
3- print ("imports..." )
4-
53import time # after imports
64import random # add comments
7- import math # as work-a-round
85import sys # for:
96from colorsys import hsv_to_rgb # https://github.com/rfk/pypyjs/issues/109
107
118import js # from PyPy.js
129
10+
11+ PY2 = sys .version_info [0 ] == 2
12+ if PY2 :
13+ # Python 2
14+ range = xrange
15+
16+
1317CANVAS_ID = "#mandelbrot"
1418PROGRESS_BAR_ID = "#progress-bar"
1519
20+
1621class jQuery (object ):
1722 def __init__ (self ):
1823 self .jquery = js .globals ["$" ]
@@ -57,6 +62,40 @@ def reset(self):
5762 self .context = self .canvas .getContext ('2d' )
5863
5964
65+ def interlace_generator (limit ):
66+ def gen_pow (limit ):
67+ interlace_steps = []
68+ step = 0
69+ while True :
70+ value = 2 ** step
71+ if value >= limit :
72+ return interlace_steps
73+ interlace_steps .append (value )
74+ step += 1
75+ interlace_steps = gen_pow (limit )
76+ interlace_steps .reverse ()
77+ #~ print("interlace_steps:", interlace_steps)
78+
79+ pos = 0
80+ step = 1
81+ iteration = 0
82+ size = interlace_steps [iteration ]
83+
84+ while True :
85+ yield (pos , size )
86+ pos += (size * step )
87+
88+ if pos > limit :
89+ step = 2
90+ iteration += 1
91+ try :
92+ size = interlace_steps [iteration ]
93+ except IndexError :
94+ return
95+
96+ pos = size
97+
98+
6099class Mandelbrot (object ):
61100 """
62101 FIXME: interlace rendering is not accurate, yet!
@@ -78,18 +117,18 @@ def reset(self):
78117 self .y = 0
79118 self .step = self .height // 4
80119 self .line_count = 0
81- self .rendered_lines = []
82120 self .last_update = self .start_time = time .time ()
83121 self .last_pos = 0
84122 self .done = False
123+ self .interlace_generator = interlace_generator (self .height )
85124
86125 def setup (self ):
87126 self .left = float (jquery .get_by_id ("#left" ).val ())
88127 self .right = float (jquery .get_by_id ("#right" ).val ())
89128 self .top = float (jquery .get_by_id ("#top" ).val ())
90129 self .bottom = float (jquery .get_by_id ("#bottom" ).val ())
91130
92- print ("%.2f %.2f %.2f %.2f " % (self .left , self .right , self .top , self .bottom ))
131+ print ("%f %f %f %f " % (self .left , self .right , self .top , self .bottom ))
93132
94133 self .iterations = int (jquery .get_by_id ("#iterations" ).val ())
95134
@@ -190,7 +229,7 @@ def _render_line(self, canvas, color_func, y, left, right, top, bottom, width, h
190229 top + y * (bottom - top ) / height
191230 )
192231 norm = abs (z ) ** 2
193- for count in xrange (iterations ):
232+ for count in range (iterations ):
194233 if norm <= 4 :
195234 z = z * z + c
196235 norm = abs (z * z )
@@ -204,40 +243,29 @@ def render_mandelbrot(self):
204243 if not self .running or self .done :
205244 return
206245
207- rect_height = 1
208- # rect_height = self.step # FIXME
209246 next_return = time .time () + 0.5
210247 while time .time () < next_return :
211- if self .y >= self .height :
212- if self .step <= 1 :
213- self .done = True
214- duration = time .time () - self .start_time
215- self .display_stats () # Should display 100% ;)
216- print (len (self .rendered_lines ), "lines are rendered" )
217- msg = "%ix%ipx Rendered in %iSec." % (self .width , self .height , duration )
218- print (msg )
219- print (" --- END --- " )
220- return
221-
222- # canvas.draw_rect(x=0, y=0, r=128, g=0, b=0, alpha=128, width=self.step, height=self.height) # debug
223- self .step = int (math .floor (self .step / 2.0 ))
224- # rect_height = self.step # FIXME
225- self .y = 0
226- print ("Render step: %i" % self .step )
227-
228- if self .y not in self .rendered_lines :
229- self ._render_line (
230- self .canvas ,
231- self .color_func ,
232- self .y ,
233- self .left , self .right , self .top , self .bottom ,
234- self .width , self .height , self .iterations ,
235- rect_height
236- )
237- self .line_count += 1
238- self .rendered_lines .append (self .y )
239-
240- self .y += self .step
248+ try :
249+ y , size = self .interlace_generator .next ()
250+ except StopIteration :
251+ self .done = True
252+ duration = time .time () - self .start_time
253+ self .display_stats () # Should display 100% ;)
254+ print (len (self .rendered_lines ), "lines are rendered" )
255+ msg = "%ix%ipx Rendered in %iSec." % (self .width , self .height , duration )
256+ print (msg )
257+ print (" --- END --- " )
258+ return
259+
260+ self ._render_line (
261+ self .canvas ,
262+ self .color_func ,
263+ y ,
264+ self .left , self .right , self .top , self .bottom ,
265+ self .width , self .height , self .iterations ,
266+ rect_height = size
267+ )
268+ self .line_count += 1
241269
242270 self .display_stats ()
243271
@@ -270,8 +298,6 @@ def display_stats(self):
270298 mandelbrot = Mandelbrot (canvas )
271299 mandelbrot .setup ()
272300
273- jquery .jquery ("h1" ).append (" - " + mandelbrot .color_func .__name__ )
274-
275301 @js .Function
276302 def pause_mandelbrot (event ):
277303 if mandelbrot .running :
@@ -298,6 +324,16 @@ def update_mandelbrot(event):
298324 update_button = jquery .get_by_id ("#update" )
299325 update_button .click (update_mandelbrot )
300326
327+
328+ @js .Function
329+ def data_form_change (event ):
330+ print ("form, changed:" )
331+ update_mandelbrot (event )
332+
333+ data_form = jquery .get_by_id ("#data_form" )
334+ data_form .change (data_form_change )
335+
336+
301337 @js .Function
302338 def render_mandelbrot ():
303339 mandelbrot .render_mandelbrot ()
0 commit comments