LinuxFocus 1998: Guía de SVGAlib para Principiantes Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom Bar]
[Photo of the Author]
Jay Link
Sobre el autor: Jay Link tiene veinte y tantos años, vive en Springfield, Illinois. Aparte de Linux, sus aficiones son escalar montañas y volar. Es administrador de InterLink BBS (un proveedor de Internet con ánimo de lucro, pero sin excesivo éxito) en escaso tiempo libre, también trabaja en otros extraños trabajos para poder pagar las facturas.

Escribe al autor

Gráficos Fáciles: Guía de SVGAlib para Principiantes

[Ilustration]

Estás buscando un paquete gráfico sencillo para tu sistema Linux? Si es así, no busques más. SVGAlib provee una manera fácil de crear aplicaciones gráficas y elimina la complejidad de X Windows. Si tienes el mínimo conocimiento de programación en C, entonces puedes usar SVGAlib.


Se ve peor con el Explorer (utiliza Netscape)

¿Qué es SVGAlib?

SVGAlib es una biblioteca gráfica de bajo nivel para Linux. Esta refuerza al lenguaje C, el cual no suministra soporte para gráficos.

¡Pero hay miles de programas gráficos escritos en C!

Sí, pero todos dependen de funciones de bibliotecas externas. C solamente puede ofrecer texto. Esto es porque todas las funciones gráficas dependen del sistema y no son portables. Desafortunadamente, las rutinas gráficas codificadas para un sistema operativo no trabajarán en otro al menos que sean totalmente re-escritas. Por ejemplo, gráficos originalmente escritos para DOS o Windows son inútiles en Linux.

Para codificar gráficos en C bajo Linux, es necesario usar un conjunto externo de funciones nativas de Linux, SVGAlib es uno de esos conjuntos.

SVGAlib es una biblioteca gráfica de bajo nivel para Linux.

¿Cuál es la diferencia entre SVGAlib y X Windows ?

El sistema X Windows (XFree86) es actualmente un servidor. Este servidor debe ser iniciado previamente para usar cualquier aplicación que requiera X. Además, el servidor X es un sistema que utiliza muchos recursos lo que prohibe el uso de los terminales virtuales (Alt 1-6).

SVGAlib, por otro lado, no requiere tal preparación. No ejecutarás SVGAlib como lo haces con X Windows. SVGAlib es simplemente una biblioteca binaria de C que es llamada por programas escritos en ese lenguaje, al igual que las otras bibliotecas que se encuentran en /lib y /usr/lib. Si SVGAlib es instalado correctamente, el usuario promedio ni siquiera se dará cuenta de su existencia. SVGAlib no afectará a tus terminales virtuales, permitiéndote correr libremente múltiples aplicaciones como siempre. Puedes tener texto normal en un terminal y gráficos en otro.

Desventajas

Hay muchas más aplicaciones disponibles para X Windows que para SVGAlib, debido al hecho de que X Windows es multiplataforma (corre en una variedad de UNIXes). Solamente Linux utiliza SVGAlib. También, aplicaciones para SVGAlib pobremente escritas pueden dejar colgada tu consola, requiriendo un reboot. Finalmente, no deberías cambiar de una consola a otra rápidamente cuando uses SVGAlib, o correrás el riesgo de corromper la pantalla (forzando a otro reboot).

Sin embargo, es un mito que SVGAlib es un riesgo para la seguridad. Mientras la aplicaciones de SVGAlib deben ser seteadas como root, ese privilegio es abandonado inmediatamente después de la ejecución. No hay necesidad de preocuparse por eso.

En resumen, a pesar de los problemas antes mencionados, la velocidad y fácil uso de SVGAlib la hacen atractiva en muchas situaciones. Especialmente si sólo quieres garabatear en la pantalla.

Ejemplos

Para usar SVGAlib, debes hacerle una referencia en el programa. Simplemente #include <vga.h>. A continuación un sencillo programa con SVGAlib: Para bajarlo

#include  <stdio.h>
#include  <vga.h>

int main(void) {
   vga_init();
   vga_setmode(5);
   vga_setcolor(4);
   vga_drawpixel(10,10);

   sleep(5);
   vga_setmode(0);
   exit(0);
}
gradient

Éste dibujará un sencillo pixel rojo en tu pantalla. Después de cinco segundos, pasará a modo de texto y saldrá .

Nota que nuestra primera declaración, vga_init(). Este abandona el root status e inicializa la biblioteca SVGAlib. La segunda línea, vga_setmode(5), establece la pantalla en modo 5, el cual es 320x200x256. Es decir, tu pantalla se convierte en un grid que tiene 320 pixels de ancho, 200 pixels de altura, y soporta 256 colores. Alternativamente, podrías escribir vga_setmode(G320x200x256). El próximo comando, vga_setcolor(4), convierte en rojo al color actual. Podemos elegir cualquier valor entre 0 y 255. Más colores están disponibles con otros comandos, pero trabajaremos con los colores básicos en este ejemplo. Ahora,dibujaremos nuestro pixel de coordenadas 10, 10. Esto es once espacios, no diez, porque el grid de coordenadas empieza en 0. La coordenada 0,0 está en la esquina superior izquierda. vga_setmode(0) regresa la pantalla al modo de texto. vga_setmode(text) es indéntico a vga_setmode(0). Es siempre una buena idea realizar ésto al final del programa. De otra manera, le harás la vida díficil a tus usuarios.

