#
# Create a World
#
# By George Peter Staplin
#
package require Tk

if 0 {
 1 0 0 0 0 0 0 0 0 0
 0 1 0 0 0 0 0 0 0 0
 0 0 1 0 0 0 0 0 0 0
 0 0 0 1 0 0 0 0 0 0
 0 0 0 0 1 0 0 0 0 0
 0 0 0 0 0 1 0 0 0 0
 0 0 0 0 0 0 1 0 0 0
 0 0 0 0 0 0 0 1 0 0
 0 0 0 0 0 0 0 0 1 0
 0 0 0 0 0 0 0 0 0 1
 1 1 0 0 0 0 0 0 0 0
 1 0 1 0 0 0 0 0 0 0
 1 0 0 1 0 0 0 0 0 0
 1 0 0 0 1 0 0 0 0 0
 1 0 0 0 0 1 0 0 0 0
 1 0 0 0 0 0 1 0 0 0
 1 0 0 0 0 0 0 1 0 0
 1 0 0 0 0 0 0 0 1 0
 1 0 0 0 0 0 0 0 0 1
 0 1 1 0 0 0 0 0 0 0
 0 1 0 1 0 0 0 0 0 0
 0 1 0 0 1 0 0 0 0 0 
 0 1 0 0 0 1 0 0 0 0
 ...
}

proc zoom.image {img xratio yratio} {
 set result [image create photo]
 $result copy $img -zoom $xratio $yratio
 return $result
}

proc init.array size {
 for {set i 0} {$i < $size} {incr i} {
  #
  # Initialize all points to a value that results in no display.
  #
  set ::points($i) -1
 }
}

proc generate.image {img size} {
 $img blank

 set cursor 0

 while 1 {
  incr ::points($cursor)
  if {$::points($cursor) >= $size} {
   set ::points($cursor) 0
   incr cursor
  } else {
   break
  }
 }

 for {set p 0} {$p < $size} {incr p} {
  if {$::points($p) < 0} {
   break
  }
  set y [expr {$::points($p) / [$img cget -width]}]
  set x [expr {$::points($p) % [$img cget -width]}]

  $img put "#ffffff" -to $x $y
 }
}

proc do.generation {img size} {
 set last [expr {$size - 1}]

 if {$::points($last) > [$img cget -width]} {
  return
 }

 generate.image $img $size
 
 set old [.l cget -image]

 if {"" ne $old} {
  image delete $old
 }

 .l config -image [zoom.image $img 10 10]

 after 1 [list do.generation $img $size]
}

proc main {} {

 set width 5
 set height 5

 . config -bg black

 set img [image create photo -width $width -height $height]

 set size [expr {$width * $height}]
 init.array $size

 pack [label .l -bg black -fg white] -fill both -expand 1

 do.generation $img $size
}
main
