### 3.6. Utvid skriptet Text Box

#### 3.6.1. Korrekt handsaming av «Angre»

Når du lagar eit skript, er det ofte behov for å gje brukaren ein sjanse til å angra dersom han gjer eit mistak. Dette kan du lett få til ved å setja funksjonane `gimp-image-undo-group-start` og `gimp-image-undo-group-end` rundt kodane som kan endra biletet. Du kan sjå på dei som tilpassa utsegner som gjer at Gimp veit når du skal starta og stoppa opptak av endringar i biletet, slik at disse handlingane seinare kan angrast.

Dersom skriptet ditt opnar eit nytt vindauge, er desse funksjonane unødvendige sidan du ikkje har behov for å endra i eit ferdig bilete. Derimot kan det vera svært så nødvendig dersom skriptet arbeider på eit bilete som finst frå før.

Bruker du dei nemnde funksjonane, vil angrefunksjonen stort sett arbeida feilfritt.

#### 3.6.2. Enda ei skriptutviding

Skriptet er no nokså brukbart, men me ønskjer å leggja inn to nye og nyttige eigenskapar likevel:

- Currently, the image is resized to fit exactly around the text there's no room for anything, like drop shadows or special effects (even though many scripts will automatically resize the image as necessary). Let's add a buffer around the text, and even let the user specify how much buffer to add as a percentage of the size of the resultant text.

- Sidan dette skriptet lett kan utvidast til bruk også i andre skript, vil me utvida det litt slik at det returnerar biletet og laga. Dermed kan andre program kalla opp dette skriptet og nytta seg av biletet og laga dette kreerer.

#### 3.6.3. Å endre parametrane og registreringsfunksjonen

For at brukaren skal få høve til å spesifisera storleiken på bufferen, må me leggja til ein parameter i programmet, og dermed også i registreringsfunksjonen. (Hugs at det er vanleg skikk å laga programma på engelsk, også merknadane. Omsetjaren brukar likevel ofte norsk for lettare å skilja kva som høyrer til programmet og kva so er eigendefinert. Så norsk kan vera nyttig):

      (define (script-fu-text-box inTest inFont inFontSize inTextColor inBufferAmount)
      (let*
            (
               ; definer lokale variablar
               ; lag eit nytt bilete:
               (theImageWidth  10)
               (theImageHeight 10)
               (theImage (car
                              (gimp-image-new
                               theImageWidth
                               theImageHeight
                               RGB
                              )
                         )
               )
               (theText)          ;ei deklarering av teksten
                                  ;Dette gjer vi seinare

               (theBuffer)        ;lagt til

               (theLayer
                         (car
                             (gimp-layer-new
                              theImage
                               "lag 1"
                              theImageWidth
                              theImageHeight
                              RGB-IMAGE
                              100
                              LAYER-MODE-NORMAL
                             )
                         )
               )
            ) ;slutt på lokale variablar

       [Kode her]
     )

      (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. Tilføy den nye koden

Det må leggjast inn ny kode på to stader: Like før me sett storleiken på biletet på nytt, og heilt til slutt i programmet. Dette siste for at programmet skal returnera det nye biletet, laget og teksten. Hugs at Scheme alltid returnerar berre resultatet av den siste funksjonen.

Når høgda og breidda på teksten er fastsett, må desse verdiane endrast i høve til buffermengda spesifisert av brukaren. Det er ikkje lagt inn kontroll på om innskrivinga held seg i området 0 - 100% fordi dette ikkje er livsviktig for programmet, og fordi det finst ingen rimeleg grunn til å hindra brukaren i å velja 200 som prosentsats.

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

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

Det som skjer her er at verdiane for margen rundt teksten (`theBuffer`) vert rekna ut i første linja. I dei to neste linjene vert verdiane for sidekantane i bilete rekna ut. (Grunnen til at verdien for `theBuffer` må leggast til to goner, er at det skal vera marg rundt alle sidene).

Etter linja som bestemmer storleiken på biletet, set du inn ei linje som sentrerer teksten. Dette vert gjort med ein innebygd funksjon, og ser slik ut:

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

No er det på tide å prøva skriptet etter at du har starta GIMP på nytt.

No står det berre igjen å returnera biletet, laget og tekstlaget. Etter å ha vist biletet, set me inn denne linja:

    (list theImage theLayer theText)

Dette er den siste linja i funksjonen. Det er denne linja som gjer at skriptet også kan brukast frå andre skript.

Du kan testa det ut ved å laga eit nytt skript som inneheld noko i denne duren:

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

Gratulerer. Du er no på god veg mot svart belte i Script-Fu!

3.5. Leggja til tilleggsfunksjonar |  | 3.7. Skriptet og resultatet av det

Report a bug in GIMP Report a documentation error