Теперь давайте добавим функциональность нашему сценарию.
В предыдущем уроке мы создали пустую функцию и зарегистрировали её с GIMP. Теперь настало время добавить функциональность — мы хотим создать новое изображение, добавить в него введённый текст, и изменить размер изображения по размеру текста.
Как только вы научитесь задавать переменные, определять функции и получать доступ к элементам списка, остальное будет проще простого — вам нужно только ознакомиться с функциями, доступными в процедурной базе данных GIMP, и вызывать эти функции напрямую. Откройте Раздел 12.9, «Навигатор процедур».
Начнём с создания нового изображения. Мы создаём новую переменную theImage и присваиваем ей возвратное значение встроенной функции GIMP gimp-image-new.
Как видно из браузера базы данных, функция gimp-image-new принимает три параметра — ширину, высоту и тип изображения. Поскольку позже мы изменим размер изображения, чтобы оно соответствовало тексту, мы создадим изображение RGB размером 10×10 пикселей. Мы также сохраним ширину и размеры изображения в некоторых переменных, так как будем обращаться к ним и управлять ими позже в сценарии.
        (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 все функции возвращают список, даже если в списке только один элемент. Чтобы взять этот элемент, мы и достаём голову списка.
Теперь, когда у нас есть новое изображение, нужно к нему добавить слой. Мы вызовем функцию gimp-layer-new, чтобы создать новый слой, и дадим ей ID созданного изображения. (Отныне мы будем показывать только строки, которые мы добавляем или меняем, а не текст всей функции. Текст полного сценария находится здесь.) Поскольку мы задекларировали все локальные переменные, мы также закрываем скобку декларации переменных:
        ;создать новый слой для изображения:
           (theLayer
                     (car
                          (gimp-layer-new
                           theImage
                           "слой 1"
                           theImageWidth
                           theImageHeight
                           RGB-IMAGE
                           100
                           LAYER-MODE-NORMAL
                          )
                      )
            )
         ) ;конец декларации локальных переменных
      
        Когда есть новый слой, его можно добавить к изображению:
        (gimp-image-insert-layer theImage theLayer 0 0)
      
        Давайте теперь проверим, что у нас есть на этот момент, и добавим следующую строку, чтобы увидеть новое пустое изображение:
(gimp-display-new theImage)
Сохраните свою работу, перезапустите GIMP, запустите сценарий, и должно появиться новое изображение. Вероятно, оно будет содержать «мусор» (случайные цвета), поскольку мы его не удалили. Мы займёмся этим чуть позже.
Удалите строку, показывающую пустое изображение (или деактивируйте её знаком комментария ; в начале строки).
До добавления текста нужно установить цвет переднего плана и фона, чтобы текст появился в цветах, заданные пользователем. Мы будем вызывать функции 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)
      
        Сохраните работу, перезапустите GIMP и запустите свой первый сценарий.
Если вы захотите закрыть изображение до его сохранения, GIMP запросит подтверждения сохранения до закрытия. Он это делает, потому что изображение помечено как грязное, или несохранённое. В нашем случае это неудобно при отладки сценария, поскольку приходится создавать много изображений и подтверждать, что их сохранять не надо. Если изображение не изменено, то его можно легко воспроизвести, вызвав сценарий повторно. Поэтому имеет смысл сбросить грязный флажок.
Грязный флажок сбрасывается после показа изображения:
        (gimp-image-clean-all theImage)
      
        Это установит счётчик изменений на ноль, делая изображение «чистым».
Добавлять или не добавлять эту строку — зависит от личных предпочтений. Если результат простой и легко воспроизводим, то можно добавить. Если сценарий сложен, требует много времени для работы, или работает с существующим изображением, то лучше не добавлять.