From: Roger L. <rl...@wh...> - 2005-06-27 20:52:14
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi folks, I'm looking into writing a program which will use the framebuffer to display rendered fonts and some graphics. However, I've not yet found much in the way of programming documentation. Is there anything you would recommend? (I've looked at SDL, directfb and GGI sources, but they are very complex.) Using the comments in <linux/fb.h> and some simple examples I found, I've written the sample code below. However, none of the examples I saw made any use of the fb_bitfield information. I ran into problems when I tried my (i386 tested) code on a PPC. After fixing the code, it still doesn't work. I have the bizarre situation that if I run it under X11 (using XF86_FBDev), I see the glyphs rendered fine, but if I run it on the console the colours are mucked up, and I can't see any change in the bitfield data. Are there any examples of painting simple RGB pixel data onto any arbitrary framebuffer device which also works on big and little endian systems. I'm sure this is fairly simple once you know how! Additionally, is there any documentation about how colourmaps and the other framebuffer features work? Many thanks, Roger This program simply renders each ASCII character in turn and paints it. You might need to change the fb device and font path. It's currently hard-coded for RBG LCDs, but is simple to change for a CRT. Compile with c99 -o ft-lcd ft-lcd.c `freetype-config --cflags --libs` #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <linux/fb.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <ft2build.h> #include FT_FREETYPE_H void fail (const char *reason) { fprintf (stderr, "%s\n", reason); exit (EXIT_FAILURE); } int main() { int fbfd = 0; struct fb_var_screeninfo vinfo; struct fb_fix_screeninfo finfo; long int screensize = 0; char *fbp = 0; int x = 0, y = 0; long int location = 0; // Open the file for reading and writing fbfd = open("/dev/fb/0", O_RDWR); if (fbfd < 0) fail("Error: cannot open framebuffer device."); // Get fixed screen information if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) fail("Error reading fixed information."); // Get variable screen information if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) fail("Error reading variable information."); printf("%ux%u (%ux%u), %ubpp\n", vinfo.xres, vinfo.yres, vinfo.xres_virtual, vinfo.yres_virtual, vinfo.bits_per_pixel ); printf("offsets: x=%u, y=%u\n", vinfo.xoffset, vinfo.yoffset); printf("red: o=%u, l=%u, mr=%u\n", vinfo.red.offset, vinfo.red.length, vinfo.red.msb_right); printf("green: o=%u, l=%u, mr=%u\n", vinfo.green.offset, vinfo.green.length, vinfo.green.msb_right); printf("blue: o=%u, l=%u, mr=%u\n", vinfo.blue.offset, vinfo.blue.length, vinfo.blue.msb_right); printf("transp: o=%u, l=%u, mr=%u\n", vinfo.transp.offset, vinfo.transp.length, vinfo.transp.msb_right); unsigned int red_max = 1 << vinfo.red.length; unsigned int green_max = 1 << vinfo.green.length; unsigned int blue_max = 1 << vinfo.blue.length; unsigned int transp_max = 1 << vinfo.transp.length; unsigned int red_mask = 0; for (unsigned int i=0; i<vinfo.red.length; ++i) red_mask |= 1 << (vinfo.red.offset + i); unsigned int green_mask = 0; for (unsigned int i=0; i<vinfo.green.length; ++i) green_mask |= 1 << (vinfo.green.offset + i); unsigned int blue_mask = 0; for (unsigned int i=0; i<vinfo.blue.length; ++i) blue_mask |= 1 << (vinfo.blue.offset + i); unsigned int transp_mask = 0; for (unsigned int i=0; i<vinfo.transp.length; ++i) transp_mask |= 1 << (vinfo.transp.offset + i); // Figure out the size of the screen in bytes 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) fail("Error: failed to map framebuffer device to memory.\n"); // Now setup FreeType FT_Library library; FT_Face face; int error = FT_Init_FreeType( &library ); if ( error ) { fail ("Failed to initialise FreeType"); } error = FT_New_Face( library, "/usr/share/fonts/truetype/ttf-bitstream-vera/VeraMono.ttf", 0, &face ); if ( error == FT_Err_Unknown_File_Format ) { fail ("Unsupported font format"); } else if ( error ) { fail ("Error reading font file"); } error = FT_Set_Char_Size ( face, 0, 12 * 64, 100, 100 ); if (error) { fail ("Error setting char size"); } // Display each ASCII printable char for (FT_ULong n = 33; n < 127; ++n) { FT_UInt glyph_index = FT_Get_Char_Index (face, n); FT_Load_Glyph (face, glyph_index, FT_LOAD_DEFAULT|FT_LOAD_TARGET_LCD); error = FT_Render_Glyph (face->glyph, FT_RENDER_MODE_LCD); if (error) { fail ("Error rendering glyph"); } if (n == '_') continue; FT_Bitmap *bitmap = &face->glyph->bitmap; // printf ("Glyph '%c': %d * %d\n", (char) n, bitmap->width, bitmap->rows); //printf ("Bitmap top: %d\nBitmap left: %d\n", face->glyph->bitmap_top, // face->glyph->bitmap_left); for (y=0; y<200; ++y) for (x=0; x<200; ++x) { location = ((x + 0)+vinfo.xoffset) * (vinfo.bits_per_pixel/8) + ((y + 0)+vinfo.yoffset) * finfo.line_length; if ( vinfo.bits_per_pixel == 32 ) { unsigned int *pixel = (int *) (fbp + location); *pixel = 0; } } for (y=0; y<bitmap->rows; ++y) for (x=0; x< (bitmap->width / 3); ++x) { location = ((x + face->glyph->bitmap_left)+vinfo.xoffset) * (vinfo.bits_per_pixel/8) + ((y + face->glyph->bitmap_top)+vinfo.yoffset) * finfo.line_length; unsigned int r = *(bitmap->buffer + (y * bitmap->pitch) + (x*3 + 0)); // r *= (red_max /8); unsigned int g = *(bitmap->buffer + (y * bitmap->pitch) + (x*3 + 1)); // g *= (red_max /8); unsigned int b = *(bitmap->buffer + (y * bitmap->pitch) + (x*3 + 2)); // b *= (red_max /8); // printf("r=%u, g=%u, b=%u\n", r, g, b); if ( vinfo.bits_per_pixel == 32 ) { unsigned int *pixel = (int *) (fbp + location); *pixel = 0; // This works when I run under X11_FBDev (i.e. the // colours are correct), but if I run on the console, I // get a mess and mostly blue colours... *pixel |= ((r << vinfo.red.offset) & red_mask); *pixel |= ((g << vinfo.green.offset) & green_mask); *pixel |= ((r << vinfo.blue.offset) & blue_mask); } } sleep (1); } return 0; } - -- Roger Leigh Printing on GNU/Linux? http://gimp-print.sourceforge.net/ Debian GNU/Linux http://www.debian.org/ GPG Public Key: 0x25BFB848. Please sign and encrypt your mail. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (GNU/Linux) Comment: Processed by Mailcrypt 3.5.8 <http://mailcrypt.sourceforge.net/> iD8DBQFCwGWTVcFcaSW/uEgRAkt1AJ9n98Nx0sFOCSQz6FKJ4mftcnijLACgiW6A Ew9wJRanhXh419I9x6PRgzU= =2YCz -----END PGP SIGNATURE----- |
From: James L. <ja...@ak...> - 2005-06-28 02:34:49
|
Check this out! EZFB http://www.akrobiz.com/ezfb/ Please let me know what you think! ~James. :o) ----- Original Message ----- From: "Roger Leigh" <rl...@wh...> To: <lin...@li...> Sent: Monday, June 27, 2005 4:46 PM Subject: [Linux-fbdev-users] Endianness issues using the framebuffer > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > Hi folks, > > I'm looking into writing a program which will use the framebuffer to > display rendered fonts and some graphics. However, I've not yet found > much in the way of programming documentation. Is there anything you > would recommend? > > (I've looked at SDL, directfb and GGI sources, but they are very > complex.) > > Using the comments in <linux/fb.h> and some simple examples I found, > I've written the sample code below. However, none of the examples I > saw made any use of the fb_bitfield information. I ran into problems > when I tried my (i386 tested) code on a PPC. After fixing the code, > it still doesn't work. I have the bizarre situation that if I run it > under X11 (using XF86_FBDev), I see the glyphs rendered fine, but if I > run it on the console the colours are mucked up, and I can't see any > change in the bitfield data. > > Are there any examples of painting simple RGB pixel data onto any > arbitrary framebuffer device which also works on big and little endian > systems. I'm sure this is fairly simple once you know how! > > Additionally, is there any documentation about how colourmaps and the > other framebuffer features work? > > > Many thanks, > Roger > > > This program simply renders each ASCII character in turn and paints > it. You might need to change the fb device and font path. It's > currently hard-coded for RBG LCDs, but is simple to change for a CRT. > > Compile with > c99 -o ft-lcd ft-lcd.c `freetype-config --cflags --libs` > > #include <unistd.h> > #include <stdio.h> > #include <stdlib.h> > #include <fcntl.h> > #include <linux/fb.h> > #include <sys/ioctl.h> > #include <sys/mman.h> > > #include <ft2build.h> > #include FT_FREETYPE_H > > void fail (const char *reason) > { > fprintf (stderr, "%s\n", reason); > exit (EXIT_FAILURE); > } > > int > main() > { > int fbfd = 0; > struct fb_var_screeninfo vinfo; > struct fb_fix_screeninfo finfo; > long int screensize = 0; > char *fbp = 0; > int x = 0, y = 0; > long int location = 0; > > // Open the file for reading and writing > fbfd = open("/dev/fb/0", O_RDWR); > if (fbfd < 0) > fail("Error: cannot open framebuffer device."); > > // Get fixed screen information > if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) > fail("Error reading fixed information."); > > // Get variable screen information > if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) > fail("Error reading variable information."); > > printf("%ux%u (%ux%u), %ubpp\n", vinfo.xres, vinfo.yres, > vinfo.xres_virtual, vinfo.yres_virtual, vinfo.bits_per_pixel ); > printf("offsets: x=%u, y=%u\n", vinfo.xoffset, vinfo.yoffset); > printf("red: o=%u, l=%u, mr=%u\n", vinfo.red.offset, vinfo.red.length, vinfo.red.msb_right); > printf("green: o=%u, l=%u, mr=%u\n", vinfo.green.offset, vinfo.green.length, vinfo.green.msb_right); > printf("blue: o=%u, l=%u, mr=%u\n", vinfo.blue.offset, vinfo.blue.length, vinfo.blue.msb_right); > printf("transp: o=%u, l=%u, mr=%u\n", vinfo.transp.offset, vinfo.transp.length, vinfo.transp.msb_right); > > unsigned int red_max = 1 << vinfo.red.length; > unsigned int green_max = 1 << vinfo.green.length; > unsigned int blue_max = 1 << vinfo.blue.length; > unsigned int transp_max = 1 << vinfo.transp.length; > > unsigned int red_mask = 0; > for (unsigned int i=0; i<vinfo.red.length; ++i) > red_mask |= 1 << (vinfo.red.offset + i); > unsigned int green_mask = 0; > for (unsigned int i=0; i<vinfo.green.length; ++i) > green_mask |= 1 << (vinfo.green.offset + i); > unsigned int blue_mask = 0; > for (unsigned int i=0; i<vinfo.blue.length; ++i) > blue_mask |= 1 << (vinfo.blue.offset + i); > unsigned int transp_mask = 0; > for (unsigned int i=0; i<vinfo.transp.length; ++i) > transp_mask |= 1 << (vinfo.transp.offset + i); > > > // Figure out the size of the screen in bytes > 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) > fail("Error: failed to map framebuffer device to memory.\n"); > > // Now setup FreeType > FT_Library library; > FT_Face face; > > int error = FT_Init_FreeType( &library ); > if ( error ) > { > fail ("Failed to initialise FreeType"); > } > > error = FT_New_Face( library, "/usr/share/fonts/truetype/ttf-bitstream-vera/VeraMono.ttf", 0, &face ); > if ( error == FT_Err_Unknown_File_Format ) > { > fail ("Unsupported font format"); > } > else if ( error ) > { > fail ("Error reading font file"); > } > > error = FT_Set_Char_Size ( face, > 0, > 12 * 64, > 100, > 100 ); > if (error) > { > fail ("Error setting char size"); > } > > // Display each ASCII printable char > for (FT_ULong n = 33; n < 127; ++n) > { > FT_UInt glyph_index = FT_Get_Char_Index (face, n); > > FT_Load_Glyph (face, > glyph_index, > FT_LOAD_DEFAULT|FT_LOAD_TARGET_LCD); > > error = FT_Render_Glyph (face->glyph, > FT_RENDER_MODE_LCD); > > if (error) > { > fail ("Error rendering glyph"); > } > > if (n == '_') > continue; > > FT_Bitmap *bitmap = &face->glyph->bitmap; > > // printf ("Glyph '%c': %d * %d\n", (char) n, bitmap->width, bitmap->rows); > > //printf ("Bitmap top: %d\nBitmap left: %d\n", face->glyph->bitmap_top, > // face->glyph->bitmap_left); > > for (y=0; y<200; ++y) > for (x=0; x<200; ++x) > { > location = ((x + 0)+vinfo.xoffset) * > (vinfo.bits_per_pixel/8) + > ((y + 0)+vinfo.yoffset) * finfo.line_length; > > if ( vinfo.bits_per_pixel == 32 ) { > unsigned int *pixel = (int *) (fbp + location); > *pixel = 0; > } > } > > for (y=0; y<bitmap->rows; ++y) > for (x=0; x< (bitmap->width / 3); ++x) > { > location = ((x + face->glyph->bitmap_left)+vinfo.xoffset) * > (vinfo.bits_per_pixel/8) + > ((y + face->glyph->bitmap_top)+vinfo.yoffset) * finfo.line_length; > > unsigned int r = *(bitmap->buffer + (y * bitmap->pitch) + (x*3 + 0)); > // r *= (red_max /8); > unsigned int g = *(bitmap->buffer + (y * bitmap->pitch) + (x*3 + 1)); > // g *= (red_max /8); > unsigned int b = *(bitmap->buffer + (y * bitmap->pitch) + (x*3 + 2)); > // b *= (red_max /8); > > // printf("r=%u, g=%u, b=%u\n", r, g, b); > > if ( vinfo.bits_per_pixel == 32 ) { > unsigned int *pixel = (int *) (fbp + location); > *pixel = 0; > > // This works when I run under X11_FBDev (i.e. the > // colours are correct), but if I run on the console, I > // get a mess and mostly blue colours... > > *pixel |= ((r << vinfo.red.offset) & red_mask); > *pixel |= ((g << vinfo.green.offset) & green_mask); > *pixel |= ((r << vinfo.blue.offset) & blue_mask); > > } > } > > sleep (1); > > } > > return 0; > } > > > - -- > Roger Leigh > Printing on GNU/Linux? http://gimp-print.sourceforge.net/ > Debian GNU/Linux http://www.debian.org/ > GPG Public Key: 0x25BFB848. Please sign and encrypt your mail. > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1.4.1 (GNU/Linux) > Comment: Processed by Mailcrypt 3.5.8 <http://mailcrypt.sourceforge.net/> > > iD8DBQFCwGWTVcFcaSW/uEgRAkt1AJ9n98Nx0sFOCSQz6FKJ4mftcnijLACgiW6A > Ew9wJRanhXh419I9x6PRgzU= > =2YCz > -----END PGP SIGNATURE----- > > > ------------------------------------------------------- > SF.Net email is sponsored by: Discover Easy Linux Migration Strategies > from IBM. Find simple to follow Roadmaps, straightforward articles, > informative Webcasts and more! Get everything you need to get up to > speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click > _______________________________________________ > Linux-fbdev-users mailing list > Lin...@li... > https://lists.sourceforge.net/lists/listinfo/linux-fbdev-users > |
From: James L. <ja...@ak...> - 2005-06-28 02:42:34
|
Is there a way to ask the GPU on the video card to wipe out the data in the visible area of the screen? I have found it takes WAY to long to memset zeros to every line and keeping track of only those pixels that have changed seems like more work than it's worth. http://www.akrobiz.com/ezfb http://www.akrobiz.com/laserboy Thanks! Take care. ~James. :o) |
From: James S. <jsi...@ww...> - 2005-06-28 21:02:49
|
In 2.6.X the kernel side supports fillrect. Do a fillrect the size of the display with the color black. On Mon, 27 Jun 2005, James Lehman wrote: > Is there a way to ask the GPU on the video card to wipe out the data in the > visible area of the screen? > I have found it takes WAY to long to memset zeros to every line and keeping > track of only those pixels that have changed seems like more work than it's > worth. > > http://www.akrobiz.com/ezfb > http://www.akrobiz.com/laserboy > > Thanks! > Take care. ~James. :o) > > > > > ------------------------------------------------------- > SF.Net email is sponsored by: Discover Easy Linux Migration Strategies > from IBM. Find simple to follow Roadmaps, straightforward articles, > informative Webcasts and more! Get everything you need to get up to > speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click > _______________________________________________ > Linux-fbdev-users mailing list > Lin...@li... > https://lists.sourceforge.net/lists/listinfo/linux-fbdev-users > |
From: James L. <ja...@ak...> - 2005-07-02 02:19:08
|
OK. I've looked at the code quite a bit and I've done some searching... Sorry if I'm getting into this and it has already been discussed, but are there any online docs about what changed in the new 2.6 frame buffer vs. 2.4? I see there is a thing called fb_info and it has a structure of function pointers in it that look like they do some fabulous things. All I create in my code is a user version of fix and var and a memmap to the video ram. Are there some examples of instantiating an fb_info with fix and var encapsulated inside of it? Please note: I've been into computers most of my life for one reason only... For art. I really want to get this right. I just got a Matrox G400 with 32MB ram. I can double buffer a screen of 1600x1200 @ 32. Even with a waist of time like memsetting zeros to every pixel on the screen for a wipe, it SMOKES! (in a good way). I also really want to get a mouse pointer working. Is all this stuff I see about "cursor" relevant to that or is that just character cell terminal block letter stuff? http://www.akrobiz.com/ezfb http://www.akrobiz.com/laserboy Thanks! James. :o) ----- Original Message ----- From: "James Simmons" <jsi...@ww...> To: <lin...@li...> Sent: Tuesday, June 28, 2005 5:02 PM Subject: Re: [Linux-fbdev-users] Blanking the screen : EZFB > > > In 2.6.X the kernel side supports fillrect. Do a fillrect the size of the > display with the color black. > > On Mon, 27 Jun 2005, James Lehman wrote: > > > Is there a way to ask the GPU on the video card to wipe out the data in the > > visible area of the screen? > > I have found it takes WAY to long to memset zeros to every line and keeping > > track of only those pixels that have changed seems like more work than it's > > worth. > > > > http://www.akrobiz.com/ezfb > > http://www.akrobiz.com/laserboy > > > > Thanks! > > Take care. ~James. :o) > > > > > > > > > > ------------------------------------------------------- > > SF.Net email is sponsored by: Discover Easy Linux Migration Strategies > > from IBM. Find simple to follow Roadmaps, straightforward articles, > > informative Webcasts and more! Get everything you need to get up to > > speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click > > _______________________________________________ > > Linux-fbdev-users mailing list > > Lin...@li... > > https://lists.sourceforge.net/lists/listinfo/linux-fbdev-users > > > > > ------------------------------------------------------- > SF.Net email is sponsored by: Discover Easy Linux Migration Strategies > from IBM. Find simple to follow Roadmaps, straightforward articles, > informative Webcasts and more! Get everything you need to get up to > speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click > _______________________________________________ > Linux-fbdev-users mailing list > Lin...@li... > https://lists.sourceforge.net/lists/listinfo/linux-fbdev-users > |
From: James L. <ja...@ak...> - 2005-07-24 05:39:42
|
Would someone send me a snipet of code that shows how to call the accelerator functions in fb_ops? All of the fun stuff seems to be defined inside of a #ifdef __KERNEL__ section. How do I get at this? Thanks! James. :o) ----- Original Message ----- From: "James Lehman" <ja...@ak...> To: <lin...@li...> Sent: Friday, July 01, 2005 10:17 PM Subject: Re: [Linux-fbdev-users] Blanking the screen : EZFB > OK. I've looked at the code quite a bit and I've done some searching... > Sorry if I'm getting into this and it has already been discussed, but are > there any online docs about what changed in the new 2.6 frame buffer vs. > 2.4? I see there is a thing called fb_info and it has a structure of > function pointers in it that look like they do some fabulous things. All I > create in my code is a user version of fix and var and a memmap to the video > ram. Are there some examples of instantiating an fb_info with fix and var > encapsulated inside of it? Please note: I've been into computers most of my > life for one reason only... For art. I really want to get this right. I just > got a Matrox G400 with 32MB ram. I can double buffer a screen of 1600x1200 @ > 32. Even with a waist of time like memsetting zeros to every pixel on the > screen for a wipe, it SMOKES! (in a good way). I also really want to get a > mouse pointer working. Is all this stuff I see about "cursor" relevant to > that or is that just character cell terminal block letter stuff? > > http://www.akrobiz.com/ezfb > http://www.akrobiz.com/laserboy > > Thanks! James. :o) > > > > > ----- Original Message ----- > From: "James Simmons" <jsi...@ww...> > To: <lin...@li...> > Sent: Tuesday, June 28, 2005 5:02 PM > Subject: Re: [Linux-fbdev-users] Blanking the screen : EZFB > > > > > > > > In 2.6.X the kernel side supports fillrect. Do a fillrect the size of the > > display with the color black. > > > > On Mon, 27 Jun 2005, James Lehman wrote: > > > > > Is there a way to ask the GPU on the video card to wipe out the data in > the > > > visible area of the screen? > > > I have found it takes WAY to long to memset zeros to every line and > keeping > > > track of only those pixels that have changed seems like more work than > it's > > > worth. > > > > > > http://www.akrobiz.com/ezfb > > > http://www.akrobiz.com/laserboy > > > > > > Thanks! > > > Take care. ~James. :o) > > > > > > > > > > > > > > > ------------------------------------------------------- > > > SF.Net email is sponsored by: Discover Easy Linux Migration Strategies > > > from IBM. Find simple to follow Roadmaps, straightforward articles, > > > informative Webcasts and more! Get everything you need to get up to > > > speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click > > > _______________________________________________ > > > Linux-fbdev-users mailing list > > > Lin...@li... > > > https://lists.sourceforge.net/lists/listinfo/linux-fbdev-users > > > > > > > > > ------------------------------------------------------- > > SF.Net email is sponsored by: Discover Easy Linux Migration Strategies > > from IBM. Find simple to follow Roadmaps, straightforward articles, > > informative Webcasts and more! Get everything you need to get up to > > speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click > > _______________________________________________ > > Linux-fbdev-users mailing list > > Lin...@li... > > https://lists.sourceforge.net/lists/listinfo/linux-fbdev-users > > > > > > ------------------------------------------------------- > SF.Net email is sponsored by: Discover Easy Linux Migration Strategies > from IBM. Find simple to follow Roadmaps, straightforward articles, > informative Webcasts and more! Get everything you need to get up to > speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click > _______________________________________________ > Linux-fbdev-users mailing list > Lin...@li... > https://lists.sourceforge.net/lists/listinfo/linux-fbdev-users > |
From: James S. <jsi...@ww...> - 2005-06-28 21:01:49
|
Interesting idea. Is this a pure software application? The writing suggest you modified the kernel. I haven't looked at the code. On Mon, 27 Jun 2005, James Lehman wrote: > Check this out! > > EZFB > http://www.akrobiz.com/ezfb/ > > Please let me know what you think! > > ~James. :o) > > > > > ----- Original Message ----- > From: "Roger Leigh" <rl...@wh...> > To: <lin...@li...> > Sent: Monday, June 27, 2005 4:46 PM > Subject: [Linux-fbdev-users] Endianness issues using the framebuffer > > > > -----BEGIN PGP SIGNED MESSAGE----- > > Hash: SHA1 > > > > Hi folks, > > > > I'm looking into writing a program which will use the framebuffer to > > display rendered fonts and some graphics. However, I've not yet found > > much in the way of programming documentation. Is there anything you > > would recommend? > > > > (I've looked at SDL, directfb and GGI sources, but they are very > > complex.) > > > > Using the comments in <linux/fb.h> and some simple examples I found, > > I've written the sample code below. However, none of the examples I > > saw made any use of the fb_bitfield information. I ran into problems > > when I tried my (i386 tested) code on a PPC. After fixing the code, > > it still doesn't work. I have the bizarre situation that if I run it > > under X11 (using XF86_FBDev), I see the glyphs rendered fine, but if I > > run it on the console the colours are mucked up, and I can't see any > > change in the bitfield data. > > > > Are there any examples of painting simple RGB pixel data onto any > > arbitrary framebuffer device which also works on big and little endian > > systems. I'm sure this is fairly simple once you know how! > > > > Additionally, is there any documentation about how colourmaps and the > > other framebuffer features work? > > > > > > Many thanks, > > Roger > > > > > > This program simply renders each ASCII character in turn and paints > > it. You might need to change the fb device and font path. It's > > currently hard-coded for RBG LCDs, but is simple to change for a CRT. > > > > Compile with > > c99 -o ft-lcd ft-lcd.c `freetype-config --cflags --libs` > > > > #include <unistd.h> > > #include <stdio.h> > > #include <stdlib.h> > > #include <fcntl.h> > > #include <linux/fb.h> > > #include <sys/ioctl.h> > > #include <sys/mman.h> > > > > #include <ft2build.h> > > #include FT_FREETYPE_H > > > > void fail (const char *reason) > > { > > fprintf (stderr, "%s\n", reason); > > exit (EXIT_FAILURE); > > } > > > > int > > main() > > { > > int fbfd = 0; > > struct fb_var_screeninfo vinfo; > > struct fb_fix_screeninfo finfo; > > long int screensize = 0; > > char *fbp = 0; > > int x = 0, y = 0; > > long int location = 0; > > > > // Open the file for reading and writing > > fbfd = open("/dev/fb/0", O_RDWR); > > if (fbfd < 0) > > fail("Error: cannot open framebuffer device."); > > > > // Get fixed screen information > > if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) > > fail("Error reading fixed information."); > > > > // Get variable screen information > > if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) > > fail("Error reading variable information."); > > > > printf("%ux%u (%ux%u), %ubpp\n", vinfo.xres, vinfo.yres, > > vinfo.xres_virtual, vinfo.yres_virtual, vinfo.bits_per_pixel ); > > printf("offsets: x=%u, y=%u\n", vinfo.xoffset, vinfo.yoffset); > > printf("red: o=%u, l=%u, mr=%u\n", vinfo.red.offset, vinfo.red.length, > vinfo.red.msb_right); > > printf("green: o=%u, l=%u, mr=%u\n", vinfo.green.offset, > vinfo.green.length, vinfo.green.msb_right); > > printf("blue: o=%u, l=%u, mr=%u\n", vinfo.blue.offset, > vinfo.blue.length, vinfo.blue.msb_right); > > printf("transp: o=%u, l=%u, mr=%u\n", vinfo.transp.offset, > vinfo.transp.length, vinfo.transp.msb_right); > > > > unsigned int red_max = 1 << vinfo.red.length; > > unsigned int green_max = 1 << vinfo.green.length; > > unsigned int blue_max = 1 << vinfo.blue.length; > > unsigned int transp_max = 1 << vinfo.transp.length; > > > > unsigned int red_mask = 0; > > for (unsigned int i=0; i<vinfo.red.length; ++i) > > red_mask |= 1 << (vinfo.red.offset + i); > > unsigned int green_mask = 0; > > for (unsigned int i=0; i<vinfo.green.length; ++i) > > green_mask |= 1 << (vinfo.green.offset + i); > > unsigned int blue_mask = 0; > > for (unsigned int i=0; i<vinfo.blue.length; ++i) > > blue_mask |= 1 << (vinfo.blue.offset + i); > > unsigned int transp_mask = 0; > > for (unsigned int i=0; i<vinfo.transp.length; ++i) > > transp_mask |= 1 << (vinfo.transp.offset + i); > > > > > > // Figure out the size of the screen in bytes > > 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) > > fail("Error: failed to map framebuffer device to memory.\n"); > > > > // Now setup FreeType > > FT_Library library; > > FT_Face face; > > > > int error = FT_Init_FreeType( &library ); > > if ( error ) > > { > > fail ("Failed to initialise FreeType"); > > } > > > > error = FT_New_Face( library, > "/usr/share/fonts/truetype/ttf-bitstream-vera/VeraMono.ttf", 0, &face ); > > if ( error == FT_Err_Unknown_File_Format ) > > { > > fail ("Unsupported font format"); > > } > > else if ( error ) > > { > > fail ("Error reading font file"); > > } > > > > error = FT_Set_Char_Size ( face, > > 0, > > 12 * 64, > > 100, > > 100 ); > > if (error) > > { > > fail ("Error setting char size"); > > } > > > > // Display each ASCII printable char > > for (FT_ULong n = 33; n < 127; ++n) > > { > > FT_UInt glyph_index = FT_Get_Char_Index (face, n); > > > > FT_Load_Glyph (face, > > glyph_index, > > FT_LOAD_DEFAULT|FT_LOAD_TARGET_LCD); > > > > error = FT_Render_Glyph (face->glyph, > > FT_RENDER_MODE_LCD); > > > > if (error) > > { > > fail ("Error rendering glyph"); > > } > > > > if (n == '_') > > continue; > > > > FT_Bitmap *bitmap = &face->glyph->bitmap; > > > > // printf ("Glyph '%c': %d * %d\n", (char) n, bitmap->width, > bitmap->rows); > > > > //printf ("Bitmap top: %d\nBitmap left: %d\n", > face->glyph->bitmap_top, > > // face->glyph->bitmap_left); > > > > for (y=0; y<200; ++y) > > for (x=0; x<200; ++x) > > { > > location = ((x + 0)+vinfo.xoffset) * > > (vinfo.bits_per_pixel/8) + > > ((y + 0)+vinfo.yoffset) * finfo.line_length; > > > > if ( vinfo.bits_per_pixel == 32 ) { > > unsigned int *pixel = (int *) (fbp + location); > > *pixel = 0; > > } > > } > > > > for (y=0; y<bitmap->rows; ++y) > > for (x=0; x< (bitmap->width / 3); ++x) > > { > > location = ((x + face->glyph->bitmap_left)+vinfo.xoffset) * > > (vinfo.bits_per_pixel/8) + > > ((y + face->glyph->bitmap_top)+vinfo.yoffset) * finfo.line_length; > > > > unsigned int r = *(bitmap->buffer + (y * bitmap->pitch) + (x*3 + 0)); > > // r *= (red_max /8); > > unsigned int g = *(bitmap->buffer + (y * bitmap->pitch) + (x*3 + 1)); > > // g *= (red_max /8); > > unsigned int b = *(bitmap->buffer + (y * bitmap->pitch) + (x*3 + 2)); > > // b *= (red_max /8); > > > > // printf("r=%u, g=%u, b=%u\n", r, g, b); > > > > if ( vinfo.bits_per_pixel == 32 ) { > > unsigned int *pixel = (int *) (fbp + location); > > *pixel = 0; > > > > // This works when I run under X11_FBDev (i.e. the > > // colours are correct), but if I run on the console, I > > // get a mess and mostly blue colours... > > > > *pixel |= ((r << vinfo.red.offset) & red_mask); > > *pixel |= ((g << vinfo.green.offset) & green_mask); > > *pixel |= ((r << vinfo.blue.offset) & blue_mask); > > > > } > > } > > > > sleep (1); > > > > } > > > > return 0; > > } > > > > > > - -- > > Roger Leigh > > Printing on GNU/Linux? http://gimp-print.sourceforge.net/ > > Debian GNU/Linux http://www.debian.org/ > > GPG Public Key: 0x25BFB848. Please sign and encrypt your > mail. > > -----BEGIN PGP SIGNATURE----- > > Version: GnuPG v1.4.1 (GNU/Linux) > > Comment: Processed by Mailcrypt 3.5.8 <http://mailcrypt.sourceforge.net/> > > > > iD8DBQFCwGWTVcFcaSW/uEgRAkt1AJ9n98Nx0sFOCSQz6FKJ4mftcnijLACgiW6A > > Ew9wJRanhXh419I9x6PRgzU= > > =2YCz > > -----END PGP SIGNATURE----- > > > > > > ------------------------------------------------------- > > SF.Net email is sponsored by: Discover Easy Linux Migration Strategies > > from IBM. Find simple to follow Roadmaps, straightforward articles, > > informative Webcasts and more! Get everything you need to get up to > > speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click > > _______________________________________________ > > Linux-fbdev-users mailing list > > Lin...@li... > > https://lists.sourceforge.net/lists/listinfo/linux-fbdev-users > > > > > > ------------------------------------------------------- > SF.Net email is sponsored by: Discover Easy Linux Migration Strategies > from IBM. Find simple to follow Roadmaps, straightforward articles, > informative Webcasts and more! Get everything you need to get up to > speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click > _______________________________________________ > Linux-fbdev-users mailing list > Lin...@li... > https://lists.sourceforge.net/lists/listinfo/linux-fbdev-users > |
From: Geert U. <ge...@li...> - 2005-06-28 09:29:09
|
On Mon, 27 Jun 2005, Roger Leigh wrote: > Are there any examples of painting simple RGB pixel data onto any > arbitrary framebuffer device which also works on big and little endian > systems. I'm sure this is fairly simple once you know how! http://www.sf.net/projects/linux-fbdev/ CVS module fbtest Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@li... In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds |