3.5. Придача сценарию формы

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

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

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

Когда вы знаете, как задать значения переменным, декларировать функци и доставать элементы из списка, всё остальное просто. Нужно только изучить функции, которые поставляются с базой процедур GIMP, и научится вызывать их. Вызовите Раздел 12.7, «Браузер процедур» и давайте начнём.

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

Как можно видеть из просмотрщика процедур, функция gimp-image-new берёт три параметра — ширину, высоту и тип нового изображения. Поскольку мы изменим размер изображения позже, здесь мы указываем изображение RGB 10x10 точек. Мы также сохраним значения размера в переменных, так как мы их изменим позже.

        (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-add-layer theImage theLayer 0)
      

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

(gimp-display-new theImage)

Сохраните сценарий, вызовите команду ФильтрыScript-FuОбновить сценарии, вызовите сценарий, и новое изображение должно появиться. Оно скорее всего будет содежать шум, так как мы его не очистили. Это мы сделаем позже.

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

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

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

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

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

        (gimp-drawable-fill theLayer BACKGROUND-FILL)
      

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

        (set! theText
                      (car
                           (gimp-text-fontname
                            theImage theLayer
                            0 0
                            inText
                            0
                            TRUE
                            inFontSize PIXELS
                            "Sans")
                       )
        )
      

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

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

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

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

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

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

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

        (gimp-display-new theImage)
      

Сохраните сценарий, обновите базу процедур и испытайте его.

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

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

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

        (gimp-image-clean-all theImage)
      

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

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