3.6. Compléter le script Text Box

3.6.1. Gérer correctement l'annulation d'action

Quand vous créez un script, vous voulez donner à l'utilisateur la possibilité d'annuler ses actions, car il peut commettre des erreurs. Cela est facilement réalisé en appelant les fonctions gimp-undo-push-group-start et gimp-undo-push-group-end encadrant le code qui manipule l'image. GIMP connaîtra ainsi les parties de code dont l'action pourra être annulée.

Si vous créez une image entièrement, il est de peu d'intérêt d'utiliser ces fonctions, puisque vous ne modifiez pas une image existante. Il en va tout autrement pour une image existante.

L'annulation d'un script marche presque parfaitement en utilisant ces fonctions.

3.6.2. Compléter un peu plus notre script

Ajoutons encore quelques fonctionnalités à notre script :

  • Actuellement, l'image est redimensionnée pour coller exactement au texte, et il n'y a pas de place pour autre chose, comme une ombre portée ou un effet spécial. Ajoutons donc un tampon autour du texte et permettons même à l'utilisateur de fixer la taille du tampon à un pourcentage de la taille du texte.

  • Ce script pourrait aisément être utilisé dans d'autres scripts travaillant sur du texte. Enrichissons-le donc aussi pour qu'il retourne l'image et les calques, de telle sorte que les autres scripts puissent les récupérer et les utiliser.

3.6.3. Modifier les paramètres et la fonction d'enregistrement

Pour permettre à l'utilisateur de spécifier la taille du tampon, nous ajouterons un paramètre à notre fonction et à la fonction d'enregistrement :

        (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;\
      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. Ajoutons ce nouveau code

Nous allons ajouter du code à deux endroits : juste avant de redimensionner l'image, et à la fin du script (pour retourner la nouvelle image, le calque et le texte).

Après avoir obtenu la hauteur et la largeur du texte, nous devons changer ces valeurs sur la base de la taille du tampon spécifiée par l'utilisateur. Nous ne commettrons pas d'erreur en ne recherchant pas si la valeur est dans l'intervalle 0-100%, parce que ce n'est pas vital, et qu'il n'y a aucune raison que l'utilisateur ne puisse pas donner une valeur de 200% au tampon.

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

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

Tout ce que nous faisons ici est de régler le tampon sur la hauteur du texte, et de l'ajouter deux fois à la hauteur et à la largeur de notre nouvelle image (deux fois parce que le tampon doit être ajouté des deux côtés du texte).

Maintenant que nous avons redimensionné l'image pour permettre une zone tampon, nous devons centrer le texte dans l'image. Nous le faisons en le déplaçant vers les coordonnées (x,y) de (theBuffer, theBuffer). J'ai ajouté cette ligne après le redimensionnement du calque et de l'image :

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

Poursuivez et enregistrez votre script, puis testez-le après avoir rafraîchi la base de données.

Tout ce qui reste à faire est de retourner notre image, le calque et le calque de texte. Après l'affichage de l'image, nous ajoutons cette ligne :

(list theImage theLayer theText)

C'est la dernière ligne de la fonction, qui rend cette liste disponible pour les autres scripts qui veulent l'utiliser.

Pour utiliser notre nouveau script de boîte de texte dans un autre script, nous pourrions écrire quelque chose comme :

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

Félicitations, vous êtes sur le chemin de votre Ceinture Noire de Scrip-Fu !