2014-04-17 2 views
0

Я ищу, как читать экранную память на текстовом экране. В основном я пишу приложение linux, которое использует расширенный набор символов (unicode), чтобы нарисовать «окно» на экране. Мне нужно подготовить область экрана, которую я собираюсь написать, чтобы я мог заменить эту область, когда «окно» закрыто.Доступ к текстовому экрану в Linux (Debian)

Благодаря

ответ

0

В консоли, вы можете сохранить содержание 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.

+0

Спасибо - попробуем это – graemegets

Смежные вопросы