3.6. Расширение сценария текста с рамкой

3.6.1. Правильное обхождение с отменой

При создании сценария хорошо давать пользователям возможность отменить действие сценария. Это лекго сделать вызовами функций gimp-undo-push-group-start и gimp-undo-push-group-end вокруг кода, манипулирующего изображением. О них можно думать, как о совпадающих утверждениях, который указывают GIMP, когда нужно начать и закончить запись манипуляций над изображением, чтобы эти изменения можно было отменить.

Если вы создаёте новое изображение, для отмены ничего нет. Если же изменяется существующее изображение, имеет смысл воспользоваться этими функциями.

Отмена сценария работает замечательно, когда используются эти функции.

3.6.2. Дальнейшее расширение сценария

Давайте добавим к сценарию следующие две детали:

  • Сейчас изображение становится по размеру равным размеру слоя текста — нет места для, например, тени или других спецэффектов (хотя некоторые сценарии при необходимости автоматически изменят размер изображения). Давайте добавим пустую область вокруг текста размером в каком-то процентном соотношении от размера текста.

  • Такой сценарий может быть использован другими сценариями, работающими с текстом. Давайте его расширим и вернём изображение и слои, чтобы другие сценариии смогли бы вызвать наш сценарий и использовать созданные изображение и слои дальше.

3.6.3. Изменение параметров и функции регистрации

Чтобы пользователь мог ввести размер пустой области, мы добавим параметр к нашей функции и к функции регистрации:

  (define (script-fu-text-box inTest inFont inFontSize inTextColor inBufferAmount)
  (let*
        (
           ; декларация локальных переменных
           ; создать новое изображение:
           (theImageWidth  10)
           (theImageHeight 10)
           (theImage (car
                          (gimp-image-new
                           theImageWidth
                           theImageHeight
                           RGB
                          )
                     )
           )
           (theText)          ;переменная для текста,
                               ;которой мы присвоим значение позже

           (theBuffer)        ;добавлен

           (theLayer
                     (car
                         (gimp-layer-new
                          theImage
                          theImageWidth
                          theImageHeight
                          RGB-IMAGE
                          "layer 1"
                          100
                          NORMAL
                         )
                     )
           )
        ) ;конец локальных переменных

   [код сюда]
 )
      
  (script-fu-register
    "script-fu-text-box"                        ;func 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")
      

3.6.4. Добавление нового кода

Мы добавим код в двух местах: сразу перед изменением размера изображения и к конце сценария (чтобы вернуть новые изображение, слой и текст).

После того, как мы получили высоту и ширину текста, мы должны изменить эти размеры в соответствии с размером пустой области, указанным пользователем. Мы не будем проверять ошибки, например, ограничивать введённое значение в диапазоне от 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!