| Programar con el framebuffer |
| [ Sistemas operativos / Linux ] |
| Estoy interesado en hacer programas con el framebuffer, ¿me podéis dar alguna información para comenzar? |
| Carlos Redondo |
| El framebuffer es por definición un dispositivo en el que se pueden escribir los pixels directamente en las posiciones de la pantalla que queramos como si accediéramos a una matriz. Para ello tendremos que saber a qué resolución está la pantalla y cuántos bytes ocupa cada píxel (conforme al número de colores, con 32 bits se dedican 8 a cada uno de los colores básico y los otros 8 son para la transparencia). Esta información se puede obtener con un programa como el del "Listado 1", por medio de una llamada ioctl. Para dibujar basta con abrir el dispositivo, "mapear" el fichero a una matriz con mmap y escribir en ella. El "Listado 2" muestra un ejemplo para una resolución de 800 x 600 con 24 bpp (dibuja tres franjas horizontales, cada una con uno de los colores básicos). De todos modos, suele ser más conveniente dibujar en el framebuffer a través de alguna librería. De esta manera se obtienen ventajas como primitivas de dibujo de más alto nivel. Por ejemplo, OFBis (antes libfb) implementa primitivas de dibujo similares a las de la librería SVGALib sobre el framebuffer (se encuentra en http://osis.nocrew.org/ofbis/). Sobre esta librería se ha escrito un visualizador de gráficos e incluso un navegador web llamado Zen que también tiene versión sobre GTK+. Otra posible ventaja de usar una librería es que sea multiplataforma y funcione además de en varios sistemas operativos tanto en X como en el framebuffer. El caso más clásico es GGI (www.ggi-project.org), que de hecho nació antes que el framebuffer de Linux con un supraconjunto de sus objetivos y cuenta con varias aplicaciones y subproyectos, incluyendo su propio servidor X. Uno de los casos más interesantes es SDL (www.libsdl.org). Es una librería multimedia para juegos, implementa vídeo, sonido, uso del joystick, hilos, etc. La ha desarrollado Loki para portar a Linux los juegos de primera línea que comercializa. SDL se ejecuta en muchos sistemas, incluyendo el framebuffer, X, GGI, Windows, BeOS... Otra librería multiplataforma menos popular para desarrollar juegos (se utilizó por ejemplo en Hexen II) es MGL, disponible bajo licencia GPL en www.scitechsoft.com. También cabe destacar a Microwindows (www.microwindows.censoft.com), que implementa tanto un subconjunto del API de X como la parte gráfica de Win32. Es interesante sobre todo para sistemas empotrados, ya que funciona incluso en la versión reducida de Linux para micros de 16 bits y se ejecuta tanto sobre X como sobre el framebuffer. Un caso particular es www.directfb.org; se trata de un API que junto con drivers para varias tarjetas permite aprovechar la aceleración de la tarjeta utilizando primitivas más complejas. Hay varias librerías para implementar una interfaz gráfica de usuario sobre el framebuffer e incluso un sistema de ventas. Algunas van sobre SDL. Entre los GUI implementados está tanto GTK+ como Qt. De todos modos tampoco hay que pensar que el framebuffer va a sustituir a X, su utilidad es sobre todo para sistemas empotrados o aplicaciones muy concretas. También es interesante ver el código de algunos programas para aprender. Entre los más espectaculares está un reproductor de DVD y MPEG que forma parte de un proyecto de emisión de vídeo bajo demanda. Tiene interfaces para múltiples sistemas (fbdev, GGI, SDL, Gtk+, Qt+, MacOS X y clásico, etc.) y su página es www.videolan.org. Para finalizar, te recomendamos visitar www.linux-fbdev.org y http://freshmeat.net/search/?q=framebuffer. Listado 1 #include <linux/fb.h> #include <fcntl.h> #include <sys/ioctl.h> int main() { int fd=open("/dev/fb",O_RDWR); struct fb_var_screeninfo resul; ioctl(fd,FBIOGET_VSCREENINFO,&resul); printf("x: %d y: %d bpp: %d\n",resul.xres,resul.yres,resul.bits_per_pixel); return 0; } Listado 2 #include <unistd.h> #include <sys/mman.h> #include <fcntl.h> int main() { int fd=open("/dev/fb",O_RDWR); int x,y; char * buffer=mmap(0,2400*600,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); if (buffer==-1) { perror("Error al ejecutar mmap"); return -1; } for (x=0;x<2400*200;x+=3) { buffer[x]=0xFF; buffer[x+1]=0; buffer[x+2]=0; } buffer+=2400*200; for (x=0;x<2400*200;x+=3) { buffer[x]=0; buffer[x+1]=0xFF; buffer[x+2]=0; } buffer+=2400*200; for (x=0;x<2400*200;x+=3) { buffer[x]=0; buffer[x+1]=0; buffer[x+2]=0xFF; } return 0; } |
| Anterior Siguiente |
© 2002 VNU Business Publications España. Queda terminantemente prohibida su reproducción total o parcial por cualquier medio sin el permiso explicito y por escrito del propietario del copyright. |