### 3.6. Extendendo o Script de “Text Box”

#### 3.6.1. Tratando os passos de Desfazer corretamente

When creating a script, you want to give your users the ability to undo their actions, should they make a mistake. This is easily accomplished by calling the functions `gimp-image-undo-group-start` and `gimp-image-undo-group-end` around the code that manipulates the image. You can think of them as matched statements that let GIMP know when to start and stop recording manipulations on the image, so that those manipulations can later be undone.

Se você está criando uma nova imagem, como fazemos aqui, não é tão importante usar essas funções, por que você não está alterando uma imagem que já existe. Ainda assim, sem as mesmas, se o usuário usar a opção de desfazer na imagem do seu script, ela será desfeita passo a passo, o que pode não ser desejável. Entretanto, se o seu seu script atua sobre uma imagem que já existe, você certamente vai querer fazer uso dessas funções.

Desfazer um script funciona muito bem se você usar essas funções, com raras exceções, por exemplo, se o script alterar a cor de frente do GIMP sem restaurar o contexto.

#### 3.6.2. Estendendo o script um pouco mais

Agora que você já tem um script bem legal para criar caixas de texto, vamos adicionar duas funcionalidades ao mesmo:

- 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.

- Este script poderia facilmente ser usado por outros scripts que trabalhem com texto. Vamos estende-lo de forma que ele retorne a imagem e as camadas criadas, de forma que outros scripts possam chama-lo e usar os objetos que nós criamos.

#### 3.6.3. Modificando os parâmetros e a função de registro

Para permitir ao usuário especificar a quantidade de espaço, vamos adicionar um parâmetro à nossa função e um à chamada de registro do script:

      (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
                               "layer 1"
                              theImageWidth
                              theImageHeight
                              RGB-IMAGE
                              100
                              LAYER-MODE-NORMAL
                             )
                         )
               )
            ) ;end of our local variables

       [Code here]
     )

      (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. Adicionando o novo código

Nós vamos adicionar código em dois lugares: imediatamente antes de redimensionar a imagem, e, ao final do script (para retornar a nova imagem, a camada e o texto).

Depois de obter a largura e altura do texto, nós precisamos recalcular esses valores com base na quantidade de espaço especificada pelo usuário. Nós não faremos nenhuma checagem de erro para ter certeza que o número está na faixa entre 0 e 100% por que não é algo que ameaça nossa vida, e por que não há nenhuma razão de por que o usuário não poderia colocar um valor como “200” como a percentagem de espaço a adicionar.

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

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

Tudo o que estamos fazendo aqui é configurando o espaço (buffer) baseando-no na altura do texto, e adicionando esse valor multiplicado por dois a altura e a largura de nossa nova imagem. (Nós dobramos o valor por que o espaço tem que ser adicionado dos dois lados do texto a esquerda e a direita na horizontal, e em cima e embaixo na vertical)

Agora que redimensionamos a imagem para comportar o espaço extra, é necessário centralizar o texto dentro da imagem. Isso é feito movendo se suas coordenadas (x,y) para a posição (`theBuffer`, `theBuffer`). Eu adicionei essa linha após redimensionar a imagem e a camada:

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

Go ahead and save your script, and try it out after restarting GIMP.

Tudo o que resta agora é retornar a nossa imagem, a camada e a camada de texto. Depois de exibir a imagem, nós adicionamos esta linha:

    (list theImage theLayer theText)

Essa é a última linha da função, tornando esta lista disponível para outros scripts que queiram usa-la.

Para usar nosso script de caixa de texto a partir de outro script, poderíamos fazer algo como o seguinte:

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

Parabéns! Você está indo rumo a sua faixa preta em Script-Fu!

3.5. Adding Additional Functionality |  | 3.7. Seu script e seu funcionamento

Report a bug in GIMP Report a documentation error