### 3.6. Επέκταση του σεναρίου πλαισίου κειμένου

#### 3.6.1. Σωστός χειρισμός της αναίρεσης

Όταν δημιουργείτε ένα σενάριο, θέλετε να δώσετε στους χρήστες σας τη δυνατότητα να αναιρέσουν τις ενέργειές τους, σε περίπτωση που κάνουν κάποιο λάθος. Αυτό επιτυγχάνεται εύκολα καλώντας τις συναρτήσεις `gimp-image-undo-group-start` και `gimp-image-undo-group-end` γύρω από τον κώδικα που χειρίζεται την εικόνα. Μπορείτε να τις θεωρήσετε ως αντιστοιχισμένες δηλώσεις που επιτρέπουν στο GIMP να γνωρίζει πότε να ξεκινήσει και να σταματήσει την καταγραφή χειρισμών στην εικόνα, έτσι ώστε αυτοί οι χειρισμοί να μπορούν αργότερα να αναιρεθούν.

Εάν δημιουργείτε μια ολότελα νέα εικόνα, δεν έχει νόημα να χρησιμοποιήσετε αυτές τις συναρτήσεις, επειδή δεν αλλάζετε μια υπάρχουσα εικόνα. Όμως, όταν αλλάζετε μια υπάρχουσα εικόνα, κατά πάσα πιθανότητα θα θέλετε να χρησιμοποιήσετε αυτές τις συναρτήσεις.

Αναίρεση ενός σεναρίου δουλεύει σχεδόν τέλεια, όταν χρησιμοποιείται αυτές τις συναρτήσεις.

#### 3.6.2. Επέκταση του σεναρίου λίγο παραπέρα

Τώρα που έχουμε ένα πολύ εύχρηστο σενάριο για να δημιουργήσουμε πλαίσια κειμένου, ας προσθέσουμε δύο γνωρίσματα σε αυτό:

- Currently, the image is resized to fit exactly around the text there's no room for anything, like drop shadows or special effects (even though many scripts will automatically resize the image as necessary). Let's add a buffer around the text, and even let the user specify how much buffer to add as a percentage of the size of the resultant text.

- Αυτό το σενάριο θα μπορούσε εύκολα να χρησιμοποιηθεί σε άλλα σενάρια που δουλεύουν με κείμενα. Ας το επεκτείνουμε, έτσι ώστε να επιστρέφει την εικόνα και τις στρώσεις, έτσι ώστε άλλα σενάρια να μπορούν να καλέσουν αυτό το σενάριο και να χρησιμοποιήσουν την εικόνα και τις στρώσεις που δημιουργήσαμε.

#### 3.6.3. Τροποποίηση των παραμέτρων και της συνάρτησης καταχώρησης

Για να επιτρέψουμε στο χρήστη να ορίσει τον βοηθητικό χώρο, θα προσθέσουμε μια παράμετρο στη συνάρτηση μας και τη συνάρτηση καταχώρησης:

      (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. Προσθήκη του νέου κώδικα

Πρόκειται να προσθέσουμε κώδικα σε δύο θέσεις: ακριβώς πριν να αλλάξουμε μέγεθος στην εικόνα και στο τέλος του σεναρίου (για να επιστρέψουμε τη νέα εικόνα, τη στρώση και το κείμενο).

Αφού πάρουμε το ύψος και το πλάτος του κειμένου, χρειαζόμαστε να αλλάξουμε μέγεθος σε αυτές τις τιμές που βασίστηκαν στον βοηθητικό χώρο που ορίστηκε από το χρήστη. Δεν θα κάνουμε λάθος ελέγχοντας να βεβαιωθούμε ότι είναι μια περιοχή 0-100%, επειδή δεν είναι θανάσιμο και επειδή δεν υπάρχει λόγος γιατί ο χρήστης να μην μπορεί να εισάγει μία τιμή όπως «200» ως το ποσοστό του βοηθητικού χώρου για προσθήκη.

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

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

Εδώ ρυθμίζουμε το βοηθητικό χώρο βασισμένο στο ύψος του κειμένου και προσθέτοντας τον δυο φορές στο ύψος και στο πλάτος της νέας εικόνας. (Το προσθέτουμε δύο φορές και στις δύο διαστάσεις επειδή ο βοηθητικός χώρος χρειάζεται να προστεθεί και στις δύο πλευρές του κειμένου.)

Τώρα που αλλάξαμε μέγεθος στην εικόνα για να επιτρέψουμε έναν βοηθητικό χώρο, χρειαζόμαστε να κεντράρουμε το κείμενο στην εικόνα. Αυτό γίνεται μετακινώντας την στις συντεταγμένες (x, y) του (`theBuffer`, `theBuffer`). Πρόσθεσα αυτή τη γραμμή μετά την αλλαγή μεγέθους της στρώσης και της εικόνας:

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

Προχωρήστε και αποθηκεύστε το σενάριό σας και δοκιμάστε το μετά την επανεκκίνηση του GIMP.

Αυτό που απομένει είναι η επιστροφή στην εικόνα μας, η στρώση και η στρώση κειμένου. Μετά την εμφάνιση της εικόνας, προσθέτουμε αυτή τη γραμμή:

    (list theImage theLayer theText)

Αυτή είναι η τελευταία γραμμή της συνάρτησης, κάνοντας τη λίστα διαθέσιμη σε άλλα σενάρια που θέλουμε να τη χρησιμοποιήσουμε.

Για να χρησιμοποιήσουμε το νέο σενάριό μας πλαίσιο κειμένου σε άλλο σενάριο, θα μπορούσαμε να γράψουμε κάτι σαν το πιο κάτω:

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

Συγχαρητήρια, είσαστε στο δρόμο σας για τη μαύρη ζώνη του Script-Fu!

3.5. Προσθήκη πρόσθετης λειτουργικότητας |  | 3.7. Το σενάριο σας και η λειτουργία του

Report a bug in GIMP Αναφορά σφάλματος τεκμηρίωσης