14.6. Extendiendo El Script Text-Box

Manejando Correctamente Deshacer

Cuando creas un script, quieres dar a sus usuarios la habilidad para deshacer sus acciones, podrian cometer un error. Esto es fácil de efectuar llamando a las funciones  gimp-undo-push-group-start and gimp-undo-push-group-end alrededor del código que manipula la imagen. Puedes pensar que son declaraciones marcadas que dejan a Gimp saber cuando empezar y parar la grabación de manipulaciones sobre la imagen, así esas manipulaciones pueden ser deshechas más tarde.

Si creas una imagen nueva, no tiene sentido usar estas funciones porque no cambias una imagen existente. Cuando estás cambiando una imagen existente, debes asegurarte que quieres usar estas funciones.

Deshaciendo un script trabaja casi perfectamente cuando usas estas funciones.

Extendiendo El Script Un Poco Más

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

  • La imagen es redimensionada exactamente alrededor del texto -- no hay sitio para algo, como  drop shadows o efectos especiales (muchos scripts redimensionan la imagen cuando es necesario.

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

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"             ;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" "<Toolbox>/Xtns/Script-Fu/Text")

      

Añadiendo 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).

Después de obtener el ancho y alto del texto, necesitamos redimensionar estos valores basados en la cantidad del bufer especificado por el usuario. No queremos cometer ningún error, chequeando para asegurar que está en el rango de 0-100%, porque no amenaza la vida y porque no hay razón par que el usuario no puedea entrar un valor como 200 % de bufer para añadir.

        (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 guarda tu script, e inténtalo 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 esta linea 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ás en el camino para tu Cinturón Negro de Script-Fu!.