3.5. Colocando algum conteúdo em nosso script
| 3. Um tutorial de Script-Fu |

### 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.7, “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).

            ;cria uma nova camada para a imagem:
               (theLayer
                         (car
                              (gimp-layer-new
                               theImage
                               theImageWidth
                               theImageHeight
                               RGB-IMAGE
                               "camada 1"
                               100
                               NORMAL
                              )
                          )
                )
             ) ;Fim das variáveis locais

Uma vez que tenhamos uma nova camada, precisamos adiciona-la a imagem:

            (gimp-image-add-layer theImage theLayer 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 Filtros → Script-Fu → Recarregar 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
                                "Sans")
                           )
            )

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.

3.4. Seu primeiro Script de Script-Fu |  | 3.6. Extendendo o Script de “Text Box”

Crie um relato de erro no Bugzilla