Para compilar este código, utiliza el compilador gcc. Necesitarás también hacer un link a SVGAlib con el comando -lvga. Por último, sugiero usar -O3, el mejor nivel de optimización. Aquí está nuestro comando:

gcc -O3 -o sample sample.c -lvga

Entonces, para hacerlo disponible a las cuentas non-root, escribe:

chmod u+s

Para ejecutarlo solo escribe:

sample     <o el nombre que le hayas dado>

El set completo de comandos de SVGAlib esta documentado en el man page de SVGAlib.Nosotros no estudiaremos a todos aquí. Escribiremos nuestro segundo ejemplo utilizando un set de funciones de SVGAlib más rápidas: vgagl.

Escribe "man vgagl", y verás que es " una biblioteca de funciones gráficas más rápida basada en SVGAlib." Básicamente, ésto te da funciones gráficas avanzadas, tales como la habilidad de dibujar shapes con una declaración.

A continuación está un programa que utiliza vgagl. Debería desplegar una pantalla azul, tal como la que utilizan algunos programas de instalación. El programa comienza con una luz azul en el tope de la pantalla, y gradualmente se desvanece hasta el negro como si descendiera. Una cosa que este programa hace diferente al anterior es que realiza el dibujo sobre una pantalla "virtual" invisible. Cuando todas las líneas han sido dibujadas, copia el dibujo terminado a la pantalla "física" visible. Esto elimina el efecto parpadeo en la pantalla, y hace que la aplicación luzca más profesional. Me agrada pensar que la pantalla virtual es una especie de "borrador", un lugar donde se preparan las cosas entre actos durante el show.

Para compilar, sugiero escribir:

gcc -O3 -o gradient gradient.c -lvgagl -lvga

Nota que -lvgagl viene antes de -lvga. Es mandatorio que refieras primero a vgagl cuando uses esa biblioteca. ¿Recuerdas a chmod u+s?

Aquí está el código: Para bajarlo

#include <stdio.h>  
#include <stdlib.h>
#include <vga.h>
#include <vgagl.h>

GraphicsContext *physicalscreen;
GraphicsContext *virtualscreen;

int main(void) {
   int i,  j,  b,  y,  c;

   vga_init();
   vga_setmode(5);
   gl_setcontextvga(5);
   gl_setcontextvgavirtual(5);
   physicalscreen = gl_allocatecontext();
   gl_getcontext(physicalscreen);
   virtualscreen = gl_allocatecontext();
   gl_getcontext(virtualscreen);

   y = 0;
   c = 0;
   gl_setpalettecolor(c, 0, 0, 0);
   c++;
   for (i = 0; i < 64; i++) {
      b = 63 - i;
      gl_setpalettecolor(c, 0, 0, b);
      for (j = 0; j < 3; j++) {
         gl_hline(0, y, 319, c);
         y++;
      }
      c++;
   }
   gl_copyscreen(physicalscreen);

   getchar();
   gl_clearscreen(0);
   vga_setmode(0);
   exit(0);
}
	  

Observa que necesitamos ahora a #include <vgagl.h>.

Comenzamos nuestro código definiendo el contexto gráfico:

GraphicsContext *physicalscreen
GraphicsContext *virtualscreen

Entonces declaramos nuestras variables y usaremos vga_setmode() para definir el modo de la pantalla. Utilizaremos modo 5 (G320x200x256) como antes. Necesitamos inicializar tanto la pantalla "física" visible como la pantalla "virtual" invisible. Entonces guardamos los contextos en variables:

gl_setcontextvga(5)
gl_setcontextvgavirtual(5)
physicalscreen = gl_allocatecontext()
gl_getcontext(physicalscreen)
virtualscreen = gl_allocatecontext()
gl_getcontext(virtualscreen)

Anunciamos ahora que vamos a trabajar con la pantalla virtual: gl_setcontext(virtualscreen).

gl_setpalettecolor() nos da 64 tonos de azul. Dibujaremos 3 líneas por tono, para un total de 192 líneas. Las ocho restantes no se verán.

Cuando terminemos, copiamos los contenidos de la pantalla virtual (nuestra pantalla actual) a la pantalla física con gl_copyscreen(physicalscreen).

Esta vez, dejaremos que el usuario decida cuanto tiempo deja el dibujo visible. getchar() espera por la entrada del usuario. Después de darle a cualquier tecla, hacemos gl_clearscreen(0) y vga_setmode(0)para regresar al modo de texto.

El set entero de funciones para SVGAlib puede ser vista tipeando "man svgalib" y "man vgagl". Cada función tiene su propia man page. Después de leer esta introducción, deberías de ser capaz de insertar nuevos comandos en tus programas con relativa facilidad. También puedes echarle un vistazo a los programas demo que vienen con SVGAlib de los cuales puedes aprender mucho.

En el caso de que tu distribución está incompleta, puedes encontrar la más reciente versión de SVGAlib en sunsite.unc.edu en pub/Linux/libs/graphics o en tsx-11.mit.edu en pub/linux/sources/libs . Para el momento de escribir este artículo la versión actual es 1.3.0.

Por último, la Distribución de Slackware, a pesar de lo buena que es, tiene la tendencia de instalar SVGAlib en los directorios equivocados. Obteniendo e instalando una nueva distribución de SVGAlib de Sunsite o MIT se arregla este problema.

Diviértete!


Artículo original en inglés. Traducido por Ruben Sotillo


Páginas web mantenidas por Miguel Ángel Sepúlveda
© Jay Link 1998
LinuxFocus 1998