Pseudocolor e Truecolor no Xwindows


[Home] [Dissertação] [Biba] [Linux] [Conjugue] [br.ispell] [axw3] [uplink]

O termo "Truecolor" aplicado a um device em geral significa que ele consegue exibir 2**24 ou 16 milhões de cores distintas. O termo se deve ao fato do olho humano aparentemente ser capaz de distinguir algo entre 16 milhões de cores. Quando se fala em Xserver operando em modo Truecolor, entretanto, o significado do termo é um pouco diferente.

Para poder exibir uma imagem no monitor de forma que cada pixel possa ter uma dentre 2**24 possíveis cores, é necessário dispor, para cada pixel, de 24 bits (ou seja, 3 bytes) para armazenar a sua "cor". Numa resolução de 1280x1024, isso exige 1280x1024x3 = 3.932.160 bytes, ou seja, a sua adaptadora gráfica necessita de no mínimo 4 megabytes de memória.

Como as cores se produzem por combinações de R, G e B, cada cor nesse caso será identificada por um nível de R, de G e de B, entre 0 e 255 (como o total é 24 bits, temos oito bits para cada cor). É isso que se vê por exemplo na tabela rgb.txt que acompanha o Xwindows:

255 250 250             snow
248 248 255             ghost white
...
  0   0 255             blue
 30 144 255             dodger blue
...
  0 255   0             green1
  0 238   0             green2
...

Outro modo de se especificar esses níveis é através da notação #rrggbb, usada em argumentos de linha de comandos de aplicações X. Para especificar a cor vermelho (255,0,0) ao xsetroot você faria o seguinte:

$ xsetroot -solid \#ff0000

Suponha que o Xwindows esteja operando com 16 bits por pixel. Agora só temos 65536 códigos diferentes. Cinco bits estão disponíveis para cada cor básica, portanto o intervalo dentro do qual elas variam é 0..31. Cada cor especificada na notação #rrggbb terá que ser aproximada para uma outra, representável dentro dos ranges limitados de que agora dispomos.

Apesar de não termos mais 16 milhões de cores, cada código de cor (inteiros no intervalo 0..65536) determina por si só, através de regras aritméticas, a cor a ser exibida. Por exemplo, o código de cor 111110000000000 binário significaria "nível máximo de vermelho, nada de verde, nada de azul". É nesse sentido que o Xwindows usa o termo Truecolor, ou seja, Truecolor significa que o código da cor, por si só, carrega os níveis de R, G e B a serem usados na sua exibição.

Isso entende-se melhor em oposição a Pseudocolor. Por limitações do hardware disponível, frequentemente se trabalha com um número de cores reduzido. Um número típico é 256, que exige, para cada pixel, 1 byte de memória. O esquema truecolor aqui daria 2 bits para cada cor básica, ou 4 níveis possíveis. O resultado seria muito pobre em termos visuais, por isso o Xwindows usa, neste caso, um colormap, ou seja, uma tabela que associa para cada código de cor um nível de R, G e B. Por exemplo:

código    R   G   B
-------------------
0        12   0 127
1       255 255   0 
2       112  44  96
...         ...
255       9  77 233

Agora cada cor básica pode variar entre 0 e 255, com a limitação de que, simultâneamente, não se pode ter mais do que 256 cores distintas em exibição. Dessa forma o código da cor, por si só, não determina mais os níveis de R, G e B, mas depende da consulta à tabela, daí o termo pseudocolor.

Como 256 é um limite pequeno, muitas aplicações, ao serem exibidas num Xserver que está operando com esse número de cores, aloca, por default ou a pedido, um colormap privado, fazendo com que, ao ser dado foco a essa aplicação, todas as cores na tela, exceto aquelas da janela em foco, mudem subitamente, provocando efeitos curiosos. Casos típicos são o netscape e o xv, além de alguns jogos, como doom, xboing e xgalaga.