3.6. Estendere lo script Text Box

3.6.1. Gestire correttamente l'annullamento

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.

Se si crea una immagine completamente nuova non ha molto senso utilizzare queste funzioni poiché non si sta modificando una immagine preesistente. Tuttavia quando si modificano altre immagini è consigliabile farne uso.

L'annullamento di uno script è possibile solo quando si utilizzano queste funzioni.

3.6.2. Ulteriore estensione dello script

Ora che si ha uno script per creare riquadri di testo aggiungiamovi due funzionalità:

  • Attualmente, l'immagine viene ridimensionata per contenere in maniera precisa il testo senza ulteriore spazio per ombre o effetti speciali (anche se altri script ridimensionano le immagini se necessario). Si aggiungerà uno spazio attorno al testo e si consentirà all'utente di impostare quanto aggiungerne definendolo in percentuale rispetto alla dimensione complessiva del testo.

  • Questo script potrebbe facilmente essere utilizzato in altri script che lavorano con il testo. Lo si estenderà facendogli restituire l'immagine e i livelli in modo che altri script possano chiamarlo e utilizzare le immagini e i livelli creati.

3.6.3. Modificare i parametri e la funzione di registrazione

Per consentire all'utente di specificare la dimensione della spaziatura si aggiungerà un parametro alla funzione principale e alla funzione di registrazione:

  (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. Aggiungere nuovo codice

Si aggiungerà il codice in due posizioni: appena prima il ridimensionamento dell'immagine e alla fine dello script (per restituire l'immagine, il livello e il testo).

Dopo aver ottenuto le dimensioni del testo si devono aggiustare i valori in base all'entità della spaziatura specificata dall'utente. Non si effettuerà nessun controllo di errore per assicurarsi che il valore sia compreso tra 0 e 100% anche per dare la possibilità di immettere valori superiori come ad esempio «200» come percentuale del buffer da aggiungere.

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

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

Il codice imposta la spaziatura in basse all'altezza del testo e la somma due volte sia all'altezza che alla larghezza della nuova immagine. (La si somma due volte perché la spaziatura è su entrambi i lati).

Ora che l'immagine è stata ridimensionata tenendo conto della spaziatura si deve centrare il testo all'interno dell'immagine. Questo si ottiene spostando lungo le coordinate (x, y) il livello del testo di (theBuffer, theBuffer). Aggiungere la linea seguente dopo il ridimensionamento dell'immagine:

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

Go ahead and save your script, and try it out after restarting GIMP.

Quello che rimane è restituire l'immagine, il livello e il livello del testo. Dopo la visualizzazione dell'immagine aggiungere la linea seguente:

(list theImage theLayer theText)

Questa è l'ultima linea della funzione, la lista viene quindi resa disponibile ad altri script che vogliano farne uso.

Per utilizzare il nuovo script Text Box in un altro script si potrebbe scrivere qualcosa come:

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

Complimenti, si è ora in procinto di acquisire la Cintura Nera di Script-Fu!