3.5. Colocando algum conteúdo em nosso script

Vamos continuar nosso treinamento e acrescentar alguma funcionalidade ao nosso script.

3.5.1. Criando uma nova imagem

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.

3.5.2. Adicionando uma nova camada à imagem

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 FiltrosScript-FuRecarregar scripts, 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.

3.5.3. Adicionando o texto

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!

3.5.4. Limpando o marcador de imagem suja (dirty flag)

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.