summaryrefslogtreecommitdiff
blob: 7324ebd56741f8db25fa540f4437ad64c9947b39 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
; Smart Remove

; Smart selection eraser.
; Requires resynthesizer plug-in.
; Paul Harrison (pfh@logarithmic.net)

; Versions
; lloyd konneker lkk 3/29/2009 Fix passing workLayerID to plugin.  
; Other non-functional changes: comments, error checking, menu item, blurb, license
;

; License:
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
; GNU General Public License for more details.
;
; The GNU Public License is available at
; http://www.gnu.org/copyleft/gpl.html

; lkk comment: creates stencil selection in a temp dupe image to pass as source drawable to plugin


(define (script-fu-smart-remove img layer corpus-border)
  (cond
    ((= 0 (car (gimp-selection-bounds img))) 
      (gimp-message "To use this script-fu, first select the region you wish to remove.")
    )
    (#t (let*
      (
        (dupe (car (gimp-image-duplicate img)))
        (channel (car (gimp-selection-save dupe)))
        (workLayerID -1)    ; lkk
      )

      ; lkk flatten (so stencil gets everything visible) and to activate a layer in dupe
      ; (gimp-message-set-handler 1)	; debug messages to console
      (gimp-image-flatten dupe)         ; lkk !!! flatten, activates layer, but deletes alpha
      (set! workLayerID (car (gimp-image-get-active-layer dupe)))
      (cond ((= -1 workLayerID) 
           (gimp-message "Failed get active layer")
      )     )
      ; lkk plugin requires equal count of channels, target and source.  Plugin should be changed to relax this reqt.
      (cond ((= 1 (car (gimp-drawable-has-alpha layer)))
           ;debug (gimp-message "Adding alpha")
           (if (not (car (gimp-layer-add-alpha workLayerID)))  (gimp-message "Failed add alpha") )
      )     )
      
      
      ; lkk comment: grow selection, invert, save to channel2, cut a hole size of orig selection
      ; lkk in the grown selection in channel2, select channel2, un invert
      (gimp-selection-grow dupe corpus-border)
      (gimp-selection-invert dupe)
      (let*
        (
	      (old-background (car (gimp-context-get-background)))
          (channel2 (car (gimp-selection-save dupe)))
        )

        (gimp-selection-load channel)
	    (gimp-context-set-background '(255 255 255))
        (if (not (car (gimp-edit-clear channel2))) (gimp-message "Failed edit clear") )
	    (gimp-context-set-background old-background)
        (gimp-selection-load channel2)
      )

      (gimp-selection-invert dupe)
      ; lkk comment: crop the dupe to size of stencil to save memory
      (let*
        (
          (bounds (gimp-selection-bounds dupe))
	      (x1 (nth 1 bounds))
	      (y1 (nth 2 bounds))
	      (x2 (nth 3 bounds))
	      (y2 (nth 4 bounds))
        )

        (gimp-image-crop dupe (- x2 x1) (- y2 y1) x1 y1)
      )

      (gimp-selection-invert dupe)  ; lkk !!! plugin requires inverted selection
      ;(gimp-display-new dupe)   ; debug to see the stencil as passed to plugin
      ;(gimp-displays-flush)     ; debug
      
      ; lkk originally 7th param was layer (the in layer), which only SEEMED to work.  Should be the stencil.
      (plug-in-resynthesizer 1 img layer 0 0 1 workLayerID -1 -1 0.0 0.117 16 500)

      (gimp-image-delete dupe)
      (gimp-displays-flush)
) ) ))

(script-fu-register "script-fu-smart-remove"
                    "<Image>/Filters/Enhance/Heal selection..."
		    "Extend surrounding texture to cover the selection.  Works best with homogenous, not regular surroundings. \
Requires separate resynthesizer plug-in."
		    "Paul Harrison (pfh@logarithmic.net)"
		    "Copyright 2000 Paul Harrison, 2009 Lloyd Konneker"
		    "13/9/2000"
		    "RGB* GRAY*"
		    SF-IMAGE "Input Image" 0
		    SF-DRAWABLE "Input Layer" 0
		    SF-ADJUSTMENT "Radius to take texture from" '(50 7 1000 1.0 1.0 0 1)
)