3.6. Rozšíření skriptu Text Box

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

When creating a script, you want to give your users the ability to undo their actions, should they make a mistake. This is easily accomplished by calling the functions gimp-undo-push-group-start and gimp-undo-push-group-end around the code that manipulates the image. You can think of them as matched statements that let GIMP know when to start and stop recording manipulations on the image, so that those manipulations can later be undone.

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

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

3.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.

  • 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.

  • 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.

3.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
                          LAYER-MODE-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;\
      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>/Font/Create/Text")
      

3.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).

After we get the text's height and width, we need to resize these values based on the buffer amount specified by the user. We won't do any error checking to make sure it's in the range of 0-100% because it's not life-threatening, and because there's no reason why the user can't enter a value like 200 as the percent of buffer to add.

        (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ředění 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!