3.6. Het script Text Box uitbreiden

3.6.1. Ongedaan maken juist afhandelen

Bij het maken van een script wilt u uw gebruikers de gelegenheid geven om hun acties ongedaan te maken, wanneer zij een fout zouden maken. Dat is eenvoudig te bereiken door de functies gimp-undo-push-group-start en gimp-undo-push-group-end aan te roepen rondom de code die de afbeelding bewerkt. U kunt aan hen denken als aan overeenkomende argumenten die GIMP laten weten wanneer te beginnen en te stoppen met het opnemen van bewerkingen aan de afbeelding, zodat die bewerkingen later ongedaan gemaakt kunnen worden.

Als u een geheel nieuwe afbeelding maakt, heeft het geen zin om deze functies te gebruiken, omdat u niets wijzigt aan een bestaande afbeelding. Maar, wanneer u een bestaande afbeelding wijzigt, moet u heel zeker deze functies gebruiken.

Ongedaan maken in een script werkt bijna foutloos met het gebruiken van deze functies.

3.6.2. Het script nog een beetje meer uitbreiden

Nu we een handig script hebben om tekstvakken mee te maken, laten we er nog eens twee mogelijkheden aan toe voegen:

  • Momenteel wordt de grootte van de afbeelding gewijzigd zodat die exact past rondom de tekst — er is geen ruimte voor ook maar iets, zoals schaduwen of speciale effecten (zelfs hoewel veel scripts automatisch grootte van de afbeelding zullen wijzigen als dat noodzakelijk is). Laten we een buffer toevoegen rondom de tekst en zelfs de gebruiker laten specificeren hoeveel buffer toegevoegd moet worden, als een percentage van de grootte van de resulterende tekst.

  • Dit script zou gemakkelijk in andere scripts kunnen worden gebruikt die met tekst werken. Laten we het zo uitbreiden dat het de afbeelding en de lagen teruggeeft, dan kunnen andere scripts dit script aanroepen en de afbeelding en lagen gebruiken die we maken.

3.6.3. De parameters en de functie voor registreren aanpassen

We zullen, om de gebruiker de hoeveelheid buffer te laten specificeren, een parameter toevoegen aan onze functie en aan de functie voor registreren:

  (define (script-fu-text-box inTest inFont inFontSize inTextColor inBufferAmount)
  (let*
        (
           ; onze lokale variabelen definiëren
           ; een nieuwe afbeelding maken:
           (theImageWidth  10)
           (theImageHeight 10)
           (theImage (car
                          (gimp-image-new
                           theImageWidth
                           theImageHeight
                           RGB
                          )
                     )
           )
           (theText)          ;een declaratie voor de tekst
                              ;die we later zullen maken

           (theBuffer)        ;toegevoegd

           (theLayer
                     (car
                         (gimp-layer-new
                          theImage
                          theImageWidth
                          theImageHeight
                          RGB-IMAGE
                          "laag 1"
                          100
                          LAYER-MODE-NORMAL
                         )
                     )
           )
        ) ;einde van onze lokale variabelen

   [Code hier]
 )
      
  (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>/Font/Create/Text")
      

3.6.4. De nieuwe code toevoegen

We gaan de code toevoegen op twee plaatsen: precies voordat we de grootte van de afbeelding wijzigen en aan het einde van het script (om de nieuwe afbeelding, de laag en de tekst terug te geven).

Nadat we de hoogte en breedte van de tekst hebben opgehaald, moeten we die waarden aanpassen, gebaseerd op de hoeveelheid buffer die werd gespecificeerd door de gebruiker. We zullen geen foutafhandeling doen om ervoor te zorgen dat het in het bereik van 0-100% ligt, omdat het niet levensbedreigend is en omdat er geen reden is waarom de gebruiker geen waarde zou kunnen invoeren als 200, als het percentage van de toe te voegen buffer.

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

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

Alles wat we hier doen is het instellen van de buffer, gebaseerd op de hoogte van de tekst en dat tweemaal toevoegen, aan zowel de hoogte als de breedte van onze nieuwe afbeelding. (We voegen het tweemaal aan beide dimensies toe, omdat de buffer moet worden toegevoegd aan beide zijden van de tekst.)

Nu we de afbeelding opnieuw op grootte hebben gebracht om een buffer mogelijk te maken, moeten we de tekst centreren binnen de afbeelding. Dat wordt gedaan door het te verplaatsen naar de (X, Y)-coördinaten van (theBuffer, theBuffer). Ik voegde deze regel toe na het op grootte brengen van de laag en de afbeelding:

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

Ga door en sla uw script op en probeer het, nadat u GIMP opnieuw hebt opgestart.

Alles wat nog overblijft om te worden gedaan is onze afbeelding, de laag en de tekstlaag terug te geven. Na het weergeven van de afbeelding, voegen we deze regel toe:

(list theImage theLayer theText)

Dat is de laatste regel van de functie, wat deze lijst beschikbaar maakt voor andere scripts die het willen gebruiken.

We zouden, om ons nieuwe script voor het tekstvak te gebruiken in een ander script, iets kunnen schrijven als het volgende:

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

Gefeliciteerd, u bent op weg naar uw zwarte band voor Script-Fu!