3.6. Extendendo o Script de Text Box

3.6.1. Tratando os passos de Desfazer corretamente

Ao criarmos um script, nós queremos dar aos usuários a capacidade de desfazer suas ações, se cometerem algum erro. Isso é facilmente factível chamando as funções gimp-undo-push-group-start como primeira coisa e gimp-undo-push-group-end no final de nosso script. Você pode pensar neles como comandos que tem que formar um par, que deixam o GIMP saber quando começar e quando parar de gravar as manipulações da imagem individualmente no histórico do desfazer.

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:

  • Atualmente, a imagem é redimensionada exatamente para o tamanho do texto — não há espaço para mais nada, como sombras projetadas, ou efeitos especiais (apesar de que muitos dos scripts vão automaticamente redimensionar a imagem conforme for necessário para acomodar seus resultados). Vamos criar um espaço de reserva ao redor do texto, e até mesmo deixar o usuário especificar quanto espaço ele quer adicionar, como uma porcentagem do tamanho do texto resultante.

  • 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
                          theImageWidth
                          theImageHeight
                          RGB-IMAGE
                          "layer 1"
                          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>/Font/Create/Text")
      

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)
      

Vá em frente: salve seu script, recarregue os script-fu e experimente usa-lo.

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!