3.6. Extender el script: Text Box

3.6.1. Mantener correctamente deshacer

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-undo-push-group-start and gimp-undo-push-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 crea una imagen nueva, no tiene sentido usar estas funciones porque no cambia una imagen existente. Cuando está cambiando una imagen existente, debe asegurarse que quiere usar estas funciones.

Deshacer un script trabaja casi perfectamente cuando usa estas funciones.

3.6.2. Extender el script un poco más

Ahora que hemos creado un excelente y manejable script para crear cajas de texto, añadamosle dos capacidades:

  • Currently, the image is resized to fit exactly around the text — there's no room for anything, like drop shadows or special effects (even though many scripts will automatically resize the image as necessary). Let's add a buffer around the text, and even let the user specify how much buffer to add as a percentage of the size of the resultant text.

  • Este script podría facilmente ser usado en otro script para trabajar con texto. Extendiéndolo para que devuelva la imagen y las capas, así otros scripts pueden llamar a este script y usar la imagen y las capas que creemos.

3.6.3. Modificando los parámetros y la función de registro

Para dejar al usuario especificar la cantidad del bufer, añadiremos un parámetro a nuestra función y a la función de registrar:

  (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. Añadir el nuevo código

Vamos a añadir código en dos sitios: antes de redimensionar la imagen y al final del script (para devolver la nueva imagen, la capa y el texto).

After we get the text's height and width, we need to resize these values based on the buffer amount specified by the user. We won't do any error checking to make sure it's in the range of 0-100% because it's not life-threatening, and because there's no reason why the user can't enter a value like 200 as the percent of buffer to add.

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

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

Todo lo que hacemos aquí es configurar el bufer basado en la altura del texto, y añadirlo dos veces a ambos, el alto y ancho de nuestra nueva imagen. (Lo añadiremos dos veces porque el bufer necesita ser añadido a ambos lados del texto).

Ahora que hemos redimensionado la imagen para permitir un bufer, necesitamos centrar el texto bajo la imagen. Esto se hace para moverlo a las coordenadas (x, y) de (theBuffer, theBuffer). Añadí esta linea después de redimensionar la capa y la imagen:

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

Adelante y guarde su script, e inténtelo después de refrescar la base de datos.

Todo lo que queda por hacer es devolver nuestra imagen, la capa y la capa del texto. Después de mostrar la imagen, añadimos esta linea:

(list theImage theLayer theText)

Esta es la última linea de la función, hace que esta linea esté disponible a otros scripts que quieran usarla.

Para usar nuestro nuevo script text box en otro script, podriamos escribir algo como lo siguiente:

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

Felicitaciones, está en el camino para su ¡Cinturón Negro de Script-Fu!.