GIMP Script-fu

Hex Artifact Content
Login

Artifact ddee22d3383ee5985120be835bf05552a8f29d34:


0000: 3b 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 3b 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 61 73  ublic License as
0080: 20 70 75 62 6c 69 73 68 65 64 20 62 79 0a 3b 20   published by.; 
0090: 74 68 65 20 46 72 65 65 20 53 6f 66 74 77 61 72  the Free Softwar
00a0: 65 20 46 6f 75 6e 64 61 74 69 6f 6e 3b 20 65 69  e Foundation; ei
00b0: 74 68 65 72 20 76 65 72 73 69 6f 6e 20 32 20 6f  ther version 2 o
00c0: 66 20 74 68 65 20 4c 69 63 65 6e 73 65 2c 20 6f  f the License, o
00d0: 72 0a 3b 20 28 61 74 20 79 6f 75 72 20 6f 70 74  r.; (at your opt
00e0: 69 6f 6e 29 20 61 6e 79 20 6c 61 74 65 72 20 76  ion) any later v
00f0: 65 72 73 69 6f 6e 2e 0a 3b 0a 3b 20 54 68 69 73  ersion..;.; This
0100: 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74   program is dist
0110: 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68  ributed in the h
0120: 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c  ope that it will
0130: 20 62 65 20 75 73 65 66 75 6c 2c 0a 3b 20 62 75   be useful,.; bu
0140: 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20 57 41  t WITHOUT ANY WA
0150: 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 74 20  RRANTY; without 
0160: 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65 64  even the implied
0170: 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 3b 20 4d   warranty of.; M
0180: 45 52 43 48 41 4e 54 41 42 49 4c 49 54 59 20 6f  ERCHANTABILITY o
0190: 72 20 46 49 54 4e 45 53 53 20 46 4f 52 20 41 20  r FITNESS FOR A 
01a0: 50 41 52 54 49 43 55 4c 41 52 20 50 55 52 50 4f  PARTICULAR PURPO
01b0: 53 45 2e 20 20 53 65 65 20 74 68 65 0a 3b 20 47  SE.  See the.; G
01c0: 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69  NU General Publi
01d0: 63 20 4c 69 63 65 6e 73 65 20 66 6f 72 20 6d 6f  c License for mo
01e0: 72 65 20 64 65 74 61 69 6c 73 2e 0a 0a 3b 3b 20  re details...;; 
01f0: 54 68 69 73 20 66 69 6c 65 20 70 72 6f 76 69 64  This file provid
0200: 65 73 20 74 77 6f 20 63 6f 6d 6d 61 6e 64 73 3a  es two commands:
0210: 20 0a 3b 3b 20 20 20 22 47 72 6f 75 70 20 4c 69   .;;   "Group Li
0220: 6e 6b 65 64 20 4c 61 79 65 72 73 22 20 2d 20 77  nked Layers" - w
0230: 69 6c 6c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ill create a new
0240: 20 6c 61 79 65 72 20 67 72 6f 75 70 20 61 6e 64   layer group and
0250: 20 6d 6f 76 65 0a 3b 3b 20 20 20 20 20 20 20 20   move.;;        
0260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0270: 20 20 20 61 6c 6c 20 6c 69 6e 6b 65 64 20 6c 61     all linked la
0280: 79 65 72 73 20 69 6e 74 6f 20 69 74 2e 0a 3b 3b  yers into it..;;
0290: 20 20 20 22 55 6e 67 72 6f 75 70 20 4c 61 79 65     "Ungroup Laye
02a0: 72 22 20 2d 20 77 69 6c 6c 20 6d 6f 76 65 20 61  r" - will move a
02b0: 20 6c 61 79 65 72 20 6f 75 74 20 6f 66 20 69 74   layer out of it
02c0: 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 67 72 6f  s containing gro
02d0: 75 70 2c 0a 3b 3b 20 20 20 20 20 20 20 20 20 20  up,.;;          
02e0: 20 20 20 20 20 20 20 20 20 20 20 70 6c 61 63 69             placi
02f0: 6e 67 20 69 74 20 64 69 72 65 63 74 6c 79 20 61  ng it directly a
0300: 62 6f 76 65 20 74 68 65 20 67 72 6f 75 70 27 73  bove the group's
0310: 20 66 75 6e 64 61 6d 65 6e 74 20 0a 3b 3b 20 20   fundament .;;  
0320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0330: 20 20 20 69 6e 20 74 68 65 20 6c 61 79 65 72 20     in the layer 
0340: 73 74 61 63 6b 2e 20 49 66 20 74 68 65 20 61 63  stack. If the ac
0350: 74 69 76 65 20 6c 61 79 65 72 20 69 73 20 61 20  tive layer is a 
0360: 0a 3b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  .;;             
0370: 20 20 20 20 20 20 20 20 66 75 6e 64 61 6d 65 6e          fundamen
0380: 74 2c 20 74 68 65 6e 20 61 6c 6c 20 6f 66 20 74  t, then all of t
0390: 68 65 20 6c 61 79 65 72 73 20 69 6e 20 74 68 65  he layers in the
03a0: 20 67 72 6f 75 70 20 0a 3b 3b 20 20 20 20 20 20   group .;;      
03b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
03c0: 72 65 20 73 70 6c 69 63 65 64 20 69 6e 74 6f 20  re spliced into 
03d0: 74 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 74  the parent and t
03e0: 68 65 20 66 75 6e 64 61 6d 65 6e 74 20 0a 3b 3b  he fundament .;;
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0400: 20 20 20 20 20 72 65 6d 6f 76 65 64 2e 0a 0a 28       removed...(
0410: 64 65 66 69 6e 65 20 28 73 63 72 69 70 74 2d 66  define (script-f
0420: 75 2d 73 67 2d 67 72 6f 75 70 2d 6c 69 6e 6b 65  u-sg-group-linke
0430: 64 2d 6c 61 79 65 72 73 20 69 6d 61 67 65 20 6c  d-layers image l
0440: 61 79 65 72 29 0a 0a 20 20 3b 20 69 66 20 27 6d  ayer)..  ; if 'm
0450: 6f 64 65 27 20 69 73 20 65 69 74 68 65 72 20 30  ode' is either 0
0460: 20 6f 72 20 6f 6d 69 74 74 65 64 20 61 6c 74 6f   or omitted alto
0470: 67 65 74 68 65 72 20 72 65 74 75 72 6e 20 6a 75  gether return ju
0480: 73 74 20 74 68 65 20 0a 20 20 3b 20 20 20 74 6f  st the .  ;   to
0490: 70 2d 6c 65 76 65 6c 20 6c 61 79 65 72 73 20 61  p-level layers a
04a0: 6e 64 20 66 75 6e 64 61 6d 65 6e 74 73 0a 20 20  nd fundaments.  
04b0: 3b 20 49 66 20 27 6d 6f 64 65 27 20 69 73 20 31  ; If 'mode' is 1
04c0: 20 74 68 65 6e 20 61 20 6e 65 73 74 65 64 20 6c   then a nested l
04d0: 69 73 74 20 6f 66 20 61 6c 6c 20 72 65 61 6c 20  ist of all real 
04e0: 6c 61 79 65 72 73 20 28 6e 6f 0a 20 20 3b 20 20  layers (no.  ;  
04f0: 20 66 75 6e 64 61 6d 65 6e 74 73 29 20 69 73 20   fundaments) is 
0500: 72 65 74 75 72 6e 65 64 2e 0a 20 20 3b 20 49 66  returned..  ; If
0510: 20 27 6d 6f 64 65 27 20 69 73 20 32 20 74 68 65   'mode' is 2 the
0520: 6e 20 61 20 6e 65 73 74 65 64 20 6c 69 73 74 20  n a nested list 
0530: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 77 68 65  is returned, whe
0540: 72 65 20 74 68 65 20 66 69 72 73 74 0a 20 20 3b  re the first.  ;
0550: 20 20 20 69 74 65 6d 20 69 6e 20 65 61 63 68 20     item in each 
0560: 73 75 62 2d 6c 69 73 74 20 69 73 20 74 68 65 20  sub-list is the 
0570: 66 75 6e 64 61 6d 65 6e 74 20 6f 66 20 74 68 65  fundament of the
0580: 20 67 72 6f 75 70 2e 0a 20 20 3b 0a 20 20 28 64   group..  ;.  (d
0590: 65 66 69 6e 65 20 28 67 65 74 2d 6c 61 79 65 72  efine (get-layer
05a0: 73 20 69 6d 61 67 65 20 2e 20 6d 6f 64 65 29 0a  s image . mode).
05b0: 20 20 20 20 28 6c 65 74 20 28 28 74 6f 70 2d 6c      (let ((top-l
05c0: 61 79 65 72 73 20 28 76 65 63 74 6f 72 2d 3e 6c  ayers (vector->l
05d0: 69 73 74 20 28 63 61 64 72 20 28 67 69 6d 70 2d  ist (cadr (gimp-
05e0: 69 6d 61 67 65 2d 67 65 74 2d 6c 61 79 65 72 73  image-get-layers
05f0: 20 69 6d 61 67 65 29 29 29 29 29 0a 20 20 20 20   image))))).    
0600: 20 20 28 69 66 20 28 6f 72 20 28 6e 75 6c 6c 3f    (if (or (null?
0610: 20 6d 6f 64 65 29 20 28 7a 65 72 6f 3f 20 28 63   mode) (zero? (c
0620: 61 72 20 6d 6f 64 65 29 29 29 0a 20 20 20 20 20  ar mode))).     
0630: 20 20 20 74 6f 70 2d 6c 61 79 65 72 73 0a 20 20     top-layers.  
0640: 20 20 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20        (let loop 
0650: 28 28 74 6f 70 2d 6c 61 79 65 72 73 20 74 6f 70  ((top-layers top
0660: 2d 6c 61 79 65 72 73 29 0a 20 20 20 20 20 20 20  -layers).       
0670: 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 61 79              (lay
0680: 65 72 73 20 27 28 29 29 29 0a 20 20 20 20 20 20  ers '())).      
0690: 20 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 74      (if (null? t
06a0: 6f 70 2d 6c 61 79 65 72 73 29 0a 20 20 20 20 20  op-layers).     
06b0: 20 20 20 20 20 20 20 28 72 65 76 65 72 73 65 20         (reverse 
06c0: 6c 61 79 65 72 73 29 0a 20 20 20 20 20 20 20 20  layers).        
06d0: 20 20 20 20 28 6c 6f 6f 70 20 28 63 64 72 20 74      (loop (cdr t
06e0: 6f 70 2d 6c 61 79 65 72 73 29 0a 20 20 20 20 20  op-layers).     
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f               (co
0700: 6e 73 20 28 69 66 20 28 7a 65 72 6f 3f 20 28 63  ns (if (zero? (c
0710: 61 72 20 28 67 69 6d 70 2d 69 74 65 6d 2d 69 73  ar (gimp-item-is
0720: 2d 67 72 6f 75 70 20 28 63 61 72 20 74 6f 70 2d  -group (car top-
0730: 6c 61 79 65 72 73 29 29 29 29 0a 20 20 20 20 20  layers)))).     
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 20 20 28 63 61 72 20 74 6f 70 2d 6c 61       (car top-la
0760: 79 65 72 73 29 0a 20 20 20 20 20 20 20 20 20 20  yers).          
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0780: 28 69 66 20 28 3d 20 28 63 61 72 20 6d 6f 64 65  (if (= (car mode
0790: 29 20 32 29 0a 20 20 20 20 20 20 20 20 20 20 20  ) 2).           
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 28 63 6f 6e 73 20 28 63 61 72 20 74 6f 70 2d   (cons (car top-
07c0: 6c 61 79 65 72 73 29 0a 20 20 20 20 20 20 20 20  layers).        
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 20 20 20 20 20 20 20 20 20 20 28 67 65 74 2d 63            (get-c
07f0: 68 69 6c 64 72 65 6e 20 28 63 61 72 20 74 6f 70  hildren (car top
0800: 2d 6c 61 79 65 72 73 29 20 28 63 61 72 20 6d 6f  -layers) (car mo
0810: 64 65 29 29 29 0a 20 20 20 20 20 20 20 20 20 20  de))).          
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 28 67 65 74 2d 63 68 69 6c 64 72 65 6e 20    (get-children 
0840: 28 63 61 72 20 74 6f 70 2d 6c 61 79 65 72 73 29  (car top-layers)
0850: 20 28 63 61 72 20 6d 6f 64 65 29 29 29 29 0a 20   (car mode)))). 
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 20 20 20 20 20 20 6c 61 79 65 72 73 29 29 29         layers)))
0880: 29 29 29 29 0a 0a 20 20 3b 20 73 69 6d 69 6c 61  ))))..  ; simila
0890: 72 20 74 6f 20 27 67 65 74 2d 6c 61 79 65 72 73  r to 'get-layers
08a0: 27 20 62 75 74 20 66 6f 72 20 61 20 67 72 6f 75  ' but for a grou
08b0: 70 20 66 75 6e 64 61 6d 65 6e 74 0a 20 20 3b 0a  p fundament.  ;.
08c0: 20 20 28 64 65 66 69 6e 65 20 28 67 65 74 2d 63    (define (get-c
08d0: 68 69 6c 64 72 65 6e 20 66 75 6e 64 61 6d 65 6e  hildren fundamen
08e0: 74 20 2e 20 6d 6f 64 65 29 0a 20 20 20 20 28 6c  t . mode).    (l
08f0: 65 74 20 28 28 74 6f 70 2d 6c 61 79 65 72 73 20  et ((top-layers 
0900: 28 76 65 63 74 6f 72 2d 3e 6c 69 73 74 20 28 63  (vector->list (c
0910: 61 64 72 20 28 67 69 6d 70 2d 69 74 65 6d 2d 67  adr (gimp-item-g
0920: 65 74 2d 63 68 69 6c 64 72 65 6e 20 66 75 6e 64  et-children fund
0930: 61 6d 65 6e 74 29 29 29 29 29 0a 20 20 20 20 20  ament))))).     
0940: 20 28 69 66 20 28 6f 72 20 28 6e 75 6c 6c 3f 20   (if (or (null? 
0950: 6d 6f 64 65 29 20 28 7a 65 72 6f 3f 20 28 63 61  mode) (zero? (ca
0960: 72 20 6d 6f 64 65 29 29 29 0a 20 20 20 20 20 20  r mode))).      
0970: 20 20 74 6f 70 2d 6c 61 79 65 72 73 0a 20 20 20    top-layers.   
0980: 20 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28       (let loop (
0990: 28 74 6f 70 2d 6c 61 79 65 72 73 20 74 6f 70 2d  (top-layers top-
09a0: 6c 61 79 65 72 73 29 0a 20 20 20 20 20 20 20 20  layers).        
09b0: 20 20 20 20 20 20 20 20 20 20 20 28 6c 61 79 65             (laye
09c0: 72 73 20 27 28 29 29 29 0a 20 20 20 20 20 20 20  rs '())).       
09d0: 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 74 6f     (if (null? to
09e0: 70 2d 6c 61 79 65 72 73 29 0a 20 20 20 20 20 20  p-layers).      
09f0: 20 20 20 20 20 20 28 72 65 76 65 72 73 65 20 6c        (reverse l
0a00: 61 79 65 72 73 29 0a 20 20 20 20 20 20 20 20 20  ayers).         
0a10: 20 20 20 28 6c 6f 6f 70 20 28 63 64 72 20 74 6f     (loop (cdr to
0a20: 70 2d 6c 61 79 65 72 73 29 0a 20 20 20 20 20 20  p-layers).      
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e              (con
0a40: 73 20 28 69 66 20 28 7a 65 72 6f 3f 20 28 63 61  s (if (zero? (ca
0a50: 72 20 28 67 69 6d 70 2d 69 74 65 6d 2d 69 73 2d  r (gimp-item-is-
0a60: 67 72 6f 75 70 20 28 63 61 72 20 74 6f 70 2d 6c  group (car top-l
0a70: 61 79 65 72 73 29 29 29 29 0a 20 20 20 20 20 20  ayers)))).      
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 20 20 20 28 63 61 72 20 74 6f 70 2d 6c 61 79      (car top-lay
0aa0: 65 72 73 29 0a 20 20 20 20 20 20 20 20 20 20 20  ers).           
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0ac0: 69 66 20 28 3d 20 28 63 61 72 20 6d 6f 64 65 29  if (= (car mode)
0ad0: 20 32 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   2).            
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0af0: 28 63 6f 6e 73 20 28 63 61 72 20 74 6f 70 2d 6c  (cons (car top-l
0b00: 61 79 65 72 73 29 0a 20 20 20 20 20 20 20 20 20  ayers).         
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b20: 20 20 20 20 20 20 20 20 20 28 67 65 74 2d 63 68           (get-ch
0b30: 69 6c 64 72 65 6e 20 28 63 61 72 20 74 6f 70 2d  ildren (car top-
0b40: 6c 61 79 65 72 73 29 20 28 63 61 72 20 6d 6f 64  layers) (car mod
0b50: 65 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  e))).           
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 20 28 67 65 74 2d 63 68 69 6c 64 72 65 6e 20 28   (get-children (
0b80: 63 61 72 20 74 6f 70 2d 6c 61 79 65 72 73 29 20  car top-layers) 
0b90: 28 63 61 72 20 6d 6f 64 65 29 29 29 29 0a 20 20  (car mode)))).  
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 20 6c 61 79 65 72 73 29 29 29 29        layers))))
0bc0: 29 29 29 0a 0a 20 20 28 64 65 66 69 6e 65 20 28  )))..  (define (
0bd0: 66 6c 61 74 74 65 6e 20 78 29 0a 20 20 20 20 28  flatten x).    (
0be0: 63 6f 6e 64 20 0a 20 20 20 20 20 20 28 28 6e 75  cond .      ((nu
0bf0: 6c 6c 3f 20 78 29 20 27 28 29 29 0a 20 20 20 20  ll? x) '()).    
0c00: 20 20 28 28 6e 6f 74 20 28 70 61 69 72 3f 20 78    ((not (pair? x
0c10: 29 29 20 28 6c 69 73 74 20 78 29 29 0a 20 20 20  )) (list x)).   
0c20: 20 20 20 28 65 6c 73 65 20 28 61 70 70 65 6e 64     (else (append
0c30: 20 28 66 6c 61 74 74 65 6e 20 28 63 61 72 20 78   (flatten (car x
0c40: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
0c50: 20 20 20 20 20 20 20 28 66 6c 61 74 74 65 6e 20         (flatten 
0c60: 28 63 64 72 20 78 29 29 29 29 29 29 0a 0a 20 20  (cdr x))))))..  
0c70: 28 64 65 66 69 6e 65 20 28 67 65 74 2d 70 61 72  (define (get-par
0c80: 65 6e 74 20 69 74 65 6d 29 0a 20 20 20 20 28 6c  ent item).    (l
0c90: 65 74 20 28 28 70 61 72 65 6e 74 20 28 63 61 72  et ((parent (car
0ca0: 20 28 67 69 6d 70 2d 69 74 65 6d 2d 67 65 74 2d   (gimp-item-get-
0cb0: 70 61 72 65 6e 74 20 69 74 65 6d 29 29 29 29 0a  parent item)))).
0cc0: 20 20 20 20 20 20 28 69 66 20 28 3d 20 70 61 72        (if (= par
0cd0: 65 6e 74 20 2d 31 29 20 23 66 20 70 61 72 65 6e  ent -1) #f paren
0ce0: 74 29 29 29 0a 0a 20 20 28 6c 65 74 20 28 28 6c  t)))..  (let ((l
0cf0: 69 6e 6b 65 64 73 20 28 6c 65 74 20 6c 6f 6f 70  inkeds (let loop
0d00: 20 28 28 6c 61 79 65 72 73 20 28 66 6c 61 74 74   ((layers (flatt
0d10: 65 6e 20 28 67 65 74 2d 6c 61 79 65 72 73 20 69  en (get-layers i
0d20: 6d 61 67 65 20 32 29 29 29 0a 20 20 20 20 20 20  mage 2))).      
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 28 6c                (l
0d50: 69 6e 6b 65 64 73 20 27 28 29 29 29 0a 20 20 20  inkeds '())).   
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 28 69 66 20 28 6e 75 6c 6c 3f 20 6c 61 79 65 72  (if (null? layer
0d80: 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s).             
0d90: 20 20 20 20 20 20 20 20 28 72 65 76 65 72 73 65          (reverse
0da0: 20 6c 69 6e 6b 65 64 73 29 0a 20 20 20 20 20 20   linkeds).      
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0dc0: 6c 6f 6f 70 20 28 63 64 72 20 6c 61 79 65 72 73  loop (cdr layers
0dd0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 66               (if
0df0: 20 28 6f 72 20 28 7a 65 72 6f 3f 20 28 63 61 72   (or (zero? (car
0e00: 20 28 67 69 6d 70 2d 69 74 65 6d 2d 67 65 74 2d   (gimp-item-get-
0e10: 6c 69 6e 6b 65 64 20 28 63 61 72 20 6c 61 79 65  linked (car laye
0e20: 72 73 29 29 29 29 0a 20 20 20 20 20 20 20 20 20  rs)))).         
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e40: 20 20 20 20 20 20 20 20 20 20 28 61 6e 64 20 28            (and (
0e50: 67 65 74 2d 70 61 72 65 6e 74 20 28 63 61 72 20  get-parent (car 
0e60: 6c 61 79 65 72 73 29 29 0a 20 20 20 20 20 20 20  layers)).       
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e90: 20 28 6d 65 6d 62 65 72 20 28 67 65 74 2d 70 61   (member (get-pa
0ea0: 72 65 6e 74 20 28 63 61 72 20 6c 61 79 65 72 73  rent (car layers
0eb0: 29 29 20 6c 69 6e 6b 65 64 73 29 29 29 0a 20 20  )) linkeds))).  
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ed0: 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 6b 65             linke
0ee0: 64 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ds.             
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f00: 28 63 6f 6e 73 20 28 63 61 72 20 6c 61 79 65 72  (cons (car layer
0f10: 73 29 20 6c 69 6e 6b 65 64 73 29 29 29 29 29 29  s) linkeds))))))
0f20: 29 0a 20 20 20 20 28 75 6e 6c 65 73 73 20 28 6e  ).    (unless (n
0f30: 75 6c 6c 3f 20 6c 69 6e 6b 65 64 73 29 0a 20 20  ull? linkeds).  
0f40: 20 20 20 20 28 6c 65 74 20 28 28 70 61 72 65 6e      (let ((paren
0f50: 74 20 28 6f 72 20 28 67 65 74 2d 70 61 72 65 6e  t (or (get-paren
0f60: 74 20 6c 61 79 65 72 29 20 30 29 29 0a 20 20 20  t layer) 0)).   
0f70: 20 20 20 20 20 20 20 20 20 28 73 61 66 65 3f 20           (safe? 
0f80: 28 6c 65 74 20 6c 6f 6f 70 20 28 28 70 61 72 65  (let loop ((pare
0f90: 6e 74 20 28 67 65 74 2d 70 61 72 65 6e 74 20 6c  nt (get-parent l
0fa0: 61 79 65 72 29 29 29 0a 20 20 20 20 20 20 20 20  ayer))).        
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 66               (if
0fc0: 20 70 61 72 65 6e 74 0a 20 20 20 20 20 20 20 20   parent.        
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0fe0: 69 66 20 28 6d 65 6d 62 65 72 20 70 61 72 65 6e  if (member paren
0ff0: 74 20 6c 69 6e 6b 65 64 73 29 0a 20 20 20 20 20  t linkeds).     
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1010: 20 20 20 20 23 66 0a 20 20 20 20 20 20 20 20 20      #f.         
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 28 6c 6f 6f 70 20 28 67 65 74 2d 70 61 72 65 6e  (loop (get-paren
1040: 74 20 70 61 72 65 6e 74 29 29 29 0a 20 20 20 20  t parent))).    
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1060: 20 20 20 23 74 29 29 29 29 0a 20 20 20 20 20 20     #t)))).      
1070: 20 20 28 69 66 20 28 6e 6f 74 20 73 61 66 65 3f    (if (not safe?
1080: 29 0a 20 20 20 20 20 20 20 20 20 20 28 67 69 6d  ).          (gim
1090: 70 2d 6d 65 73 73 61 67 65 20 22 4d 6f 76 69 6e  p-message "Movin
10a0: 67 20 61 20 6c 61 79 65 72 20 67 72 6f 75 70 20  g a layer group 
10b0: 69 6e 74 6f 20 69 74 73 65 6c 66 22 29 0a 20 20  into itself").  
10c0: 20 20 20 20 20 20 20 20 28 62 65 67 69 6e 0a 20          (begin. 
10d0: 20 20 20 20 20 20 20 20 20 20 20 28 67 69 6d 70             (gimp
10e0: 2d 69 6d 61 67 65 2d 75 6e 64 6f 2d 67 72 6f 75  -image-undo-grou
10f0: 70 2d 73 74 61 72 74 20 69 6d 61 67 65 29 0a 20  p-start image). 
1100: 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 74 20             (let 
1110: 28 28 66 75 6e 64 61 6d 65 6e 74 20 28 63 61 72  ((fundament (car
1120: 20 28 67 69 6d 70 2d 6c 61 79 65 72 2d 67 72 6f   (gimp-layer-gro
1130: 75 70 2d 6e 65 77 20 69 6d 61 67 65 29 29 29 29  up-new image))))
1140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
1150: 67 69 6d 70 2d 69 6d 61 67 65 2d 69 6e 73 65 72  gimp-image-inser
1160: 74 2d 6c 61 79 65 72 20 69 6d 61 67 65 20 0a 20  t-layer image . 
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1190: 20 20 20 20 20 20 66 75 6e 64 61 6d 65 6e 74 20        fundament 
11a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c0: 20 20 20 20 20 20 20 20 28 69 66 20 73 61 66 65          (if safe
11d0: 3f 20 70 61 72 65 6e 74 20 30 29 0a 20 20 20 20  ? parent 0).    
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1200: 20 20 20 28 69 66 20 73 61 66 65 3f 20 2d 31 20     (if safe? -1 
1210: 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)).            
1220: 20 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28    (map (lambda (
1230: 78 29 20 28 67 69 6d 70 2d 69 6d 61 67 65 2d 72  x) (gimp-image-r
1240: 65 6f 72 64 65 72 2d 69 74 65 6d 20 69 6d 61 67  eorder-item imag
1250: 65 20 78 20 66 75 6e 64 61 6d 65 6e 74 20 30 29  e x fundament 0)
1260: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1270: 20 20 20 20 20 28 72 65 76 65 72 73 65 20 6c 69       (reverse li
1280: 6e 6b 65 64 73 29 29 29 0a 20 20 20 20 20 20 20  nkeds))).       
1290: 20 20 20 20 20 20 20 28 67 69 6d 70 2d 69 6d 61         (gimp-ima
12a0: 67 65 2d 75 6e 64 6f 2d 67 72 6f 75 70 2d 65 6e  ge-undo-group-en
12b0: 64 20 69 6d 61 67 65 29 0a 20 20 20 20 20 20 20  d image).       
12c0: 20 20 20 20 20 20 20 28 67 69 6d 70 2d 64 69 73         (gimp-dis
12d0: 70 6c 61 79 73 2d 66 6c 75 73 68 29 29 29 29 29  plays-flush)))))
12e0: 29 29 0a 0a 28 73 63 72 69 70 74 2d 66 75 2d 72  ))..(script-fu-r
12f0: 65 67 69 73 74 65 72 20 22 73 63 72 69 70 74 2d  egister "script-
1300: 66 75 2d 73 67 2d 67 72 6f 75 70 2d 6c 69 6e 6b  fu-sg-group-link
1310: 65 64 2d 6c 61 79 65 72 73 22 0a 20 20 22 47 72  ed-layers".  "Gr
1320: 6f 75 70 20 4c 69 6e 6b 65 64 20 4c 61 79 65 72  oup Linked Layer
1330: 73 22 0a 20 20 22 4d 6f 76 65 20 6c 69 6e 6b 65  s".  "Move linke
1340: 64 20 6c 61 79 65 72 73 20 69 6e 74 6f 20 61 20  d layers into a 
1350: 6e 65 77 20 6c 61 79 65 72 20 67 72 6f 75 70 22  new layer group"
1360: 0a 20 20 22 53 61 75 6c 20 47 6f 6f 64 65 22 0a  .  "Saul Goode".
1370: 20 20 22 73 61 75 6c 67 6f 6f 64 65 22 0a 20 20    "saulgoode".  
1380: 22 4d 61 72 63 68 20 32 30 31 35 22 0a 20 20 22  "March 2015".  "
1390: 2a 22 0a 20 20 53 46 2d 49 4d 41 47 45 20 20 20  *".  SF-IMAGE   
13a0: 20 22 49 6d 61 67 65 22 20 20 20 20 30 0a 20 20   "Image"    0.  
13b0: 53 46 2d 44 52 41 57 41 42 4c 45 20 22 44 72 61  SF-DRAWABLE "Dra
13c0: 77 61 62 6c 65 22 20 30 0a 20 20 29 0a 28 73 63  wable" 0.  ).(sc
13d0: 72 69 70 74 2d 66 75 2d 6d 65 6e 75 2d 72 65 67  ript-fu-menu-reg
13e0: 69 73 74 65 72 20 22 73 63 72 69 70 74 2d 66 75  ister "script-fu
13f0: 2d 73 67 2d 67 72 6f 75 70 2d 6c 69 6e 6b 65 64  -sg-group-linked
1400: 2d 6c 61 79 65 72 73 22 0a 20 20 22 3c 49 6d 61  -layers".  "<Ima
1410: 67 65 3e 2f 4c 61 79 65 72 2f 53 74 61 63 6b 2f  ge>/Layer/Stack/
1420: 22 0a 20 20 29 0a 0a 28 20 73 63 72 69 70 74 2d  ".  )..( script-
1430: 66 75 2d 6d 65 6e 75 2d 72 65 67 69 73 74 65 72  fu-menu-register
1440: 20 22 73 63 72 69 70 74 2d 66 75 2d 73 67 2d 67   "script-fu-sg-g
1450: 72 6f 75 70 2d 6c 69 6e 6b 65 64 2d 6c 61 79 65  roup-linked-laye
1460: 72 73 22 0a 20 20 22 3c 4c 61 79 65 72 73 3e 22  rs".  "<Layers>"
1470: 0a 20 20 29 20 20 0a 0a 28 64 65 66 69 6e 65 20  .  )  ..(define 
1480: 28 73 63 72 69 70 74 2d 66 75 2d 73 67 2d 75 6e  (script-fu-sg-un
1490: 67 72 6f 75 70 2d 6c 61 79 65 72 20 69 6d 61 67  group-layer imag
14a0: 65 20 69 74 65 6d 29 0a 20 20 28 67 69 6d 70 2d  e item).  (gimp-
14b0: 69 6d 61 67 65 2d 75 6e 64 6f 2d 67 72 6f 75 70  image-undo-group
14c0: 2d 73 74 61 72 74 20 69 6d 61 67 65 29 0a 20 20  -start image).  
14d0: 28 69 66 20 28 3d 20 28 63 61 72 20 28 67 69 6d  (if (= (car (gim
14e0: 70 2d 69 74 65 6d 2d 69 73 2d 67 72 6f 75 70 20  p-item-is-group 
14f0: 69 74 65 6d 29 29 20 31 29 0a 20 20 20 20 28 6c  item)) 1).    (l
1500: 65 74 20 28 28 70 61 72 65 6e 74 20 28 63 61 72  et ((parent (car
1510: 20 28 67 69 6d 70 2d 69 74 65 6d 2d 67 65 74 2d   (gimp-item-get-
1520: 70 61 72 65 6e 74 20 69 74 65 6d 29 29 29 0a 20  parent item))). 
1530: 20 20 20 20 20 20 20 20 20 28 70 6f 73 69 74 69           (positi
1540: 6f 6e 20 28 63 61 72 20 28 67 69 6d 70 2d 69 6d  on (car (gimp-im
1550: 61 67 65 2d 67 65 74 2d 69 74 65 6d 2d 70 6f 73  age-get-item-pos
1560: 69 74 69 6f 6e 20 69 6d 61 67 65 20 69 74 65 6d  ition image item
1570: 29 29 29 29 0a 20 20 20 20 20 20 28 69 66 20 28  )))).      (if (
1580: 3d 20 70 61 72 65 6e 74 20 2d 31 29 0a 20 20 20  = parent -1).   
1590: 20 20 20 20 20 28 73 65 74 21 20 70 61 72 65 6e       (set! paren
15a0: 74 20 30 29 29 0a 20 20 20 20 20 20 28 6c 65 74  t 0)).      (let
15b0: 20 6c 6f 6f 70 20 28 28 6c 61 79 65 72 73 20 28   loop ((layers (
15c0: 72 65 76 65 72 73 65 20 28 76 65 63 74 6f 72 2d  reverse (vector-
15d0: 3e 6c 69 73 74 20 28 63 61 64 72 20 20 28 67 69  >list (cadr  (gi
15e0: 6d 70 2d 69 74 65 6d 2d 67 65 74 2d 63 68 69 6c  mp-item-get-chil
15f0: 64 72 65 6e 20 69 74 65 6d 29 29 29 29 29 29 0a  dren item)))))).
1600: 20 20 20 20 20 20 20 20 28 75 6e 6c 65 73 73 20          (unless 
1610: 28 6e 75 6c 6c 3f 20 6c 61 79 65 72 73 29 0a 20  (null? layers). 
1620: 20 20 20 20 20 20 20 20 20 28 67 69 6d 70 2d 69           (gimp-i
1630: 6d 61 67 65 2d 72 65 6f 72 64 65 72 2d 69 74 65  mage-reorder-ite
1640: 6d 20 69 6d 61 67 65 20 28 63 61 72 20 6c 61 79  m image (car lay
1650: 65 72 73 29 20 70 61 72 65 6e 74 20 70 6f 73 69  ers) parent posi
1660: 74 69 6f 6e 29 0a 20 20 20 20 20 20 20 20 20 20  tion).          
1670: 28 6c 6f 6f 70 20 28 63 64 72 20 6c 61 79 65 72  (loop (cdr layer
1680: 73 29 29 29 29 0a 20 20 20 20 20 20 28 67 69 6d  s)))).      (gim
1690: 70 2d 69 6d 61 67 65 2d 72 65 6d 6f 76 65 2d 6c  p-image-remove-l
16a0: 61 79 65 72 20 69 6d 61 67 65 20 69 74 65 6d 29  ayer image item)
16b0: 29 0a 20 20 20 20 28 62 65 67 69 6e 20 0a 20 20  ).    (begin .  
16c0: 20 20 20 20 28 77 68 65 6e 20 28 3d 20 28 63 61      (when (= (ca
16d0: 72 20 28 67 69 6d 70 2d 69 74 65 6d 2d 69 73 2d  r (gimp-item-is-
16e0: 6c 61 79 65 72 2d 6d 61 73 6b 20 69 74 65 6d 29  layer-mask item)
16f0: 29 20 31 29 0a 20 20 20 20 20 20 20 20 28 73 65  ) 1).        (se
1700: 74 21 20 69 74 65 6d 20 28 63 61 72 20 28 67 69  t! item (car (gi
1710: 6d 70 2d 6c 61 79 65 72 2d 66 72 6f 6d 2d 6d 61  mp-layer-from-ma
1720: 73 6b 20 69 74 65 6d 29 29 29 29 0a 20 20 20 20  sk item)))).    
1730: 20 20 28 6c 65 74 20 28 28 70 61 72 65 6e 74 20    (let ((parent 
1740: 28 63 61 72 20 28 67 69 6d 70 2d 69 74 65 6d 2d  (car (gimp-item-
1750: 67 65 74 2d 70 61 72 65 6e 74 20 69 74 65 6d 29  get-parent item)
1760: 29 29 29 0a 20 20 20 20 20 20 20 20 28 75 6e 6c  ))).        (unl
1770: 65 73 73 20 28 3d 20 70 61 72 65 6e 74 20 2d 31  ess (= parent -1
1780: 29 20 0a 20 20 20 20 20 20 20 20 20 20 28 6c 65  ) .          (le
1790: 74 20 28 28 67 72 61 6e 64 70 61 72 65 6e 74 20  t ((grandparent 
17a0: 28 63 61 72 20 28 67 69 6d 70 2d 69 74 65 6d 2d  (car (gimp-item-
17b0: 67 65 74 2d 70 61 72 65 6e 74 20 70 61 72 65 6e  get-parent paren
17c0: 74 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  t))).           
17d0: 20 20 20 20 20 28 70 6f 73 69 74 69 6f 6e 20 28       (position (
17e0: 20 63 61 72 20 28 67 69 6d 70 2d 69 6d 61 67 65   car (gimp-image
17f0: 2d 67 65 74 2d 69 74 65 6d 2d 70 6f 73 69 74 69  -get-item-positi
1800: 6f 6e 20 69 6d 61 67 65 20 70 61 72 65 6e 74 29  on image parent)
1810: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))).            
1820: 28 69 66 20 28 3d 20 67 72 61 6e 64 70 61 72 65  (if (= grandpare
1830: 6e 74 20 2d 31 29 0a 20 20 20 20 20 20 20 20 20  nt -1).         
1840: 20 20 20 20 20 28 73 65 74 21 20 67 72 61 6e 64       (set! grand
1850: 70 61 72 65 6e 74 20 30 29 29 20 0a 20 20 20 20  parent 0)) .    
1860: 20 20 20 20 20 20 20 20 28 67 69 6d 70 2d 69 6d          (gimp-im
1870: 61 67 65 2d 72 65 6f 72 64 65 72 2d 69 74 65 6d  age-reorder-item
1880: 20 69 6d 61 67 65 20 69 74 65 6d 20 67 72 61 6e   image item gran
1890: 64 70 61 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  dparent position
18a0: 29 29 29 29 29 29 0a 20 20 28 67 69 6d 70 2d 69  )))))).  (gimp-i
18b0: 6d 61 67 65 2d 75 6e 64 6f 2d 67 72 6f 75 70 2d  mage-undo-group-
18c0: 65 6e 64 20 69 6d 61 67 65 29 0a 20 20 28 67 69  end image).  (gi
18d0: 6d 70 2d 64 69 73 70 6c 61 79 73 2d 66 6c 75 73  mp-displays-flus
18e0: 68 29 0a 20 20 29 0a 0a 20 20 0a 28 73 63 72 69  h).  )..  .(scri
18f0: 70 74 2d 66 75 2d 72 65 67 69 73 74 65 72 20 22  pt-fu-register "
1900: 73 63 72 69 70 74 2d 66 75 2d 73 67 2d 75 6e 67  script-fu-sg-ung
1910: 72 6f 75 70 2d 6c 61 79 65 72 22 0a 20 20 22 55  roup-layer".  "U
1920: 6e 67 72 6f 75 70 20 4c 61 79 65 72 22 0a 20 20  ngroup Layer".  
1930: 22 4d 6f 76 65 20 61 20 6c 61 79 65 72 20 28 6f  "Move a layer (o
1940: 72 20 6d 65 6d 62 65 72 73 20 6f 66 20 61 20 67  r members of a g
1950: 72 6f 75 70 29 20 6f 75 74 20 6f 66 20 69 74 73  roup) out of its
1960: 20 67 72 6f 75 70 22 0a 20 20 22 53 61 75 6c 20   group".  "Saul 
1970: 47 6f 6f 64 65 22 0a 20 20 22 73 61 75 6c 67 6f  Goode".  "saulgo
1980: 6f 64 65 22 0a 20 20 22 46 65 62 72 75 61 72 79  ode".  "February
1990: 20 32 30 31 35 22 0a 20 20 22 2a 22 0a 20 20 53   2015".  "*".  S
19a0: 46 2d 49 4d 41 47 45 20 20 20 20 22 49 6d 61 67  F-IMAGE    "Imag
19b0: 65 22 20 20 20 20 30 0a 20 20 53 46 2d 44 52 41  e"    0.  SF-DRA
19c0: 57 41 42 4c 45 20 22 44 72 61 77 61 62 6c 65 22  WABLE "Drawable"
19d0: 20 30 0a 20 20 29 0a 28 73 63 72 69 70 74 2d 66   0.  ).(script-f
19e0: 75 2d 6d 65 6e 75 2d 72 65 67 69 73 74 65 72 20  u-menu-register 
19f0: 22 73 63 72 69 70 74 2d 66 75 2d 73 67 2d 75 6e  "script-fu-sg-un
1a00: 67 72 6f 75 70 2d 6c 61 79 65 72 22 0a 20 20 22  group-layer".  "
1a10: 3c 49 6d 61 67 65 3e 2f 4c 61 79 65 72 2f 53 74  <Image>/Layer/St
1a20: 61 63 6b 2f 22 0a 20 20 29 0a 0a 28 20 73 63 72  ack/".  )..( scr
1a30: 69 70 74 2d 66 75 2d 6d 65 6e 75 2d 72 65 67 69  ipt-fu-menu-regi
1a40: 73 74 65 72 20 22 73 63 72 69 70 74 2d 66 75 2d  ster "script-fu-
1a50: 73 67 2d 75 6e 67 72 6f 75 70 2d 6c 61 79 65 72  sg-ungroup-layer
1a60: 22 0a 20 20 22 3c 4c 61 79 65 72 73 3e 22 0a 20  ".  "<Layers>". 
1a70: 20 29 20 20 0a                                    )  .