RFX-GIMP

Hex Artifact Content
Login

Artifact e944a35413cb02d1f91644273e86823ea8b7871d:


0000: 53 63 72 69 70 74 20 66 69 6c 65 20 67 65 6e 65  Script file gene
0010: 72 61 74 65 64 20 66 72 6f 6d 20 4c 69 56 45 53  rated from LiVES
0020: 0a 0a 3c 64 65 66 69 6e 65 3e 0a 7c 31 2e 37 0a  ..<define>.|1.7.
0030: 3c 2f 64 65 66 69 6e 65 3e 0a 0a 3c 6e 61 6d 65  </define>..<name
0040: 3e 0a 6a 69 67 73 61 77 0a 3c 2f 6e 61 6d 65 3e  >.jigsaw.</name>
0050: 0a 0a 3c 76 65 72 73 69 6f 6e 3e 0a 31 0a 3c 2f  ..<version>.1.</
0060: 76 65 72 73 69 6f 6e 3e 0a 0a 3c 61 75 74 68 6f  version>..<autho
0070: 72 3e 0a 73 61 75 6c 67 6f 6f 64 65 7c 68 74 74  r>.saulgoode|htt
0080: 70 3a 2f 2f 63 68 69 73 65 6c 61 70 70 2e 63 6f  p://chiselapp.co
0090: 6d 2f 75 73 65 72 2f 73 61 75 6c 67 6f 6f 64 65  m/user/saulgoode
00a0: 2f 72 65 70 6f 73 69 74 6f 72 79 2f 52 46 58 2d  /repository/RFX-
00b0: 47 49 4d 50 2f 68 6f 6d 65 0a 3c 2f 61 75 74 68  GIMP/home.</auth
00c0: 6f 72 3e 0a 0a 3c 64 65 73 63 72 69 70 74 69 6f  or>..<descriptio
00d0: 6e 3e 0a 4a 69 67 73 61 77 7c 6a 69 67 73 61 77  n>.Jigsaw|jigsaw
00e0: 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 7c 31   transitioning|1
00f0: 7c 32 7c 0a 3c 2f 64 65 73 63 72 69 70 74 69 6f  |2|.</descriptio
0100: 6e 3e 0a 0a 3c 72 65 71 75 69 72 65 73 3e 0a 67  n>..<requires>.g
0110: 69 6d 70 0a 3c 2f 72 65 71 75 69 72 65 73 3e 0a  imp.</requires>.
0120: 0a 3c 70 61 72 61 6d 73 3e 0a 68 6f 72 69 7a 5f  .<params>.horiz_
0130: 70 69 65 63 65 73 7c 48 6f 72 69 7a 6f 6e 74 61  pieces|Horizonta
0140: 6c 20 70 69 65 63 65 73 7c 6e 75 6d 30 7c 30 7c  l pieces|num0|0|
0150: 30 7c 31 30 30 30 30 30 30 7c 0a 76 65 72 74 5f  0|1000000|.vert_
0160: 70 69 65 63 65 73 7c 56 65 72 74 69 63 61 6c 20  pieces|Vertical 
0170: 70 69 65 63 65 73 7c 6e 75 6d 30 7c 30 7c 30 7c  pieces|num0|0|0|
0180: 31 30 30 30 30 30 30 7c 0a 63 75 72 76 65 79 5f  1000000|.curvey_
0190: 65 64 67 65 73 7c 43 75 72 76 65 79 20 65 64 67  edges|Curvey edg
01a0: 65 73 7c 62 6f 6f 6c 7c 30 7c 0a 63 6c 69 70 5f  es|bool|0|.clip_
01b0: 70 6f 73 69 74 69 6f 6e 7c 43 6c 69 70 62 6f 61  position|Clipboa
01c0: 72 64 20 70 6f 73 69 74 69 6f 6e 69 6e 67 7c 73  rd positioning|s
01d0: 74 72 69 6e 67 5f 6c 69 73 74 7c 30 7c 4e 6f 72  tring_list|0|Nor
01e0: 6d 61 6c 7c 43 65 6e 74 65 72 65 64 7c 53 63 61  mal|Centered|Sca
01f0: 6c 65 64 7c 0a 3c 2f 70 61 72 61 6d 73 3e 0a 0a  led|.</params>..
0200: 3c 70 61 72 61 6d 5f 77 69 6e 64 6f 77 3e 0a 6c  <param_window>.l
0210: 61 79 6f 75 74 7c 70 30 7c 70 31 7c 0a 6c 61 79  ayout|p0|p1|.lay
0220: 6f 75 74 7c 70 32 7c 0a 6c 61 79 6f 75 74 7c 68  out|p2|.layout|h
0230: 73 65 70 61 72 61 74 6f 72 7c 0a 6c 61 79 6f 75  separator|.layou
0240: 74 7c 70 33 7c 70 34 7c 0a 3c 2f 70 61 72 61 6d  t|p3|p4|.</param
0250: 5f 77 69 6e 64 6f 77 3e 0a 0a 3c 70 72 6f 70 65  _window>..<prope
0260: 72 74 69 65 73 3e 0a 30 78 30 30 30 30 0a 3c 2f  rties>.0x0000.</
0270: 70 72 6f 70 65 72 74 69 65 73 3e 0a 0a 3c 6c 61  properties>..<la
0280: 6e 67 75 61 67 65 5f 63 6f 64 65 3e 0a 30 78 46  nguage_code>.0xF
0290: 30 0a 3c 2f 6c 61 6e 67 75 61 67 65 5f 63 6f 64  0.</language_cod
02a0: 65 3e 0a 0a 3c 70 72 65 3e 0a 23 20 54 68 69 73  e>..<pre>.# This
02b0: 20 70 72 6f 67 72 61 6d 20 69 73 20 66 72 65 65   program is free
02c0: 20 73 6f 66 74 77 61 72 65 3b 20 79 6f 75 20 63   software; you c
02d0: 61 6e 20 72 65 64 69 73 74 72 69 62 75 74 65 20  an redistribute 
02e0: 69 74 20 61 6e 64 2f 6f 72 20 6d 6f 64 69 66 79  it and/or modify
02f0: 0a 23 20 69 74 20 75 6e 64 65 72 20 74 68 65 20  .# it under the 
0300: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 47 4e 55  terms of the GNU
0310: 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20   General Public 
0320: 4c 69 63 65 6e 73 65 20 76 65 72 73 69 6f 6e 20  License version 
0330: 33 20 6f 72 20 68 69 67 68 65 72 0a 23 20 61 73  3 or higher.# as
0340: 20 70 75 62 6c 69 73 68 65 64 20 62 79 20 74 68   published by th
0350: 65 20 46 72 65 65 20 53 6f 66 74 77 61 72 65 20  e Free Software 
0360: 46 6f 75 6e 64 61 74 69 6f 6e 2e 0a 0a 75 73 65  Foundation...use
0370: 20 49 4f 3a 3a 53 6f 63 6b 65 74 3b 20 0a 75 73   IO::Socket; .us
0380: 65 20 54 65 78 74 3a 3a 42 61 6c 61 6e 63 65 64  e Text::Balanced
0390: 3b 0a 0a 69 66 20 28 24 45 4e 56 7b 27 52 46 58  ;..if ($ENV{'RFX
03a0: 47 49 4d 50 5f 50 4f 52 54 27 7d 29 20 7b 0a 20  GIMP_PORT'}) {. 
03b0: 20 24 72 66 78 5f 70 6f 72 74 20 3d 20 24 45 4e   $rfx_port = $EN
03c0: 56 7b 27 52 46 58 47 49 4d 50 5f 50 4f 52 54 27  V{'RFXGIMP_PORT'
03d0: 7d 3b 0a 20 20 7d 0a 65 6c 73 65 20 7b 0a 20 20  };.  }.else {.  
03e0: 24 72 66 78 5f 70 6f 72 74 20 3d 20 31 30 30 30  $rfx_port = 1000
03f0: 38 3b 20 0a 20 20 7d 0a 0a 24 73 6f 63 6b 20 3d  8; .  }..$sock =
0400: 20 6e 65 77 20 49 4f 3a 3a 53 6f 63 6b 65 74 3a   new IO::Socket:
0410: 3a 49 4e 45 54 20 28 20 50 65 65 72 41 64 64 72  :INET ( PeerAddr
0420: 20 3d 3e 20 27 6c 6f 63 61 6c 68 6f 73 74 27 2c   => 'localhost',
0430: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
0440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0450: 20 50 65 65 72 50 6f 72 74 20 3d 3e 20 24 72 66   PeerPort => $rf
0460: 78 5f 70 6f 72 74 2c 20 0a 20 20 20 20 20 20 20  x_port, .       
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 20 20 20 20 20 20 20 50 72 6f 74 6f 20 3d 3e          Proto =>
0490: 20 27 74 63 70 27 20 0a 20 20 20 20 20 20 20 20   'tcp' .        
04a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04b0: 20 20 20 20 20 20 20 29 3b 0a 69 66 20 28 20 6e         );.if ( n
04c0: 6f 74 20 64 65 66 69 6e 65 64 20 24 73 6f 63 6b  ot defined $sock
04d0: 20 29 20 7b 0a 20 20 6d 79 20 24 72 66 78 5f 70   ) {.  my $rfx_p
04e0: 69 64 20 3d 20 66 6f 72 6b 28 29 3b 0a 20 20 69  id = fork();.  i
04f0: 66 20 28 6e 6f 74 20 64 65 66 69 6e 65 64 20 24  f (not defined $
0500: 72 66 78 5f 70 69 64 29 20 7b 0a 20 20 20 20 26  rfx_pid) {.    &
0510: 73 69 67 5f 65 72 72 6f 72 28 22 55 4e 41 42 4c  sig_error("UNABL
0520: 45 20 54 4f 20 45 58 45 43 55 54 45 20 47 49 4d  E TO EXECUTE GIM
0530: 50 3a 20 4e 6f 74 20 65 6e 6f 75 67 68 20 72 65  P: Not enough re
0540: 73 6f 75 72 63 65 73 22 29 3b 0a 20 20 20 20 7d  sources");.    }
0550: 20 0a 20 20 65 6c 73 69 66 20 28 24 72 66 78 5f   .  elsif ($rfx_
0560: 70 69 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  pid == 0) {.    
0570: 69 66 20 28 20 2d 66 20 24 74 6d 70 64 69 72 20  if ( -f $tmpdir 
0580: 2e 20 22 72 66 78 67 69 6d 70 2e 70 69 64 22 29  . "rfxgimp.pid")
0590: 20 7b 0a 20 20 20 20 20 20 6f 70 65 6e 28 50 49   {.      open(PI
05a0: 44 46 49 4c 45 2c 20 24 74 6d 70 64 69 72 20 2e  DFILE, $tmpdir .
05b0: 20 22 72 66 78 67 69 6d 70 2e 70 69 64 22 29 3b   "rfxgimp.pid");
05c0: 0a 20 20 20 20 20 20 23 20 73 68 6f 75 6c 64 20  .      # should 
05d0: 70 72 6f 62 61 62 6c 79 20 64 6f 20 73 6f 6d 65  probably do some
05e0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
05f0: 20 66 6f 72 20 74 68 65 20 6f 66 66 20 63 68 61   for the off cha
0600: 6e 63 65 20 74 68 61 74 0a 20 20 20 20 20 20 23  nce that.      #
0610: 20 74 68 65 20 50 49 44 20 68 61 73 20 62 65 65   the PID has bee
0620: 6e 20 72 65 63 79 63 6c 65 64 20 6f 72 20 74 68  n recycled or th
0630: 65 20 73 79 73 74 65 6d 20 68 61 73 20 72 65 62  e system has reb
0640: 6f 6f 74 65 64 20 28 65 2e 67 2c 20 63 68 65 63  ooted (e.g, chec
0650: 6b 0a 20 20 20 20 20 20 23 20 69 66 20 70 72 6f  k.      # if pro
0660: 63 65 73 73 20 77 61 73 20 65 78 65 63 75 74 65  cess was execute
0670: 64 20 77 69 74 68 20 2f 75 73 72 2f 62 69 6e 2f  d with /usr/bin/
0680: 70 65 72 6c 2e 20 42 75 74 20 66 6f 72 20 6e 6f  perl. But for no
0690: 77 2e 2e 2e 0a 20 20 20 20 20 20 6b 69 6c 6c 28  w....      kill(
06a0: 31 35 2c 20 2d 3c 50 49 44 46 49 4c 45 3e 29 3b  15, -<PIDFILE>);
06b0: 20 23 20 74 68 65 20 6e 65 67 61 74 69 76 65 20   # the negative 
06c0: 50 49 44 20 6d 65 61 6e 73 20 6b 69 6c 6c 20 61  PID means kill a
06d0: 6c 6c 20 63 68 69 6c 64 72 65 6e 2c 20 74 6f 6f  ll children, too
06e0: 2e 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 50 49  ..      close(PI
06f0: 44 46 49 4c 45 29 3b 0a 20 20 20 20 20 20 7d 0a  DFILE);.      }.
0700: 20 20 20 20 73 65 74 70 67 69 64 28 24 24 2c 30      setpgid($$,0
0710: 29 3b 20 23 20 63 68 61 6e 67 65 20 74 68 65 20  ); # change the 
0720: 70 67 72 6f 75 70 20 74 6f 20 74 68 69 73 20 66  pgroup to this f
0730: 6f 72 6b 65 64 20 70 72 6f 63 65 73 73 2c 20 72  orked process, r
0740: 61 74 68 65 72 20 74 68 61 6e 0a 20 20 20 20 20  ather than.     
0750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
0760: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c 69 56  the original LiV
0770: 45 53 20 28 73 6f 20 74 68 61 74 20 77 65 20 64  ES (so that we d
0780: 6f 6e 27 74 20 6b 69 6c 6c 20 4c 69 56 45 53 20  on't kill LiVES 
0790: 77 68 65 6e 20 0a 20 20 20 20 20 20 20 20 20 20  when .          
07a0: 20 20 20 20 20 20 20 20 20 23 20 74 68 69 73 20           # this 
07b0: 70 72 67 72 6f 75 70 20 69 73 20 6b 69 6c 6c 65  prgroup is kille
07c0: 64 29 2e 0a 20 20 20 20 6f 70 65 6e 28 50 49 44  d)..    open(PID
07d0: 46 49 4c 45 2c 20 22 3e 22 20 2e 20 24 74 6d 70  FILE, ">" . $tmp
07e0: 64 69 72 20 2e 20 22 72 66 78 67 69 6d 70 2e 70  dir . "rfxgimp.p
07f0: 69 64 22 29 3b 20 23 20 6f 76 65 72 77 72 69 74  id"); # overwrit
0800: 65 20 6f 6c 64 20 66 69 6c 65 0a 20 20 20 20 70  e old file.    p
0810: 72 69 6e 74 20 50 49 44 46 49 4c 45 20 24 24 3b  rint PIDFILE $$;
0820: 0a 20 20 20 20 63 6c 6f 73 65 28 50 49 44 46 49  .    close(PIDFI
0830: 4c 45 29 3b 0a 20 20 20 20 6d 79 20 24 73 74 61  LE);.    my $sta
0840: 72 74 5f 67 69 6d 70 20 3d 20 71 71 7b 20 67 69  rt_gimp = qq{ gi
0850: 6d 70 20 2d 69 20 2d 62 20 22 28 70 6c 75 67 2d  mp -i -b "(plug-
0860: 69 6e 2d 73 63 72 69 70 74 2d 66 75 2d 73 65 72  in-script-fu-ser
0870: 76 65 72 20 31 20 24 72 66 78 5f 70 6f 72 74 20  ver 1 $rfx_port 
0880: 5c 5c 5c 22 5c 5c 5c 22 29 22 20 26 20 7d 3b 0a  \\\"\\\")" & };.
0890: 20 20 20 20 73 79 73 74 65 6d 20 28 20 24 73 74      system ( $st
08a0: 61 72 74 5f 67 69 6d 70 20 29 3b 20 23 20 74 68  art_gimp ); # th
08b0: 6f 75 67 68 20 73 74 61 72 74 65 64 20 61 73 20  ough started as 
08c0: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
08d0: 2c 20 47 49 4d 50 20 6e 6f 77 0a 20 20 20 20 20  , GIMP now.     
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 20 20 20 20 20 20 23 20 69 73 20 70 61 72 74         # is part
0900: 20 6f 66 20 74 68 69 73 20 73 70 61 77 6e 65 64   of this spawned
0910: 20 63 68 69 6c 64 27 73 20 70 67 72 6f 75 70 2c   child's pgroup,
0920: 20 6e 6f 74 20 74 68 65 20 4c 69 56 45 53 20 70   not the LiVES p
0930: 67 72 6f 75 70 0a 20 20 20 20 73 6c 65 65 70 28  group.    sleep(
0940: 29 3b 20 23 20 64 6f 20 6e 6f 74 68 69 6e 67 2c  ); # do nothing,
0950: 20 66 6f 72 65 76 65 72 0a 20 20 20 20 26 73 69   forever.    &si
0960: 67 5f 65 72 72 6f 72 28 22 47 49 4d 50 20 6b 69  g_error("GIMP ki
0970: 6c 6c 65 64 20 62 79 20 65 78 74 65 72 6e 61 6c  lled by external
0980: 20 70 72 6f 63 65 73 73 5c 6e 22 29 3b 0a 20 20   process\n");.  
0990: 20 20 7d 0a 20 20 65 6c 73 65 20 7b 0a 20 20 20    }.  else {.   
09a0: 20 77 68 69 6c 65 20 28 6e 6f 74 20 64 65 66 69   while (not defi
09b0: 6e 65 64 20 24 73 6f 63 6b 29 20 7b 0a 20 20 20  ned $sock) {.   
09c0: 20 20 20 73 6c 65 65 70 20 28 31 29 3b 0a 20 20     sleep (1);.  
09d0: 20 20 20 20 24 73 6f 63 6b 20 3d 20 6e 65 77 20      $sock = new 
09e0: 49 4f 3a 3a 53 6f 63 6b 65 74 3a 3a 49 4e 45 54  IO::Socket::INET
09f0: 20 28 20 50 65 65 72 41 64 64 72 20 3d 3e 20 27   ( PeerAddr => '
0a00: 6c 6f 63 61 6c 68 6f 73 74 27 2c 20 0a 20 20 20  localhost', .   
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a30: 20 20 50 65 65 72 50 6f 72 74 20 3d 3e 20 24 72    PeerPort => $r
0a40: 66 78 5f 70 6f 72 74 2c 20 0a 20 20 20 20 20 20  fx_port, .      
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
0a70: 72 6f 74 6f 20 3d 3e 20 27 74 63 70 27 20 0a 20  roto => 'tcp' . 
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
0ab0: 20 20 20 7d 0a 20 20 7d 0a 0a 23 20 44 65 66 69     }.  }..# Defi
0ac0: 6e 65 20 61 20 50 65 72 6c 20 73 75 62 72 6f 75  ne a Perl subrou
0ad0: 74 69 6e 65 20 66 6f 72 20 73 65 6e 64 69 6e 67  tine for sending
0ae0: 20 6d 65 73 73 61 67 65 73 20 74 6f 20 74 68 65   messages to the
0af0: 20 53 46 20 73 65 72 76 65 72 20 61 6e 64 20 77   SF server and w
0b00: 61 69 74 69 6e 67 0a 23 20 66 6f 72 20 61 20 72  aiting.# for a r
0b10: 65 73 70 6f 6e 73 65 2e 0a 23 0a 73 75 62 20 72  esponse..#.sub r
0b20: 66 78 5f 73 65 6e 64 6d 73 67 20 7b 0a 20 20 6d  fx_sendmsg {.  m
0b30: 79 20 24 6d 65 73 73 61 67 65 20 3d 20 24 5f 5b  y $message = $_[
0b40: 30 5d 3b 0a 20 20 6d 79 20 24 6c 65 6e 20 3d 20  0];.  my $len = 
0b50: 6c 65 6e 67 74 68 20 28 24 6d 65 73 73 61 67 65  length ($message
0b60: 29 3b 0a 20 20 69 66 20 28 24 6c 65 6e 20 3e 20  );.  if ($len > 
0b70: 36 35 35 33 35 29 20 7b 0a 20 20 20 20 26 73 69  65535) {.    &si
0b80: 67 5f 65 72 72 6f 72 28 22 45 52 52 4f 52 3a 20  g_error("ERROR: 
0b90: 73 63 72 69 70 74 20 69 73 20 74 6f 6f 20 6c 6f  script is too lo
0ba0: 6e 67 20 66 6f 72 20 6f 6e 65 20 73 65 72 76 65  ng for one serve
0bb0: 72 20 72 65 71 75 65 73 74 3a 20 24 6c 65 6e 20  r request: $len 
0bc0: 3e 20 36 35 35 33 35 22 29 3b 0a 20 20 20 20 7d  > 65535");.    }
0bd0: 3b 0a 20 20 23 20 73 65 6e 64 20 73 63 72 69 70  ;.  # send scrip
0be0: 74 20 74 6f 20 47 49 4d 50 0a 20 20 6d 79 20 24  t to GIMP.  my $
0bf0: 68 65 61 64 65 72 20 3d 20 70 61 63 6b 28 20 27  header = pack( '
0c00: 61 6e 27 2c 20 27 47 27 2c 20 24 6c 65 6e 29 3b  an', 'G', $len);
0c10: 0a 20 20 73 79 73 77 72 69 74 65 28 20 24 73 6f  .  syswrite( $so
0c20: 63 6b 2c 20 24 5f 20 29 20 66 6f 72 20 28 24 68  ck, $_ ) for ($h
0c30: 65 61 64 65 72 2c 20 24 6d 65 73 73 61 67 65 29  eader, $message)
0c40: 3b 0a 20 20 23 20 77 61 69 74 20 66 6f 72 20 72  ;.  # wait for r
0c50: 65 73 70 6f 6e 73 65 0a 20 20 6d 79 20 24 72 69  esponse.  my $ri
0c60: 6e 20 3d 20 27 27 3b 0a 20 20 76 65 63 28 20 24  n = '';.  vec( $
0c70: 72 69 6e 2c 20 66 69 6c 65 6e 6f 28 24 73 6f 63  rin, fileno($soc
0c80: 6b 29 2c 20 31 20 29 20 3d 20 31 3b 0a 20 20 73  k), 1 ) = 1;.  s
0c90: 65 6c 65 63 74 28 20 24 72 69 6e 2c 20 20 75 6e  elect( $rin,  un
0ca0: 64 65 66 2c 20 75 6e 64 65 66 2c 20 75 6e 64 65  def, undef, unde
0cb0: 66 20 29 3b 20 20 20 20 23 20 77 61 69 74 20 28  f );    # wait (
0cc0: 66 6f 72 65 76 65 72 29 20 66 6f 72 20 72 65 73  forever) for res
0cd0: 70 6f 6e 73 65 20 73 74 61 72 74 0a 20 20 73 65  ponse start.  se
0ce0: 6c 65 63 74 28 20 75 6e 64 65 66 2c 20 75 6e 64  lect( undef, und
0cf0: 65 66 2c 20 75 6e 64 65 66 2c 20 2e 31 20 29 3b  ef, undef, .1 );
0d00: 20 20 20 20 20 20 20 23 20 77 61 69 74 20 61 20         # wait a 
0d10: 62 69 74 20 66 6f 72 20 72 65 73 70 6f 6e 73 65  bit for response
0d20: 20 74 6f 20 66 69 6e 69 73 68 0a 20 20 20 20 20   to finish.     
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 20 20 20 23 20 20 69 6e 63 72 65 61 73        #  increas
0d60: 65 20 77 61 69 74 20 69 66 20 49 4e 56 41 4c 49  e wait if INVALI
0d70: 44 2f 49 4e 43 4f 4d 50 4c 45 54 45 20 52 45 53  D/INCOMPLETE RES
0d80: 50 4f 4e 53 45 20 6f 63 63 75 72 73 0a 20 20 23  PONSE occurs.  #
0d90: 20 72 65 73 70 6f 6e 73 65 0a 20 20 24 6c 65 6e   response.  $len
0da0: 20 3d 20 73 79 73 72 65 61 64 28 20 24 73 6f 63   = sysread( $soc
0db0: 6b 2c 20 24 68 65 61 64 65 72 2c 20 34 20 29 20  k, $header, 4 ) 
0dc0: 6f 72 20 26 73 69 67 5f 65 72 72 6f 72 28 22 49  or &sig_error("I
0dd0: 4e 56 41 4c 49 44 20 52 45 53 50 4f 4e 53 45 3a  NVALID RESPONSE:
0de0: 20 65 6d 70 74 79 20 72 65 73 70 6f 6e 73 65 22   empty response"
0df0: 29 3b 0a 20 20 28 20 24 6c 65 6e 20 3d 3d 20 34  );.  ( $len == 4
0e00: 20 61 6e 64 20 24 68 65 61 64 65 72 20 3d 7e 20   and $header =~ 
0e10: 2f 5e 47 2f 20 29 20 6f 72 20 26 73 69 67 5f 65  /^G/ ) or &sig_e
0e20: 72 72 6f 72 28 22 49 4e 56 41 4c 49 44 20 52 45  rror("INVALID RE
0e30: 53 50 4f 4e 53 45 3a 20 62 61 64 20 68 65 61 64  SPONSE: bad head
0e40: 65 72 22 29 3b 0a 20 20 6d 79 20 24 73 74 61 74  er");.  my $stat
0e50: 75 73 3b 0a 20 20 28 24 73 74 61 74 75 73 2c 20  us;.  ($status, 
0e60: 24 6c 65 6e 29 20 3d 20 75 6e 70 61 63 6b 28 20  $len) = unpack( 
0e70: 27 78 43 6e 27 2c 20 24 68 65 61 64 65 72 20 29  'xCn', $header )
0e80: 3b 0a 20 20 6d 79 20 24 72 65 73 70 6f 6e 73 65  ;.  my $response
0e90: 3b 0a 20 20 28 20 73 79 73 72 65 61 64 28 20 24  ;.  ( sysread( $
0ea0: 73 6f 63 6b 2c 20 24 72 65 73 70 6f 6e 73 65 2c  sock, $response,
0eb0: 20 24 6c 65 6e 20 29 20 3d 3d 20 24 6c 65 6e 20   $len ) == $len 
0ec0: 29 20 6f 72 20 26 73 69 67 5f 65 72 72 6f 72 28  ) or &sig_error(
0ed0: 22 49 4e 43 4f 4d 50 4c 45 54 45 20 52 45 53 50  "INCOMPLETE RESP
0ee0: 4f 4e 53 45 3a 20 24 72 65 73 70 6f 6e 73 65 22  ONSE: $response"
0ef0: 29 3b 0a 20 20 23 20 65 78 69 74 20 69 66 20 72  );.  # exit if r
0f00: 65 73 70 6f 6e 73 65 20 69 73 20 6e 6f 74 20 22  esponse is not "
0f10: 53 75 63 63 65 73 73 22 0a 20 20 69 66 20 28 20  Success".  if ( 
0f20: 24 73 74 61 74 75 73 20 61 6e 64 20 24 72 65 73  $status and $res
0f30: 70 6f 6e 73 65 20 3d 7e 20 2f 5e 45 72 72 6f 72  ponse =~ /^Error
0f40: 3a 20 53 75 63 63 65 73 73 5c 6e 2f 69 20 29 20  : Success\n/i ) 
0f50: 7b 0a 20 20 20 20 26 73 69 67 5f 65 72 72 6f 72  {.    &sig_error
0f60: 28 22 55 4e 53 55 43 43 45 53 53 46 55 4c 20 45  ("UNSUCCESSFUL E
0f70: 58 45 43 55 54 49 4f 4e 3a 20 53 63 72 69 70 74  XECUTION: Script
0f80: 2d 66 75 20 65 72 72 6f 72 22 29 3b 0a 20 20 20  -fu error");.   
0f90: 20 7d 0a 20 20 24 73 74 61 74 75 73 3b 20 0a 20   }.  $status; . 
0fa0: 20 7d 0a 0a 23 20 64 65 66 69 6e 65 20 61 20 53   }..# define a S
0fb0: 63 72 69 70 74 2d 66 75 20 75 74 69 6c 69 74 79  cript-fu utility
0fc0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 61 76   function to sav
0fd0: 65 20 66 72 61 6d 65 73 20 75 73 69 6e 67 20 74  e frames using t
0fe0: 68 65 20 50 4e 47 20 6f 72 20 4a 50 47 0a 23 20  he PNG or JPG.# 
0ff0: 63 6f 6d 70 72 65 73 73 69 6f 6e 20 6c 65 76 65  compression leve
1000: 6c 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  ls specified in 
1010: 27 67 69 6d 70 72 63 27 2e 20 0a 23 20 54 6f 20  'gimprc'. .# To 
1020: 73 70 65 63 69 66 79 20 61 20 50 4e 47 20 63 6f  specify a PNG co
1030: 6d 70 72 65 73 73 69 6f 6e 20 6c 65 76 65 6c 20  mpression level 
1040: 6f 66 20 35 2c 20 69 6e 63 6c 75 64 65 20 74 68  of 5, include th
1050: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 6e 65  e following line
1060: 0a 23 20 69 6e 20 67 69 6d 70 72 63 3a 0a 23 20  .# in gimprc:.# 
1070: 20 20 28 72 66 78 2d 70 6e 67 2d 63 6f 6d 70 72    (rfx-png-compr
1080: 65 73 73 69 6f 6e 20 22 35 22 29 20 0a 23 20 49  ession "5") .# I
1090: 66 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  f not specified 
10a0: 74 68 65 6e 20 61 20 64 65 66 61 75 6c 74 20 6c  then a default l
10b0: 65 76 65 6c 20 6f 66 20 22 33 22 20 69 73 20 61  evel of "3" is a
10c0: 73 73 75 6d 65 64 2e 0a 23 20 22 33 22 20 69 73  ssumed..# "3" is
10d0: 20 61 20 67 6f 6f 64 20 63 68 6f 69 63 65 20 66   a good choice f
10e0: 6f 72 20 50 4e 47 73 20 62 65 63 61 75 73 65 20  or PNGs because 
10f0: 68 69 67 68 65 72 20 6c 65 76 65 6c 73 20 64 6f  higher levels do
1100: 75 62 6c 65 20 74 68 65 20 77 72 69 74 65 0a 23  uble the write.#
1110: 20 74 69 6d 65 73 20 77 68 69 6c 65 20 6f 6e 6c   times while onl
1120: 79 20 6f 66 66 65 72 69 6e 67 20 61 62 6f 75 74  y offering about
1130: 20 31 35 25 20 72 65 64 75 63 74 69 6f 6e 20 69   15% reduction i
1140: 6e 20 66 69 6c 65 20 73 69 7a 65 2e 0a 23 20 54  n file size..# T
1150: 6f 20 73 70 65 63 69 66 79 20 61 20 4a 50 47 20  o specify a JPG 
1160: 63 6f 6d 70 72 65 73 73 69 6f 6e 20 6c 65 76 65  compression leve
1170: 6c 20 6f 66 20 38 35 2c 20 69 6e 63 6c 75 64 65  l of 85, include
1180: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   the following l
1190: 69 6e 65 0a 23 20 69 6e 20 67 69 6d 70 72 63 3a  ine.# in gimprc:
11a0: 0a 23 20 20 20 28 72 66 78 2d 6a 70 67 2d 63 6f  .#   (rfx-jpg-co
11b0: 6d 70 72 65 73 73 69 6f 6e 20 22 38 35 22 29 20  mpression "85") 
11c0: 0a 23 20 49 66 20 6e 6f 74 20 73 70 65 63 69 66  .# If not specif
11d0: 69 65 64 20 74 68 65 6e 20 61 20 64 65 66 61 75  ied then a defau
11e0: 6c 74 20 6c 65 76 65 6c 20 6f 66 20 22 39 33 22  lt level of "93"
11f0: 20 69 73 20 61 73 73 75 6d 65 64 2e 0a 0a 23 20   is assumed...# 
1200: 4e 4f 54 45 3a 20 27 72 66 78 2d 73 61 76 65 2d  NOTE: 'rfx-save-
1210: 66 72 61 6d 65 27 20 44 45 4c 45 54 45 53 20 74  frame' DELETES t
1220: 68 65 20 69 6d 61 67 65 2e 20 20 0a 26 72 66 78  he image.  .&rfx
1230: 5f 73 65 6e 64 6d 73 67 28 20 71 71 7b 0a 20 20  _sendmsg( qq{.  
1240: 28 62 65 67 69 6e 0a 20 20 20 20 28 64 65 66 69  (begin.    (defi
1250: 6e 65 20 72 66 78 2d 63 75 72 74 6d 70 64 69 72  ne rfx-curtmpdir
1260: 20 22 24 63 75 72 74 6d 70 64 69 72 22 29 0a 20   "$curtmpdir"). 
1270: 20 20 20 28 64 65 66 69 6e 65 20 72 66 78 2d 69     (define rfx-i
1280: 6d 67 65 78 74 20 22 24 69 6d 67 5f 65 78 74 22  mgext "$img_ext"
1290: 29 0a 20 20 20 20 28 75 6e 6c 65 73 73 20 28 64  ).    (unless (d
12a0: 65 66 69 6e 65 64 3f 20 27 72 66 78 2d 73 61 76  efined? 'rfx-sav
12b0: 65 2d 66 72 61 6d 65 29 0a 20 20 20 20 20 20 28  e-frame).      (
12c0: 64 65 66 69 6e 65 20 72 66 78 2d 70 6e 67 2d 63  define rfx-png-c
12d0: 6f 6d 70 72 65 73 73 69 6f 6e 20 28 63 61 74 63  ompression (catc
12e0: 68 20 23 66 20 28 67 69 6d 70 2d 67 69 6d 70 72  h #f (gimp-gimpr
12f0: 63 2d 71 75 65 72 79 20 22 72 66 78 2d 70 6e 67  c-query "rfx-png
1300: 2d 63 6f 6d 70 72 65 73 73 69 6f 6e 22 29 29 29  -compression")))
1310: 0a 20 20 20 20 20 20 28 73 65 74 21 20 72 66 78  .      (set! rfx
1320: 2d 70 6e 67 2d 63 6f 6d 70 72 65 73 73 69 6f 6e  -png-compression
1330: 20 28 69 66 20 72 66 78 2d 70 6e 67 2d 63 6f 6d   (if rfx-png-com
1340: 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 20  pression.       
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 20 20 20 20 20 20 20 20 20 28 73 74 72 69             (stri
1370: 6e 67 2d 3e 6e 75 6d 62 65 72 20 28 63 61 72 20  ng->number (car 
1380: 72 66 78 2d 70 6e 67 2d 63 6f 6d 70 72 65 73 73  rfx-png-compress
1390: 69 6f 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20  ion)).          
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 20 20 20 20 20 33 20 29 29 0a 20 20 20          3 )).   
13c0: 20 20 20 28 64 65 66 69 6e 65 20 72 66 78 2d 6a     (define rfx-j
13d0: 70 67 2d 63 6f 6d 70 72 65 73 73 69 6f 6e 20 28  pg-compression (
13e0: 63 61 74 63 68 20 23 66 20 28 67 69 6d 70 2d 67  catch #f (gimp-g
13f0: 69 6d 70 72 63 2d 71 75 65 72 79 20 22 72 66 78  imprc-query "rfx
1400: 2d 6a 70 67 2d 63 6f 6d 70 72 65 73 73 69 6f 6e  -jpg-compression
1410: 22 29 29 29 0a 20 20 20 20 20 20 28 73 65 74 21  "))).      (set!
1420: 20 72 66 78 2d 6a 70 67 2d 63 6f 6d 70 72 65 73   rfx-jpg-compres
1430: 73 69 6f 6e 20 28 69 66 20 72 66 78 2d 6a 70 67  sion (if rfx-jpg
1440: 2d 63 6f 6d 70 72 65 73 73 69 6f 6e 0a 20 20 20  -compression.   
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1470: 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 72 20 28  string->number (
1480: 63 61 72 20 72 66 78 2d 6a 70 67 2d 63 6f 6d 70  car rfx-jpg-comp
1490: 72 65 73 73 69 6f 6e 29 29 0a 20 20 20 20 20 20  ression)).      
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 39 33 20 29              93 )
14c0: 29 0a 20 20 20 20 20 20 28 64 65 66 69 6e 65 20  ).      (define 
14d0: 28 72 66 78 2d 73 61 76 65 2d 66 72 61 6d 65 20  (rfx-save-frame 
14e0: 69 6d 61 67 65 20 62 61 73 65 6e 61 6d 65 29 0a  image basename).
14f0: 20 20 20 20 20 20 20 20 28 6c 65 74 20 28 28 66          (let ((f
1500: 69 6c 65 6e 61 6d 65 20 28 73 74 72 69 6e 67 2d  ilename (string-
1510: 61 70 70 65 6e 64 20 72 66 78 2d 63 75 72 74 6d  append rfx-curtm
1520: 70 64 69 72 20 44 49 52 2d 53 45 50 41 52 41 54  pdir DIR-SEPARAT
1530: 4f 52 20 62 61 73 65 6e 61 6d 65 29 29 0a 20 20  OR basename)).  
1540: 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 61 79              (lay
1550: 65 72 20 28 63 61 72 20 28 67 69 6d 70 2d 69 6d  er (car (gimp-im
1560: 61 67 65 2d 67 65 74 2d 61 63 74 69 76 65 2d 6c  age-get-active-l
1570: 61 79 65 72 20 69 6d 61 67 65 29 29 29 20 29 0a  ayer image))) ).
1580: 20 20 20 20 20 20 20 20 20 20 28 69 66 20 28 73            (if (s
1590: 74 72 69 6e 67 2d 63 69 3d 3f 20 72 66 78 2d 69  tring-ci=? rfx-i
15a0: 6d 67 65 78 74 20 22 2e 6a 70 67 22 29 0a 20 20  mgext ".jpg").  
15b0: 20 20 20 20 20 20 20 20 20 20 28 62 65 67 69 6e            (begin
15c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
15d0: 67 69 6d 70 2d 63 6f 6e 74 65 78 74 2d 70 75 73  gimp-context-pus
15e0: 68 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h).             
15f0: 20 28 67 69 6d 70 2d 63 6f 6e 74 65 78 74 2d 73   (gimp-context-s
1600: 65 74 2d 62 61 63 6b 67 72 6f 75 6e 64 20 27 28  et-background '(
1610: 36 20 36 20 36 29 29 0a 20 20 20 20 20 20 20 20  6 6 6)).        
1620: 20 20 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20        (let loop 
1630: 28 28 6c 61 79 65 72 73 20 28 76 65 63 74 6f 72  ((layers (vector
1640: 2d 3e 6c 69 73 74 20 28 63 61 64 72 20 28 67 69  ->list (cadr (gi
1650: 6d 70 2d 69 6d 61 67 65 2d 67 65 74 2d 6c 61 79  mp-image-get-lay
1660: 65 72 73 20 69 6d 61 67 65 29 29 29 29 29 0a 20  ers image))))). 
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1680: 75 6e 6c 65 73 73 20 28 6e 75 6c 6c 3f 20 6c 61  unless (null? la
1690: 79 65 72 73 29 0a 20 20 20 20 20 20 20 20 20 20  yers).          
16a0: 20 20 20 20 20 20 20 20 28 69 66 20 28 3d 20 28          (if (= (
16b0: 63 61 72 20 6c 61 79 65 72 73 29 20 6c 61 79 65  car layers) laye
16c0: 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r).             
16d0: 20 20 20 20 20 20 20 28 67 69 6d 70 2d 64 72 61         (gimp-dra
16e0: 77 61 62 6c 65 2d 73 65 74 2d 76 69 73 69 62 6c  wable-set-visibl
16f0: 65 20 6c 61 79 65 72 20 54 52 55 45 29 0a 20 20  e layer TRUE).  
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 28 67 69 6d 70 2d 64 72 61 77 61 62 6c 65    (gimp-drawable
1720: 2d 73 65 74 2d 76 69 73 69 62 6c 65 20 28 63 61  -set-visible (ca
1730: 72 20 6c 61 79 65 72 73 29 20 46 41 4c 53 45 29  r layers) FALSE)
1740: 20 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ).             
1750: 20 20 20 20 20 28 6c 6f 6f 70 20 28 63 64 72 20       (loop (cdr 
1760: 6c 61 79 65 72 73 29 29 20 29 29 0a 20 20 20 20  layers)) )).    
1770: 20 20 20 20 20 20 20 20 20 20 28 73 65 74 21 20            (set! 
1780: 6c 61 79 65 72 20 28 63 61 72 20 28 67 69 6d 70  layer (car (gimp
1790: 2d 69 6d 61 67 65 2d 66 6c 61 74 74 65 6e 20 69  -image-flatten i
17a0: 6d 61 67 65 29 29 29 0a 20 20 20 20 20 20 20 20  mage))).        
17b0: 20 20 20 20 20 20 28 66 69 6c 65 2d 6a 70 65 67        (file-jpeg
17c0: 2d 73 61 76 65 20 52 55 4e 2d 4e 4f 4e 49 4e 54  -save RUN-NONINT
17d0: 45 52 41 43 54 49 56 45 20 0a 20 20 20 20 20 20  ERACTIVE .      
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 69 6d 61 67 65 20 0a 20          image . 
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 79               lay
1820: 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 20 66 69 6c 65 6e 61 6d 65 20 0a 20 20 20 20 20   filename .     
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 20 20 20 20 20 20 20 20 66 69 6c 65 6e 61 6d           filenam
1870: 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 20 28 2f 20 72 66 78 2d 6a 70 67 2d 63 6f 6d 70   (/ rfx-jpg-comp
18a0: 72 65 73 73 69 6f 6e 20 31 30 30 29 0a 20 20 20  ression 100).   
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 3b 20 73             0 ; s
18d0: 6d 6f 6f 74 68 69 6e 67 20 0a 20 20 20 20 20 20  moothing .      
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 31 20 3b 20 6f 70 74 69          1 ; opti
1900: 6d 69 7a 65 20 0a 20 20 20 20 20 20 20 20 20 20  mize .          
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 31 20 3b 20 70 72 6f 67 72 65 73 73      1 ; progress
1930: 69 76 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  ive .           
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 20 20 22 22 20 3b 20 63 6f 6d 6d 65 6e 74 20     "" ; comment 
1960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1980: 20 3b 20 73 75 62 73 6d 70 20 28 30 2d 34 29 0a   ; subsmp (0-4).
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
19b0: 3b 20 62 61 73 65 6c 69 6e 65 20 0a 20 20 20 20  ; baseline .    
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 20 20 20 20 20 20 20 30 20 3b 20 72 65            0 ; re
19e0: 73 74 61 72 74 20 0a 20 20 20 20 20 20 20 20 20  start .         
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a00: 20 20 20 20 20 30 20 3b 64 63 74 20 0a 20 20 20       0 ;dct .   
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a20: 20 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20             ).   
1a30: 20 20 20 20 20 20 20 20 20 20 20 28 67 69 6d 70             (gimp
1a40: 2d 63 6f 6e 74 65 78 74 2d 70 6f 70 29 20 29 0a  -context-pop) ).
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 28 62 65 67              (beg
1a60: 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  in.             
1a70: 20 28 75 6e 6c 65 73 73 20 28 7a 65 72 6f 3f 20   (unless (zero? 
1a80: 28 63 61 72 20 28 67 69 6d 70 2d 69 6d 61 67 65  (car (gimp-image
1a90: 2d 62 61 73 65 2d 74 79 70 65 20 69 6d 61 67 65  -base-type image
1aa0: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))).            
1ab0: 20 20 20 20 28 67 69 6d 70 2d 69 6d 61 67 65 2d      (gimp-image-
1ac0: 63 6f 6e 76 65 72 74 2d 72 67 62 20 69 6d 61 67  convert-rgb imag
1ad0: 65 29 20 29 0a 20 20 20 20 20 20 20 20 20 20 20  e) ).           
1ae0: 20 20 20 28 66 69 6c 65 2d 70 6e 67 2d 73 61 76     (file-png-sav
1af0: 65 32 20 52 55 4e 2d 4e 4f 4e 49 4e 54 45 52 41  e2 RUN-NONINTERA
1b00: 43 54 49 56 45 20 0a 20 20 20 20 20 20 20 20 20  CTIVE .         
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 20 20 20 20 20 69 6d 61 67 65 20 0a 20 20 20 20       image .    
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b40: 20 20 20 20 20 20 20 20 20 20 6c 61 79 65 72 0a            layer.
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
1b70: 6c 65 6e 61 6d 65 20 0a 20 20 20 20 20 20 20 20  lename .        
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 66 69 6c 65 6e 61 6d 65 20 0a        filename .
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 41                FA
1bc0: 4c 53 45 20 3b 20 69 6e 74 65 72 6c 61 63 65 0a  LSE ; interlace.
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 66                rf
1bf0: 78 2d 70 6e 67 2d 63 6f 6d 70 72 65 73 73 69 6f  x-png-compressio
1c00: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c20: 46 41 4c 53 45 20 3b 20 62 6b 67 64 0a 20 20 20  FALSE ; bkgd.   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 20 20 20 20 20 28 63 61 72 20             (car 
1c50: 28 67 69 6d 70 2d 64 72 61 77 61 62 6c 65 2d 68  (gimp-drawable-h
1c60: 61 73 2d 61 6c 70 68 61 20 6c 61 79 65 72 29 29  as-alpha layer))
1c70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
1c90: 41 4c 53 45 20 3b 20 6f 66 66 73 0a 20 20 20 20  ALSE ; offs.    
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 20 20 20 20 20 20 20 46 41 4c 53 45 20            FALSE 
1cc0: 3b 20 70 68 79 73 0a 20 20 20 20 20 20 20 20 20  ; phys.         
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 20 46 41 4c 53 45 20 3b 20 74 69 6d       FALSE ; tim
1cf0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 54 52 55 45 20 20 3b 20 63 6f 6d 6d 65 6e 74 0a  TRUE  ; comment.
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 41                FA
1d40: 4c 53 45 20 3b 20 73 76 74 72 61 6e 73 0a 20 20  LSE ; svtrans.  
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 29 29 29 0a              ))).
1d70: 20 20 20 20 20 20 20 20 20 20 28 67 69 6d 70 2d            (gimp-
1d80: 69 6d 61 67 65 2d 64 65 6c 65 74 65 20 69 6d 61  image-delete ima
1d90: 67 65 29 20 29 29 29 0a 20 20 20 20 28 64 65 66  ge) ))).    (def
1da0: 69 6e 65 20 28 6d 61 6b 65 2d 70 72 6f 67 72 65  ine (make-progre
1db0: 73 73 6f 72 20 73 74 61 72 74 20 64 65 6c 74 61  ssor start delta
1dc0: 20 2e 20 70 65 72 69 6f 64 29 0a 20 20 20 20 20   . period).     
1dd0: 20 28 6c 65 74 20 28 28 73 74 61 72 74 20 73 74   (let ((start st
1de0: 61 72 74 29 0a 20 20 20 20 20 20 20 20 20 20 20  art).           
1df0: 20 28 76 61 6c 75 65 20 73 74 61 72 74 29 0a 20   (value start). 
1e00: 20 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 74             (delt
1e10: 61 20 64 65 6c 74 61 29 0a 20 20 20 20 20 20 20  a delta).       
1e20: 20 20 20 20 20 28 70 65 72 69 6f 64 20 28 69 66       (period (if
1e30: 20 28 6e 75 6c 6c 3f 20 70 65 72 69 6f 64 29 0a   (null? period).
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 20 20 20 20 20 20 23 66 0a 20 20 20 20 20          #f.     
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 28 63 61 72 20 70 65 72 69 6f 64 29 29     (car period))
1e80: 20 29 29 0a 20 20 20 20 20 20 20 20 28 6c 61 6d   )).        (lam
1e90: 62 64 61 20 28 29 0a 20 20 20 20 20 20 20 20 20  bda ().         
1ea0: 20 28 6c 65 74 20 28 28 74 65 6d 70 20 76 61 6c   (let ((temp val
1eb0: 75 65 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  ue)).           
1ec0: 20 28 73 65 74 21 20 76 61 6c 75 65 20 28 69 66   (set! value (if
1ed0: 20 28 61 6e 64 20 70 65 72 69 6f 64 20 28 3e 3d   (and period (>=
1ee0: 20 28 2b 20 76 61 6c 75 65 20 64 65 6c 74 61 29   (+ value delta)
1ef0: 20 28 2b 20 73 74 61 72 74 20 70 65 72 69 6f 64   (+ start period
1f00: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))).            
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 2d                (-
1f20: 20 28 2b 20 76 61 6c 75 65 20 64 65 6c 74 61 29   (+ value delta)
1f30: 20 70 65 72 69 6f 64 29 0a 20 20 20 20 20 20 20   period).       
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 20 20 20 28 2b 20 76 61 6c 75 65 20 64 65 6c 74     (+ value delt
1f60: 61 29 20 29 29 0a 20 20 20 20 20 20 20 20 20 20  a) )).          
1f70: 20 20 74 65 6d 70 20 29 29 29 29 0a 20 20 20 20    temp )))).    
1f80: 29 0a 20 20 7d 0a 20 20 29 3b 0a 3c 2f 70 72 65  ).  }.  );.</pre
1f90: 3e 0a 0a 3c 6c 6f 6f 70 3e 0a 23 20 24 70 30 20  >..<loop>.# $p0 
1fa0: 2d 20 48 6f 72 69 7a 6f 6e 74 61 6c 20 70 69 65  - Horizontal pie
1fb0: 63 65 73 0a 23 20 24 70 31 20 2d 20 56 65 72 74  ces.# $p1 - Vert
1fc0: 69 63 61 6c 20 70 69 65 63 65 73 0a 23 20 24 70  ical pieces.# $p
1fd0: 32 20 2d 20 43 75 72 76 65 64 20 65 64 67 65 73  2 - Curved edges
1fe0: 20 28 62 6f 6f 6c 65 61 6e 29 0a 23 20 24 70 33   (boolean).# $p3
1ff0: 20 2d 20 43 6c 69 70 62 6f 61 72 64 20 70 6f 73   - Clipboard pos
2000: 69 74 69 6f 6e 20 28 6e 6f 72 6d 61 6c 2c 20 63  ition (normal, c
2010: 65 6e 74 65 72 65 64 2c 20 73 63 61 6c 65 64 29  entered, scaled)
2020: 0a 0a 26 72 66 78 5f 73 65 6e 64 6d 73 67 20 28  ..&rfx_sendmsg (
2030: 0a 20 20 71 71 7b 0a 20 20 20 20 28 62 65 67 69  .  qq{.    (begi
2040: 6e 0a 20 20 20 20 20 20 28 77 68 65 6e 20 28 3d  n.      (when (=
2050: 20 24 66 72 61 6d 65 20 24 73 74 61 72 74 29 0a   $frame $start).
2060: 20 20 20 20 20 20 20 20 28 64 65 66 69 6e 65 20          (define 
2070: 72 66 78 2d 6a 69 67 73 61 77 2d 70 69 65 63 65  rfx-jigsaw-piece
2080: 73 20 27 28 29 29 0a 20 20 20 20 20 20 20 20 28  s '()).        (
2090: 64 65 66 69 6e 65 20 72 66 78 2d 6a 69 67 73 61  define rfx-jigsa
20a0: 77 2d 6b 65 79 66 72 61 6d 65 73 20 27 28 29 29  w-keyframes '())
20b0: 0a 20 20 20 20 20 20 20 20 28 6c 65 74 2a 20 28  .        (let* (
20c0: 28 6a 69 67 73 61 77 2d 69 6d 61 67 65 20 28 63  (jigsaw-image (c
20d0: 61 72 20 28 67 69 6d 70 2d 69 6d 61 67 65 2d 6e  ar (gimp-image-n
20e0: 65 77 20 24 77 69 64 74 68 20 24 68 65 69 67 68  ew $width $heigh
20f0: 74 20 52 47 42 29 29 29 0a 20 20 20 20 20 20 20  t RGB))).       
2100: 20 20 20 20 20 20 20 20 28 6c 61 79 65 72 20 28          (layer (
2110: 63 61 72 20 28 67 69 6d 70 2d 6c 61 79 65 72 2d  car (gimp-layer-
2120: 6e 65 77 20 6a 69 67 73 61 77 2d 69 6d 61 67 65  new jigsaw-image
2130: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 24 77 69               $wi
2160: 64 74 68 20 0a 20 20 20 20 20 20 20 20 20 20 20  dth .           
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 24 68 65 69 67 68 74 20 0a 20 20 20 20 20 20 20  $height .       
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c0: 20 20 20 20 52 47 42 41 2d 49 4d 41 47 45 0a 20      RGBA-IMAGE. 
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 20 20 20 20 20 20 20 22 6a 69 67 73 61            "jigsa
2200: 77 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w".             
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30                10
2230: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 4f 52               NOR
2260: 4d 41 4c 2d 4d 4f 44 45 20 29 29 29 29 0a 20 20  MAL-MODE )))).  
2270: 20 20 20 20 20 20 20 20 28 67 69 6d 70 2d 69 6d          (gimp-im
2280: 61 67 65 2d 61 64 64 2d 6c 61 79 65 72 20 6a 69  age-add-layer ji
2290: 67 73 61 77 2d 69 6d 61 67 65 20 6c 61 79 65 72  gsaw-image layer
22a0: 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 28 67   0).          (g
22b0: 69 6d 70 2d 64 72 61 77 61 62 6c 65 2d 66 69 6c  imp-drawable-fil
22c0: 6c 20 6c 61 79 65 72 20 57 48 49 54 45 2d 46 49  l layer WHITE-FI
22d0: 4c 4c 29 0a 20 20 20 20 20 20 20 20 20 20 28 70  LL).          (p
22e0: 6c 75 67 2d 69 6e 2d 6a 69 67 73 61 77 20 52 55  lug-in-jigsaw RU
22f0: 4e 2d 4e 4f 4e 49 4e 54 45 52 41 43 54 49 56 45  N-NONINTERACTIVE
2300: 20 6a 69 67 73 61 77 2d 69 6d 61 67 65 20 6c 61   jigsaw-image la
2310: 79 65 72 20 24 70 30 20 24 70 31 20 24 70 32 20  yer $p0 $p1 $p2 
2320: 30 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 28  0 0).          (
2330: 6c 65 74 20 72 6f 77 2d 6c 6f 6f 70 20 28 28 72  let row-loop ((r
2340: 6f 77 20 24 70 31 29 29 0a 20 20 20 20 20 20 20  ow $p1)).       
2350: 20 20 20 20 20 28 75 6e 6c 65 73 73 20 28 7a 65       (unless (ze
2360: 72 6f 3f 20 72 6f 77 29 0a 20 20 20 20 20 20 20  ro? row).       
2370: 20 20 20 20 20 20 20 28 6c 65 74 20 63 6f 6c 2d         (let col-
2380: 6c 6f 6f 70 20 28 28 63 6f 6c 20 24 70 30 29 29  loop ((col $p0))
2390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23a0: 20 28 69 66 20 28 7a 65 72 6f 3f 20 63 6f 6c 29   (if (zero? col)
23b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23c0: 20 20 20 28 72 6f 77 2d 6c 6f 6f 70 20 28 70 72     (row-loop (pr
23d0: 65 64 20 72 6f 77 29 29 0a 20 20 20 20 20 20 20  ed row)).       
23e0: 20 20 20 20 20 20 20 20 20 20 20 28 62 65 67 69             (begi
23f0: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
2400: 20 20 20 20 20 20 28 67 69 6d 70 2d 66 75 7a 7a        (gimp-fuzz
2410: 79 2d 73 65 6c 65 63 74 20 6c 61 79 65 72 20 0a  y-select layer .
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 20 20 20 20 20 28 2d 20 28 2a 20 28 2f 20         (- (* (/ 
2450: 24 77 69 64 74 68 20 24 70 30 29 20 63 6f 6c 29  $width $p0) col)
2460: 20 28 2f 20 24 77 69 64 74 68 20 24 70 30 20 32   (/ $width $p0 2
2470: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 20 20 20 20 20 20 20 20 28 2d 20 28 2a 20            (- (* 
24a0: 28 2f 20 24 68 65 69 67 68 74 20 24 70 31 29 20  (/ $height $p1) 
24b0: 72 6f 77 29 20 28 2f 20 24 68 65 69 67 68 74 20  row) (/ $height 
24c0: 24 70 31 20 32 29 29 0a 20 20 20 20 20 20 20 20  $p1 2)).        
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
24f0: 32 38 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  28 .            
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 20 20 20 20 20 20 20 43 48 41 4e 4e             CHANN
2520: 45 4c 2d 4f 50 2d 52 45 50 4c 41 43 45 0a 20 20  EL-OP-REPLACE.  
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 20 20 20 46 41 4c 53 45 0a 20 20 20 20 20       FALSE.     
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 46 41 4c 53 45 0a 20 20 20 20 20 20 20 20    FALSE.        
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
25b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d0: 20 20 20 20 20 20 20 20 46 41 4c 53 45 20 29 0a          FALSE ).
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 20 20 20 20 28 70 6c 75 67 2d 69 6e 2d 73 65 6c      (plug-in-sel
2600: 32 70 61 74 68 20 52 55 4e 2d 4e 4f 4e 49 4e 54  2path RUN-NONINT
2610: 45 52 41 43 54 49 56 45 20 6a 69 67 73 61 77 2d  ERACTIVE jigsaw-
2620: 69 6d 61 67 65 20 6c 61 79 65 72 29 0a 20 20 20  image layer).   
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 28 73 65 74 21 20 72 66 78 2d 6a 69 67 73 61   (set! rfx-jigsa
2650: 77 2d 70 69 65 63 65 73 20 0a 20 20 20 20 20 20  w-pieces .      
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 20 20 28 63 6f 6e 73 20 28 63 61 72 20 28      (cons (car (
2680: 67 69 6d 70 2d 76 65 63 74 6f 72 73 2d 65 78 70  gimp-vectors-exp
2690: 6f 72 74 2d 74 6f 2d 73 74 72 69 6e 67 20 0a 20  ort-to-string . 
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 20 20 20 20 6a 69 67 73 61 77 2d 69          jigsaw-i
26d0: 6d 61 67 65 20 0a 20 20 20 20 20 20 20 20 20 20  mage .          
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2700: 63 61 72 20 28 67 69 6d 70 2d 69 6d 61 67 65 2d  car (gimp-image-
2710: 67 65 74 2d 61 63 74 69 76 65 2d 76 65 63 74 6f  get-active-vecto
2720: 72 73 20 6a 69 67 73 61 77 2d 69 6d 61 67 65 29  rs jigsaw-image)
2730: 29 20 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  ) )).           
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 20 20 72 66 78 2d 6a 69 67 73 61 77 2d       rfx-jigsaw-
2760: 70 69 65 63 65 73 20 29 29 0a 20 20 20 20 20 20  pieces )).      
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2780: 6f 6c 2d 6c 6f 6f 70 20 28 70 72 65 64 20 63 6f  ol-loop (pred co
2790: 6c 29 29 20 29 29 29 29 29 0a 20 20 20 20 20 20  l)) ))))).      
27a0: 20 20 20 20 28 67 69 6d 70 2d 69 6d 61 67 65 2d      (gimp-image-
27b0: 64 65 6c 65 74 65 20 6a 69 67 73 61 77 2d 69 6d  delete jigsaw-im
27c0: 61 67 65 29 20 0a 20 20 20 20 20 20 20 20 20 20  age) .          
27d0: 29 0a 20 20 20 20 20 20 20 20 3b 3b 20 72 61 6e  ).        ;; ran
27e0: 64 6f 6d 69 7a 65 20 74 68 65 20 6c 69 73 74 20  domize the list 
27f0: 6f 66 20 70 69 65 63 65 73 0a 20 20 20 20 20 20  of pieces.      
2800: 20 20 28 6c 65 74 20 28 28 6e 75 6d 62 65 72 2d    (let ((number-
2810: 6f 66 2d 70 69 65 63 65 73 20 28 2a 20 24 70 30  of-pieces (* $p0
2820: 20 24 70 31 29 29 29 0a 20 20 20 20 20 20 20 20   $p1))).        
2830: 20 20 28 73 65 74 21 20 72 66 78 2d 6a 69 67 73    (set! rfx-jigs
2840: 61 77 2d 70 69 65 63 65 73 20 0a 20 20 20 20 20  aw-pieces .     
2850: 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 74 20             (let 
2860: 6c 6f 6f 70 20 28 28 6c 69 73 20 72 66 78 2d 6a  loop ((lis rfx-j
2870: 69 67 73 61 77 2d 70 69 65 63 65 73 29 0a 20 20  igsaw-pieces).  
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2890: 20 20 20 20 20 20 20 20 20 28 6b 20 6e 75 6d 62           (k numb
28a0: 65 72 2d 6f 66 2d 70 69 65 63 65 73 29 20 29 0a  er-of-pieces) ).
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 28 69 66 20 28 7a 65 72 6f 3f 20 6b 29 0a    (if (zero? k).
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 20 20 6c 69 73 0a 20 20 20 20 20 20 20 20      lis.        
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 74              (let
2900: 20 28 28 69 6e 64 65 78 20 28 72 61 6e 64 6f 6d   ((index (random
2910: 20 6e 75 6d 62 65 72 2d 6f 66 2d 70 69 65 63 65   number-of-piece
2920: 73 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  s))).           
2930: 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f 6f 70             (loop
2940: 20 28 61 70 70 65 6e 64 20 28 6c 69 73 74 2d 74   (append (list-t
2950: 61 69 6c 20 6c 69 73 20 69 6e 64 65 78 29 0a 20  ail lis index). 
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 28 6c 69 73 74 2d 74 61 69 6c 20 28 72     (list-tail (r
2990: 65 76 65 72 73 65 20 6c 69 73 29 20 28 2d 20 28  everse lis) (- (
29a0: 6c 65 6e 67 74 68 20 6c 69 73 29 20 20 69 6e 64  length lis)  ind
29b0: 65 78 29 29 20 29 0a 20 20 20 20 20 20 20 20 20  ex)) ).         
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 28 70 72 65 64 20 6b 29 20 29 29 29 29     (pred k) ))))
29e0: 29 29 0a 20 20 20 20 20 20 20 20 28 6c 65 74 20  )).        (let 
29f0: 28 28 6e 65 78 74 2d 6b 65 79 66 72 61 6d 65 20  ((next-keyframe 
2a00: 28 6d 61 6b 65 2d 70 72 6f 67 72 65 73 73 6f 72  (make-progressor
2a10: 20 24 73 74 61 72 74 20 28 2f 20 28 2d 20 24 65   $start (/ (- $e
2a20: 6e 64 20 24 73 74 61 72 74 29 20 28 73 75 63 63  nd $start) (succ
2a30: 20 28 2a 20 24 70 30 20 24 70 31 29 29 29 29 29   (* $p0 $p1)))))
2a40: 29 0a 20 20 20 20 20 20 20 20 20 20 28 6e 65 78  ).          (nex
2a50: 74 2d 6b 65 79 66 72 61 6d 65 29 20 3b 20 73 74  t-keyframe) ; st
2a60: 61 72 74 20 77 69 74 68 20 66 75 6c 6c 79 20 73  art with fully s
2a70: 68 6f 77 6e 20 63 6c 69 70 62 6f 61 72 64 0a 20  hown clipboard. 
2a80: 20 20 20 20 20 20 20 20 20 28 73 65 74 21 20 72           (set! r
2a90: 66 78 2d 6a 69 67 73 61 77 2d 6b 65 79 66 72 61  fx-jigsaw-keyfra
2aa0: 6d 65 73 20 28 6d 61 70 20 6e 65 78 74 2d 6b 65  mes (map next-ke
2ab0: 79 66 72 61 6d 65 20 72 66 78 2d 6a 69 67 73 61  yframe rfx-jigsa
2ac0: 77 2d 70 69 65 63 65 73 29 29 0a 20 20 20 20 20  w-pieces)).     
2ad0: 20 20 20 20 20 29 0a 20 20 20 20 20 20 20 20 29       ).        )
2ae0: 0a 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28 69  .      (let* ((i
2af0: 6e 70 75 74 2d 66 69 6c 65 20 28 73 74 72 69 6e  nput-file (strin
2b00: 67 2d 61 70 70 65 6e 64 20 22 24 63 75 72 74 6d  g-append "$curtm
2b10: 70 64 69 72 22 20 44 49 52 2d 53 45 50 41 52 41  pdir" DIR-SEPARA
2b20: 54 4f 52 20 22 24 69 6e 22 29 29 0a 20 20 20 20  TOR "$in")).    
2b30: 20 20 20 20 20 20 20 20 20 28 69 6d 61 67 65 20           (image 
2b40: 28 63 61 72 20 28 67 69 6d 70 2d 66 69 6c 65 2d  (car (gimp-file-
2b50: 6c 6f 61 64 20 52 55 4e 2d 4e 4f 4e 49 4e 54 45  load RUN-NONINTE
2b60: 52 41 43 54 49 56 45 20 69 6e 70 75 74 2d 66 69  RACTIVE input-fi
2b70: 6c 65 20 69 6e 70 75 74 2d 66 69 6c 65 29 29 29  le input-file)))
2b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c  .             (l
2b90: 61 79 65 72 20 28 63 61 72 20 28 67 69 6d 70 2d  ayer (car (gimp-
2ba0: 69 6d 61 67 65 2d 67 65 74 2d 61 63 74 69 76 65  image-get-active
2bb0: 2d 6c 61 79 65 72 20 69 6d 61 67 65 29 29 29 0a  -layer image))).
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
2bd0: 70 75 74 2d 66 69 6c 65 32 20 28 73 74 72 69 6e  put-file2 (strin
2be0: 67 2d 61 70 70 65 6e 64 20 22 24 69 6e 32 22 29  g-append "$in2")
2bf0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ).             (
2c00: 69 6d 61 67 65 32 20 28 63 61 72 20 28 67 69 6d  image2 (car (gim
2c10: 70 2d 66 69 6c 65 2d 6c 6f 61 64 20 52 55 4e 2d  p-file-load RUN-
2c20: 4e 4f 4e 49 4e 54 45 52 41 43 54 49 56 45 20 69  NONINTERACTIVE i
2c30: 6e 70 75 74 2d 66 69 6c 65 32 20 69 6e 70 75 74  nput-file2 input
2c40: 2d 66 69 6c 65 32 29 29 29 0a 20 20 20 20 20 20  -file2))).      
2c50: 20 20 20 20 20 20 20 28 62 2d 6c 61 79 65 72 20         (b-layer 
2c60: 28 63 61 72 20 28 67 69 6d 70 2d 6c 61 79 65 72  (car (gimp-layer
2c70: 2d 6e 65 77 2d 66 72 6f 6d 2d 64 72 61 77 61 62  -new-from-drawab
2c80: 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  le .            
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca0: 20 20 20 20 28 63 61 72 20 28 67 69 6d 70 2d 69      (car (gimp-i
2cb0: 6d 61 67 65 2d 67 65 74 2d 61 63 74 69 76 65 2d  mage-get-active-
2cc0: 6c 61 79 65 72 20 69 6d 61 67 65 32 29 29 20 0a  layer image2)) .
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf0: 69 6d 61 67 65 20 29 29 29 20 29 0a 20 20 20 20  image ))) ).    
2d00: 20 20 20 20 28 67 69 6d 70 2d 69 6d 61 67 65 2d      (gimp-image-
2d10: 75 6e 64 6f 2d 64 69 73 61 62 6c 65 20 69 6d 61  undo-disable ima
2d20: 67 65 29 0a 20 20 20 20 20 20 20 20 28 67 69 6d  ge).        (gim
2d30: 70 2d 69 6d 61 67 65 2d 61 64 64 2d 6c 61 79 65  p-image-add-laye
2d40: 72 20 69 6d 61 67 65 20 62 2d 6c 61 79 65 72 20  r image b-layer 
2d50: 31 29 0a 20 20 20 20 20 20 20 20 28 63 6f 6e 64  1).        (cond
2d60: 20 0a 20 20 20 20 20 20 20 20 20 20 28 28 3d 20   .          ((= 
2d70: 24 70 33 20 31 29 20 3b 20 63 65 6e 74 65 72 65  $p3 1) ; centere
2d80: 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 67  d.            (g
2d90: 69 6d 70 2d 6c 61 79 65 72 2d 73 65 74 2d 6f 66  imp-layer-set-of
2da0: 66 73 65 74 73 20 62 2d 6c 61 79 65 72 20 0a 20  fsets b-layer . 
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd0: 20 20 20 28 2f 20 28 2d 20 24 77 69 64 74 68 20     (/ (- $width 
2de0: 28 63 61 72 20 28 67 69 6d 70 2d 64 72 61 77 61  (car (gimp-drawa
2df0: 62 6c 65 2d 77 69 64 74 68 20 62 2d 6c 61 79 65  ble-width b-laye
2e00: 72 29 29 29 20 32 29 0a 20 20 20 20 20 20 20 20  r))) 2).        
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 28 2f 20 28              (/ (
2e30: 2d 20 24 68 65 69 67 68 74 20 28 63 61 72 20 28  - $height (car (
2e40: 67 69 6d 70 2d 64 72 61 77 61 62 6c 65 2d 68 65  gimp-drawable-he
2e50: 69 67 68 74 20 62 2d 6c 61 79 65 72 29 29 29 20  ight b-layer))) 
2e60: 32 29 20 29 29 0a 20 20 20 20 20 20 20 20 20 20  2) )).          
2e70: 28 28 3d 20 24 70 33 20 32 29 20 3b 20 73 63 61  ((= $p3 2) ; sca
2e80: 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  led.            
2e90: 28 67 69 6d 70 2d 6c 61 79 65 72 2d 73 63 61 6c  (gimp-layer-scal
2ea0: 65 2d 66 75 6c 6c 20 62 2d 6c 61 79 65 72 20 24  e-full b-layer $
2eb0: 77 69 64 74 68 20 24 68 65 69 67 68 74 20 54 52  width $height TR
2ec0: 55 45 20 49 4e 54 45 52 50 4f 4c 41 54 49 4f 4e  UE INTERPOLATION
2ed0: 2d 43 55 42 49 43 29 0a 20 20 20 20 20 20 20 20  -CUBIC).        
2ee0: 20 20 20 20 28 67 69 6d 70 2d 6c 61 79 65 72 2d      (gimp-layer-
2ef0: 73 65 74 2d 6f 66 66 73 65 74 73 20 62 2d 6c 61  set-offsets b-la
2f00: 79 65 72 20 30 20 30 29 20 29 29 0a 20 20 20 20  yer 0 0) )).    
2f10: 20 20 20 20 0a 20 20 20 20 20 20 20 20 28 67 69      .        (gi
2f20: 6d 70 2d 69 6d 61 67 65 2d 64 65 6c 65 74 65 20  mp-image-delete 
2f30: 69 6d 61 67 65 32 29 0a 0a 20 20 20 20 20 20 20  image2)..       
2f40: 20 28 67 69 6d 70 2d 6c 61 79 65 72 2d 61 64 64   (gimp-layer-add
2f50: 2d 61 6c 70 68 61 20 6c 61 79 65 72 29 0a 20 20  -alpha layer).  
2f60: 20 20 20 20 20 20 28 67 69 6d 70 2d 73 65 6c 65        (gimp-sele
2f70: 63 74 69 6f 6e 2d 6e 6f 6e 65 20 69 6d 61 67 65  ction-none image
2f80: 29 0a 0a 20 20 20 20 20 20 20 20 28 6c 65 74 20  )..        (let 
2f90: 6c 6f 6f 70 20 28 28 6e 75 6d 62 65 72 2d 6f 66  loop ((number-of
2fa0: 2d 6b 65 79 66 72 61 6d 65 73 20 28 6c 65 6e 67  -keyframes (leng
2fb0: 74 68 20 72 66 78 2d 6a 69 67 73 61 77 2d 6b 65  th rfx-jigsaw-ke
2fc0: 79 66 72 61 6d 65 73 29 29 0a 20 20 20 20 20 20  yframes)).      
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 69               (pi
2fe0: 65 63 65 73 20 72 66 78 2d 6a 69 67 73 61 77 2d  eces rfx-jigsaw-
2ff0: 70 69 65 63 65 73 29 20 29 0a 20 20 20 20 20 20  pieces) ).      
3000: 20 20 20 20 28 75 6e 6c 65 73 73 20 28 7a 65 72      (unless (zer
3010: 6f 3f 20 6e 75 6d 62 65 72 2d 6f 66 2d 6b 65 79  o? number-of-key
3020: 66 72 61 6d 65 73 29 0a 20 20 20 20 20 20 20 20  frames).        
3030: 20 20 20 20 28 6c 65 74 20 28 28 70 61 74 68 20      (let ((path 
3040: 28 76 65 63 74 6f 72 2d 72 65 66 20 28 63 61 64  (vector-ref (cad
3050: 72 20 28 67 69 6d 70 2d 76 65 63 74 6f 72 73 2d  r (gimp-vectors-
3060: 69 6d 70 6f 72 74 2d 66 72 6f 6d 2d 73 74 72 69  import-from-stri
3070: 6e 67 20 69 6d 61 67 65 20 0a 20 20 20 20 20 20  ng image .      
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 20 20 20 20 20 20 28 63 61 72 20 70 69 65          (car pie
30c0: 63 65 73 29 0a 20 20 20 20 20 20 20 20 20 20 20  ces).           
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 20 20 2d 31 0a 20 20 20 20 20 20 20 20 20 20     -1.          
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3140: 20 20 20 20 54 52 55 45 0a 20 20 20 20 20 20 20      TRUE.       
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 20 20 20 20 20 20 20 46 41 4c 53 45 20 29 29 0a         FALSE )).
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b0: 20 20 20 20 30 20 29 29 29 0a 20 20 20 20 20 20      0 ))).      
31c0: 20 20 20 20 20 20 20 20 28 67 69 6d 70 2d 76 65          (gimp-ve
31d0: 63 74 6f 72 73 2d 74 6f 2d 73 65 6c 65 63 74 69  ctors-to-selecti
31e0: 6f 6e 20 70 61 74 68 20 43 48 41 4e 4e 45 4c 2d  on path CHANNEL-
31f0: 4f 50 2d 41 44 44 20 54 52 55 45 20 46 41 4c 53  OP-ADD TRUE FALS
3200: 45 20 30 20 30 29 0a 20 20 20 20 20 20 20 20 20  E 0 0).         
3210: 20 20 20 20 20 28 6c 6f 6f 70 20 28 70 72 65 64       (loop (pred
3220: 20 6e 75 6d 62 65 72 2d 6f 66 2d 6b 65 79 66 72   number-of-keyfr
3230: 61 6d 65 73 29 0a 20 20 20 20 20 20 20 20 20 20  ames).          
3240: 20 20 20 20 20 20 20 20 20 20 28 63 64 72 20 70            (cdr p
3250: 69 65 63 65 73 29 20 29 29 29 29 0a 20 20 20 20  ieces) )))).    
3260: 20 20 20 20 28 67 69 6d 70 2d 73 65 6c 65 63 74      (gimp-select
3270: 69 6f 6e 2d 67 72 6f 77 20 69 6d 61 67 65 20 31  ion-grow image 1
3280: 29 0a 20 20 20 20 20 20 20 20 28 69 66 20 28 70  ).        (if (p
3290: 61 69 72 3f 20 72 66 78 2d 6a 69 67 73 61 77 2d  air? rfx-jigsaw-
32a0: 6b 65 79 66 72 61 6d 65 73 29 0a 20 20 20 20 20  keyframes).     
32b0: 20 20 20 20 20 28 67 69 6d 70 2d 65 64 69 74 2d       (gimp-edit-
32c0: 63 6c 65 61 72 20 6c 61 79 65 72 29 20 29 0a 20  clear layer) ). 
32d0: 20 20 20 20 20 20 20 28 77 68 65 6e 20 28 61 6e         (when (an
32e0: 64 20 28 70 61 69 72 3f 20 72 66 78 2d 6a 69 67  d (pair? rfx-jig
32f0: 73 61 77 2d 6b 65 79 66 72 61 6d 65 73 29 0a 20  saw-keyframes). 
3300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3310: 20 20 28 3e 3d 20 24 66 72 61 6d 65 20 28 63 61    (>= $frame (ca
3320: 72 20 72 66 78 2d 6a 69 67 73 61 77 2d 6b 65 79  r rfx-jigsaw-key
3330: 66 72 61 6d 65 73 29 29 20 29 0a 20 20 20 20 20  frames)) ).     
3340: 20 20 20 20 20 28 73 65 74 21 20 72 66 78 2d 6a       (set! rfx-j
3350: 69 67 73 61 77 2d 6b 65 79 66 72 61 6d 65 73 20  igsaw-keyframes 
3360: 28 63 64 72 20 72 66 78 2d 6a 69 67 73 61 77 2d  (cdr rfx-jigsaw-
3370: 6b 65 79 66 72 61 6d 65 73 29 29 20 29 0a 0a 20  keyframes)) ).. 
3380: 20 20 20 20 20 20 20 28 67 69 6d 70 2d 69 6d 61         (gimp-ima
3390: 67 65 2d 6d 65 72 67 65 2d 76 69 73 69 62 6c 65  ge-merge-visible
33a0: 2d 6c 61 79 65 72 73 20 69 6d 61 67 65 20 43 4c  -layers image CL
33b0: 49 50 2d 54 4f 2d 49 4d 41 47 45 29 0a 20 20 20  IP-TO-IMAGE).   
33c0: 20 20 20 20 20 28 72 66 78 2d 73 61 76 65 2d 66       (rfx-save-f
33d0: 72 61 6d 65 20 69 6d 61 67 65 20 22 24 6f 75 74  rame image "$out
33e0: 22 29 20 0a 20 20 20 20 20 20 20 20 29 0a 20 20  ") .        ).  
33f0: 20 20 20 20 29 0a 20 20 20 20 7d 0a 20 20 29 3b      ).    }.  );
3400: 0a 3c 2f 6c 6f 6f 70 3e 0a 0a 3c 70 6f 73 74 3e  .</loop>..<post>
3410: 0a 3c 2f 70 6f 73 74 3e 0a 0a 3c 6f 6e 63 68 61  .</post>..<oncha
3420: 6e 67 65 3e 0a 69 6e 69 74 7c 24 70 30 5f 6d 61  nge>.init|$p0_ma
3430: 78 20 3d 20 35 30 3b 0a 69 6e 69 74 7c 24 70 31  x = 50;.init|$p1
3440: 5f 6d 61 78 20 3d 20 35 30 3b 0a 69 6e 69 74 7c  _max = 50;.init|
3450: 24 70 30 20 3d 20 33 3b 0a 69 6e 69 74 7c 24 70  $p0 = 3;.init|$p
3460: 31 20 3d 20 33 3b 0a 3c 2f 6f 6e 63 68 61 6e 67  1 = 3;.</onchang
3470: 65 3e 0a 0a                                      e>..