📄 fb.c
字号:
#include "fb.h"int fb_init(){ static int fb_inited = 0; char *dev, *env; if (fb_inited) return 0; fb = malloc(sizeof(FRAMEBUFFER)); if (!fb) { fprintf(stderr, "malloc: %s\n", strerror(errno)); exit(1); } env = getenv("FRAMEBUFFER"); if (env) dev = env; else dev = DEFAULT_FRAMEBUFFER; if ((fb->fbh = open(dev, O_RDWR)) == -1) { fprintf(stderr, "open %s: %s\n", dev, strerror(errno)); exit(1); } if (ioctl(fb->fbh, FBIOGET_VSCREENINFO, &fb->fbinfo)) { fprintf(stderr, "ioctl FBIOGET_VSCREENINFO: %s\n", strerror(errno)); exit(1); } fb->fbsize = fb->fbinfo.xres * fb->fbinfo.yres * fb->fbinfo.bits_per_pixel / 8; fb->fbmem = mmap(NULL, fb->fbsize, PROT_WRITE | PROT_READ, MAP_SHARED, fb->fbh, 0); if (fb->fbmem == MAP_FAILED) { fprintf(stderr, "mmap: %s\n", strerror(errno)); exit(1); } fb->fbclone = malloc(fb->fbsize); if (!fb->fbclone) { fprintf(stderr, "malloc: %s\n", strerror(errno)); exit(1); } fb_inited = 1; fb->init=fb_init; fb->release=fb_release; fb->snap=fb_snap; fb->refresh=fb_refresh; fb->blit=fb_blit; fb->convert=fb_convert; fb_clear(); return 0;}void fb_release(){ if (fb) { munmap(fb->fbmem, fb->fbsize); free(fb->fbclone); close(fb->fbh); free(fb); }}void fb_snap(){ memcpy(fb->fbclone, fb->fbmem, fb->fbsize);}void fb_refresh(){ memcpy(fb->fbmem, fb->fbclone, fb->fbsize);}void fb_clear(){ memset(fb->fbclone, 0x0, fb->fbsize); memcpy(fb->fbmem, fb->fbclone, fb->fbsize);}inline unsigned char make8color(unsigned char r, unsigned char g, unsigned char b){ return ((((r >> 5) & 7) << 5) | (((g >> 5) & 7) << 2) | ((b >> 6) & 3));}inline unsigned short make15color(unsigned char r, unsigned char g, unsigned char b){ return ((((r >> 3) & 31) << 10) | (((g >> 3) & 31) << 5) | ((b >> 3) & 31));}inline unsigned short make16color(unsigned char r, unsigned char g, unsigned char b){ return ((((r >> 3) & 31) << 11) | (((g >> 2) & 63) << 5) | ((b >> 3) & 31));}void *fb_convert(unsigned char *rgbbuff, unsigned long count, int bpp){ unsigned long i; void *fbbuff = NULL; unsigned char *c_fbbuff; unsigned short *s_fbbuff; unsigned int *i_fbbuff; switch (bpp) { case 8: c_fbbuff = (unsigned char *) malloc(count * sizeof(unsigned char)); for (i = 0; i < count; i++) c_fbbuff[i] = make8color(rgbbuff[i * 3], rgbbuff[i * 3 + 1], rgbbuff[i * 3 + 2]); fbbuff = (void *) c_fbbuff; break; case 15: s_fbbuff = (unsigned short *) malloc(count * sizeof(unsigned short)); for (i = 0; i < count; i++) s_fbbuff[i] = make15color(rgbbuff[i * 3], rgbbuff[i * 3 + 1], rgbbuff[i * 3 + 2]); fbbuff = (void *) s_fbbuff; break; case 16: s_fbbuff = (unsigned short *) malloc(count * sizeof(unsigned short)); for (i = 0; i < count; i++) s_fbbuff[i] = make16color(rgbbuff[i * 3], rgbbuff[i * 3 + 1], rgbbuff[i * 3 + 2]); fbbuff = (void *) s_fbbuff; break; case 24: case 32: i_fbbuff = (unsigned int *) malloc(count * sizeof(unsigned int)); for (i = 0; i < count; i++) i_fbbuff[i] = ((rgbbuff[i * 3] << 16) & 0xFF0000) | ((rgbbuff[i * 3 + 1] << 8) & 0xFF00) | (rgbbuff[i * 3 + 2] & 0xFF); fbbuff = (void *) i_fbbuff; break; default: fprintf(stderr, "Unsupported video mode! You've got: %dbpp\n", bpp); exit(1); } return fbbuff;}void fb_blit(unsigned char *image, int x, int y, int width, int height){ int i, xc, yc; unsigned char *fbptr;#if 10 if (!fb) return; if (fb->fbinfo.xres == width && fb->fbinfo.yres == height) { memcpy(fb->fbmem, image, fb->fbsize); } else { fb_snap(); xc = (width > fb->fbinfo.xres) ? fb->fbinfo.xres : width; yc = (height > fb->fbinfo.yres) ? fb->fbinfo.yres : height; fbptr = fb->fbclone + (y * fb->fbinfo.xres + x) * fb->fbinfo.bits_per_pixel / 8; for (i = 0; i < yc; i++, fbptr += fb->fbinfo.xres * fb->fbinfo.bits_per_pixel / 8, image += width * fb->fbinfo.bits_per_pixel / 8) memcpy(fbptr, image, xc * fb->fbinfo.bits_per_pixel / 8); memcpy(fb->fbmem, fb->fbclone, fb->fbsize); }#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -