3.5. Adding Additional Functionality

Теперь давайте добавим функциональность нашему сценарию.

3.5.1. Создание нового изображения

В предыдущем уроке мы создали пустую функцию и зарегистрировали её с GIMP. Теперь настало время добавить функциональность — мы хотим создать новое изображение, добавить в него введённый текст, и изменить размер изображеня по размеру текста.

Once you know how to set variables, define functions and access list members, the rest is all downhill — all you need to do is familiarize yourself with the functions available in GIMP's procedural database and call those functions directly. Open the Раздел 12.9, «Браузер процедур».

Начнёс с создания нового изображения. Мы создаём новую переменную theImage и присваиваем ей возвратное значение встроенной функции GIMP gimp-image-new.

As you can see from the DB Browser, the function gimp-image-new takes three parameters — the image's width, height and the type of image. Because we'll later resize the image to fit the text, we'll make a 10×10 pixels RGB image. We'll store the image's width and sizes in some variables, too, as we'll refer to and manipulate them later in the script.

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

Заметка: мы использовали значение RGB, чтобы указать тип изображения RGB. Мы также могли бы использовать значение 0, но это не так описательно, как значение RGB во время быстрого просмотра сценария.

Заметьте также, что мы взяли голову результата функции. Это может показаться странным, так как база данных указывает, что функция возвращает только одно значение — ID нового изображения. Однако в GIMP все функции возвращают список, даже если в списке только один элемент. Чтобы взять этот элемент, мы и достаём голову списка.

3.5.2. Добавление нового слоя к изображению

Теперь, когда у нас есть новое изображение, нужно к нему добавить слой. Мы вызовем функцию gimp-layer-new, чтобы создать новый слой, и дадим ей ID созданного изображения. (Отныне мы будем показывать только строки, которые мы добавляем или меняем, а не текст всей функции. Текст полного сценария находится здесь.) Поскольку мы задекларировали все локальные переменные, мы также закрываем скобку декларации переменных:

        ;create a new layer for the image:
           (theLayer
                     (car
                          (gimp-layer-new
                           theImage
                           theImageWidth
                           theImageHeight
                           RGB-IMAGE
                           "layer 1"
                           100
                           LAYER-MODE-NORMAL
                          )
                      )
            )
         ) ;end of our local variables
      

Когда есть новый слой, его можно добавить к изображению:

        (gimp-image-insert-layer theImage theLayer 0 0)
      

Давайте теперь проверим, что у нас есть на этот момент, и добавим следующую строку, чтобы увидеть новое пустое изображение:

(gimp-display-new theImage)

Save your work, restart GIMP, run the script and a new image should pop up. It will probably contain garbage (random colors), because we haven't erased it. We'll get to that in a second.

3.5.3. Добавление текста

Удалите строку, показывающую пустое изображение (или деактивируйте её знаком комментария ; в начале строки).

До добавление текста нужно установить цвет переднего плана и фона, чтобы текст появился в цветах, заданные пользователем. Мы будем вызывать функции gimp-context-set-back/foreground:

        (gimp-context-set-background '(255 255 255) )
        (gimp-context-set-foreground inTextColor)
      

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

        (gimp-drawable-fill theLayer FILL-BACKGROUND)
      

А сейчас можно добавить текст:

        (set! theText
                      (car
                           (gimp-text-font
                            theImage theLayer
                            0 0
                            inText
                            0
                            TRUE
                            inFontSize
                            inFont)
                       )
        )
      

И хотя вызов функции длинный, он прост, если сверить значения параметров с их описанием в базе процедур. Вкратце, мы создаём новый слой и присваиваем его переменной theText.

Теперь, когда у нас есть текст, мы можем достать его ширину и высоту и изменить размер изображения и слоя изображения соответствующим образом:

        (set! theImageWidth   (car (gimp-drawable-get-width  theText) ) )
        (set! theImageHeight  (car (gimp-drawable-get-height theText) ) )

        (gimp-image-resize theImage theImageWidth theImageHeight 0 0)

        (gimp-layer-resize theLayer theImageWidth theImageHeight 0 0)
      

Вы может быть спрашиваете себя, в чём разница между рисуемым объектом и слоем. Рисуемый объект это всё во что можно рисовать и включает не только слои, но и каналы, маски слоя, выделение и т.п. Слой — более специфическая версия рисуемого объекта. В большинстве случаев разница не важна.

Теперь, когда изображение готово, мы можем вернуть строку показа:

        (gimp-display-new theImage)
      

Save your work, restart GIMP and give your first script a run!

3.5.4. Очистка грязного флажка

Если вы захотите закрыть изображение до его сохранения, GIMP запросит подтверждения сохранения до закрытия. Он это делает, потому что изображение помечено как грязное, или несохранённое. В нашем случае это неудобно при отладки сценария, поскольку приходится создавать много изображений и подтверждать, что их сохранять не надо. Если изображение не изменено, то его можно легко воспроизвести, вызвав сценарий повторно. Поэтому имеет смысл сбросить грязный флажок.

Грязный флажок сбрасывается после показа изображения:

        (gimp-image-clean-all theImage)
      

Это установит счётчик изменений на ноль, делая изображение «чистым».

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