3.6. Rozšírenie skriptu Text Box

3.6.1. Správne používanie histórie zmien

Pri písaní skriptov budete chcieť, aby používatelia mali možnosť vrátiť späť chybné kroky. Toto sa dá docieliť veľmi ľahko. Slúžia na to funkcie gimp-undo-push-group-start a gimp-undo-push-group-end, ktoré dáte pred a za kód, ktorý manipuluje s obrázkom. Môžete si ich predstaviť ako párovú značku, ktorá GIMP informuje o tom, kedy začať a kedy skončiť zaznamenávanie manipulácie s obrázkom.

Ak začínate vytvárať celkom nový obrázok, použitie týchto funkcií nemá prakticky žiadny význam. Nemeníte totiž existujúci obrázok. Naopak, ak meníte už existujúci obrázok, tieto funkcie by ste mali použiť.

Ak sú tieto funkcie použité, vrátenie zmien je pre skript bezproblémové.

3.6.2. Ďalšie rozšírenie skriptu

Teraz, keď už máme celkom šikovný skript na tvorbu textových rámikov, pridajme mu ešte dve ďalšie vlastnosti:

  • Momentálne je veľkosť obrázka nastavená tak, že okolo textu nie je priestor pre nič. Ani pre tieň alebo nejaké efekty (aj keď mnohé skripty v prípade potreby obrázok aicky zväčšia). Urobme teda ešte jednu vec. Okolo textu pridajme trochu miesta. Veľkosť tohto priestoru nechajme na používateľa, nech si zvolí priestor v percentách z veľkosti výsledného textu.

  • Tento skript sa bude dať veľmi ľahko využiť aj v iných skriptoch pracujúcich s textom. Rozšírme ho teda tak, aby vracal obrázok a vrstvy, ktoré môžu ostatné skripty volať. Ich volaním sa budú dať aplikovať na iné obrázky a vrstvy, ktoré vytvoríme.

3.6.3. Úprava parametrov a funkcia registrácie

Aby používateľ mohol zadať množstvo voľného priestoru okolo textu, našej funkcii pridáme parameter a funkciu registrácie:

  (define (script-fu-text-box inTest inFont inFontSize inTextColor inBufferAmount)
  (let*
        (
           ; definujeme lokálne premenné
           ; vytvorime nový obrázok:
           (theImageWidth  10)
           (theImageHeight 10)
           (theImage (car
                          (gimp-image-new
                           theImageWidth
                           theImageHeight
                           RGB
                          )
                     )
           )
           (theText)          ; deklarácia textu
                              ; vytvoríme neskôr

           (theBuffer)        ;added

           (theLayer
                     (car
                         (gimp-layer-new
                          theImage
                          theImageWidth
                          theImageHeight
                          RGB-IMAGE
                          "layer 1"
                          100
                          NORMAL
                         )
                     )
           )
        ) ;koniec lokálnych premenných

   [Code here]
 )
      
  (script-fu-register
    "script-fu-text-box"                        ;meno funkcie
    "Text Box"                                  ;meno popisu
    "Creates a simple text box, sized to fit\
      around the user's choice of text,\
      font, font size, and color."              ;popis
    "Michael Terry"                             ;autor
    "copyright 1997, Michael Terry;\
      2009, the GIMP Documentation Team"        ;copyright
    "October 27, 1997"                          ;dátum vzniku
    ""                     ;typ obrázku s ktorým skript pracuje
    SF-STRING      "Text:"         "Text Box"   ;premenná reťazca
    SF-FONT        "Font:"         "Charter"    ;premenná písma
    SF-ADJUSTMENT  "Font size"     '(50 1 1000 1 10 0 1)
                                                ; tlačidlo
    SF-COLOR       "Color:"        '(0 0 0)     ;premenná farby
    SF-ADJUSTMENT  "Buffer amount" '(35 0 100 1 10 1 0)
                                                ;posuvník
  )
  (script-fu-menu-register "script-fu-text-box" "<Image>/Font/Create/Text")
      

3.6.4. Pridávanie nového kódu

Kód budeme pridávať na dvoch miestach: hneď pred zmenou obrázka a na koniec skriptu (na vrátenie nového obrázka, vrstvy a textu).

Akonáhle získame šírku a výšku textu, tieto hodnoty budeme musieť zväčšiť na základe priestoru zadaného používateľom. Kontrolu zadaných údajov nebudeme vykonávať. Nie je to životne dôležité. Nie je dôvod kontrolovať, či používateľ zadal hodnoty v rozsahu 0-100%, alebo či zadal napr. 200%. Môžeme mu to umožniť.

        (set! theBuffer (* theImageHeight (/ inBufferAmount 100) ) )

        (set! theImageHeight (+ theImageHeight theBuffer theBuffer) )
        (set! theImageWidth  (+ theImageWidth  theBuffer theBuffer) )
      

Všetko, o čo sa tu snažíme, je nastaviť voľný priestor okolo textu na základe šírky a výšky zadaného textu a pridať k nemu dvakrát toľko priestoru. (Dvakrát toľko priestoru pridáme ku každému rozmeru, keďže voľný priestor musí byť pridaný na každej strane textu.)

Teraz, keď sme obrázok zväčšili o voľný priestor okolo textu, musíme text v obrázku vycentrovať. Urobíme to posunom textu v súradniciach (x, y) (theBuffer, theBuffer). Za miesto, kde sa v kóde mení veľkosť vrstvy a obrázka, pridáme nasledujúci riadok:

        (gimp-layer-set-offsets theText theBuffer theBuffer)
      

Pokračujte v práci, skript uložte, znovu načítajte databázu a skript spustite.

Ostáva už len vrátiť obrázok, vrstvu a textovú vrstvu. Po zobrazení obrázka pridáme nasledujúci riadok:

(list theImage theLayer theText)

Toto je posledný riadok našej funkcie, ktorý tento zoznam sprístupní ostatným skriptom. Tie ho môžu ďalej použiť.

Aby náš skript mohli použiť iné skripty musíme napísať niečo takéto:

        (set! theResult (script-fu-text-box
                         "Ľubovoľný text"
                         "Charter" "30"
                         '(0 0 0)
                         "35"
                        )
        )
        (gimp-image-flatten (car theResult))
      

Blahoželám! Ste na dobrej ceste k zisku čierneho opasku v Script-Fu.