⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mga_vfb.c

📁 linux下显示各种格式图片
💻 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 + -