RFX-GIMP

Hex Artifact Content
Login

Artifact 2d73fa231b28400205a13fe874a2bad1ee72327c:


0000: 23 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69  # This program i
0010: 73 20 66 72 65 65 20 73 6f 66 74 77 61 72 65 3b  s free software;
0020: 20 79 6f 75 20 63 61 6e 20 72 65 64 69 73 74 72   you can redistr
0030: 69 62 75 74 65 20 69 74 20 61 6e 64 2f 6f 72 20  ibute it and/or 
0040: 6d 6f 64 69 66 79 0a 23 20 69 74 20 75 6e 64 65  modify.# it unde
0050: 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  r the terms of t
0060: 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50  he GNU General P
0070: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 76 65  ublic License ve
0080: 72 73 69 6f 6e 20 33 20 6f 72 20 68 69 67 68 65  rsion 3 or highe
0090: 72 0a 23 20 61 73 20 70 75 62 6c 69 73 68 65 64  r.# as published
00a0: 20 62 79 20 74 68 65 20 46 72 65 65 20 53 6f 66   by the Free Sof
00b0: 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f 6e  tware Foundation
00c0: 2e 0a 0a 75 73 65 20 49 4f 3a 3a 53 6f 63 6b 65  ...use IO::Socke
00d0: 74 3b 20 0a 75 73 65 20 54 65 78 74 3a 3a 42 61  t; .use Text::Ba
00e0: 6c 61 6e 63 65 64 3b 0a 0a 69 66 20 28 24 45 4e  lanced;..if ($EN
00f0: 56 7b 27 52 46 58 47 49 4d 50 5f 50 4f 52 54 27  V{'RFXGIMP_PORT'
0100: 7d 29 20 7b 0a 20 20 24 72 66 78 5f 70 6f 72 74  }) {.  $rfx_port
0110: 20 3d 20 24 45 4e 56 7b 27 52 46 58 47 49 4d 50   = $ENV{'RFXGIMP
0120: 5f 50 4f 52 54 27 7d 3b 0a 20 20 7d 0a 65 6c 73  _PORT'};.  }.els
0130: 65 20 7b 0a 20 20 24 72 66 78 5f 70 6f 72 74 20  e {.  $rfx_port 
0140: 3d 20 31 30 30 30 38 3b 20 0a 20 20 7d 0a 0a 24  = 10008; .  }..$
0150: 73 6f 63 6b 20 3d 20 6e 65 77 20 49 4f 3a 3a 53  sock = new IO::S
0160: 6f 63 6b 65 74 3a 3a 49 4e 45 54 20 28 20 50 65  ocket::INET ( Pe
0170: 65 72 41 64 64 72 20 3d 3e 20 27 6c 6f 63 61 6c  erAddr => 'local
0180: 68 6f 73 74 27 2c 20 0a 20 20 20 20 20 20 20 20  host', .        
0190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
01a0: 20 20 20 20 20 20 20 50 65 65 72 50 6f 72 74 20         PeerPort 
01b0: 3d 3e 20 24 72 66 78 5f 70 6f 72 74 2c 20 0a 20  => $rfx_port, . 
01c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
01d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 72                Pr
01e0: 6f 74 6f 20 3d 3e 20 27 74 63 70 27 20 0a 20 20  oto => 'tcp' .  
01f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0200: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a               );.
0210: 69 66 20 28 20 6e 6f 74 20 64 65 66 69 6e 65 64  if ( not defined
0220: 20 24 73 6f 63 6b 20 29 20 7b 0a 20 20 6d 79 20   $sock ) {.  my 
0230: 24 72 66 78 5f 70 69 64 20 3d 20 66 6f 72 6b 28  $rfx_pid = fork(
0240: 29 3b 0a 20 20 69 66 20 28 6e 6f 74 20 64 65 66  );.  if (not def
0250: 69 6e 65 64 20 24 72 66 78 5f 70 69 64 29 20 7b  ined $rfx_pid) {
0260: 0a 20 20 20 20 26 73 69 67 5f 65 72 72 6f 72 28  .    &sig_error(
0270: 22 55 4e 41 42 4c 45 20 54 4f 20 45 58 45 43 55  "UNABLE TO EXECU
0280: 54 45 20 47 49 4d 50 3a 20 4e 6f 74 20 65 6e 6f  TE GIMP: Not eno
0290: 75 67 68 20 72 65 73 6f 75 72 63 65 73 22 29 3b  ugh resources");
02a0: 0a 20 20 20 20 7d 20 0a 20 20 65 6c 73 69 66 20  .    } .  elsif 
02b0: 28 24 72 66 78 5f 70 69 64 20 3d 3d 20 30 29 20  ($rfx_pid == 0) 
02c0: 7b 0a 20 20 20 20 69 66 20 28 20 2d 66 20 24 74  {.    if ( -f $t
02d0: 6d 70 64 69 72 20 2e 20 22 72 66 78 67 69 6d 70  mpdir . "rfxgimp
02e0: 2e 70 69 64 22 29 20 7b 0a 20 20 20 20 20 20 6f  .pid") {.      o
02f0: 70 65 6e 28 50 49 44 46 49 4c 45 2c 20 24 74 6d  pen(PIDFILE, $tm
0300: 70 64 69 72 20 2e 20 22 72 66 78 67 69 6d 70 2e  pdir . "rfxgimp.
0310: 70 69 64 22 29 3b 0a 20 20 20 20 20 20 23 20 73  pid");.      # s
0320: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 64  hould probably d
0330: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
0340: 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 6f  ecking for the o
0350: 66 66 20 63 68 61 6e 63 65 20 74 68 61 74 0a 20  ff chance that. 
0360: 20 20 20 20 20 23 20 74 68 65 20 50 49 44 20 68       # the PID h
0370: 61 73 20 62 65 65 6e 20 72 65 63 79 63 6c 65 64  as been recycled
0380: 20 6f 72 20 74 68 65 20 73 79 73 74 65 6d 20 68   or the system h
0390: 61 73 20 72 65 62 6f 6f 74 65 64 20 28 65 2e 67  as rebooted (e.g
03a0: 2c 20 63 68 65 63 6b 0a 20 20 20 20 20 20 23 20  , check.      # 
03b0: 69 66 20 70 72 6f 63 65 73 73 20 77 61 73 20 65  if process was e
03c0: 78 65 63 75 74 65 64 20 77 69 74 68 20 2f 75 73  xecuted with /us
03d0: 72 2f 62 69 6e 2f 70 65 72 6c 2e 20 42 75 74 20  r/bin/perl. But 
03e0: 66 6f 72 20 6e 6f 77 2e 2e 2e 0a 20 20 20 20 20  for now....     
03f0: 20 6b 69 6c 6c 28 31 35 2c 20 2d 3c 50 49 44 46   kill(15, -<PIDF
0400: 49 4c 45 3e 29 3b 20 23 20 74 68 65 20 6e 65 67  ILE>); # the neg
0410: 61 74 69 76 65 20 50 49 44 20 6d 65 61 6e 73 20  ative PID means 
0420: 6b 69 6c 6c 20 61 6c 6c 20 63 68 69 6c 64 72 65  kill all childre
0430: 6e 2c 20 74 6f 6f 2e 0a 20 20 20 20 20 20 63 6c  n, too..      cl
0440: 6f 73 65 28 50 49 44 46 49 4c 45 29 3b 0a 20 20  ose(PIDFILE);.  
0450: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 70 67 69      }.    setpgi
0460: 64 28 24 24 2c 30 29 3b 20 23 20 63 68 61 6e 67  d($$,0); # chang
0470: 65 20 74 68 65 20 70 67 72 6f 75 70 20 74 6f 20  e the pgroup to 
0480: 74 68 69 73 20 66 6f 72 6b 65 64 20 70 72 6f 63  this forked proc
0490: 65 73 73 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ess, rather than
04a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
04b0: 20 20 20 20 23 20 74 68 65 20 6f 72 69 67 69 6e      # the origin
04c0: 61 6c 20 4c 69 56 45 53 20 28 73 6f 20 74 68 61  al LiVES (so tha
04d0: 74 20 77 65 20 64 6f 6e 27 74 20 6b 69 6c 6c 20  t we don't kill 
04e0: 4c 69 56 45 53 20 77 68 65 6e 20 0a 20 20 20 20  LiVES when .    
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
0500: 20 74 68 69 73 20 70 72 67 72 6f 75 70 20 69 73   this prgroup is
0510: 20 6b 69 6c 6c 65 64 29 2e 0a 20 20 20 20 6f 70   killed)..    op
0520: 65 6e 28 50 49 44 46 49 4c 45 2c 20 22 3e 22 20  en(PIDFILE, ">" 
0530: 2e 20 24 74 6d 70 64 69 72 20 2e 20 22 72 66 78  . $tmpdir . "rfx
0540: 67 69 6d 70 2e 70 69 64 22 29 3b 20 23 20 6f 76  gimp.pid"); # ov
0550: 65 72 77 72 69 74 65 20 6f 6c 64 20 66 69 6c 65  erwrite old file
0560: 0a 20 20 20 20 70 72 69 6e 74 20 50 49 44 46 49  .    print PIDFI
0570: 4c 45 20 24 24 3b 0a 20 20 20 20 63 6c 6f 73 65  LE $$;.    close
0580: 28 50 49 44 46 49 4c 45 29 3b 0a 20 20 20 20 6d  (PIDFILE);.    m
0590: 79 20 24 73 74 61 72 74 5f 67 69 6d 70 20 3d 20  y $start_gimp = 
05a0: 71 71 7b 20 67 69 6d 70 20 2d 69 20 2d 62 20 22  qq{ gimp -i -b "
05b0: 28 70 6c 75 67 2d 69 6e 2d 73 63 72 69 70 74 2d  (plug-in-script-
05c0: 66 75 2d 73 65 72 76 65 72 20 31 20 24 72 66 78  fu-server 1 $rfx
05d0: 5f 70 6f 72 74 20 5c 5c 5c 22 5c 5c 5c 22 29 22  _port \\\"\\\")"
05e0: 20 26 20 7d 3b 0a 20 20 20 20 73 79 73 74 65 6d   & };.    system
05f0: 20 28 20 24 73 74 61 72 74 5f 67 69 6d 70 20 29   ( $start_gimp )
0600: 3b 20 23 20 74 68 6f 75 67 68 20 73 74 61 72 74  ; # though start
0610: 65 64 20 61 73 20 73 65 70 61 72 61 74 65 20 70  ed as separate p
0620: 72 6f 63 65 73 73 2c 20 47 49 4d 50 20 6e 6f 77  rocess, GIMP now
0630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0640: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 69               # i
0650: 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 73  s part of this s
0660: 70 61 77 6e 65 64 20 63 68 69 6c 64 27 73 20 70  pawned child's p
0670: 67 72 6f 75 70 2c 20 6e 6f 74 20 74 68 65 20 4c  group, not the L
0680: 69 56 45 53 20 70 67 72 6f 75 70 0a 20 20 20 20  iVES pgroup.    
0690: 73 6c 65 65 70 28 29 3b 20 23 20 64 6f 20 6e 6f  sleep(); # do no
06a0: 74 68 69 6e 67 2c 20 66 6f 72 65 76 65 72 0a 20  thing, forever. 
06b0: 20 20 20 26 73 69 67 5f 65 72 72 6f 72 28 22 47     &sig_error("G
06c0: 49 4d 50 20 6b 69 6c 6c 65 64 20 62 79 20 65 78  IMP killed by ex
06d0: 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 5c 6e  ternal process\n
06e0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 65 6c 73 65  ");.    }.  else
06f0: 20 7b 0a 20 20 20 20 77 68 69 6c 65 20 28 6e 6f   {.    while (no
0700: 74 20 64 65 66 69 6e 65 64 20 24 73 6f 63 6b 29  t defined $sock)
0710: 20 7b 0a 20 20 20 20 20 20 73 6c 65 65 70 20 28   {.      sleep (
0720: 31 29 3b 0a 20 20 20 20 20 20 24 73 6f 63 6b 20  1);.      $sock 
0730: 3d 20 6e 65 77 20 49 4f 3a 3a 53 6f 63 6b 65 74  = new IO::Socket
0740: 3a 3a 49 4e 45 54 20 28 20 50 65 65 72 41 64 64  ::INET ( PeerAdd
0750: 72 20 3d 3e 20 27 6c 6f 63 61 6c 68 6f 73 74 27  r => 'localhost'
0760: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0780: 20 20 20 20 20 20 20 20 50 65 65 72 50 6f 72 74          PeerPort
0790: 20 3d 3e 20 24 72 66 78 5f 70 6f 72 74 2c 20 0a   => $rfx_port, .
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07c0: 20 20 20 20 20 50 72 6f 74 6f 20 3d 3e 20 27 74       Proto => 't
07d0: 63 70 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  cp' .           
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
0800: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
0810: 23 20 44 65 66 69 6e 65 20 61 20 50 65 72 6c 20  # Define a Perl 
0820: 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 73  subroutine for s
0830: 65 6e 64 69 6e 67 20 6d 65 73 73 61 67 65 73 20  ending messages 
0840: 74 6f 20 74 68 65 20 53 46 20 73 65 72 76 65 72  to the SF server
0850: 20 61 6e 64 20 77 61 69 74 69 6e 67 0a 23 20 66   and waiting.# f
0860: 6f 72 20 61 20 72 65 73 70 6f 6e 73 65 2e 0a 23  or a response..#
0870: 0a 73 75 62 20 72 66 78 5f 73 65 6e 64 6d 73 67  .sub rfx_sendmsg
0880: 20 7b 0a 20 20 6d 79 20 24 6d 65 73 73 61 67 65   {.  my $message
0890: 20 3d 20 24 5f 5b 30 5d 3b 0a 20 20 6d 79 20 24   = $_[0];.  my $
08a0: 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20 28 24 6d  len = length ($m
08b0: 65 73 73 61 67 65 29 3b 0a 20 20 69 66 20 28 24  essage);.  if ($
08c0: 6c 65 6e 20 3e 20 36 35 35 33 35 29 20 7b 0a 20  len > 65535) {. 
08d0: 20 20 20 26 73 69 67 5f 65 72 72 6f 72 28 22 45     &sig_error("E
08e0: 52 52 4f 52 3a 20 73 63 72 69 70 74 20 69 73 20  RROR: script is 
08f0: 74 6f 6f 20 6c 6f 6e 67 20 66 6f 72 20 6f 6e 65  too long for one
0900: 20 73 65 72 76 65 72 20 72 65 71 75 65 73 74 3a   server request:
0910: 20 24 6c 65 6e 20 3e 20 36 35 35 33 35 22 29 3b   $len > 65535");
0920: 0a 20 20 20 20 7d 3b 0a 20 20 23 20 73 65 6e 64  .    };.  # send
0930: 20 73 63 72 69 70 74 20 74 6f 20 47 49 4d 50 0a   script to GIMP.
0940: 20 20 6d 79 20 24 68 65 61 64 65 72 20 3d 20 70    my $header = p
0950: 61 63 6b 28 20 27 61 6e 27 2c 20 27 47 27 2c 20  ack( 'an', 'G', 
0960: 24 6c 65 6e 29 3b 0a 20 20 73 79 73 77 72 69 74  $len);.  syswrit
0970: 65 28 20 24 73 6f 63 6b 2c 20 24 5f 20 29 20 66  e( $sock, $_ ) f
0980: 6f 72 20 28 24 68 65 61 64 65 72 2c 20 24 6d 65  or ($header, $me
0990: 73 73 61 67 65 29 3b 0a 20 20 23 20 77 61 69 74  ssage);.  # wait
09a0: 20 66 6f 72 20 72 65 73 70 6f 6e 73 65 0a 20 20   for response.  
09b0: 6d 79 20 24 72 69 6e 20 3d 20 27 27 3b 0a 20 20  my $rin = '';.  
09c0: 76 65 63 28 20 24 72 69 6e 2c 20 66 69 6c 65 6e  vec( $rin, filen
09d0: 6f 28 24 73 6f 63 6b 29 2c 20 31 20 29 20 3d 20  o($sock), 1 ) = 
09e0: 31 3b 0a 20 20 73 65 6c 65 63 74 28 20 24 72 69  1;.  select( $ri
09f0: 6e 2c 20 20 75 6e 64 65 66 2c 20 75 6e 64 65 66  n,  undef, undef
0a00: 2c 20 75 6e 64 65 66 20 29 3b 20 20 20 20 23 20  , undef );    # 
0a10: 77 61 69 74 20 28 66 6f 72 65 76 65 72 29 20 66  wait (forever) f
0a20: 6f 72 20 72 65 73 70 6f 6e 73 65 20 73 74 61 72  or response star
0a30: 74 0a 20 20 73 65 6c 65 63 74 28 20 75 6e 64 65  t.  select( unde
0a40: 66 2c 20 75 6e 64 65 66 2c 20 75 6e 64 65 66 2c  f, undef, undef,
0a50: 20 2e 31 20 29 3b 20 20 20 20 20 20 20 23 20 77   .1 );       # w
0a60: 61 69 74 20 61 20 62 69 74 20 66 6f 72 20 72 65  ait a bit for re
0a70: 73 70 6f 6e 73 65 20 74 6f 20 66 69 6e 69 73 68  sponse to finish
0a80: 0a 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 20 20 20 20 20 20 20 20 23 20 20 69              #  i
0ab0: 6e 63 72 65 61 73 65 20 77 61 69 74 20 69 66 20  ncrease wait if 
0ac0: 49 4e 56 41 4c 49 44 2f 49 4e 43 4f 4d 50 4c 45  INVALID/INCOMPLE
0ad0: 54 45 20 52 45 53 50 4f 4e 53 45 20 6f 63 63 75  TE RESPONSE occu
0ae0: 72 73 0a 20 20 23 20 72 65 73 70 6f 6e 73 65 0a  rs.  # response.
0af0: 20 20 24 6c 65 6e 20 3d 20 73 79 73 72 65 61 64    $len = sysread
0b00: 28 20 24 73 6f 63 6b 2c 20 24 68 65 61 64 65 72  ( $sock, $header
0b10: 2c 20 34 20 29 20 6f 72 20 26 73 69 67 5f 65 72  , 4 ) or &sig_er
0b20: 72 6f 72 28 22 49 4e 56 41 4c 49 44 20 52 45 53  ror("INVALID RES
0b30: 50 4f 4e 53 45 3a 20 65 6d 70 74 79 20 72 65 73  PONSE: empty res
0b40: 70 6f 6e 73 65 22 29 3b 0a 20 20 28 20 24 6c 65  ponse");.  ( $le
0b50: 6e 20 3d 3d 20 34 20 61 6e 64 20 24 68 65 61 64  n == 4 and $head
0b60: 65 72 20 3d 7e 20 2f 5e 47 2f 20 29 20 6f 72 20  er =~ /^G/ ) or 
0b70: 26 73 69 67 5f 65 72 72 6f 72 28 22 49 4e 56 41  &sig_error("INVA
0b80: 4c 49 44 20 52 45 53 50 4f 4e 53 45 3a 20 62 61  LID RESPONSE: ba
0b90: 64 20 68 65 61 64 65 72 22 29 3b 0a 20 20 6d 79  d header");.  my
0ba0: 20 24 73 74 61 74 75 73 3b 0a 20 20 28 24 73 74   $status;.  ($st
0bb0: 61 74 75 73 2c 20 24 6c 65 6e 29 20 3d 20 75 6e  atus, $len) = un
0bc0: 70 61 63 6b 28 20 27 78 43 6e 27 2c 20 24 68 65  pack( 'xCn', $he
0bd0: 61 64 65 72 20 29 3b 0a 20 20 6d 79 20 24 72 65  ader );.  my $re
0be0: 73 70 6f 6e 73 65 3b 0a 20 20 28 20 73 79 73 72  sponse;.  ( sysr
0bf0: 65 61 64 28 20 24 73 6f 63 6b 2c 20 24 72 65 73  ead( $sock, $res
0c00: 70 6f 6e 73 65 2c 20 24 6c 65 6e 20 29 20 3d 3d  ponse, $len ) ==
0c10: 20 24 6c 65 6e 20 29 20 6f 72 20 26 73 69 67 5f   $len ) or &sig_
0c20: 65 72 72 6f 72 28 22 49 4e 43 4f 4d 50 4c 45 54  error("INCOMPLET
0c30: 45 20 52 45 53 50 4f 4e 53 45 3a 20 24 72 65 73  E RESPONSE: $res
0c40: 70 6f 6e 73 65 22 29 3b 0a 20 20 23 20 65 78 69  ponse");.  # exi
0c50: 74 20 69 66 20 72 65 73 70 6f 6e 73 65 20 69 73  t if response is
0c60: 20 6e 6f 74 20 22 53 75 63 63 65 73 73 22 0a 20   not "Success". 
0c70: 20 69 66 20 28 20 24 73 74 61 74 75 73 20 61 6e   if ( $status an
0c80: 64 20 24 72 65 73 70 6f 6e 73 65 20 3d 7e 20 2f  d $response =~ /
0c90: 5e 45 72 72 6f 72 3a 20 53 75 63 63 65 73 73 5c  ^Error: Success\
0ca0: 6e 2f 69 20 29 20 7b 0a 20 20 20 20 26 73 69 67  n/i ) {.    &sig
0cb0: 5f 65 72 72 6f 72 28 22 55 4e 53 55 43 43 45 53  _error("UNSUCCES
0cc0: 53 46 55 4c 20 45 58 45 43 55 54 49 4f 4e 3a 20  SFUL EXECUTION: 
0cd0: 53 63 72 69 70 74 2d 66 75 20 65 72 72 6f 72 22  Script-fu error"
0ce0: 29 3b 0a 20 20 20 20 7d 0a 20 20 24 73 74 61 74  );.    }.  $stat
0cf0: 75 73 3b 20 0a 20 20 7d 0a 0a 23 20 64 65 66 69  us; .  }..# defi
0d00: 6e 65 20 61 20 53 63 72 69 70 74 2d 66 75 20 75  ne a Script-fu u
0d10: 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20  tility function 
0d20: 74 6f 20 73 61 76 65 20 66 72 61 6d 65 73 20 75  to save frames u
0d30: 73 69 6e 67 20 74 68 65 20 50 4e 47 20 6f 72 20  sing the PNG or 
0d40: 4a 50 47 0a 23 20 63 6f 6d 70 72 65 73 73 69 6f  JPG.# compressio
0d50: 6e 20 6c 65 76 65 6c 73 20 73 70 65 63 69 66 69  n levels specifi
0d60: 65 64 20 69 6e 20 27 67 69 6d 70 72 63 27 2e 20  ed in 'gimprc'. 
0d70: 0a 23 20 54 6f 20 73 70 65 63 69 66 79 20 61 20  .# To specify a 
0d80: 50 4e 47 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20  PNG compression 
0d90: 6c 65 76 65 6c 20 6f 66 20 35 2c 20 69 6e 63 6c  level of 5, incl
0da0: 75 64 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ude the followin
0db0: 67 20 6c 69 6e 65 0a 23 20 69 6e 20 67 69 6d 70  g line.# in gimp
0dc0: 72 63 3a 0a 23 20 20 20 28 72 66 78 2d 70 6e 67  rc:.#   (rfx-png
0dd0: 2d 63 6f 6d 70 72 65 73 73 69 6f 6e 20 22 35 22  -compression "5"
0de0: 29 20 0a 23 20 49 66 20 6e 6f 74 20 73 70 65 63  ) .# If not spec
0df0: 69 66 69 65 64 20 74 68 65 6e 20 61 20 64 65 66  ified then a def
0e00: 61 75 6c 74 20 6c 65 76 65 6c 20 6f 66 20 22 33  ault level of "3
0e10: 22 20 69 73 20 61 73 73 75 6d 65 64 2e 0a 23 20  " is assumed..# 
0e20: 22 33 22 20 69 73 20 61 20 67 6f 6f 64 20 63 68  "3" is a good ch
0e30: 6f 69 63 65 20 66 6f 72 20 50 4e 47 73 20 62 65  oice for PNGs be
0e40: 63 61 75 73 65 20 68 69 67 68 65 72 20 6c 65 76  cause higher lev
0e50: 65 6c 73 20 64 6f 75 62 6c 65 20 74 68 65 20 77  els double the w
0e60: 72 69 74 65 0a 23 20 74 69 6d 65 73 20 77 68 69  rite.# times whi
0e70: 6c 65 20 6f 6e 6c 79 20 6f 66 66 65 72 69 6e 67  le only offering
0e80: 20 61 62 6f 75 74 20 31 35 25 20 72 65 64 75 63   about 15% reduc
0e90: 74 69 6f 6e 20 69 6e 20 66 69 6c 65 20 73 69 7a  tion in file siz
0ea0: 65 2e 0a 23 20 54 6f 20 73 70 65 63 69 66 79 20  e..# To specify 
0eb0: 61 20 4a 50 47 20 63 6f 6d 70 72 65 73 73 69 6f  a JPG compressio
0ec0: 6e 20 6c 65 76 65 6c 20 6f 66 20 38 35 2c 20 69  n level of 85, i
0ed0: 6e 63 6c 75 64 65 20 74 68 65 20 66 6f 6c 6c 6f  nclude the follo
0ee0: 77 69 6e 67 20 6c 69 6e 65 0a 23 20 69 6e 20 67  wing line.# in g
0ef0: 69 6d 70 72 63 3a 0a 23 20 20 20 28 72 66 78 2d  imprc:.#   (rfx-
0f00: 6a 70 67 2d 63 6f 6d 70 72 65 73 73 69 6f 6e 20  jpg-compression 
0f10: 22 38 35 22 29 20 0a 23 20 49 66 20 6e 6f 74 20  "85") .# If not 
0f20: 73 70 65 63 69 66 69 65 64 20 74 68 65 6e 20 61  specified then a
0f30: 20 64 65 66 61 75 6c 74 20 6c 65 76 65 6c 20 6f   default level o
0f40: 66 20 22 39 33 22 20 69 73 20 61 73 73 75 6d 65  f "93" is assume
0f50: 64 2e 0a 0a 23 20 4e 4f 54 45 3a 20 27 72 66 78  d...# NOTE: 'rfx
0f60: 2d 73 61 76 65 2d 66 72 61 6d 65 27 20 44 45 4c  -save-frame' DEL
0f70: 45 54 45 53 20 74 68 65 20 69 6d 61 67 65 2e 20  ETES the image. 
0f80: 20 0a 26 72 66 78 5f 73 65 6e 64 6d 73 67 28 20   .&rfx_sendmsg( 
0f90: 71 71 7b 0a 20 20 28 62 65 67 69 6e 0a 20 20 20  qq{.  (begin.   
0fa0: 20 28 64 65 66 69 6e 65 20 72 66 78 2d 63 75 72   (define rfx-cur
0fb0: 74 6d 70 64 69 72 20 22 24 63 75 72 74 6d 70 64  tmpdir "$curtmpd
0fc0: 69 72 22 29 0a 20 20 20 20 28 64 65 66 69 6e 65  ir").    (define
0fd0: 20 72 66 78 2d 69 6d 67 65 78 74 20 22 24 69 6d   rfx-imgext "$im
0fe0: 67 5f 65 78 74 22 29 0a 20 20 20 20 28 75 6e 6c  g_ext").    (unl
0ff0: 65 73 73 20 28 64 65 66 69 6e 65 64 3f 20 27 72  ess (defined? 'r
1000: 66 78 2d 73 61 76 65 2d 66 72 61 6d 65 29 0a 20  fx-save-frame). 
1010: 20 20 20 20 20 28 64 65 66 69 6e 65 20 72 66 78       (define rfx
1020: 2d 70 6e 67 2d 63 6f 6d 70 72 65 73 73 69 6f 6e  -png-compression
1030: 20 28 63 61 74 63 68 20 23 66 20 28 67 69 6d 70   (catch #f (gimp
1040: 2d 67 69 6d 70 72 63 2d 71 75 65 72 79 20 22 72  -gimprc-query "r
1050: 66 78 2d 70 6e 67 2d 63 6f 6d 70 72 65 73 73 69  fx-png-compressi
1060: 6f 6e 22 29 29 29 0a 20 20 20 20 20 20 28 73 65  on"))).      (se
1070: 74 21 20 72 66 78 2d 70 6e 67 2d 63 6f 6d 70 72  t! rfx-png-compr
1080: 65 73 73 69 6f 6e 20 28 69 66 20 72 66 78 2d 70  ession (if rfx-p
1090: 6e 67 2d 63 6f 6d 70 72 65 73 73 69 6f 6e 0a 20  ng-compression. 
10a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c0: 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 72   (string->number
10d0: 20 28 63 61 72 20 72 66 78 2d 70 6e 67 2d 63 6f   (car rfx-png-co
10e0: 6d 70 72 65 73 73 69 6f 6e 29 29 0a 20 20 20 20  mpression)).    
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20                3 
1110: 29 29 0a 20 20 20 20 20 20 28 64 65 66 69 6e 65  )).      (define
1120: 20 72 66 78 2d 6a 70 67 2d 63 6f 6d 70 72 65 73   rfx-jpg-compres
1130: 73 69 6f 6e 20 28 63 61 74 63 68 20 23 66 20 28  sion (catch #f (
1140: 67 69 6d 70 2d 67 69 6d 70 72 63 2d 71 75 65 72  gimp-gimprc-quer
1150: 79 20 22 72 66 78 2d 6a 70 67 2d 63 6f 6d 70 72  y "rfx-jpg-compr
1160: 65 73 73 69 6f 6e 22 29 29 29 0a 20 20 20 20 20  ession"))).     
1170: 20 28 73 65 74 21 20 72 66 78 2d 6a 70 67 2d 63   (set! rfx-jpg-c
1180: 6f 6d 70 72 65 73 73 69 6f 6e 20 28 69 66 20 72  ompression (if r
1190: 66 78 2d 6a 70 67 2d 63 6f 6d 70 72 65 73 73 69  fx-jpg-compressi
11a0: 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  on.             
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c0: 20 20 20 20 20 28 73 74 72 69 6e 67 2d 3e 6e 75       (string->nu
11d0: 6d 62 65 72 20 28 63 61 72 20 72 66 78 2d 6a 70  mber (car rfx-jp
11e0: 67 2d 63 6f 6d 70 72 65 73 73 69 6f 6e 29 29 0a  g-compression)).
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1210: 20 20 39 33 20 29 29 0a 20 20 20 20 20 20 28 64    93 )).      (d
1220: 65 66 69 6e 65 20 28 72 66 78 2d 73 61 76 65 2d  efine (rfx-save-
1230: 66 72 61 6d 65 20 69 6d 61 67 65 20 62 61 73 65  frame image base
1240: 6e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 28 6c  name).        (l
1250: 65 74 20 28 28 66 69 6c 65 6e 61 6d 65 20 28 73  et ((filename (s
1260: 74 72 69 6e 67 2d 61 70 70 65 6e 64 20 72 66 78  tring-append rfx
1270: 2d 63 75 72 74 6d 70 64 69 72 20 44 49 52 2d 53  -curtmpdir DIR-S
1280: 45 50 41 52 41 54 4f 52 20 62 61 73 65 6e 61 6d  EPARATOR basenam
1290: 65 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  e)).            
12a0: 20 20 28 6c 61 79 65 72 20 28 63 61 72 20 28 67    (layer (car (g
12b0: 69 6d 70 2d 69 6d 61 67 65 2d 67 65 74 2d 61 63  imp-image-get-ac
12c0: 74 69 76 65 2d 6c 61 79 65 72 20 69 6d 61 67 65  tive-layer image
12d0: 29 29 29 20 29 0a 20 20 20 20 20 20 20 20 20 20  ))) ).          
12e0: 28 69 66 20 28 73 74 72 69 6e 67 2d 63 69 3d 3f  (if (string-ci=?
12f0: 20 72 66 78 2d 69 6d 67 65 78 74 20 22 2e 6a 70   rfx-imgext ".jp
1300: 67 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  g").            
1310: 28 62 65 67 69 6e 0a 20 20 20 20 20 20 20 20 20  (begin.         
1320: 20 20 20 20 20 28 67 69 6d 70 2d 63 6f 6e 74 65       (gimp-conte
1330: 78 74 2d 70 75 73 68 29 0a 20 20 20 20 20 20 20  xt-push).       
1340: 20 20 20 20 20 20 20 28 67 69 6d 70 2d 63 6f 6e         (gimp-con
1350: 74 65 78 74 2d 73 65 74 2d 62 61 63 6b 67 72 6f  text-set-backgro
1360: 75 6e 64 20 27 28 36 20 36 20 36 29 29 0a 20 20  und '(6 6 6)).  
1370: 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 74              (let
1380: 20 6c 6f 6f 70 20 28 28 6c 61 79 65 72 73 20 28   loop ((layers (
1390: 76 65 63 74 6f 72 2d 3e 6c 69 73 74 20 28 63 61  vector->list (ca
13a0: 64 72 20 28 67 69 6d 70 2d 69 6d 61 67 65 2d 67  dr (gimp-image-g
13b0: 65 74 2d 6c 61 79 65 72 73 20 69 6d 61 67 65 29  et-layers image)
13c0: 29 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  )))).           
13d0: 20 20 20 20 20 28 75 6e 6c 65 73 73 20 28 6e 75       (unless (nu
13e0: 6c 6c 3f 20 6c 61 79 65 72 73 29 0a 20 20 20 20  ll? layers).    
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
1400: 66 20 28 3d 20 28 63 61 72 20 6c 61 79 65 72 73  f (= (car layers
1410: 29 20 6c 61 79 65 72 29 0a 20 20 20 20 20 20 20  ) layer).       
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 67 69               (gi
1430: 6d 70 2d 64 72 61 77 61 62 6c 65 2d 73 65 74 2d  mp-drawable-set-
1440: 76 69 73 69 62 6c 65 20 6c 61 79 65 72 20 54 52  visible layer TR
1450: 55 45 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  UE).            
1460: 20 20 20 20 20 20 20 20 28 67 69 6d 70 2d 64 72          (gimp-dr
1470: 61 77 61 62 6c 65 2d 73 65 74 2d 76 69 73 69 62  awable-set-visib
1480: 6c 65 20 28 63 61 72 20 6c 61 79 65 72 73 29 20  le (car layers) 
1490: 46 41 4c 53 45 29 20 29 0a 20 20 20 20 20 20 20  FALSE) ).       
14a0: 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f 6f 70             (loop
14b0: 20 28 63 64 72 20 6c 61 79 65 72 73 29 29 20 29   (cdr layers)) )
14c0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
14d0: 28 73 65 74 21 20 6c 61 79 65 72 20 28 63 61 72  (set! layer (car
14e0: 20 28 67 69 6d 70 2d 69 6d 61 67 65 2d 66 6c 61   (gimp-image-fla
14f0: 74 74 65 6e 20 69 6d 61 67 65 29 29 29 0a 20 20  tten image))).  
1500: 20 20 20 20 20 20 20 20 20 20 20 20 28 66 69 6c              (fil
1510: 65 2d 6a 70 65 67 2d 73 61 76 65 20 52 55 4e 2d  e-jpeg-save RUN-
1520: 4e 4f 4e 49 4e 54 45 52 41 43 54 49 56 45 20 0a  NONINTERACTIVE .
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d                im
1550: 61 67 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  age .           
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 20 20 6c 61 79 65 72 0a 20 20 20 20 20 20 20     layer.       
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 20 20 20 20 20 20 66 69 6c 65 6e 61 6d 65 20         filename 
15a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
15c0: 69 6c 65 6e 61 6d 65 20 0a 20 20 20 20 20 20 20  ilename .       
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e0: 20 20 20 20 20 20 20 28 2f 20 72 66 78 2d 6a 70         (/ rfx-jp
15f0: 67 2d 63 6f 6d 70 72 65 73 73 69 6f 6e 20 31 30  g-compression 10
1600: 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 20 30 20 3b 20 73 6d 6f 6f 74 68 69 6e 67 20 0a   0 ; smoothing .
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
1650: 3b 20 6f 70 74 69 6d 69 7a 65 20 0a 20 20 20 20  ; optimize .    
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 20 20 20 20 20 20 20 20 20 20 31 20 3b 20 70 72            1 ; pr
1680: 6f 67 72 65 73 73 69 76 65 20 0a 20 20 20 20 20  ogressive .     
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 22 22 20 3b 20 63 6f           "" ; co
16b0: 6d 6d 65 6e 74 20 0a 20 20 20 20 20 20 20 20 20  mment .         
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 30 20 3b 20 73 75 62 73 6d 70 20       0 ; subsmp 
16e0: 28 30 2d 34 29 0a 20 20 20 20 20 20 20 20 20 20  (0-4).          
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1700: 20 20 20 20 31 20 3b 20 62 61 73 65 6c 69 6e 65      1 ; baseline
1710: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 30 20 3b 20 72 65 73 74 61 72 74 20 0a 20 20 20  0 ; restart .   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 20 20 20 20 20 20 20 20 20 20 20 30 20 3b 64 63             0 ;dc
1760: 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t .             
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1780: 20 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ).             
1790: 20 28 67 69 6d 70 2d 63 6f 6e 74 65 78 74 2d 70   (gimp-context-p
17a0: 6f 70 29 20 29 0a 20 20 20 20 20 20 20 20 20 20  op) ).          
17b0: 20 20 28 62 65 67 69 6e 0a 20 20 20 20 20 20 20    (begin.       
17c0: 20 20 20 20 20 20 20 28 75 6e 6c 65 73 73 20 28         (unless (
17d0: 7a 65 72 6f 3f 20 28 63 61 72 20 28 67 69 6d 70  zero? (car (gimp
17e0: 2d 69 6d 61 67 65 2d 62 61 73 65 2d 74 79 70 65  -image-base-type
17f0: 20 69 6d 61 67 65 29 29 29 0a 20 20 20 20 20 20   image))).      
1800: 20 20 20 20 20 20 20 20 20 20 28 67 69 6d 70 2d            (gimp-
1810: 69 6d 61 67 65 2d 63 6f 6e 76 65 72 74 2d 72 67  image-convert-rg
1820: 62 20 69 6d 61 67 65 29 20 29 0a 20 20 20 20 20  b image) ).     
1830: 20 20 20 20 20 20 20 20 20 28 66 69 6c 65 2d 70           (file-p
1840: 6e 67 2d 73 61 76 65 32 20 52 55 4e 2d 4e 4f 4e  ng-save2 RUN-NON
1850: 49 4e 54 45 52 41 43 54 49 56 45 20 0a 20 20 20  INTERACTIVE .   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 20 20 20 20 20 20 20 20 20 20 69 6d 61 67 65             image
1880: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 6c 61 79 65 72 0a 20 20 20 20 20 20 20 20 20 20  layer.          
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c0: 20 20 20 20 66 69 6c 65 6e 61 6d 65 20 0a 20 20      filename .  
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
18f0: 6e 61 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20  name .          
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1910: 20 20 20 20 46 41 4c 53 45 20 3b 20 69 6e 74 65      FALSE ; inte
1920: 72 6c 61 63 65 0a 20 20 20 20 20 20 20 20 20 20  rlace.          
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 20 20 20 20 72 66 78 2d 70 6e 67 2d 63 6f 6d 70      rfx-png-comp
1950: 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 20 20  ression.        
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 20 20 46 41 4c 53 45 20 3b 20 62 6b        FALSE ; bk
1980: 67 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  gd.             
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 28 63 61 72 20 28 67 69 6d 70 2d 64 72 61 77   (car (gimp-draw
19b0: 61 62 6c 65 2d 68 61 73 2d 61 6c 70 68 61 20 6c  able-has-alpha l
19c0: 61 79 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ayer)).         
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e0: 20 20 20 20 20 46 41 4c 53 45 20 3b 20 6f 66 66       FALSE ; off
19f0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 46 41 4c 53 45 20 3b 20 70 68 79 73 0a 20 20 20  FALSE ; phys.   
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 20 20 20 20 20 20 20 20 20 20 20 46 41 4c 53 45             FALSE
1a40: 20 3b 20 74 69 6d 65 0a 20 20 20 20 20 20 20 20   ; time.        
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 20 20 54 52 55 45 20 20 3b 20 63 6f        TRUE  ; co
1a70: 6d 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  mment.          
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 46 41 4c 53 45 20 3b 20 73 76 74 72      FALSE ; svtr
1aa0: 61 6e 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ans.            
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 29 29 29 0a 20 20 20 20 20 20 20 20 20 20    ))).          
1ad0: 28 67 69 6d 70 2d 69 6d 61 67 65 2d 64 65 6c 65  (gimp-image-dele
1ae0: 74 65 20 69 6d 61 67 65 29 20 29 29 29 0a 20 20  te image) ))).  
1af0: 28 64 65 66 69 6e 65 20 28 6d 75 6c 74 69 70 6c  (define (multipl
1b00: 79 2d 6c 61 79 65 72 73 20 69 6d 61 67 65 20 6c  y-layers image l
1b10: 69 73 29 0a 20 20 20 20 28 6c 65 74 2a 20 28 28  is).    (let* ((
1b20: 6e 65 77 2d 6c 61 79 65 72 73 20 28 6d 61 70 20  new-layers (map 
1b30: 28 6c 61 6d 62 64 61 20 28 78 29 20 28 63 61 72  (lambda (x) (car
1b40: 20 28 67 69 6d 70 2d 6c 61 79 65 72 2d 63 6f 70   (gimp-layer-cop
1b50: 79 20 78 20 46 41 4c 53 45 29 29 29 0a 20 20 20  y x FALSE))).   
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b70: 20 20 20 20 20 20 20 20 20 6c 69 73 20 29 29 20           lis )) 
1b80: 29 0a 20 20 20 20 20 20 28 67 69 6d 70 2d 69 6d  ).      (gimp-im
1b90: 61 67 65 2d 61 64 64 2d 6c 61 79 65 72 20 69 6d  age-add-layer im
1ba0: 61 67 65 20 28 63 61 72 20 6e 65 77 2d 6c 61 79  age (car new-lay
1bb0: 65 72 73 29 20 2d 31 29 0a 20 20 20 20 20 20 28  ers) -1).      (
1bc0: 6c 65 74 20 6c 6f 6f 70 20 28 28 6c 61 79 65 72  let loop ((layer
1bd0: 73 20 28 63 64 72 20 6e 65 77 2d 6c 61 79 65 72  s (cdr new-layer
1be0: 73 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  s)).            
1bf0: 20 20 20 20 20 28 6e 65 77 2d 6c 61 79 65 72 20       (new-layer 
1c00: 28 63 61 72 20 6e 65 77 2d 6c 61 79 65 72 73 29  (car new-layers)
1c10: 29 20 29 0a 20 20 20 20 20 20 20 20 28 69 66 20  ) ).        (if 
1c20: 28 6e 75 6c 6c 3f 20 6c 61 79 65 72 73 29 0a 20  (null? layers). 
1c30: 20 20 20 20 20 20 20 20 20 6e 65 77 2d 6c 61 79           new-lay
1c40: 65 72 0a 20 20 20 20 20 20 20 20 20 20 28 62 65  er.          (be
1c50: 67 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  gin.            
1c60: 28 67 69 6d 70 2d 69 6d 61 67 65 2d 61 64 64 2d  (gimp-image-add-
1c70: 6c 61 79 65 72 20 69 6d 61 67 65 20 28 63 61 72  layer image (car
1c80: 20 6c 61 79 65 72 73 29 20 2d 31 29 0a 20 20 20   layers) -1).   
1c90: 20 20 20 20 20 20 20 20 20 28 67 69 6d 70 2d 6c           (gimp-l
1ca0: 61 79 65 72 2d 73 65 74 2d 6d 6f 64 65 20 28 63  ayer-set-mode (c
1cb0: 61 72 20 6c 61 79 65 72 73 29 20 4d 55 4c 54 49  ar layers) MULTI
1cc0: 50 4c 59 2d 4d 4f 44 45 29 0a 20 20 20 20 20 20  PLY-MODE).      
1cd0: 20 20 20 20 20 20 28 6c 6f 6f 70 20 28 63 64 72        (loop (cdr
1ce0: 20 6c 61 79 65 72 73 29 0a 20 20 20 20 20 20 20   layers).       
1cf0: 20 20 20 20 20 20 20 20 20 20 20 28 63 61 72 20             (car 
1d00: 28 67 69 6d 70 2d 69 6d 61 67 65 2d 6d 65 72 67  (gimp-image-merg
1d10: 65 2d 64 6f 77 6e 20 69 6d 61 67 65 0a 20 20 20  e-down image.   
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 20 20                  
1d40: 20 20 20 20 20 20 20 20 20 20 20 28 63 61 72 20             (car 
1d50: 6c 61 79 65 72 73 29 0a 20 20 20 20 20 20 20 20  layers).        
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 20 20 20 20 20 45 58 50 41 4e 44 2d 41 53 2d        EXPAND-AS-
1d90: 4e 45 43 45 53 53 41 52 59 20 29 29 29 29 29 29  NECESSARY ))))))
1da0: 29 29 29 0a 20 20 7d 0a 20 20 29 3b 0a           ))).  }.  );.