При создании сценария хорошо давать пользователям возможность отменить действие сценария. Это лекго сделать вызовами функций gimp-undo-push-group-start
и gimp-undo-push-group-end
вокруг кода, манипулирующего изображением. О них можно думать, как о совпадающих утверждениях, который указывают GIMP, когда нужно начать и закончить запись манипуляций над изображением, чтобы эти изменения можно было отменить.
Если вы создаёте новое изображение, для отмены ничего нет. Если же изменяется существующее изображение, имеет смысл воспользоваться этими функциями.
Отмена сценария работает замечательно, когда используются эти функции.
Давайте добавим к сценарию следующие две детали:
Сейчас изображение становится по размеру равным размеру слоя текста — нет места для, например, тени или других спецэффектов (хотя некоторые сценарии при необходимости автоматически изменят размер изображения). Давайте добавим пустую область вокруг текста размером в каком-то процентном соотношении от размера текста.
Такой сценарий может быть использован другими сценариями, работающими с текстом. Давайте его расширим и вернём изображение и слои, чтобы другие сценариии смогли бы вызвать наш сценарий и использовать созданные изображение и слои дальше.
Чтобы пользователь мог ввести размер пустой области, мы добавим параметр к нашей функции и к функции регистрации:
(define (script-fu-text-box inTest inFont inFontSize inTextColor inBufferAmount)
(let*
(
; define our local variables
; create a new image:
(theImageWidth 10)
(theImageHeight 10)
(theImage (car
(gimp-image-new
theImageWidth
theImageHeight
RGB
)
)
)
(theText) ;a declaration for the text
;we create later
(theBuffer) ;added
(theLayer
(car
(gimp-layer-new
theImage
theImageWidth
theImageHeight
RGB-IMAGE
"layer 1"
100
LAYER-MODE-NORMAL
)
)
)
) ;end of our local variables
[Code here]
)
(script-fu-register "script-fu-text-box" ;function name "Text Box" ;menu label "Creates a simple text box, sized to fit\ around the user's choice of text,\ font, font size, and color." ;description "Michael Terry" ;author "copyright 1997, Michael Terry;\ 2009, the GIMP Documentation Team" ;copyright notice "October 27, 1997" ;date created "" ;image type that the script works on SF-STRING "Text" "Text Box" ;a string variable SF-FONT "Font" "Charter" ;a font variable SF-ADJUSTMENT "Font size" '(50 1 1000 1 10 0 1) ;a spin-button SF-COLOR "Color" '(0 0 0) ;color variable SF-ADJUSTMENT "Buffer amount" '(35 0 100 1 10 1 0) ;a slider ) (script-fu-menu-register "script-fu-text-box" "<Image>/Font/Create/Text")
Мы добавим код в двух местах: сразу перед изменением размера изображения и к конце сценария (чтобы вернуть новые изображение, слой и текст).
После того, как мы получили высоту и ширину текста, мы должны изменить эти размеры в соответствии с размером пустой области, указанным пользователем. Мы не будем проверять ошибки, например, ограничивать введённое значение в диапазоне от 0 до 100%, потому что это не сильно важно и потому, что пользователю может захочется ввести «200» процентов буфера.
(set! theBuffer (* theImageHeight (/ inBufferAmount 100) ) ) (set! theImageHeight (+ theImageHeight theBuffer theBuffer) ) (set! theImageWidth (+ theImageWidth theBuffer theBuffer) )
Мы добавляем размер пустой области к размеру текста дважды, потому что буфер нужно добавить по обе стороны текста.
После изменения размера изображения, чтобы дать место рамке нужно отцентровать текст внутри изображения. Это делается его передвижением в координаты (x, y) относительно (theBuffer
, theBuffer
). Эта строка добавлена после изменения размера изображения и слоя:
(gimp-layer-set-offsets theText theBuffer theBuffer)
Сохраните сценарий, обновите его в базе процедур и испытайте.
Всё, что осталось сделать, это вернуть изображение, слой и слой текста. После показа изображения мы добавляем следующую строку:
(list theImage theLayer theText)
Это последняя строка функции, что делает этот список результатом функции, доступным другим сценариям.
Чтобы использовать наш сценарий в другом сценарии, мы можем написать, например, следующее:
(set! theResult (script-fu-text-box "Некоторый текст" "Charter" "30" '(0 0 0) "35" ) ) (gimp-image-flatten (car theResult))
Вот и конец урока, примите наши поздравления, вы на пути стать мастером Script-Fu!