Segunda, 6 de Abril de 2009


Texto originalmente publicado no portal iMasters.

Lua como Mídia de NCL

A seguir alguns conceitos importantes que devemos ter em mente.

Como vimos no artigo passado, um NCLua é um programa escrito em linguagem Lua e que é executado através de um documento NCL. Por sua vez, um documento NCL apenas define como os objetos de mídia são estruturados e relacionados no tempo e espaço, como uma linguagem de “cola”. A relação entre essas diversas mídias é definida através dos conectores.

Uma mídia não tem qualquer comunicação com outra mídia declarada no documento. Sendo assim, o escopo de uma determinada mídia se restringe aos elos definidos no documento e aos eventos gerados para ela ou por ela.

Todas as regras válidas para um nó de vídeo, texto ou imagem, também são válidas para scripts Lua. Quero dizer, todo ciclo de vida, de qualquer nó, é controlado pelo formatador NCL, ele é quem decide se o nó para, começa ou pausa.

Incrementando um pouco mais: já que todas as regras se aplicam igualmente aos nós, podemos definir âncoras para o nó Lua, certo? A sintaxe NCL permite que um elemento pode definir âncoras através de elementos e propriedades através de elementos .

1 1 - 1 1

Então, aplicando isso a um nó Lua temos:

2 - 2

O código corresponde à figura. Simples assim:

3 - 3

Bibliotecas NCLua

Para que as duas linguagens se entendam foram definidos quatro novos módulos para NCLua, além do conjunto padrão de bibliotecas. São eles:

  • Módulo canvas: oferece uma API para desenhar primitivas gráficas e manipular imagens;
  • Módulo settings: exporta uma tabela com variáveis definidas pelo autor do documento NCL e variáveis de ambiente reservadas em um nó “application/x-ginga-settings”;
  • Módulo persistent: exporta uma tabela com variáveis persistentes, que estão disponíveis para manipulação apenas por objetos procedurais.
  • Módulo event: permite que aplicações NCLua comuniquem-se com o middleware através de eventos (eventos NCL e de teclas);
  • Este artigo irá apresentar o módulo event.

    O script Lua, ao ser iniciado, executa seus procedimentos apenas uma vez e então se torna orientado a eventos e, por isso, até podemos chamá-lo de tratador de eventos.

    Como já dito, a comunicação entre Lua e NCL se dá através dos eventos definidos pela linguagem NCL. Esses eventos, para efeito de código, têm o formato de tabelas Lua. Então quando um nó Lua é iniciado pelo documento NCL, a seguinte tabela é gerada:

    4 - 4

    A tabela chamada evt com 3 campos, class, type e action, diz que a classe de eventos é ‘ncl’, que o tipo de evento foi de apresentação e a ação do formatador que desencadeou a apresentação foi um ‘start’.

    Os elementos da tabela acima:

    1. class: São 5 tipos de classes: ‘key’, ‘ncl’, ‘user’, ‘sms’ e ‘tcp’, focaremos este artigo na classe “ncl”.

    2. type: Pode assumir os valores ‘presentation’ ou ‘attribution’

    Neste ponto irei explorar os dois valores possíveis para type:

    2.1. presentation: Eventos de apresentação controlam a exibição do nó NCLua.
    Eventos de apresentação estão sempre ligados ao nó como um todo ou a âncoras do nó. O documento NCL pode dar um “start” em uma âncora especifica que foi declarada no nó Lua, como a âncora a1 da Figura 2.

    2.2. attribution: Eventos de atribuição controlam as propriedades do nó NCLua.
    Neste caso a manipulação é na propriedade do nó, como a p1 da Figura 2, e um novo campo é associado, o value, que recebe ou atribui valores aquela propriedade.
    Resumindo:

    • type: ‘attribution’
    • property: [string] Nome da propriedade (name) associada ao evento.
    • value: [string] Novo valor a ser atribuído à propriedade

    3. action: Pode assumir os seguintes valores: ’start’, ’stop’, ‘abort’, ‘pause’ e ‘resume’
    Pois bem, a tabela foi gerada, mas aonde é usada? No script Lua, o tratador de eventos. E para que ele seja capaz de capturar os eventos gerados é preciso registrar uma função tratadora:

    5 - 5

    No script acima estou declarando uma função e dizendo que esta função receberá todos os eventos gerados (note que ela recebe como parâmetro uma tabela evt). Assim, o código da função “tratadora” pode manipular a tabela que recebeu, e identificar o tipo de evento e a ação, por exemplo.

    Até aqui, vimos uma função do módulo event, a função register, e também o formato da tabela de eventos e seus respectivos campos.
    Agora uma nova função de event será apresentada, a função post, que é necessária para que o scrpt Lua se comunique com o documento NCL.

    Comunicação Lua para NCL

    Em termos mais práticos vou exemplificar como um sript Lua sinaliza o formatador NCL para parar a execução do nó.

    6 - 6

    De maneira similar, se eu quisesse para a execução de uma âncora do nó, o elemento área, deveria estar presente no código.

    7 - 7

    Uma simples aplicação do código acima. O script sinaliza a âncora para parar. O formatador detecta que a âncora foi parada e, através dos elos associa esse evento ao inicio de uma figura, de background por exemplo.

    Para saber mais:

    Vimos neste artigo uma explanação geral sobre a biblioteca NCLua, continuarei no próximo artigo com este assunto.
    Para quem ficou curioso recomendo fortemente a leitura do tutorial sobre NCLua escrito pelo Francisco Santana da PUC-Rio, la existe toda documentação sobre os métodos, exemplos e onde achar mais bibliografia sobre o assunto.

    O link é:

    http://www.telemidia.puc-rio.br/~francisco/nclua/index.html

        Finalmente saiu a posição do Fórum do SBTVD sobre o que vai ser o middleware Ginga. Por 12 votos a favor da especificação desenvolvida pela Sun, contra apenas um voto a favor de Ginga-NCL mais Lua, o middleware brasileiro será um misto de tecnologia nacional e norte americana. A parte declarativa foi desenvolvida pela Puc-Rio e a parte procedural pela Sun Microsystems, que está prestes a ser vendida para a IBM.
        O acerto ou erro dessa decisão ainda será fruto de muita discussão no futuro. O que fica por hora é a certeza de que finalmente a interatividade deverá deslanchar no país, com a maioria eslagadora das aplicações desenvolvidas em NCL e LUA. Pelo menos no começo.