3.6. Das Textbox-Skript erweitern

3.6.1. Rückgängig machen korrekt handhaben

Wenn Sie ein Skript erstellen, wollen Sie vielleicht den Benutzern die Möglichkeit geben, ihre Aktionen nach einem Fehler wieder zurückzunehmen. Das können Sie ganz leicht erreichen, indem Sie die Funktionen gimp-undo-push-group-start und gimp-undo-push-group-end vor beziehungsweise nach dem Code, der das Bild manipuliert, aufrufen. Sie können sie sich als ein zusammengehörendes Anweisungspaar vorstellen, das GIMP wissen lässt, wann es das Aufzeichnen von Bildmanipulationen starten oder beenden soll, so dass diese Änderungen später rückgängig gemacht werden können.

Wenn Sie ein völlig neues Bild erstellen, ist das Verwenden dieser Funktionen sinnlos, da Sie kein existierendes Bild verändern. Wenn Sie das allerdings tun, dann sollten Sie diese Funktionen ganz bestimmt verwenden.

Mit Hilfe dieser Funktionen klappt das Zurücknehmen eines Skriptes praktisch ohne Probleme.

3.6.2. Das Skript noch etwas mehr erweitern

Nachdem wir nun ein wirklich nettes Skript zur Texterzeugung haben, lassen Sie uns noch zwei Möglichkeiten hinzufügen:

  • Im Moment wird das Bild so skaliert, dass der Text genau hineinpasst – es ist also kein Platz für irgendetwas anderes, etwa Schlagschatten oder spezielle Effekte (auch wenn viele Skripte das Bild bei Bedarf automatisch skalieren). Lassen Sie uns daher einen Puffer um den Text erstellen, ferner soll der Benutzer festlegen können, wie groß der Puffer (in Prozent der Textgröße) sein soll.

  • Dieses Skript könnte leicht von anderen Skripten, die mit Text arbeiten verwendet werden. Lassen Sie es uns so erweitern, dass es das Bild und die Ebenen zurückliefert, so dass andere Skripte dieses Skript aufrufen können und das von uns erstellte Bild und die Ebenen verwenden können.

3.6.3. Die Parameter und die Registrierungsfunktion modifizieren

Damit der Benutzer die Puffergröße festlegen kann, fügen wir unserer Funktion und der Registrierungsfunktion einen Parameter hinzu:

  (define (script-fu-text-box inTest inFont inFontSize inTextColor inBufferAmount)
  (let*
        (
           ; unsere Variablen definieren
           ; ein neues Bild erzeugen:
           (theImageWidth  10)
           (theImageHeight 10)
           (theImage (car
                          (gimp-image-new
                           theImageWidth
                           theImageHeight
                           RGB
                          )
                     )
           )
           (theText)          ;eine Bezeichnung für den Text
                              ;erstellen wir später

           (theBuffer)        ;added

           (theLayer
                     (car
                         (gimp-layer-new
                          theImage
                          theImageWidth
                          theImageHeight
                          RGB-IMAGE
                          "layer 1"
                          100
                          NORMAL
                         )
                     )
           )
        ) ;Ende unserer Variablen

   [Hier der Programmcode]
 )
      
  (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. Den neuen Code hinzufügen

Wir fügen den Code an zwei Stellen ein: unmittelbar, bevor wir die Größe des Bildes anpassen, und am Ende des Skripts (um das neue Bild, die Ebene und den Text zurückzugeben).

Nachdem die Textbreite und -höhe ermittelt haben, müssen wir diese Werte auf der vom Nutzer spezifizierten Puffergröße basierend anpassen. Wir führen hier keine Fehlerprüfung durch um sicherzustellen, dass sie im Bereich 0-100% liegt, da es zum einen nicht gefährlich wäre und es zum anderen keinen Grund gibt, warum der Benutzer nicht einen Wert wie »200« als Prozentwert für den Puffer eingeben sollte.

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

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

Wir machen hier nichts weiter, als den Puffer gemäß der Texthöhe zu setzen und ihn dann jeweils zweimal zur Bildhöhe und -breite zu addieren. (Wir addieren ihn zweimal in beide Richtungen, da der Puffer zu beiden Seiten des Textes hinzugefügt werden muss.)

Jetzt, wo wir die Größe des Bildes geändert haben, um einen Puffer zu erlauben, müssen wir den Text innerhalb des Bildes zentrieren. Das machen wir, indem wir ihn zur (x,y)-Koordinate von (theBuffer, theBuffer) verschieben. Ich habe diese Zeile hinter der Skalierung von Ebene und Bild eingefügt:

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

Sichern Sie nun Ihr Skript und probieren Sie es aus, nachdem Sie die (Prozeduren-)Datenbank aufgefrischt haben.

Was noch zu tun bleibt ist, das Bild, die Ebene und die Textebene zurückzugeben. Nach dem Anzeigen des Bildes fügen wir diese Zeile ein:

(list theImage theLayer theText)

Das ist die letzte Zeile unserer Funktion und macht diese Liste anderen Skripten, die sie verwenden wollen, verfügbar.

Um unser neues Textbox-Skript in anderen Skripten zu verwenden, könnten wir etwa folgendes schreiben:

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

Gratuliere, Sie sind nun auf dem besten Wege zu Ihrem Schwarzen Gürtel in Skript-Fu!