Caracteres rápidos e sujos para o buffer Linux em C - da maneira mais difícil - com "Matrizes de Glyph", Array Fu, Pointer Fu, mas sem seios, explosões ou carro perseguir esse projeto é sobre o personagem. Ao procurar colocar os caracteres para exibir um buffer Linux, eu queria criar uma tela para dados, mas o texto real do console era muito pequeno nos barbona não-gui framboesa Pi que foi manchada para este projeto. Este projeto é baseado em outro trabalho, um bom exemplo de manuseio de estrutura no Linux. Consulte http://raspberrycompote.blogspot.com/2015/01/low-level-graphics-on-rapberry-pi-part.html, então o que foi feito para este projeto foi um monte de matrizes de 1s e 0s representando caracteres e números foram criados e esses matrizes são reais. As fontes são baseadas nas armas de sentinela alienígenas. https://www.youtube.com/watch?v=hqdy-5iqvuu Esta demo assume que nem todo sistema será rápido e tem uma tela HDMI (que superaquece no meu caso - não seja eu), então preste atenção a esta linha:
vinfo.bits_per_pixel = 8;
Os valores de cor variam de 0 a 15. Esta não é a cor mais profunda, é claro. Se você aumentar essa "profundidade", poderá desacelerar as coisas, mas obtém uma ampla gama de cores. E estes:
vinfo.xres = 1184;
vinfo.yres = 624;
Sua tela, seja HDMI, ou algum TFT LCD, talvez - ele não importa para uma rotina Linux Framebuffer, desde que você obtenha o direito /dev /fbn, onde n é o número de monitores - pode diferir. Portanto, as dimensões da tela e a "profundidade" podem diferir. Eu tenho uma tela TFT LCD que lida bem com a saída de uma câmera de framboesa infravermelha antiga noir, mas tente qualquer bitmap x32 nela sem alguma conversão e as coisas ficam interessantes. Meu objetivo em geral foi "basta pegar algum texto na tela". As matrizes foram criadas usando algo próximo a "Fonte de Auto-Gun Aliens" e rotinas escritas para definir pixels para um determinado valor de cor com base em onde queremos, x e y e tudo isso, e o que é 1 ou 0 na matriz de glifos.
A partir daí, foram geradas outras rotinas: imprimir uma corda. Imprimir uma exibição numérica. E retângulos, preenchidos ou ocos com uma borda e linhas.
Essa demonstração mostra um pouco de animação, mas não é o objetivo. Usando uma espécie de abordagem de "lançamento de buffer", que é assim que a maioria dos gráficos funciona - escrevendo em um espaço de memória, como uma matriz primeiro, que é igual à exibição em tamanho e profundidade de cor, com valores de cores e depois "explodindo" (uma palavra antiga dos anos 90 provavelmente) que a memória para a mesma memória que é mapeada para a tela. Isso contribui para uma transição muito suave de uma tela para a outra.
Portanto, a animação é possível, mas não o objetivo. É simples o suficiente para tudo para esse "buffer de volta" e, em seguida, escrevê -lo no buffer de tela. Depois de ter esse tipo de código, como o código da Raspberry Compote, o que você faz com esse buffer de volta é sua empresa: do nosso humilde texto à renderização 3D.
Essa demonstração pressupõe que sistemas mais antigos ou menos capazes possam estar em uso. Então, todos os personagens estão em um bloco. Os glifos reais - representados pelas matrizes são "mantidos" por meio de uma matriz de "ponteiro para matriz". No bloco, essa matriz é atribuída ponteiros aos dados da matriz; portanto, uma vez que o bloco é passado, esses objetos desapareceram. Isso permite escolher e escolher quais personagens você usa e descartar o resto. Também para observar, existem duas matrizes representando dois tamanhos de fonte. Cada um são 128 elementos e o enésimo elemento corresponde ao valor int não assinado do caractere. Portanto, por esse motivo, um espaço está no elemento 32. O valor ASCII de "S" é 83, então os 83º elementos das matrizes são um ponteiro para a matriz de S.
Matrizes de números menores também são usados para serem elementos que apontam para matrizes representando números, o enésimo elemento correspondente ao número, variando de 0 a 9. Isso nos poupa a chamada de Atoi que seria usada para letras.
No geral, testado em uma framboesa de núcleo único de 1ª geração, foi bastante rápido. Os resultados podem variar. É o código C básico também.
Existem outras maneiras de personagens em uma tela. Mas optei por essa medida rápida e suja para garantir flexibilidade e simplicidade. O "Array Fu" deste código também pode ser útil para outras coisas. A matriz não precisa ser uma letra, número ou glifo de qualquer tipo - pode ser um sprite, por exemplo, ou qualquer coisa que você queira. Você é limitado pela tela que usa e pelo processador.
Se você quer mais fontes sofisticadas, há demos na internet que pegam fontes "reais" e as convertem em pixels. Se você puder colocá -los em matrizes, como um programa, o Tha lê um bitmap e o transforma em uma variedade de valores de cores, você pode usá -los como fontes neste programa. Lembre -se de que tudo isso, enquanto exibido no código como matrizes 2D, são realmente matrizes 1D. Então você precisa saber com antecedência quais são as dimensões de suas matrizes. As matrizes nesta demonstração foram criadas manualmente. Todas as faixas ASCII - 128 caracteres, não são concluídas. Portanto, se você quiser algo que não existe, como caracteres e pontuação em minúsculas, você terá que criá -lo sozinho. Notas adicionais: estou observando uma falha de segmentação em uma instalação do Debian no BeagleBone com uma resolução de 800x600 - mas estou usando a mesma tela HDMI. Curioso. Os resultados variam com o sistema e o sistema operacional. Estou tendo uma profundidade de pixel padrão mais baixa no BEAGLEBONE. Ambos os sistemas são sistemas não-gui (as GUIs são para donas de casa). Acho que se livrar do buffer "expandido" no truque YRES * 2 que funcionou bem em Rasperry eliminou o erro de inicialização e permite a mesma animação leve com o Atari 2600 Flicker em que cresci. Imagino que uma variedade separada por escrever para "Blit" para exibir na antiga maneira da escola possa funcionar, em vez disso, estarei experimentando isso. A menor resolução nos gráficos apenas Debian Beaglebone me dá sensação nostálgica. Também estou percebendo que, com a mesma "profundidade de pixels" que usei no Raspberry Pi, ainda posso passar mais de 15 em meus valores na cor ao colocar um pixel no buffer. A framboesa iria engasgar com isso, mas não o BEAGLEBONE. Isso permite mais opções de cores. Todo sistema é diferente, então você sempre precisa experimentar. Divirta -se com este código.