aboutsummaryrefslogtreecommitdiff
path: root/externals/gridflow/bin/pdnonegative
blob: d707f568434ccfdc4266d45d8e25c2e0a182b026 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/tclsh

set argh0 [file normalize [file join [pwd] $argv0]]
source [file dirname $argh0]/pd-tools.tcl

set toplefts {}

# for the recursion to work properly, restore should be checked before #N, and the check
# for #N shouldn't do "continue", as well as other tricky index stuff.
proc find_top_left {lines i} {
  global filename toplefts
  set toplefts_i [llength $toplefts]
  lappend toplefts [list patate poil] ;# temporary dummy value so that subpatches are represented in the correct order
  set j $i
  set xmin +9999; set ymin +9999
  set xmax -9999; set ymax -9999
  while {$i < [llength $lines]} {
    set list [split [lindex $lines $i] " "]
    if {[string compare [lindex $list 1] "connect"]==0} {incr i; continue}
    if {[string compare [lindex $list 1] "restore"]==0} {break}
    if {[string compare [lindex $list 0] "#N"]==0} {set i [find_top_left $lines [expr $i+1]]}
    set x [lindex $list 2]; if {$xmin > $x} {set xmin $x}; if {$xmax < $x} {set xmax $x}
    set y [lindex $list 3]; if {$ymin > $y} {set ymin $y}; if {$ymax < $y} {set ymax $y}
    incr i
  }
  puts [format "filename=%-32s patch at lines %4d thru %4d has xmin=%d ymin=%d xmax=%d ymax=%d" $filename $j $i $xmin $ymin $xmax $ymax]
  lset toplefts $toplefts_i [list $xmin $ymin]
  return $i
}

# somewhat copy-pasted from the above, sorry.
proc move_objects {lines i} {
  global toplefts fout
  set xymin [lindex $toplefts 0]
  set xmin [lindex $xymin 0]; if {$xmin > 0} {set xmin 0}
  set ymin [lindex $xymin 1]; if {$ymin > 0} {set ymin 0}
  set toplefts [lrange $toplefts 1 end]
  while {$i < [llength $lines]} {
    set list [split [lindex $lines $i] " "]
    if {[string compare [lindex $list 1] "connect"]==0} {puts $fout [pd_pickle $list]; incr i; continue}
    if {[string compare [lindex $list 1] "restore"]==0} {break}
    if {[string compare [lindex $list 0] "#N"]==0} {
      puts $fout [pd_pickle $list]
      set i [move_objects $lines [expr $i+1]]
      set list [split [lindex $lines $i] " "]
    }
    set x [expr [lindex $list 2]-$xmin]
    set y [expr [lindex $list 3]-$ymin]
    set list [lreplace $list 2 3 $x $y]
    puts $fout [pd_pickle $list]
    incr i
  }
  return $i
}

foreach filename $argv {
  set lines [pd_read_file $filename]
  find_top_left $lines 1
  #continue
  set fout [open $filename.new w]
  puts $fout [pd_pickle [lindex $lines 0]]
  move_objects $lines 1
  close $fout
  exec mv $filename $filename.old
  exec mv $filename.new $filename
}