3.6. Проширивање скрипте за текстуално поље

3.6.1. Исправно руковање опозивањем

Када правите скрипту, желите да својим корисницима пружите могућност да опозову своје радње у случају да направе грешку. Ово се лако постиже позивањем функција gimp-image-undo-group-start и gimp-image-undo-group-end око кода који мења слику. Можете их посматрати као упарене наредбе које обавештавају Гимп када да започне и заустави снимање измена на слици, како би се те измене касније могле опозвати.

Ако правите потпуно нову слику, нема смисла користити ове функције јер не мењате постојећу слику. Међутим, када мењате постојећу слику, сигурно ћете желети да користите ове функције.

Поништавање скрипте ради скоро беспрекорно када се користе ове функције.

3.6.2. Још мало проширивања скрипте

Сада када имамо веома корисну скрипту за прављење текстуалних оквира, додајмо јој две могућности:

  • Currently, the image is resized to fit exactly around the text — there's no room for anything, like drop shadows or special effects (even though many scripts will automatically resize the image as necessary). Let's add a buffer around the text, and even let the user specify how much buffer to add as a percentage of the size of the resultant text.

  • Ова скрипта би се лако могла користити у другим скриптама које раде са текстом. Проширимо је тако да враћа слику и слојеве, како би друге скрипте могле да позову ову скрипту и користе слику и слојеве које направимо.

3.6.3. Мењање параметара и функције за регистрацију

Да бисмо омогућили кориснику да одреди количину празног простора, додаћемо параметар нашој функцији и функцији за регистрацију:

  (define (script-fu-text-box inTest inFont inFontSize inTextColor inBufferAmount)
  (let*
        (
           ; define our local variables
           ; create a new image:
           (theImageWidth  10)
           (theImageHeight 10)
           (theImage (car
                          (gimp-image-new
                           theImageWidth
                           theImageHeight
                           RGB
                          )
                     )
           )
           (theText)          ;a declaration for the text
                              ;we create later

           (theBuffer)        ;added

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

   [Code here]
 )
      
  (script-fu-register
    "script-fu-text-box"                        ;function 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>/Filters/Tutorial")
      

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
                         "Some text"
                         "Charter" "30"
                         '(0 0 0)
                         "35"
                        )
        )
        (gimp-image-flatten (car theResult))
      

Честитамо, на путу сте ка свом црном појасу у Скрипт-фуу!