3.6. Utöka textruteskriptet

3.6.1. Hantera ångring korrekt

När du skapar ett skript vill du ge dina användare förmågan att ångra sina åtgärder om de skulle göra ett misstag. Detta åstadkoms lätt genom att anropa funktionerna gimp-image-undo-group-start och gimp-image-undo-group-end runt koden som manipulerar bilden. Du kan tänka på dem som ett satspar som låter GIMP veta när det ska börja och sluta spela in manipulationer på bilden, så att dessa manipulationer sedan kan göras ogjorda.

Om du skapar en helt ny bild så är det inte meningsfullt att använda dessa funktioner eftersom du inte ändrar en befintlig bild. När du ändrar en befintlig bild kommer du dock säkerligen vilja använda dessa funktioner.

Att ångra ett skript fungerar nästan felfritt när dessa funktioner används.

3.6.2. Utöka skriptet lite till

Vi har nu ett väldigt praktiskt skript för att skapa textrutor, så låt oss lägga till två funktioner till det:

  • Bilden ändras för närvarande så att den passar precis runt texten — det finns inte plats för något, som skuggkastning eller specialeffekter (även om många skript automatiskt kommer ändra storlek på bilden efter behov). Låt oss lägga till en buffert runt texten, och till och med låta användaren ange hur mycket buffert som ska läggas till som en procentsats av storleken på den resulterande texten.

  • Detta skript skulle lätt kunna användas i andra skript som arbetar med text. Låt oss utöka det så att det returnerar bilden och lagren, så att andra skript kan anropa detta skript och använda bilden och lagren som vi skapar.

3.6.3. Modifiera parametrarna och registreringsfunktionen

För att låta användaren ange mängden buffert lägger vi till en parameter till vår funktion och registreringsfunktionen:

  (define (script-fu-text-box inTest inFont inFontSize inTextColor inBufferAmount)
  (let*
        (
           ; definiera våra lokala variabler
           ; skapa en ny bild:
           (theImageWidth  10)
           (theImageHeight 10)
           (theImage (car
                          (gimp-image-new
                           theImageWidth
                           theImageHeight
                           RGB
                          )
                     )
           )
           (theText)          ;en deklaration för texten
                              ;vi skapar senare

           (theBuffer)        ;tillagd

           (theLayer
                     (car
                         (gimp-layer-new
                          theImage
                           "lager 1"
                          theImageWidth
                          theImageHeight
                          RGB-IMAGE
                          100
                          LAYER-MODE-NORMAL
                         )
                     )
           )
        ) ;slut på våra lokala variabler

   [Kod här]
 )
      
  (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>/Filters/Tutorial")
      

3.6.4. Lägga till den nya koden

Vi kommer lägga till kod på två platser: just före vi ändrar storlek på bilden, och i slutet på skriptet (för att returnera den nya bilden, lagret och texten).

Efter att vi får textens höjd och bredd behöver vi ändra storleken på dessa värden baserat på buffertmängden som anges av användaren. Vi gör ingen felkontroll för att säkerställa att det är i intervallet 0-100% för att det inte är livshotande, och för att det inte finns någon anledning till att användaren inte skulle kunna ange exempelvis 200 som buffertprocent att lägga till.

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

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

Allt som vi gör här är att ställa in bufferten baserat på textens höjd, och lägga till den två gånger till både höjden och bredden av vår nya bild. (Vi lägger till den två gånger till båda dimensionerna för att bufferten behöver läggas till på båda sidor om texten.)

Nu när vi ändrats storlek på bilden för att ge en buffert, så behöver vi centrera texten i bilden. Detta görs genom att flytta den till koordinaterna (x, y) för (theBuffer, theBuffer). Jag la till denna rad efter att ha ändrat storlek på lagret och bilden:

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

Ta nu och spara ditt skript, och prova det efter att du startat om GIMP.

Allt som återstår är att returnera vår bild, lagret och textlagret. Efter att ha visat bilden lägger vi till denna rad:

(list theImage theLayer theText)

Detta är den sista raden i funktionen, vilket gör denna lista tillgänglig för andra skript som vill använda den.

För att använda vårt nya textruteskript i ett annat skript skulle vi kunna skriva något i stil med följande:

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

Gratulerar, du är nu på väg mot ditt svarta bälte i Script-Fu!