[cairo-commit] cairo-demo/fbdev Makefile, NONE, 1.1 cairo-fb.c, NONE, 1.1

Amaury Jacquot commit at pdx.freedesktop.org
Thu Sep 30 13:02:18 PDT 2004

Committed by: sxpert

Update of /cvs/cairo/cairo-demo/fbdev
In directory gabe:/tmp/cvs-serv1595

Added Files:
	Makefile cairo-fb.c 
Log Message:

first version of the frame buffer demo

--- NEW FILE: Makefile ---

fbtest : fbtest.o
	gcc `pkg-config --libs cairo` -o fbtest fbtest.o

fbtest.o: fbtest.c
	gcc `pkg-config --cflags cairo` -c fbtest.c

	rm *.o fbtest

--- NEW FILE: cairo-fb.c ---
 * Cairo Frame Buffer demo
 * (c) 2004 Amaury Jacquot <sxpert at esitcom.org>
 * This program is licensed under the GNU GPL version 2 or later license

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <cairo.h>

int main(){
	int fbfd = 0;
	struct fb_var_screeninfo vinfo;
	struct fb_fix_screeninfo finfo;
	long int screensize = 0;
	char* fbp = 0;
	cairo_t* cr;

	// open the frame buffer file for reading & writing
	fbfd = open ( "/dev/fb0", O_RDWR );
	if (!fbfd) {
		printf ("Error: can't open framebuffer device.\n");
		exit (1);
	printf ("The framebuffer device was opened successfully\n");

	if (ioctl (fbfd, FBIOGET_FSCREENINFO, &finfo)) {
		printf ("Error reading fixed information\n");
		close (fbfd);
		exit (2);

	if (ioctl (fbfd, FBIOGET_VSCREENINFO, &vinfo)) {
		printf ("Error reading variable information\n");
		close (fbfd);
		exit (3);

	// print info about the buffer
	printf ("%dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);

	// calculates size
	screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;

	// map the device to memory 
	fbp = (char*) mmap (0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);

	if ((int)fbp == -1) {
		printf ("Error: failed to map framebuffer device to memory\n");
		close (fbfd);
		exit (4);

	printf ("The framebuffer device was successfully mapped to memory\n");

	cr = cairo_create ();
	cairo_set_target_image (cr, fbp, CAIRO_FORMAT_ARGB32, 
		vinfo.xres, vinfo.yres, finfo.line_length); 
	cairo_move_to (cr, 100, 100);
	cairo_line_to (cr, 300, 300);
	cairo_stroke (cr);
	munmap (fbp, screensize);
	close (fbfd);
	return 0;

More information about the cairo-commit mailing list