3.5. Adding Additional Functionality

Poursuivons notre entraînement et ajoutons quelques fonctionnalités à notre script.

3.5.1. Création d’une nouvelle image

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 Section 12.9, « Navigateur de Procédures ».

Commençons par fabriquer une nouvelle image. Nous créons pour cela une nouvelle variable theImage, réglée pour appeler la fonction gimp-image-new intégrée à GIMP.

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 : Nous avons utilisé la valeur RGB pour spécifier que l’image est une image RVB. Nous aurions pu aussi utiliser 0, mais RGB est nettement plus parlant.

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. Ajouter un nouveau calque à l’image

Maintenant que nous avons l’image, nous devons lui ajouter un calque. Nous ferons appel à la fonction gimp-layer-new pour créer ce calque, en lui transmettant l’ID de l’image que nous venons juste de créer. (À partir de maintenant, au lieu de lister l’ensemble de la fonction, nous ne listerons que les lignes que nous lui ajoutons. Vous pouvez voir ici le script complet). Et puisque nous avons déclaré toutes les variable locales dont nous aurons besoin, nous pouvons aussi fermer les parenthèses marquant la fin de nos déclarations de variables :

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

Ce nouveau calque obtenu, nous devons l’ajouter à l’image :

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

Et maintenant, juste pour le plaisir, admirons le fruit de notre travail jusqu’ici, en ajoutant cette ligne qui affichera la nouvelle image vide :

(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. Ajouter le texte

Supprimez la ligne d’affichage de l’image (ou mettez-la en commentaire en plaçant un ; en premier caractère de la ligne).

Avant d’ajouter le texte à l’image, nous devons fixer les couleurs de premier-plan (foreground) et d’arrière-plan (background), de façon à ce que le texte apparaisse dans les couleurs que l’utilisateur a spécifiées. Nous utiliserons pour cela les fonctions gimp-context-set-back/foreground :

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

Les couleurs étant correctement réglées, nettoyons les résidus présents dans l’image en remplissant le calque avec la couleur d’arrière-plan :

        (gimp-drawable-fill theLayer FILL-BACKGROUND)
      

L’image nettoyée, nous sommes prêts à ajouter un texte :

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

Malgré un appel de fonction un peu long, il est facile à comprendre si vous suivez les paramètres tout en consultant les entrées de la fonction dans le Navigateur de Procédures. À la base, nous créons un nouveau calque de texte et nous l’assignons à la variable theText.

Maintenant que nous avons le texte, nous pouvons nous intéresser à sa hauteur et à sa largeur, et adapter l’image et le calque d’image à la taille du texte :

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

Si vous êtes comme moi, vous vous demandez probablement quelle différence il y a entre un « drawable » et un calque (NdT: faute de mieux, je traduis « drawable » par "élément graphique", ce qui enlève pas mal d’intérêt à cette remarque de l’auteur) . Un élément graphique est tout objet de GIMP pouvant être peint : les sélections, les masques de calque, les masques de canaux et aussi les calques. Les calques sont un type particulier d’élément graphique.

Notre image étant prête, nous pouvons rajouter notre ligne d’affichage de l’image :

        (gimp-display-new theImage)
      

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

3.5.4. Annulons le drapeau de modification

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.

Nous pouvons faire cela après l’affichage de l’image :

        (gimp-image-clean-all theImage)
      

Ceci mettra le drapeau de modification à 0, faisant comme si l’image n’avait pas été modifiée.

Ajouter ou non cette ligne est affaire de goût personnel. Je l’utilise dans les scripts qui produisent une nouvelle image sans intérêt prononcé. Si votre script est très complexe, ou si vous travaillez sur une image existante, vous ne voudrez sûrement pas utiliser cette fonction.