Personajes rápidos y sucios al búfer Linux en C - de la manera difícil - con "matrices de glifo", matriz Fu, puntero Fu, pero sin senos, explosiones o persecuciones de automóviles Este proyecto tiene que ver con el carácter. Cuando busqué poner a los personajes a la pantalla para un búfer Linux, quería crear una pantalla para los datos, pero el texto real de la consola era demasiado pequeño en el Barbones no Gui Raspberry Pi que estaba aturdido para este proyecto. Este proyecto se basa en otro trabajo, un buen ejemplo de manejo de FrameBuffer en Linux. Consulte http://raspberrycompote.blogspot.com/2015/01/low-level-graphics-on-raspberry-pi-part.html, lo que lo que se hizo para este proyecto fue un grupo de matrices de 1s y 0s que representan caracteres y números se crearon y estas matrices se realizan con una rutina de "set de mi píxeles" para determinar cuándo y donde se escribe un pixel real con un valor de color. Las fuentes se basan en las pistolas Sentry de Aliens. https://www.youtube.com/watch?v=hqdy-5iqvuu Esta demostración supone que no todos los sistemas serán rápidos y tendrán una pantalla HDMI (que se sobrecalienta en mi caso, no sea yo), así que preste atención a esta línea:
vinfo.bits_per_pixel = 8;
Los valores de color rangan 0 a 15. Este no es el color más profundo, por supuesto. Si eleva esta "profundidad", podría ralentizar las cosas, pero obtiene una gama más amplia de colores. Y estos:
vinfo.xres = 1184;
vinfo.yres = 624;
Su pantalla, ya sea HDMI, o alguna LCD TFT quizás, no es importante para una rutina de Linux FrameBuffer siempre que obtenga el correcto /dev /fbn, donde n es el enésimo número de pantallas, es probable que diferir. Por lo tanto, las dimensiones de la pantalla y la "profundidad" podrían diferir. Tengo una pantalla LCD TFT que maneja la salida de una vieja cámara de frambuesa infrarroja de Noir bien, pero pruebe cualquier mapa de bits X32 sin alguna conversión y las cosas se vuelven interesantes. En general, mi objetivo era "solo obtener algún texto en la pantalla". Las matrices se crearon usando algo cercano a la "fuente de armas automáticas de Aliens" y las rutinas escritas para establecer píxeles en un valor de color dado en función de dónde queremos, X e Y y todo eso, y qué es 1 o 0 en la matriz de glifos.
A partir de ahí, se generaron otras rutinas: imprimir una cadena. Impresión de una pantalla Número. Y rectángulos, llenos o huecos con un borde y líneas.
Esta demostración muestra un poco de animación, pero no es el objetivo. Utilizando un tipo de enfoque de "volteo de búfer", que es cómo funcionan la mayoría de los gráficos: escribir en un espacio de memoria, como una matriz primero, que equivale a la pantalla en tamaño y profundidad de color, con valores de color, y luego "brochando" (una palabra antigua de la década de 1990 probablemente) esa memoria a la misma memoria que se asigna a la pantalla. Esto hace que la transición muy suave de una pantalla a la otra.
Entonces la animación es posible, pero no el objetivo. Es lo suficientemente simple como para todo a ese "búfer de espalda" y luego escribirlo en el búfer de pantalla. Una vez que tenga este tipo de código hacia abajo, como el código de Raspberry Compot, lo que hace a ese buffer de espalda es su negocio: desde nuestro texto humilde hasta la representación 3D.
Esta demostración supone que los sistemas más antiguos o menos capaces podrían estar en uso. Entonces todos los personajes están en un bloque. Los glifos reales, representados por matrices se "retienen" a través de una matriz de "puntero a la matriz". En el bloque, esta matriz se asigna punteros a los datos de la matriz, por lo que una vez que se pasa el bloque, esos objetos desaparecen. Esto te permite elegir qué personajes usas, y descartar el resto. También para tener en cuenta que hay dos matrices que representan dos tamaños de fuente. Cada uno son 128 elementos, y el enésimo elemento corresponde con el valor int no firmar del carácter. Entonces, por esa razón, un espacio está en el elemento 32. El valor ASCII de "S" es 83, por lo que los elementos 83 de las matrices son un puntero a la matriz de S.
Las matrices de números más pequeñas también se usan para ser elementos que apuntan a matrices que representan números, el enésimo elemento correspondiente al número, que van desde 0-9. Esto nos da la llamada ATOI que se utilizaría para letras.
En general, probado en una frambuesa de un solo núcleo de primera generación, fue bastante rápido. Los resultados pueden variar. También es un código C básico.
Hay otras formas de hacer personajes en una pantalla. Pero opté por esta medida rápida y sucia para garantizar la flexibilidad y la simplicidad. El "Array Fu" de este código también puede ser útil para otras cosas. La matriz no necesita ser una letra, número o glifo de ningún tipo: puede ser un sprite, por ejemplo, o cualquier cosa que desee. Estás limitado por la pantalla que usa y el procesador.
Si desea más fuentes elegantes, hay demostraciones en Internet que toman fuentes "reales" y las convierten a píxeles. Si puede obtener esto en matrices, como un programa que lee un mapa de bits y lo convierte en una variedad de valores de color, puede usarlas como fuentes en este programa. Tenga en cuenta que todo esto, mientras se muestra en código como matrices 2D, son realmente matrices 1D. Entonces, debe saber con anticipación cuáles son las dimensiones de sus matrices. Las matrices en esta demostración se crearon manualmente. Todos los rangos ASCII completos - 128 caracteres, no se completan. Entonces, si quieres algo que no esté allí, como personajes de minúsculas y puntuación, tendrás que crearlo tú mismo. Notas adicionales: Estoy notando una falla de segmentación en una instalación de Debian en BeagleBone con una resolución de 800x600, pero estoy usando la misma pantalla HDMI. Curioso. Los resultados variarán con el sistema y el sistema operativo. Incluso estoy obteniendo una profundidad de píxel predeterminada más baja en BeagleBone. Ambos sistemas son sistemas no GUI (las GUI son para amas de casa). Encuentro que deshacerse del búfer "expandido" en el truco de Yres * 2 que funcionó bien en Rasperry eliminó el error de inicialización y permite la misma animación leve con el parpadeo de Atari 2600 en el que crecí. Me imagino que una matriz separada para escribir para entonces "Blit" para proyectar en el camino de la vieja escuela podría funcionar en su lugar, estaré experimentando con esto. La menor resolución en los gráficos que solo Debian Beaglebone me da sensaciones nostálgicas. También me doy cuenta de que con la misma "profundidad de píxeles" como usé en la Raspberry Pi, todavía puedo superar 15 en mis valores al color al poner un píxel en el búfer. La frambuesa se ahogaría en eso, pero no en Beaglebone. Esto permite más opciones de color. Cada sistema es diferente, por lo que siempre necesita experimentar. Diviértete con este código.