3.6. Estendre l'script «Text Box»

3.6.1. Gestiona correctament l'acció de desfer

When creating a script, you want to give your users the ability to undo their actions, should they make a mistake. This is easily accomplished by calling the functions gimp-image-undo-group-start and gimp-image-undo-group-end around the code that manipulates the image. You can think of them as matched statements that let GIMP know when to start and stop recording manipulations on the image, so that those manipulations can later be undone.

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
                           "layer 1"
                          theImageWidth
                          theImageHeight
                          RGB-IMAGE
                          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>/Filters/Tutorial")
      

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!