### 3.5. Добавление дополнительных функций

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

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

In the previous lesson, we created an empty function and registered it with GIMP. In this lesson, we want to provide functionality to our script — we want to create a new image, add the user's text to it and resize the image to fit the text exactly.

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 во время быстрого просмотра сценария.

You should also notice that we took the head of the result of the function call. This may seem strange, because the database explicitly tells us that it returns only one value — the ID of the newly created image. However, all GIMP functions return a list, even if there is only one element in the list, so we need to get the head of the list.

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

Теперь, когда у нас есть новое изображение, нужно к нему добавить слой. Мы вызовем функцию `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, запустите сценарий, и должно появиться новое изображение. Вероятно, оно будет содержать «мусор» (случайные цвета), поскольку мы его не удалили. Мы займёмся этим чуть позже.

#### 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)

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

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

If you try to close the image created without first saving the file, GIMP will ask you if you want to save your work before you close the image. It asks this because the image is marked as dirty, or unsaved. In the case of our script, this is a nuisance for the times when we simply give it a test run and don't add or change anything in the resulting image — that is, our work is easily reproducible in such a simple script, so it makes sense to get rid of this dirty flag.

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

            (gimp-image-clean-all theImage)

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

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

3.4. Первый сценарий Script-Fu |  | 3.6. Расширение сценария Tex Box

Report a bug in GIMP Сообщите об ошибке в нашем баг-трекере