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