?? graphic.c
字號:
/* make masks to mask out untouchable destination */ dest_beg_mask = ~((unsigned char)(-1) >> dest_off); dest_end_mask = (unsigned char)(-1) >> ((dest_off + w) & 7); if (dest_end_mask == (unsigned char)(-1)) { /* bit stupid */ dest_end_mask = 0; } //printf("dx=%d\n", dx); //dump_unit("dest_beg_mask", dest_beg_mask); //dump_unit("dest_end_mask", dest_end_mask); for (y = 0; y < h; y++) { // process one line register unsigned char *sp; register unsigned char *dp; register unsigned char mask = 0; register unsigned char left, right; unsigned char s, d; sp = src; dp = dest; for (x = 0; x < dest_n; x++, sp++, dp++) { // process one unit if (dx < 0) { // first, don't care about masks left = *sp << (-dx); right = *(sp+1) >> (8 + dx); } else if (dx > 0) { // first, don't care about masks left = *(sp-1) << (8-dx); right = *(sp) >> (dx); } else { left = *sp; right = 0; } s = left | right; // combine with destination switch (Mode) { case MODE_SRC: default: d = s; break; case MODE_NOT_SRC: d = ~s; break; case MODE_SRC_OR_DST: d = *dp | s; break; case MODE_SRC_AND_DST: d = *dp & s; break; case MODE_SRC_XOR_DST: d = *dp ^ s; break; case MODE_NOT_SRC_OR_DST: d = *dp | ~s; break; case MODE_NOT_SRC_AND_DST: d = *dp & ~s; break; case MODE_NOT_SRC_XOR_DST: d = *dp ^ ~s; break; case MODE_SRC_OR_NOT_DST: d = ~*dp | s; break; case MODE_SRC_AND_NOT_DST: d = ~*dp & s; break; case MODE_SRC_XOR_NOT_DST: d = ~*dp ^ ~s; break; } mask = 0; if (x == 0) { mask |= dest_beg_mask; } if (x == dest_n-1) { mask |= dest_end_mask; } *dp = (*dp & mask) | (d & ~mask); } src += src_units_per_line; dest += dest_units_per_line; }}void patternfill( short dest_x, short dest_y, short w, short h, unsigned char*dest, short dest_units_per_line) { /* todo: clip */ register char dx; unsigned short x,y; unsigned char src_off, dest_off; short dest_n; unsigned char dest_beg_mask, dest_end_mask; const Pattern *pattern = patterns[P_Index]; /* goto line y */ dest += dest_y * dest_units_per_line; /* goto UNIT-offset x */ dest += dest_x / 8; /* determine number of affected units per line */ dest_n = (dest_x + w + 8 - 1) / 8 - dest_x / 8; /* determine PIXEL-offsets */ dest_off = dest_x % 8; /* make masks to mask out untouchable destination */ dest_beg_mask = ~((unsigned char)(-1) >> dest_off); dest_end_mask = (unsigned char)(-1) >> ((dest_off + w) % 8); if (dest_end_mask == (unsigned char)(-1)) { /* bit stupid */ dest_end_mask = 0; } for (y = 0; y < h; y++) { // process one line register unsigned char *dp; register unsigned char mask = 0; unsigned char s=pattern->data[(dest_y+y)%pattern->height], d; dp = dest; for (x = 0; x < dest_n; x++, dp++) { // combine with destination switch (Mode) { case MODE_SRC: default: d = s; break; case MODE_NOT_SRC: d = ~s; break; case MODE_SRC_OR_DST: d = *dp | s; break; case MODE_SRC_AND_DST: d = *dp & s; break; case MODE_SRC_XOR_DST: d = *dp ^ s; break; case MODE_NOT_SRC_OR_DST: d = *dp | ~s; break; case MODE_NOT_SRC_AND_DST: d = *dp & ~s; break; case MODE_NOT_SRC_XOR_DST: d = *dp ^ ~s; break; case MODE_SRC_OR_NOT_DST: d = ~*dp | s; break; case MODE_SRC_AND_NOT_DST: d = ~*dp & s; break; case MODE_SRC_XOR_NOT_DST: d = ~*dp ^ ~s; break; } mask = 0; if (x == 0) { mask |= dest_beg_mask; } if (x == dest_n-1) { mask |= dest_end_mask; } *dp = (*dp & mask) | (d & ~mask); } dest += dest_units_per_line; }}short initgraph(void){ struct fb_var_screeninfo screeninfo; screen_fd = open("/dev/fb0", O_RDWR); if (screen_fd == -1) { perror("Unable to open frame buffer device /dev/fb0"); return 0; } if (ioctl(screen_fd, FBIOGET_VSCREENINFO, &screeninfo)==-1) { perror("Unable to retrieve framebuffer information"); return 0; } //screen_width = screeninfo.xres_virtual; screen_width = 240;//screeninfo.xres_virtual; //screen_height = screeninfo.yres_virtual; screen_height = 320;//screeninfo.yres_virtual; //lyk modified it //E_Font = (unsigned char*)(screeninfo.english_font); //printf("E_Font Address %x %x\n",E_Font,screeninfo.english_font); //if(!E_Font) //E_Font=(unsigned char*)(0x8804); //E_Font=(unsigned char*)(0x8812); E_Font=fontdata_8x16;//(unsigned char*)(0x0004a690); screen_ptr = mmap(NULL, ((screen_height * screen_width*2)/4096+1)*4096, PROT_READ|PROT_WRITE, /*0*/MAP_SHARED, screen_fd, 0); printf("sc_ptr=%x\n",screen_ptr); if (screen_ptr==MAP_FAILED) { perror("Unable to mmap frame buffer"); close(screen_fd); return 0; } C_Font=fopen(CHINESE_FONT_FILE,"rb"); if(!C_Font) { perror("Unable to open Chinese font file"); close(screen_fd); return 0; } Color=1; return 1;}void closegraph(){ if(screen_fd!=-1) { close(screen_fd); } if(C_Font) fclose(C_Font);}void XY_clearscreen(unsigned short x1,unsigned short y1,unsigned short x2,unsigned short y2){unsigned short i=0, h_y=y2-y1+1,w_x=x2-x1+1;// for(i=0;i<h_y;i++)// memset(screen_ptr+240*2*y1+2*x1+i*240*2,0,w_x*2); memset(screen_ptr+240*2*y1+2*x1,0,h_y*w_x*2);}void clearscreen(){ memset(screen_ptr,0,screen_width*screen_height*2);}void clearscreen_white(){ memset(screen_ptr,0xff,screen_width*screen_height*2);}void draw_xbm(short sx, short sy, short width, short height, char* pixel){ short i, j, k, t,l=(width>>=3)*height,m,wid=screen_width>>3; short d,off; char *loc=screen_ptr+(off=((sy*screen_width+sx)>>3)); for(k=0,i=0;i<height;i++,k+=wid) for(j=0;(j<width)&&(j<20);j++) { d=0; for(m=0;m<8;m++) if(pixel[k+j]&masktab[m]) d|=masktab[7-m]; t=k+j; if((t+off)>=3200) return; loc[t]=d; }}void draw_bmp(short sx, short sy, short rwidth, short height, char* pixel,unsigned short color,unsigned short groundcolor){ short i, j, k; char flag=0; char *loc=screen_ptr+sx*2+sy*240*2; for(j=0;j<height;j++) for(k=0;k<rwidth;k++) for(i=0;i<8;i++) {flag= *(pixel+j*rwidth+k) & masktab[i]; if(flag) {// *(loc+j*240*2+k*16+i*2)=0x00; // *(loc+j*240*2+k*16+i*2+1)=0x00; *(unsigned short*)(loc+j*240*2+k*16+i*2)=color; } else{// *(loc+j*240*2+k*16+i*2)=0xff; // *(loc+j*240*2+k*16+i*2+1)=0xff; *(unsigned short*)(loc+j*240*2+k*16+i*2)=groundcolor; } }}void my_draw_bmp(short x,short y,unsigned short width,unsigned short height,char *pixel){short i,j; long aver_size=((width+31)/32)*4; char masktab[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; for(j=0;(y+j)<ScreenHeight&&(y+j)>=0&&j<height;j++) //0---height; for(i=0;(x+i)<ScreenWidth&&(x+i)>=0&&i<width;i++) //0---width ; if(*(pixel+j*aver_size+i/8) & masktab[i%8])//judge pixel "0"or "1"; { *(screen_ptr+(y+j)*ScreenWidth*2+2*(i+x))=0x00; *(screen_ptr+(y+j)*ScreenWidth*2+2*(i+x)+1)=0x00; } else{ *(screen_ptr+(y+j)*ScreenWidth*2+2*(i+x))=0xff; *(screen_ptr+(y+j)*ScreenWidth*2+2*(i+x)+1)=0xff; }}inline void color_dot_bmp(short x,short y,char *buf) {if(y>0&&y<ScreenHeight) if(x>0&&x<ScreenWidth) {*(screen_ptr+y*240*2+2*x)=*buf; *(screen_ptr+y*240*2+2*x+1)=*(buf+1); } }void color_555_draw_bmp(short x,short y,unsigned short width,unsigned short height,char *buf){ long i,j,offset; unsigned short tmp,red,green,blue; for(j=y;j<ScreenHeight&&(j-y)<height;j++) for(i=x;i<ScreenWidth&&(i-x)<width;i++) { offset=(j-y)*width*2+(i-x)*2; tmp=*(unsigned short*)(buf+offset); red=(tmp&0x7c00)<<1; green=(tmp&0x03e0)<<1; tmp&=0x001f; tmp|=red|green; *(unsigned short*)(screen_ptr+j*240*2+2*i)=tmp; } }void color_565_draw_bmp(short x,short y,unsigned short width,unsigned short height,char *buf){ long i,j,offset; unsigned short tmp,red,green,blue; for(j=y;j<ScreenHeight&&(j-y)<height;j++) for(i=x;i<ScreenWidth&&(i-x)<width;i++) { offset=(j-y)*width*2+(i-x)*2; tmp=*(unsigned short*)(buf+offset); /*red=tmp&0xf800; green=(tmp&0x07e0); tmp=tmp&0x001f; tmp=red|green|tmp; */ *(unsigned short*)(screen_ptr+j*ScreenWidth*2+2*i)=tmp; /* *(screen_ptr+j*ScreenWidth*2+2*i)=*(buf+offset); *(screen_ptr+j*ScreenWidth*2+2*i+1)=*(buf+offset+1);*/ }}/////////////void testbmp(){long i,j; short k=0x20;for(j=0;j<160;j++){ for(i=0;i<240;i++) { *(screen_ptr+j*240*2+2*i)=0x00; *(screen_ptr+j*240*2+2*i+1)=0x40; }// k=k+2;}}////////////////////////////* void ShowBMP_16_color(char *filename,short x,short y){ BMPHEAD bmp_inf; FILE *fp; char Tmp,c,*buf,*buf1,*buf2; int width,height; int bmptype=0; long size,i,j,k; fp=fopen(filename,"rb"); if(!fp) return;fseek(fp,2L,0); fread(&bmp_inf.bfSize,1,52,fp); if(bmp_inf.biBitCount!=16) { fclose(fp); puts("Unsupported 16_color bitmap!\n"); printf("bitcolor=%d\n",bmp_inf.biBitCount); return; }s1: printf("%d* %d\n",bmp_inf.biWidth,bmp_inf.biHeight); size=bmp_inf.biWidth*bmp_inf.biHeight*2; buf=(char*)malloc(size); fseek(fp,70L,0); fread(buf,1,size,fp); fclose(fp); for(i=0;i<(bmp_inf.biHeight>>1);i++) for(k=i*bmp_inf.biWidth*2,j=0;j<bmp_inf.biWidth*2;j++) { Tmp=buf[k+j]; buf[k+j]=buf[size-k-bmp_inf.biWidth*2+j]; buf[size-k-bmp_inf.biWidth*2+j]=Tmp; } color_555_draw_bmp(x,y, bmp_inf.biWidth,bmp_inf.biHeight,buf); // else// color_565_draw_bmp(x,y,bmp_inf.biWidth,bmp_inf.biHeight,buf); free(buf);}*//*void ShowBMP_24_color(char *filename,short x,short y) {BMPHEAD bmp_inf; FILE *fp; char Tmp,c,*buf,*buf1,*buf2; int width,height; int bmptype=0; long size,i,j,k,m; short red,green,blue; float redtmp,greentmp,bluetmp; fp=fopen(filename,"rb"); if(!fp) return; fseek(fp,2L,0); fread(&bmp_inf.bfSize,1,52,fp); if(bmp_inf.biBitCount!=24) { fclose(fp); puts("Unsupported 24_color bitmap!\n"); printf("bitcolor=%d\n",bmp_inf.biBitCount); return;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -