3.6. Estendere lo script Text Box

3.6.1. Gestire correttamente l'annullamento

Quando si crea uno script, si vuol dare agli utenti la possibilità di annullare le loro operazioni nel caso commettano degli errori. Ciò si può ottenere facilmente chiamando le funzioni gimp-undo-push-group-start e gimp-undo-push-group-end prima e dopo il codice che elabora l'immagine. Esse possono essere pensate come istruzioni accoppiate, che fanno sapere a GIMP quando iniziare e fermare la registrazione delle operazioni sull'immagine, in modo da poterle annullare in un secondo momento.

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*
        (
           ; definisce le nostre variabili locali
           ; crea una nuova immagine:
           (theImageWidth  10)
           (theImageHeight 10)
           (theImage (car
                          (gimp-image-new
                           theImageWidth
                           theImageHeight
                           RGB
                          )
                     )
           )
           (theText)          ;una dichiarazione per il testo
                              ;che creiamo dopo

           (theBuffer)        ;aggiunto

           (theLayer
                     (car
                         (gimp-layer-new
                          theImage
                          theImageWidth
                          theImageHeight
                          RGB-IMAGE
                          "layer 1"
                          100
                          LAYER-MODE-NORMAL
                         )
                     )
           )
        ) ;fine delle nostre variabili locali

   [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. 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)
      

Salvare lo script e provarlo dopo aver aggiornato il database.

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!