3.6.1. Handling Undo Correctly
When creating a script, you want to give your users the
ability to undo their actions, should they make a
mistake. This is easily accomplished by calling the functions
gimp-undo-push-group-start
and
gimp-undo-push-group-end
around
the code that manipulates the image. You can think of them as
matched statements that let GIMP know when to start and stop
recording manipulations on the image, so that those
manipulations can later be undone.
If you are creating a new image entirely, it doesn't make
sense to use these functions because you're not changing an
existing image. However, when you are changing an existing
image, you most surely want to use these functions.
Undoing a script works nearly flawlessly when using these
functions.
3.6.3. Modifying The Parameters And The Registration Function
To let the user specify the amount of buffer, we'll add a
parameter to our function and the registration function:
(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" ;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" "<Toolbox>/Xtns/Script-Fu/Text")
3.6.4. Adding The New Code
We're going to add code in two places: right before we resize
the image, and at the end of the script (to return the new
image, the layer and the text).
After we get the text's height and width, we need to resize
these values based on the buffer amount specified by the
user. We won't do any error checking to make sure it's in the
range of 0-100% because it's not life-threatening, and because
there's no reason why the user can't enter a value like "200"
as the percent of buffer to add.
(set! theBuffer (* theImageHeight (/ inBufferAmount 100) ) )
(set! theImageHeight (+ theImageHeight theBuffer theBuffer) )
(set! theImageWidth (+ theImageWidth theBuffer theBuffer) )
All we're doing here is setting the buffer based on the height
of the text, and adding it twice to both the height and width
of our new image. (We add it twice to both dimensions because
the buffer needs to be added to both sides of the text.)
Now that we have resized the image to allow for a buffer, we
need to center the text within the image. This is done by
moving it to the (x, y) coordinates of (theBuffer
,
theBuffer
). I added this line after
resizing the layer and the image:
(gimp-layer-set-offsets theText theBuffer theBuffer)
Go ahead and save your script, and try it out after refreshing
the database.
All that is left to do is return our image, the layer, and the
text layer. After displaying the image, we add this line:
(list theImage theLayer theText)
This is the last line of the function, making this list
available to other scripts that want to use it.
To use our new text box script in another script, we could
write something like the following:
(set! theResult (script-fu-text-box
"Some text"
"Charter" "30"
'(0 0 0)
"35"
)
)
(gimp-image-flatten (car theResult))
Congratulations, you are on your way to your Black Belt of Script-Fu!