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.
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.
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")
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!