segunda-feira, janeiro 22, 2007

Java 6: Bem-vindo o antialiasing

Antialiasing é, grosso modo, uma técnica para reduzir o ruído em imagens. Esse ruído nada mais é do que a percepção dos pixels que formam a imagem na tela do computador. Em suma, quando maior a resolução de um monitor, menor é a percepção desse ruído. Isso ocorre porque quanto mais pixles pudermos colocar em uma determinada área, menor será a percepção de erro que conseguimos detectar. Por exemplo, ao desenharmos um quadrado na tela, não percebemos nenhum problema de aliasing, uma vez que os pixles do monitor estão alinhados com as linhas horizontais e verticais do respectivo quadrado. Entretanto, quando a figura é um círculo, ou uma diagonal, ou qualquer outra forma que exija pixles não alinhados, o aliasing ocorre.

Resolvendo o aliasing
Monitores LCD, como os de notebooks, são os mais afetados por esse problema. Para resolver esse problema via hardware, a única alternativa é aumentar a quantidade de pixles que podem ser colocados em uma área. Em outras palavras, aumentar a resolução. Porém, quanto maior o número de pixles, mais instável é a imagem, uma vez que a varredura de atualização horizontal deve aumentar também. E isso ocorre em outro problema que é a potência de brilho e capacidade de contraste, que também devem aumentar. Em suma, traduzindo em palavras mais simples, quando tentantamos resolver um problema, acabamos caindo em outros.
Outra forma de reduzir o aliasing é através de software. Através do software, não resolvemos o problema, mas conseguimos criar uma ilusão óptica, que simula um resultado satisfatório. Quando desenhamos uma diagonal na tela, sempre teremos, uma estrutura parecida com uma escada, como ao lado. Não conseguimos reduzir esse "serrilhado" porque, cada degrau dessa escada é um pixel - não existe um nível menor de pintura. Assim, a técnica de antialiasing baseada em software tenta resolver esse problema adicionando pixels adjacentes à escada. Esses pixels adjacentes possuem tonalidades de cores intermediárias entre o pixles pintado e o fundo da imagem.
Quando essa imagem é vista de muito perto, notamos os pixels adjacentes. Mas quando a imagem é vista de longe (uso normal do monitor), esses pixels adjacentes são fundidos com os pixels pintados e o nosso cérebro encarrega-se de fazer a ilusão para nós. O resultado é uma imagem sem ruído.

Antialiasing no Windows
Quem utiliza o Windows deve conhecer o chamado ClearType Tunnig. Ele não é padrão do sistema operacional, mas pode ser instalado como integrante do pacote Power Toys. Uma vez instalado, é possível configurar o nível do antialiasing a ser aplicado no monitor. Novamente, para usuários de monitores LCD, esse recurso é fundamental, melhorando consideravelmente a experiência do usuário.

Antialiasing no Java
E agora o fundamento desse post. O Java, historicamente, não se preocupa com esse problema de aliasing. Talvez porque na época de sua criação os monitores LCD eram quase inexistentes, e esse problema não era detectável. Hoje, porém, uma aplicação Java Swing sofre muito com o aliasing. Java nunca pode resolver esse problema porque a solução de antialiasing dos sistemas operacionais é algo implementado em baixo nível. Em outras palavras, Java não poderia ter uma solução multiplataforma que operasse em todos os locais, uma vez que nem todos os sistemas operacionais suportados pela JDK têm um mecanismo de antialiasing.
Felizmente, o release 6 do Java resolve esse problema. E mais, a solução implementada é totalmente Java. Parte da API 2D do Swing foi reescrita e agora os algoritmos de renderização implementam a técnica dos pixels adjacentes descritos acima. Assim, para quem usa uma aplicação Java Swing, a experiência será bem superior.
Abaixo, tenho dois screenshots da mesma aplicação. Uma rodando sobre o Java 5 e a outra sobre o Java 6. Notem que a aplicação da direita não apresenta o serrilhado sobre o texto. Para quem não conseguiu visualizar muito bem a diferença, recortei dois fragmentos da imagem ampliada. Notem que o suporte antialiasing além de adicionar os pixels adjacentes, também encarrega-se de alterar algumas cores de pixels.

Comentários finais
O antialiasing é uma técnica de redução de ruído das imagens. Podendo se implementado por hardware ou software, alguns sistemas operacionais, como o WindowsXP, possuem suporte nativo para o ajuste desse recurso. Quanto ao Java, na sua versão 6 o antialiasing é suportado de forma intrínsica, melhorando sensivelmente a aparência das aplicações desktop Swing. Como último comentário, salienta-se que o suporte do antialiasing do Java é independente de plataforma operacional e de hardware, sendo suportado totalmente pela sua API 2D. Assim, mesmo quando desabilitado o ClearType no Windows, a aplicação Java continuará efetuando o antialiasing dos pixels. Para desabilitá-lo totalmente, deve existir algum atributo "-D" para o interpretador da virtual machine, mas isso é uma coisa que eu ainda devo procurar :-)

0 comentários: