Όταν δημιουργείτε ένα σενάριο, θέλετε να δώσετε στους χρήστες σας την ικανότητα να αναιρούν τις ενέργειες τους, εάν κάνουν κάποιο λάθος. Αυτό πετυχαίνεται εύκολα καλώντας τις συναρτήσεις gimp-undo-push-group-start
και gimp-undo-push-group-end
γύρω από τον κώδικα που επεξεργάζεται την εικόνα. Μπορείτε να τις θεωρήσετε ως συνδυασμένες προτάσεις που επιτρέπουν στο GIMP να ξέρει πότε να ξεκινήσει και πότε να σταματήσει τους χειρισμούς στην εικόνα, έτσι ώστε αυτοί οι χειρισμοί να μπορούν αργότερα να αναιρεθούν.
Εάν δημιουργείτε μια ολότελα νέα εικόνα, δεν έχει νόημα να χρησιμοποιήσετε αυτές τις συναρτήσεις, επειδή δεν αλλάζετε μια υπάρχουσα εικόνα. Όμως, όταν αλλάζετε μια υπάρχουσα εικόνα, κατά πάσα πιθανότητα θα θέλετε να χρησιμοποιήσετε αυτές τις συναρτήσεις.
Αναίρεση ενός σεναρίου δουλεύει σχεδόν τέλεια, όταν χρησιμοποιείται αυτές τις συναρτήσεις.
Τώρα που έχουμε ένα πολύ εύχρηστο σενάριο για να δημιουργήσουμε πλαίσια κειμένου, ας προσθέσουμε δύο γνωρίσματα σε αυτό:
Προς το παρόν, η εικόνα άλλαξε μέγεθος για να ταιριάζει ακριβώς γύρω από το κείμενο — δεν υπάρχει χώρος για τίποτα, όπως πίπτουσες σκιές ή ειδικά εφέ (αν και πολλά σενάρια θα αλλάξουν αυτόματα το μέγεθος όπως χρειάζεται). Ας προσθέσουμε ένα βοηθητικό χώρο γύρω από το κείμενο και ακόμα ας αφήσουμε το χρήστη να ορίσει πόσο βοηθητικό χώρο να προσθέσει ως ποσοστό του μεγέθους του τελικού κειμένου.
Αυτό το σενάριο θα μπορούσε εύκολα να χρησιμοποιηθεί σε άλλα σενάρια που δουλεύουν με κείμενα. Ας το επεκτείνουμε, έτσι ώστε να επιστρέφει την εικόνα και τις στρώσεις, έτσι ώστε άλλα σενάρια να μπορούν να καλέσουν αυτό το σενάριο και να χρησιμοποιήσουν την εικόνα και τις στρώσεις που δημιουργήσαμε.
Για να επιτρέψουμε στο χρήστη να ορίσει τον βοηθητικό χώρο, θα προσθέσουμε μια παράμετρο στη συνάρτηση μας και τη συνάρτηση καταχώρησης:
(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")
Πρόκειται να προσθέσουμε κώδικα σε δύο θέσεις: ακριβώς πριν να αλλάξουμε μέγεθος στην εικόνα και στο τέλος του σεναρίου (για να επιστρέψουμε τη νέα εικόνα, τη στρώση και το κείμενο).
Αφού πάρουμε το ύψος και το πλάτος του κειμένου, χρειαζόμαστε να αλλάξουμε μέγεθος σε αυτές τις τιμές που βασίστηκαν στον βοηθητικό χώρο που ορίστηκε από το χρήστη. Δεν θα κάνουμε λάθος ελέγχοντας να βεβαιωθούμε ότι είναι μια περιοχή 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!