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

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

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

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

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

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

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

  • Προς το παρόν, η εικόνα άλλαξε μέγεθος για να ταιριάζει ακριβώς γύρω από το κείμενο — δεν υπάρχει χώρος για τίποτα, όπως πίπτουσες σκιές ή ειδικά εφέ (αν και πολλά σενάρια θα αλλάξουν αυτόματα το μέγεθος όπως χρειάζεται). Ας προσθέσουμε ένα βοηθητικό χώρο γύρω από το κείμενο και ακόμα ας αφήσουμε το χρήστη να ορίσει πόσο βοηθητικό χώρο να προσθέσει ως ποσοστό του μεγέθους του τελικού κειμένου.

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

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

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

Αφού πάρουμε το ύψος και το πλάτος του κειμένου, χρειαζόμαστε να αλλάξουμε μέγεθος σε αυτές τις τιμές που βασίστηκαν στον βοηθητικό χώρο που ορίστηκε από το χρήστη. Δεν θα κάνουμε λάθος ελέγχοντας να βεβαιωθούμε ότι είναι μια περιοχή 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)
      

Συνεχίστε και αποθηκεύστε το σενάριο σας και δοκιμάστε το, αφού ανανεώσετε τη βάση δεδομένων.

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

(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!