📄 mga_vfb.c
字号:
/* Framebuffer unit */#include "../mga_view.h"#include "mga_vfb.h"__u16 rr[256],gg[256],bb[256];struct fb_cmap oldcmap={0,256,rr,gg,bb} ;void clear_bottom(){ if (is_matrox==0) { system("clear"); dest=fb_mem; dest+=((fb_vinfo.yres-10)*fb_vinfo.bits_per_pixel/8)*fb_vinfo.xres; for (y=fb_vinfo.yres-10;y<fb_vinfo.yres;y++){ for (x=0;x<fb_vinfo.xres;x++){ for (i=0;i<fb_vinfo.bits_per_pixel/8;i++) *dest++=0; } } }}int init_fb(){ fb_dev_name="/dev/fb0"; if ((fb_dev_fd = open(fb_dev_name, O_RDWR)) == -1) { fprintf(stderr,"\x1B[0;31mCouldn`t open \x1B[1;31m/dev/fb0\x1B[0;0m\n"); exit(1); } ioctl(fb_dev_fd, FBIOGET_VSCREENINFO, &fb_vinfo); ioctl(fb_dev_fd, FBIOGET_FSCREENINFO, &fb_fix); if (fb_vinfo.bits_per_pixel==8) ioctl(fb_dev_fd, FBIOGETCMAP, &oldcmap); if (iksy==0) { tx=fb_vinfo.xres; ty=fb_vinfo.yres; } fb_mem=mmap(NULL,fb_fix.smem_len,PROT_READ|PROT_WRITE,MAP_SHARED,fb_dev_fd,0);// fb_mem2=fb_mem; return 0;}void write_to_fb(uint8_t *r,uint8_t *g,uint8_t *b){ int h,w; uint8_t temp,temp2,temp3; struct fb_cmap kolor; if (fb_vinfo.bits_per_pixel==8) { kolor.start = 0; kolor.len = 255; kolor.red = malloc(256 * sizeof(__u16)); kolor.green = malloc(256 * sizeof(__u16)); kolor.blue = malloc(256 * sizeof(__u16)); kolor.transp = 0; for (i=0;i<256;i++) { kolor.red[i]=0; kolor.green[i]=0; kolor.blue[i]=0; } } dest=fb_mem; if (fb_vinfo.xres>image_x) { dest+=(((fb_vinfo.xres-image_x)/2)*fb_vinfo.bits_per_pixel/8); } if (fb_vinfo.yres>image_y) { dest+=((((fb_vinfo.yres-image_y)/2)+fb_vinfo.yoffset)*fb_vinfo.bits_per_pixel/8)*fb_vinfo.xres; }#ifdef USE_X if (iksy==1) { XMoveResizeWindow(display,window,3,20,image_x,image_y); XFlush(display); }#endif for (h=0;h<image_y;h++){ for (w=0;w<image_x;w++){ if (fb_vinfo.bits_per_pixel==16 && iksy==0) { temp=*r++; temp2=*b++; temp3=*g++; *dest++=((temp3 & 0x1c)<<3)+((temp2 & 0xf8)>>3); *dest++=((temp & 0xf8))+((temp3 & 0xe0)>>5); } if (fb_vinfo.bits_per_pixel==24 && iksy==0) { *dest++ =*b++; *dest++ =*g++; *dest++ =*r++; } if (fb_vinfo.bits_per_pixel==32 && iksy==0) { *dest++ =*b++; *dest++ =*g++; *dest++ =*r++; *dest++ =0; } if (fb_vinfo.bits_per_pixel==8 && iksy==0) { temp=(*r++)*0.92; temp2=(*g++)*0.92; temp3=(*b++)*0.92; kolor.red[((temp & 0xc0))+((temp2 & 0xf0)>>2)+((temp3 & 0xc0)>>6)]=temp*256; kolor.green[((temp & 0xc0))+((temp2 & 0xf0)>>2)+((temp3 & 0xc0)>>6)]=temp2*256; kolor.blue[((temp & 0xc0))+((temp2 & 0xf0)>>2)+((temp3 & 0xc0)>>6)]=temp3*256; *dest++ =(((temp & 0xc0))+ ((temp2 & 0xf0)>>2)+ ((temp3 & 0xc0)>>6)); }#ifdef USE_X if (iksy==1) { XSetForeground(display,gc,((*r++)*256*256)+((*g++)*256)+(*b++)); XDrawPoint(display,window,gc,w,h); }#endif } dest+=(fb_vinfo.xres-image_x)*(fb_vinfo.bits_per_pixel/8); } if (fb_vinfo.bits_per_pixel==8) { ioctl(fb_dev_fd, FBIOPUTCMAP, &kolor); } }void draw_image_fb(){ int xxx,yyy; if (ori==1) { rotate_img(); } xxx=image_x-dodajx; yyy=image_y-dodajy; i=0;scale_x=1;scale_y=1; if ((image_x>fb_vinfo.xres) || (image_y>fb_vinfo.yres)) { scale_x=(float)fb_vinfo.xres/image_x; scale_y=(float)fb_vinfo.yres/image_y; if (scale_x<scale_y) scale_y=scale_x; else scale_x=scale_y; i=0;j=0; for (y=0;y<image_y;y++) { for (x=0;x<image_x;x++) { tabr[(int)((x*scale_x)+j)]=(tabr[i]+tabr[i+1])/2; tabg[(int)((x*scale_x)+j)]=(tabg[i]+tabg[i+1])/2; tabb[(int)((x*scale_x)+j)]=(tabb[i]+tabb[i+1])/2; i++; } j=j+(int)(scale_x*xxx); } image_x=(int)(scale_x*xxx); i=0; for (y=0;y<image_y-dodajy;y++) { for (x=0;x<image_x;x++) { tabr[x+((int)(y*scale_x))*image_x]=(tabr[i]+tabr[i+1])/2; tabg[x+((int)(y*scale_x))*image_x]=(tabg[i]+tabg[i+1])/2; tabb[x+((int)(y*scale_x))*image_x]=(tabb[i]+tabb[i+1])/2; i++; } } image_y=(int)(scale_y*yyy); fprintf(stderr,"Scaling to : %ix%i\n",image_x,image_y); } i=0; for (y=0;y<image_y;y++) for (x=0;x<image_x;x++) { y_image[i]=tabr[x+(y*image_x)]; cr_image[i]=tabg[x+(y*image_x)]; cb_image[i++]=tabb[x+(y*image_x)]; } if (grey==0) write_to_fb(y_image,cr_image,cb_image); else write_to_fb(y_image,y_image,y_image); }int fb_fs(){int xx,yy; if (fullscr<2) fullscr++; else fullscr=0; if (((image_x==fb_vinfo.xres) && (image_y==fb_vinfo.yres))) return 1; if (((image_x==fb_vinfo.xres) || (image_y==fb_vinfo.yres)) && (fullscr==1)) fullscr=2; clear_bottom(); xx=image_x; yy=image_y; i=0; if (fullscr==2) { scale_x=(float)fb_vinfo.xres/image_x; scale_y=(float)fb_vinfo.yres/image_y; for (y=0;y<fb_vinfo.yres;y++) for (x=0;x<fb_vinfo.xres;x++) { y_image[x+(y*fb_vinfo.xres)]=tabr[(int)(x*(1/scale_x))+(int)(y*(1/scale_y))*image_x]; if (grey==0) { cr_image[x+(y*fb_vinfo.xres)]=tabg[(int)(x*(1/scale_x))+(int)(y*(1/scale_y))*image_x]; cb_image[x+(y*fb_vinfo.xres)]=tabb[(int)(x*(1/scale_x))+(int)(y*(1/scale_y))*image_x]; } } image_x=fb_vinfo.xres; image_y=fb_vinfo.yres; } if (fullscr==1) { scale_x=(float)fb_vinfo.xres/image_x; scale_y=(float)fb_vinfo.yres/image_y; if (scale_x<scale_y) scale_y=scale_x; else scale_x=scale_y; for (y=0;y<(int)(image_y*scale_y);y++) for (x=0;x<(int)(image_x*scale_x);x++) { y_image[x+(y*(int)(image_x*scale_x))]=tabr[(int)(x*(1/scale_x))+(int)(y*(1/scale_y))*image_x]; if (grey==0) { cr_image[x+(y*(int)(image_x*scale_x))]=tabg[(int)(x*(1/scale_x))+(int)(y*(1/scale_y))*image_x]; cb_image[x+(y*(int)(image_x*scale_x))]=tabb[(int)(x*(1/scale_x))+(int)(y*(1/scale_y))*image_x]; } } image_x=(int)(image_x*scale_x); image_y=(int)(image_y*scale_y); } if ((fullscr==1) || (fullscr==2)) { if (grey==0) write_to_fb(y_image,cr_image,cb_image); else write_to_fb(y_image,y_image,y_image); } else draw_image_fb(); image_x=xx; image_y=yy; return 1;}void fb_grey(){ if (grey==0) grey++; else grey=0; if (grey==0) { if (zmgm==3) zmgm=1; if (zmgm==4) zmgm=2; } if (grey==1) { if (zmgm==1) zmgm=3; if (zmgm==2) zmgm=4; } if (grey==1) { i=0; memcpy(tab2r,tabr,image_x*image_y); for (y=0;y<image_y;y++) for (x=0;x<image_x;x++) { tabr[x+(y*image_x)]=y_image[i++]; } } if (grey==0) { memcpy(tabr,tab2r,image_x*image_y); } if (((image_x==fb_vinfo.xres) && (image_y==fb_vinfo.yres))) draw_image_fb(); if (fullscr>0) fullscr--; else fullscr=2; fb_fs(); }void restore_pal(){ oldcmap.start=0; oldcmap.len=255; ioctl(fb_dev_fd,FBIOPUTCMAP,&oldcmap);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -