Vamos continuar nosso treinamento e acrescentar alguma funcionalidade ao nosso script.
Na seção anterior, nós criamos uma função vazia e a registramos no GIMP. Nesta lição, nós vamos prover funcionalidades ao nosso script — nós queremos criar uma nova imagem, adicionar o texto do usuário à mesma, e mudar o tamanho da imagem para que fique exatamente do tamanho do texto.
Uma vez que você já saiba como definir variáveis, definir funções, e acessar itens dentro de listas, o restante é ladeira abaixo — tudo o que você precisa é se familiarizar com as funções disponíveis no banco de dados de procedimentos do GIMP, e chamar aquelas funções diretamente. Então abra o Navegador de procedimentos, no menu de ajuda (Seção 12.8, “O navegador de procedimentos”) e vamos começar a brincar!
Vamos começar criando uma nova imagem. vamos criar uma nova variável com o nome theImage
, e atribuir a ela o resultado de chamar a função do GIMP gimp-image-new
.
Como você pode ver no navegador de procedimentos, a função gimp-image-new
precisa de 3 parâmetros: a largura da imagem, sua altura e o tipo de imagem. Como nós vamos mudar seu tamanho depois, vamos cria-la como tamanho fixo de 10x10 pixels, no formato RGB. Vamos guardar a largura e a altura da imagem em variáveis também, já que vamos nos referir a esses valores e manipula-los mais tarde no script.
(define (script-fu-text-box inText inFont inFontSize inTextColor) (let* ( ; definir nossas variáeis locais (theImageWidth 10) (theImageHeight 10) ; criar uma nova imagem: (theImage (car (gimp-image-new theImageWidth theImageHeight RGB ) ) ) (theText) ;uma declaração para o textot ;que vamos criar depois
Nota: nós usamos o valor RGB
para especificar que a imagem é uma imagem RGB . Nós também poderíamos ter usado o valor 0
, mas RGB é mais descritivo quando nós (e outras pessoas, quando publicarmos o script na internet), formos olhar o código de volta.
Você também deve notar que nós pegamos a cabeça do resultado da chamada a função de criar imagem (usando “car”) Isso pode parecer estranho, por que a base de dados de procedimento (PDB) nos diz que ela retorna apenas um valor — o ID da imagem recém criada. No entanto, todas as funções da PDB do GIMP retornam uma lista para o Script-fu, mesmo que só haja um valor a lista. Então precisamos tomar o primeiro elemento da lista, a cabeça, com uma chamada a car.
Agora que temos uma imagem, precisamos adicionar uma camada à mesma. Nós podemos chamar a função gimp-layer-new
para criar a nova camada, passando a referência (ID) da imagem que acabamos de criar. (Daqui por diante, em vez de listar a função toda, mostraremos só as linhas que estamos adicionando à mesma. Você pode ver o script completo aqui).
;create a new layer for the image: (theLayer (car (gimp-layer-new theImage theImageWidth theImageHeight RGB-IMAGE "layer 1" 100 LAYER-MODE-NORMAL ) ) ) ) ;end of our local variables
Uma vez que tenhamos uma nova camada, precisamos adiciona-la a imagem:
(gimp-image-insert-layer theImage theLayer 0 0)
Agora, só por diversão, vamos verificar o resultado de nosso trabalho até esse ponto, e adicionar esta linha para exibir a nova imagem, ainda vazia:
(gimp-display-new theImage)
Salve o seu trabalho até aqui, selecione
→ → , execute o script, e uma nova imagem deve aparecer. É possível que ela contenha lixo (cores aleatórias), por que nós não apagamos o conteúdo da nova camada quando a criamos. Num instante chegaremos até essa parte.Vá em frente, e remova a linha para exibir a imagem (ou comente-a colocando um (;
) no começo da linha)
Antes de adicionar texto a imagem, precisamos configurar a cor de frente e a cor de fundo, de forma que o texto apareça na cor que o usuário especificou. Vamos usar as funções gimp-context-set-back/foreground:
(gimp-context-set-background '(255 255 255) ) (gimp-context-set-foreground inTextColor)
Com as cores selecionadas, vamos limpar o lixo que existe na imagem preenchendo nossa camada com a cor de fundo:
(gimp-drawable-fill theLayer BACKGROUND-FILL)
Com a imagem limpa, podemos começar a adicionar algum texto
(set! theText (car (gimp-text-fontname theImage theLayer 0 0 inText 0 TRUE inFontSize PIXELS inFont) ) )
Embora seja uma chamada de função longa, com muitos parâmetros, não há nenhuma surpresa se você olhar os parâmetros e compara-los com os que estão listados na entrada para essa função no navegador de procedimentos. Basicamente, estamos criando uma nova camada de texto, e atribuindo a mesma à variável theText
.
Agora que temos o texto, podemos saber sua largura e sua altura, e redimensionar a imagem e sua camada para o tamanho do texto:
(set! theImageWidth (car (gimp-drawable-width theText) ) ) (set! theImageHeight (car (gimp-drawable-height theText) ) ) (gimp-image-resize theImage theImageWidth theImageHeight 0 0) (gimp-layer-resize theLayer theImageWidth theImageHeight 0 0)
Se você é como eu, provavelmente está se perguntando o que é um desenhável (drawable) e como é diferente de uma camada (layer). A diferença entre os dois é que um desenhável é qualquer coisa em que se pode desenhar, incluindo camadas, mas isso também inclui canais, máscaras de camada, a seleção, etc...; Uma camada é uma versão mais específica de um desenhável. Na maioria dos casos a distinção não é importante.
Com a imagem pronta para ser exibida, podemos acrescentar de volta nossa linha que diz pra imagem ser exibida em uma janela:
(gimp-display-new theImage)
Salve o seu trabalho, recarregue os scripts, e tente usa-lo!
Se você tentar fechar sua imagem criada sem salvar o arquivo antes, o GIMP vai perguntar se você quer salvar seu arquivo antes de fechar a imagem. Ele faz isso por que a imagem está marcada como “suja”, ou seja — ela sofreu modificações desde a última vez que foi salva.
Para fazer isso, nós limpamos o marcador de sujeira (dirty flag), depois de mostrar a imagem na tela:
(gimp-image-clean-all theImage)
Isso colocará o contador de sujeira em 0, fazendo a imagem parecer estar “limpa”.
Adicionar ou não essa linha é uma questão de gosto pessoal. Eu a uso em scripts que produzem novas imagens, quando os resultados são triviais, como neste caso. Se o seu script for muito complicado, ou se trabalha modificando uma imagem já existente, é melhor não usar essa função.