Если вы пытаетесь создать фильтр, который создает 2-пиксельную рамку вокруг объекта в текущем слое, сделав заливку позади него в слое ниже (по крайней мере, это то, что вы пытаетесь сделать)), попробуйте это:
(define (quick-fill image)
(gimp-undo-push-group-start image)
(gimp-selection-grow image 2)
(gimp-image-set-active-layer image (aref (cadr (gimp-image-get-layers image)) 1))
(let* ((active-drawable (car (gimp-image-get-active-drawable image))))
(gimp-bucket-fill active-drawable FG-BUCKET-FILL NORMAL-MODE 100 0 FALSE 0 0)
(gimp-image-set-active-layer image (aref (cadr (gimp-image-get-layers image)) 0)))
(gimp-undo-push-group-end image)
(gimp-displays-flush))
Пара замечаний:
1) Вы никогда не используете переменную layer
в своем разделе let*
, поэтому я удалил ее.
2) Gimp не рисует, не заливает и ничего не делает с активным слоем ... скорее он работает с активным рисунком.Если вы получаете заливку на верхнем слое, когда вы хотите его на нижнем слое, то это означает, что вы передаете рисование для верхнего слоя, поэтому оно будет заполняться на верхнем слое ... переключение активногослой к слою ниже не изменяет значение переданного объекта рисования.Итак, в этой модификации я создал новую переменную active-drawable
в секции let*
, которая инициализируется для текущей активной прорисовки после того, как вы изменили активный слой с верхнего слоя наслой под.Таким образом, вы заполняете рисованный слой, который находится ниже, а не исходный переданный рисунок, который является верхним слоем.На самом деле вам вообще не нужно передавать аргумент drawable, поскольку вы можете получить новый drawable из активного слоя (что и сделано в этой модификации).