Předcházející |  | Další

### 11.6. Rozšíření skriptu Text Box

#### 11.6.1. Správné zacházení s historií změn

Při vytváření skriptu chcete umožnit uživatelům vracet provedené akce, pokud udělají chybu. Toho lze snadno dosáhnout voláním funkcí `gimp-undo-push-group-start` a `gimp-undo-push-group-end` před a za kódem, který manipuluje s obrázkem. Můžete si je představit jako párovou značku, která Gimp informuje o tom, kdy začít a kdy skončit zaznamenávání manipulací s obrázkem. Tento záznam umožňuje pozdější vrácení provedených změn.

Pokud ale skript tvoří zcela nový obrázek, nemá smysl tyto funkce používat, protože se žádný existující obrázek němění. Pokud ale skript mění existující obrázek, jsou tyto funkce zcela nepostradatelné.

Pokud jsou tyto funkce použity, nečiní vracemí změn provedených skripty žádné potíže.

#### 11.6.2. Další rozšíření skriptu

Nyní máme šikovný a funkční skript pro vytváření textových rámečků. Přidáme mu ale ještě dvě další funkce rozšiřující jeho možnosti.

- V současné chvíli je velikost obrázku nastavována tak, že kolem textu není žádné volné místo, například pro stíny nebo jiné zvláštní efekty (i když mnoho skriptů tvořících takové efekty si v případě potřeby obrázek bez potíží zvětší). Přidáme proto okolo obrázku místo a dovolíme uživateli, aby jeho množství sám zadal jako procento z velikosti textu.

- Tento skript se dá snadno použít v rámci jiných skriptů pracujících s textem. Rozšiřme ho proto tak, aby vracel obrázek a vrstvy způsobem, který umožní, aby náš skript ostatní skripty volaly a dále pracovaly s vytvořeným obrázkem a vrstvami.

#### 11.6.3. Úprava parametrů a registrační funkce

Aby mohl uživatel zadat množství volného místa, přidáme parametr naší funkci i registrační funkci:

            (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
                                    theImageWidth
                                    theImageHeight
                                    RGB-IMAGE
                                    "layer 1"
                                    100
                                    NORMAL
                                   )
                               )
                     )
                  ) ;end of our local variables

             [Code here]
           )

            (script-fu-register
              "script-fu-text-box"                        ;func 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"             ;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" "<Toolbox>/Xtns/Script-Fu/Text")

#### 11.6.4. Adding The New Code

Kód musíme přidat na dvě místa: těsně před změnu velikosti obrázku a úplně na konec skriptu (pro vrácení nového obrázku, vrstvy a textu).

Jakmile získáme výšku a šířku textu, musíme hodnoty zvětšit podle zadání uživatele. Nebudeme provádět žádnou kontrolu zadaných hodnot (například zda leží v rozsahu 0-100%), protože nejde o život a protože vlastně není důvod, pro uživateli nedovolit zadat například 200%.

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

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

Všechno co děláme, je nastavení volného místa podle výšky textu a požadavku užřivatele a přídání tohoto místa dvakrát k výšce i šířce obrázku. (Přidáváme ho ke každému rozměru dvakrát, protože volné místo musí být na každé straně textu.)

Nyní je obrázek ve vhodné velikosti, včetně požadovaného volného místa, ale text není v obrázku vystředěn. Vystředení lze provést posunem textu na (x, y) souřadnice (`theBuffer`, `theBuffer`). Za místo, kde se v kódu mění velikost obrázku, proto přidáme následující řádku:

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

Nyní skript uložte, obnovte databázi a vyzkoušejte.

Již zbývá jen vrátit obrázek, vrstvu a textovou vrstvu jako výsledek skriptu. Po zobrazení obrázku přidáme řádek:

            (list theImage theLayer theText)

To je poslední řádka funkce, což činí tento seznam přístupný ostatním skriptům, které by ho chtěly využít.

Pro využití našeho Text Box skriptu v jiném skriptu stačí napsat něco podobného:

            (set! theResult (script-fu-text-box
                             "Some text"
                             "Charter" "30"
                             '(0 0 0)
                             "35"
                            )
            )
            (gimp-image-flatten (car theResult))

Výborně! Jste na cestě k černému pásku ve Script-Fu!

Předcházející | Nahoru | Další
| Domů |