3.5. Adding Additional Functionality

Pokračujme ve výcviku a naučme náš skript vykonávat požadovanou činnost.

3.5.1. Vytvoření nového obrázku

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 – „Prohlížeč procedur“.

Let's begin by making a new image. We'll create a new variable, theImage, set to the result of calling GIMP's built-in function 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*
              (
                 ; 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
      

Note: We used the value RGB to specify that the image is an RGB image. We could have also used 0, but RGB is more descriptive when we glance at the code.

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. Přidání nové vrstvy do obrázku

Now that we have an image, we need to add a layer to it. We'll call the gimp-layer-new function to create the layer, passing in the ID of the image we just created. (From now on, instead of listing the complete function, we'll only list the lines we're adding to it. You can see the complete script here.) Because we've declared all of the local variables we'll use, we'll also close the parentheses marking the end of our variable declarations:

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

Jakmile máme novou vrstvu, je třeba ji přidat k obrázku:

        (gimp-image-insert-layer theImage theLayer 0 0)
      

Nyní, jen z legrace, si prohlédneme plody naší dosavadní práce a přidáme proto následující řádku pro zobrazení nového, prázdného obrázku:

(gimp-display-new theImage)

Save your work, restart GIMP, run the script and a new image should pop up. It will probably contain garbage (random colors), because we haven't erased it. We'll get to that in a second.

3.5.3. Přidání textu

Go ahead and remove the line to display the image (or comment it out with a (;) as the first character of the line).

Než text do obrázku přidáme, musíme nastavit barvu popředí a pozadí tak, aby se text objevil v uživatelem zadané barvě. použijeme k tomu funkce gimp-context-set-background/foreground:

        (gimp-context-set-background '(255 255 255) )
        (gimp-context-set-foreground inTextColor)
      

Barvy máme správně nastavedny, proto teď můžeme vyčistit nepořádek v obrázku vyplněním barvou pozadí:

        (gimp-drawable-fill theLayer FILL-BACKGROUND)
      

Do vyčištěného obrázku lze přidat text:

        (set! theText
                      (car
                           (gimp-text-font
                            theImage theLayer
                            0 0
                            inText
                            0
                            TRUE
                            inFontSize
                            inFont)
                       )
        )
      

Ačkoliv je volání funkce poměrně dlouhé, pokud se podíváte na popis funkce v prohlížeči procedur, je vše poměrně jasné. Tvoříme novou textovou vrstvu a přiřazujeme ji proměnné theText.

Nyní, když máme v obrázku text, můžeme zjistit jeho výšku a šířku a změnit podle něj velikost obrázku a vrstvy obrázku:

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

Možná vám není jasný rozdíl mezi vrstvou a tím, čemu se v Gimpu říká drawable. Pojem drawable se vztahuje na vše, na co lze kreslit, včetně vrstev, ale kromě nich také zahrnuje kanály, masky vrstev, výběry atd. Vrstva je specifickým typem objektu drawable. Ve většině případů se ale nemusíte rozdíly zabývat.

Nyní můžeme připravený obrázek zobrazit:

        (gimp-display-new theImage)
      

Save your work, restart GIMP and give your first script a run!

3.5.4. Odstranění příznaku nečistoty

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.

To lze snadno učinit po zobrazení obrázku následujícím způsobem:

        (gimp-image-clean-all theImage)
      

This will set dirty count to 0, making it appear to be a clean image.

Zda tuto řádku přidat nebo ne je otázkou vkusu. Já ji používám ve skriptech tvořících jednoduché nové obrázky, jako je například tento skript. Pokud je skript velmi složitý, nebo pokud pracuje s existujícím obrázkem, není tato funkce vhodná.