3.6. Extender el script «Text Box»

3.6.1. Gestionar correctamente deshacer

Cuando crea un script, quiere dar a sus usuarios la habilidad para deshacer sus acciones, podrían cometer un error. Esto es fácil de efectuar llamando a las funciones gimp-undo-push-group-start y gimp-undo-push-group-end sobre el código que manipula la imagen. Puede imaginarlas como declaraciones marcadas que dejan que GIMP sepa cuándo empezar y parar la grabación de manipulaciones sobre la imagen, para que esas manipulaciones se pueden deshacer más tarde.

Si crea una imagen totalmente nueva, no tiene sentido usar estas funciones porque no está cambiando una imagen existente. Sin embargo, cuando cambia una imagen existente, seguramente sí querrá usar estas funciones.

Deshacer un script funciona casi perfectamente cuando usa estas funciones.

3.6.2. Extender el script un poco más

Ahora que ha creado un excelente y manejable script para crear cajas de texto, añádale dos capacidades:

  • Actualmente, la imagen se redimensiona para ajustarse exactamente alrededor del texto, no hay sitio para nada, como sombras o efectos especiales (aunque muchos scripts redimensionan la imagen cuando es necesario). Añádale un búfer al texto e incluso deje que el usuario especifique la cantidad del búfer a añadir como un porcentaje del tamaño del texto resultante.

  • Este script se podría usar fácilmente en otros scripts para trabajar con texto. Extendiéndalo para que devuelva la imagen y las capas, así otros scripts podrán llamar a este script y usar la imagen y las capas que se creen.

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

Para dejar al usuario especificar la cantidad del bufer, añada un parámetro a su función y a la función de registro:

  (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"                        ;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 código nuevo

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

Después de obtener la anchura y la anchura del texto, necesita redimensionar estos valores basados en la cantidad del bufer especificado por el usuario. No se hace ninguna comprobación de que está en el rango de 0-100% porque no es vital y porque no hay ninguna razón por la que el usuario no pueda dar un valor como 200 como porcentaje de búfer a añadir.

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

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

Todo lo que se hace aquí es configurar el búfer basado en la altura del texto, y añadirlo dos veces tanto al alto como al ancho de nuestra nueva imagen. (Se añade dos veces porque el búfer necesita añadirse a ambos lados del texto.)

Ahora que se ha redimensionado la imagen para permitir un búfer, necesita centrar el texto en la imagen. Esto se hace moviéndolo a las coordenadas (x, y) de (theBuffer, theBuffer). Se añadió esta línea 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 actualizar 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, se añade esta línea:

(list theImage theLayer theText)

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

Para usar nuestro nuevo script «text box» en otro script, se podría 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!.