3.6. Estendre l'script «Text Box»

3.6.1. Gestiona correctament l'acció de desfer

Quan feu un script, voldreu donar als usuaris l'opció de desfer les accions, ja que podrien cometre un error. Això és fàcil d'efectuar cridant les funcions gimp-undo-push-group-start i gimp-undo-push-group-end emmarcant el codi que manipula la imatge. El GIMP sap quan començar i parar les manipulacions enregistrades de la imatge, així, aquestes manipulacions es poden desfer més tard.

Si feu una imatge totalment nova, no té sentit utilitzar aquestes funcions perquè no s'està canviant una imatge existent. Malgrat tot, quan canvieu una imatge existent, segurament sí que voldreu utilitzar aquestes funcions.

Desfer un script funciona gairebé a la perfecció quan s'utilitzen aquestes funcions.

3.6.2. Estendre l'script una mica més

Ara que heu creat un excel·lent i manejable script per a fer quadres de text, afegiu-li dues capacitats:

  • Actualment, la imatge es redimensiona per a ajustar-se exactament al voltant del text, no hi ha lloc per a res més, com una ombra o un efecte especial (encara que molts scripts redimensionin la imatge quan calgui). Afegiu-li una memòria intermèdia al text i fins i tot deixeu que l'usuari especifiqui la quantitat de memòria intermèdia a un percentatge de la mida del text resultant.

  • Aquest script es podria utilitzar fàcilment en altres scripts per a treballar amb text. Esteneu-lo perquè retorni la imatge i les capes, així, altres scripts podran recuperar aquest script i utilitzar la imatge i les capes.

3.6.3. Modifica els paràmetres i la funció de registre

Per tal de permetre a l'usuari especificar la quantitat de memòria intermèdia, afegiu un paràmetre a la vostra funció i a la funció de registre:

  (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"                        ;function 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. Afegeix el codi nou

Anem a afegir el codi en dos llocs: just abans de redimensionar la imatge i al final de l'script (per a retornar la nova imatge, la capa i el text).

Després d'obtenir l'alçada i l'amplada del text, cal redimensionar aquests valors basats en la quantitat de memòria intermèdia especificada per l'usuari. No es caurà en l'error de no considerar si el valor està en l'interval 0-100%, pel fet que no sigui vital i perquè no hi ha cap raó per la qual l'usuari no pugui donar un valor de «200%» de memòria intermèdia.

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

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

Tot el que es fa ací és configurar la memòria intermèdia basada en l'alçada del text, i afegir-la dues vegades tant a l'alçada com a l'amplada de la vostra nova imatge. (S'afegeix dues vegades perquè la memòria intermèdia s'hi ha d'afegir a banda i banda del text).

Ara que s'ha redimensionat la imatge per a permetre una memòria intermèdia, caldrà centrar el text en la imatge. Això es fa movent-lo a les coordenades (x, y) del (theBuffer, theBuffer). Es va afegir aquesta línia després de redimensionar la capa i la imatge:

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

Tireu endavant i deseu el vostre script, i proveu-lo després de reiniciar el GIMP.

Tot el que queda per a fer és retornar la nostra imatge, la capa i la capa del text. Després de mostrar la imatge, s'afegeix aquesta línia:

(list theImage theLayer theText)

És la darrera línia de la funció, i fa que aquesta llista estigui disponible a altres scripts que desitgin utilitzar-la.

Per a utilitzar el vostre nou script del quadre de text en un altre script, es podria escriure alguna cosa com:

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

Felicitats, esteu en el camí cap al Cinturó Negre de Script-Fu!