3.5.  Dare un corpo allo script

Si continui con il nostro addestramento e si aggiungano delle funzionalità allo script.

3.5.1.  Creare una nuova immagine

Nella lezione precedente si è creata una funzione vuota e la si è registrata in GIMP. In questa lezione si doterà lo script di funzionalità -- si vuole creare una nuova immagine, aggiungere il testo immesso dall'utente e ridimensionare l'immagine per contenere esattamente il testo.

Una volta che si sa come definire variabili, definire le funzioni e accedere agli elementi di una lista il resto è presto fatto, si deve solo familiarizzare con le funzioni disponibili nel database delle procedure di GIMP e chiamare tali funzioni direttamente. Si richiami il Navigatore delle procedure prima di continuare.

Cominciare creando una nuova immagine. Creare una nuova variabile, theImage, a cui assegnare il valore di ritorno della funzione interna gimp-image-new.

Come si può vedere dal navigatore delle procedure la funzione gimp-image-new prende tre parametri: la larghezza dell'immagine, l'altezza e il tipo. Poiché l'immagine verrà successivamente ridimensionata per contenere il testo creare una immagine 10x10 RGB. Memorizzare le dimensioni dell'immagine in alcune variabili per potervi fare riferimento e manipolarle più avanti nello script.

        (define (script-fu-text-box inText inFont inFontSize inTextColor)
        (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
      

Nota: si è utilizzato il valore RGB per specificare che l'immagine è di tipo RGB. Si sarebbe potuto anche utilizzare il valore 0 ma RGB è più descrittivo osservando il codice.

Si noti anche che si è presa la testa del risultato della chiamata a funzione. Può sembrare strano perchè il database afferma esplicitamente che la funzione restituisce un unico valore: l'ID dell'immagine appena creata. Tuttavia tutte le funzioni di GIMP ritornano una lista anche se contenente un unico elemento.

3.5.2.  Aggiungere un nuovo livello all'immagine

Ora che un'immagine è disponibie occorre aggiungervi un livello. Chiamare la funzione gimp-layer-new per creare il livello passando l'ID dell'immagine precedentemente creata. (Da adesso in poi invece di elencare l'intera funzione, verranno mostrate solo le linee da aggiungere). Poichè si sono dichiarate tutte le variabili locali utilizzate si chiuderanno tutte le parentesi segnando la fine del blocco di dichiarazione delle variabili:

        ;create a new layer for the image:
           (theLayer
                     (car
                          (gimp-layer-new
                           theImage
                           theImageWidth
                           theImageHeight
                           RGB-IMAGE
                           "layer 1"
                           100
                           NORMAL
                          )
                      )
            )
         ) ;end of our local variables
      

Una volta disponibile il nuovo livello occorre aggiungerlo all'immagine:

        (gimp-image-add-layer theImage theLayer 0)
      

Si provi ora a testare il risultato del lavoro svolto fino a questo punto aggiungendo la linea seguente per mostrare la nuova immagine:

        (gimp-display-new theImage)
      

Si salvi il lavoro e si selezioni XtnsScript-FuRinfresca scripts, si esegua lo script, dovrebbe comparire una nuova immagine. E' probabile che contenga spazzatura (colori casuali) poiché non è stata cancellata esplicitamente.

3.5.3.  Aggiungere il testo

Procedere rimuovendo la linea per visualizzare l'immagine (o la si commenti facendola precedere da un ; ad inizio linea).

Prima di aggiungere il testo all'immagine occorre impostare i colori di primo piano e di sfondo in modo che il testo abbia il colore selezionato dall'utente. Utilizzare le funzioni gimp-context-set-back/foreground:

        (gimp-context-set-background '(255 255 255) )
        (gimp-context-set-foreground inTextColor)
      

Con i colori opportunamente impostati cancellare la spazzatura presente nell'immagine riempiendo l'area con il colore di sfondo:

        (gimp-drawable-fill theLayer BACKGROUND-FILL)
      

Dopo aver pulito l'immagine si è pronti per l'aggiunta del testo:

        (set! theText
                      (car
                           (gimp-text-fontname
                            theImage theLayer
                            0 0
                            inText
                            0
                            TRUE
                            inFontSize PIXELS
                            "Sans")
                       )
        )
      

Anche se la chiamata della funzione è molto lunga è facile comprenderne il funzionamento esaminando i parametri mentre si fa riferimento alla voce della funzione nel Navigatore delle procedure. Essenzialmente si sta creando un nuovo livello di testo e lo si sta assegnando alla variabile theText.

Ora che il testo è disponibile si possono richiedere le sue dimensioni e ritagliare l'immagine e il suo livello:

        (set! theImageWidth   (car (gimp-drawable-width  theText) ) )
        (set! theImageHeight  (car (gimp-drawable-height theText) ) )
        (gimp-image-resize theImage theImageWidth theImageHeight 0 0)
        (gimp-layer-resize theLayer theImageWidth theImageHeight 0 0)
      

Ci si potrebbe chiedere che differenza c'è tra un piano disegnabile e un livello. Un piano disegnabile è qualcosa in cui si può disegnare e comprende i livelli ma anche i canali, le maschere, la selezione ecc. Un livello è una specializzazione di un piano disegnabile. Nella maggioranza dei casi, tuttavia, la differenza non è rilevante.

Una volta che l'immagine è pronta si può reinserire la riga per la visualizzazione:

        (gimp-display-new theImage)
      

Salvare il lavoro, aggiornare il database e provare lo script.

3.5.4.  Reimpostare il dirty flag

Se si tenta di chiudere una nuova immagine senza aver salvato il file, GIMP chiederà se si vuole salvare il lavoro. La richiesta deriva dal fatto che l'immagine è marcata come modificata o non salvata (dirty flag). Nel caso dello script in oggetto ciò costituisce una sfumatura, se lo si esegue per test e non si cambia nulla nell'immagine prodotta, poichè il nostro lavoro è facilmente riproducibile può convenire azzerare la marcatura di modifica.

Si può azzerare la marcatura di modifica dopo aver mostrato l'immagine:

        (gimp-image-clean-all theImage)
      

Ciò imposterà il contatore delle modifiche a zero rendendo l'immagine "non modificata".

L'aggiunta di questa linea è una questione di gusti personali. È consigliabile utilizzarla in script che producono nuove immagini in cui i risultati sono banali. Se lo script è molto complicato o se lavora su immagini preesistenti è consigliabile non utilizzare questa funzione.