3.6. Utvid skriptet Text Box

3.6.1. Korrekt handtering av Angre

Når du programmerer eit skript, er det ofte behov for å gi brukaren ein sjanse til å angre dersom han gjer eit mistak. Dette kan du lett få til ved å setje funksjonane gimp-undo-push-group-start og gimp-undo-push-group-end rundt kodane som kan endra biletet. Du kan sjå på funksjonane som kommandoar til GIMP om å starte og stoppe registreringa av data til angreloggen.

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 vere svært så nødvendig dersom skriptet arbeider på eit eksisterande bilete.

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

3.6.2. Enda ei skriptutviding

Skriptet er nå blitt nokså brukbart, men vi ønskjer å legge inn to nye og nyttige eigenskapar likevel:

  • Slik skriptet er nå, blir biletet akkurat stort nok til å ta inn teksten. Det er ikkje plass til andre ting, som t.d. skyggelegging eller andre spesialeffektar. (Rett nok vil mange skript ordna opp i dette sjølv dersom du bruker dei, men ikkje alle). Difor er det ønskjeleg med litt luft kring teksten. Brukaren kan sjølv bestemme storleiken på dette rommet i prosent av tekststorleiken.

  • Sidan dette skriptet lett kan utvidast til nruk også i andre skript, vil vi 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 parametra og registreringsfunksjonen

For at brukaren skal få høve til å spesifisera storleiken på området rundt teksten, må vi legge til eit parameter i programmet, og dermed også i registreringsfunksjonen: (Hugs at det er vanleg skikk å lage programma på engelsk, også merknadane. Det er likevel ingenting i vegen for at du kan bruke norsk).

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

Det må leggjast inn ny kode på to stader: Like før vi 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 bare resultatet av den siste funksjonen.

Når høgda og breidda på teksten er fastsett, må også data for margen rundt teksten leggast til desse verdiane for å finna storleiken på biletet. Det er ikkje lagt inn noen kontroll på om innskrivinga held seg i området 0 - 100%. Dette både fordi det 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) blir rekna ut i første linja. I dei to neste linjene blir verdiane for sidekantane i bilete rekna ut. (Grunnen til at verdien for theBuffer må leggast til to goner, er at det skal vere marg rundt alle sidene).

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

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

Nå er det på tide å prøve skriptet. Lagra det, oppdater databasen og gled deg over det nye skriptet ditt, eller plukk ut eventuelle skrivefeil og prøv på nytt.

Nå står det bare igjen å setje returverdiane for biletet, laget og tekstlaget. Etter linja som viser biletet på skjermen, set du inn

        (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 teste det ut ved å lage eit nytt skript som inneheld noe i denne duren:

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

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