3.5. Donner un peu plus de corps à votre script
| 3. Didacticiel pour Script-Fu |

### 3.5. Donner un peu plus de corps à votre script

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

#### 3.5.1. Création d'une nouvelle image

Dans la leçon précédente, nous avons créé une fonction vide et nous l'avons enregistrée dans GIMP. Dans la présente leçon, nous voulons donner quelque fonctionnalité à notre script : créer une nouvelle image, lui ajouter le texte de l'utilisateur et redimensionner l'image pour qu'elle s'adapte exactement au texte.

Une fois que vous savez fixer les variables, définir les fonctions et accéder aux membres d'une liste, le reste va comme sur des roulettes. Tout ce que vous avez à faire est de vous familiariser avec les fonctions disponibles dans la base de données de procédures de GIMP et à les appeler directement. Activez le Section 12.7, « Navigateur de Procédures » et c'est parti !

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.

Comme vous pouvez le voir dans le Navigateur de Procédures, la fonction `gimp-image-new` nécessite trois paramètres : la largeur de l'image, sa hauteur et son type. Puisque l'image sera redimensionnée pour s'adapter à la taille du texte, nous créerons arbitrairement une image RVB de 10x10 pixels. Nous stockerons les dimensions de l'image dans des variables, de façon à pouvoir les récupérer plus tard dans le 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.

Vous devriez aussi avoir remarqué que nous avons pris la tête du résultat de la fonction « call ». Cela peut paraître étrange parce que la base de donnée nous dit explicitement qu'elle ne retourne qu'une seule valeur – l'ID (identificateur) de la nouvelle image créée. Mais toutes les fonctions GIMP retournent une liste, même s'il n'y a qu'un seul élément dans la liste.

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

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

            (gimp-image-add-layer theImage theLayer 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)

Enregistrez votre travail, sélectionnez la commande suivante Filtres → Script-Fu → Actualiser les scripts, lancez le script et une nouvelle image s'affichera. Elle contiendra probablement quelques résidus (couleurs au hasard), parce que nous ne les avons pas effacés. Nous ferons ça plus tard.

#### 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 BACKGROUND-FILL)

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

            (set! theText
                          (car
                               (gimp-text-fontname
                                theImage theLayer
                                0 0
                                inText
                                0
                                TRUE
                                inFontSize PIXELS
                                "Sans")
                           )
            )

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-width  theText) ) )
            (set! theImageHeight  (car (gimp-drawable-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)

Enregistrez votre travail, rafraîchissez la base de données et tentez un démarrage de votre script !

#### 3.5.4. Annulons le drapeau de modification

Quand vous essayez de fermer une image modifiée sans l'avoir enregistrée au préalable, GIMP vous demande de l'enregistrer. L'image est en effet marquée par un drapeau de modification. Dans le cas de notre script, c'est une nuisance car nous ne faisons que tester nos modifications sans vouloir modifier définitivement l'image elle même – nous pouvons reproduire l'effet du script comme nous voulons. Il est donc judicieux d'annuler ce drapeau de modification.

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.

3.4. Votre premier script de Script-Fu |  | 3.6. Compléter le script Text Box

Envoyez un rapport d'anomalie à Bugzilla