В консоли, вы можете сохранить содержание frame buffer.
Это общее доступное через /dev/fb0
, оно не ускорено, но надежно.
Вот небольшой пример с четкой функцией.
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <linux/fb.h>
#define red pixel {0xFF,0,0,0}
typedef struct s_Pixel {
char r;
char g;
char b;
char a;
}pixel;
typedef struct s_Framebuffer {
void* ptr;
int hauteur;
int largeur;
int linelength;
}Framebuffer;
void FB_close ();
void FB_init (Framebuffer *);
void FB_clear (int);
void FB_setPixel(int,int,char,char,char,char);
char *fbp;
int fbfd;
long int screensize;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
void FB_setPixel(int x, int y, char r, char g, char b, char a)
{
char * p = (char*)fbp + (x * 4) + (y * finfo.line_length);
p[0] = r;
p[1] = g;
p[2] = b;
p[3] = a;
}
void FB_close()
{
munmap(fbp, screensize);
close(fbfd);
}
void FB_init(Framebuffer* fb)
{
// Open the file for reading and writing
fbfd = open("/dev/fb0", O_RDWR);
if (fbfd == -1) {
perror("Error: cannot open framebuffer device");
exit(1);
}
// Get fixed screen information
if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo) == -1) {
perror("Error reading fixed information");
exit(2);
}
// Get variable screen information
if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo) == -1) {
perror("Error reading variable information");
exit(3);
}
// 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) {
perror("Error: failed to map framebuffer device to memory");
exit(4);
}
fb->ptr = fbp;
fb->largeur = vinfo.xres;
fb->hauteur = vinfo.yres;
fb->linelength = finfo.line_length;
FB_clear (0x0);
//trace(T1,"%dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);
}
void FB_clear(int color)
{
unsigned int x,y;
switch (vinfo.bits_per_pixel)
{
case 32:
memset((int*)fbp,color,screensize);
break;
default:
for (y=0;y<vinfo.yres;y++)
{
for (x=0;x<vinfo.xres;x++)
{
fbp[x * 4 + y *finfo.line_length] = 0x0;
fbp[1 + x * 4 + y * finfo.line_length] = 0x0;
fbp[2 + x * 4 + y * finfo.line_length] = 0x0;
}
}
break;
}
}
Если вы хотите accelereted рендеринга на фреймбуфере, поиск KMS.
Спасибо - попробуем это – graemegets