📄 display.c
字号:
cy=bmpinfoheader.biHeight; nbyte=bmpinfoheader.biBitCount/8; OSSemPend(Lcd_Disp_Sem, 0, &err); for(i=cy-1;i>=0;i--){ pbmp=bmp; if(!ReadOSFile(pfile, bmp,cx*nbyte+((cx*nbyte)%2))) break; for(j=0;j<cx;j++){ color=*pbmp; for(k=0;k<nbyte-1;k++){ color<<=8; pbmp++; color|=*pbmp; } pbmp++; SetPixel(pdc,x+j, y+i, color); } } OSSemPost(Lcd_Disp_Sem); CloseOSFile(pfile); if(pdc->bUpdataBuffer) OSMboxPost(LCDFresh_MBox,(void*)1); //刷新LCD}void SetDrawOrg(PDC pdc, int x,int y, int* oldx, int *oldy) //设置绘图的原点{ *oldx=pdc->DrawOrgx; *oldy=pdc->DrawOrgy; pdc->DrawOrgx=x; pdc->DrawOrgy=y;}void SetDrawRange(PDC pdc, int x,int y, int* oldx, int *oldy) //设置绘图的范围{ *oldx=pdc->DrawRangex; *oldy=pdc->DrawRangey; if(x==0 && y==0) return; pdc->DrawRangex=x; pdc->DrawRangey=y; if(ABS(x)<=1) pdc->DrawRangex=y*LCDWIDTH/LCDHEIGHT; if(x==-1) //左右镜像 pdc->DrawRangex=-pdc->DrawRangex; if(ABS(y)<=1) pdc->DrawRangey=x*LCDHEIGHT/LCDWIDTH; if(y==-1) //上下镜像 pdc->DrawRangey=-pdc->DrawRangey;}////////////////////////有延时的绘图///////////////////////////////void DrawSBresenham_LineDelay(PDC pdc, int x1, int y1,int x2, int y2, int ticks){ INT8U err; int x, y,dx,dy; int e,i; dx=x2-x1; dy=y2-y1; x=x1; y=y1; if ( ABS(dx) >= ABS(dy) ){ if ( dx >= 0 && dy>=0 ){ e = -dx; for ( i = 0; i <= dx; i++ ) { OSSemPend(Lcd_Disp_Sem,0, &err); SetPixel(pdc,x++,y,pdc->PenColor); e += 2 * dy; if (e >= 0) { y = y + 1; e -= 2 * dx; } OSTimeDly(ticks); OSSemPost(Lcd_Disp_Sem); OSMboxPost(LCDFresh_MBox,(void*)1); //刷新LCD } } else if( dx < 0 && dy<0 ){ e = -dx; for ( i = 0; i >= dx; i-- ){ OSSemPend(Lcd_Disp_Sem,0, &err); SetPixel(pdc,x--,y,pdc->PenColor); e += 2 * dy; if (e <= 0) { y = y - 1; e -= 2 * dx; } OSTimeDly(ticks); OSSemPost(Lcd_Disp_Sem); OSMboxPost(LCDFresh_MBox,(void*)1); //刷新LCD } } else if(dx>=0 && dy<=0){ e = dx; for ( i = 0; i <= dx; i++ ){ OSSemPend(Lcd_Disp_Sem,0, &err); SetPixel(pdc,x++,y,pdc->PenColor); e += 2 * dy; if (e <= 0) { y = y - 1; e += 2 * dx; } OSTimeDly(ticks); OSSemPost(Lcd_Disp_Sem); OSMboxPost(LCDFresh_MBox,(void*)1); //刷新LCD } } else{ //dx<0 && dy>0 e = dx; for ( i = 0; i >= dx; i-- ){ OSSemPend(Lcd_Disp_Sem,0, &err); SetPixel(pdc,x--,y,pdc->PenColor); e += 2 * dy; if (e >= 0) { y = y + 1; e += 2 * dx; } OSTimeDly(ticks); OSSemPost(Lcd_Disp_Sem); OSMboxPost(LCDFresh_MBox,(void*)1); //刷新LCD } } } else{ if ( dx >= 0 && dy>=0 ){ e = -dy; for ( i = 0; i <= dy; i++ ) { OSSemPend(Lcd_Disp_Sem,0, &err); SetPixel(pdc,x,y++,pdc->PenColor); e += 2 * dx; if (e >= 0) { x = x + 1; e -= 2 * dy; } OSTimeDly(ticks); OSSemPost(Lcd_Disp_Sem); OSMboxPost(LCDFresh_MBox,(void*)1); //刷新LCD } } else if( dx < 0 && dy<0 ){ e = -dy; for ( i = 0; i >= dy; i-- ){ OSSemPend(Lcd_Disp_Sem,0, &err); SetPixel(pdc,x,y--,pdc->PenColor); e += 2 * dx; if (e <= 0) { x = x - 1; e -= 2 * dy; } OSTimeDly(ticks); OSSemPost(Lcd_Disp_Sem); OSMboxPost(LCDFresh_MBox,(void*)1); //刷新LCD } } else if(dx<=0 && dy>=0){ e = dy; for ( i = 0; i <= dy; i++ ){ OSSemPend(Lcd_Disp_Sem,0, &err); SetPixel(pdc,x,y++,pdc->PenColor); e += 2 * dx; if (e <= 0) { x = x - 1; e += 2 * dy; } OSTimeDly(ticks); OSSemPost(Lcd_Disp_Sem); OSMboxPost(LCDFresh_MBox,(void*)1); //刷新LCD } } else{ //dx>0 && dy<0 e = dy; for ( i = 0; i >= dy; i-- ){ OSSemPend(Lcd_Disp_Sem,0, &err); SetPixel(pdc,x,y--,pdc->PenColor); e += 2 * dx; if (e >= 0) { x = x + 1; e += 2 * dy; } OSTimeDly(ticks); OSSemPost(Lcd_Disp_Sem); OSMboxPost(LCDFresh_MBox,(void*)1); //刷新LCD } } }}void LineToDelay(PDC pdc, int x, int y, int ticks){ int i,j; int x1,x2,y1,y2; INT8U err; if(pdc->DrawPointx==x){ //画垂直线 if(pdc->DrawPointy<y){ for(i=pdc->DrawPointy-(pdc->PenWidth-1)/2;i<=y+pdc->PenWidth/2;i++){ OSSemPend(Lcd_Disp_Sem,0, &err); for(j=-(pdc->PenWidth-1)/2;j<=pdc->PenWidth/2;j++){ SetPixel(pdc,x+j,i,pdc->PenColor); } OSTimeDly(ticks); OSSemPost(Lcd_Disp_Sem); OSMboxPost(LCDFresh_MBox,(void*)1); //刷新LCD } } else{ for(i=pdc->DrawPointy+pdc->PenWidth/2;i>=y-(pdc->PenWidth-1)/2;i--){ OSSemPend(Lcd_Disp_Sem,0, &err); for(j=-(pdc->PenWidth-1)/2;j<=pdc->PenWidth/2;j++){ SetPixel(pdc, x+j,i,pdc->PenColor); } OSTimeDly(ticks); OSSemPost(Lcd_Disp_Sem); OSMboxPost(LCDFresh_MBox,(void*)1); //刷新LCD } } pdc->DrawPointy=y; return; } if(pdc->DrawPointy==y){ //画水平线 if(pdc->DrawPointx<x){ for(i=pdc->DrawPointx-(pdc->PenWidth-1)/2;i<=x+pdc->PenWidth/2;i++){ OSSemPend(Lcd_Disp_Sem,0, &err); for(j=-(pdc->PenWidth-1)/2;j<=pdc->PenWidth/2;j++){ SetPixel(pdc,i,y+j,pdc->PenColor); } OSTimeDly(ticks); OSSemPost(Lcd_Disp_Sem); OSMboxPost(LCDFresh_MBox,(void*)1); //刷新LCD } } else{ for(i=pdc->DrawPointx+pdc->PenWidth/2;i>=x-(pdc->PenWidth-1)/2;i--){ OSSemPend(Lcd_Disp_Sem,0, &err); for(j=-(pdc->PenWidth-1)/2;j<=pdc->PenWidth/2;j++){ SetPixel(pdc, i,y+j,pdc->PenColor); } OSTimeDly(ticks); OSSemPost(Lcd_Disp_Sem); OSMboxPost(LCDFresh_MBox,(void*)1); //刷新LCD } } pdc->DrawPointx=x; return; } for(i=-(pdc->PenWidth-1)/2;i<=pdc->PenWidth/2;i++){ x1=pdc->DrawPointx+(i+1)/2; x2=x+(i+1)/2; y1=(pdc->DrawPointx-x)*i/2/(y-pdc->DrawPointy)+pdc->DrawPointy; y2=(pdc->DrawPointx-x)*i/2/(y-pdc->DrawPointy)+y; DrawSBresenham_LineDelay(pdc,x1,y1,x2,y2,ticks); } pdc->DrawPointx=x; pdc->DrawPointy=y;}//画顺圆void ArcToDelay1(PDC pdc, int x1, int y1, int R, int ticks){ int delta, delta1, delta2, direction,x0,y0,dAB2,x2,y2; int tmpx,tmpy; double tmp; INT8U err; x2=pdc->DrawPointx; y2=pdc->DrawPointy; tmpx=x1-x2; tmpy=y1-y2; dAB2=tmpx*tmpx+tmpy*tmpy; if(dAB2==0) return; if(R*2>dAB2) return; tmp=sqrt(((double)R*R)/((double)dAB2)-0.25); if(R>0){//劣弧 x0=(int)(0.5*(x1-x2)+tmp*(y1-y2)+x2); //圆心坐标 y0=(int)(0.5*(y1-y2)-tmp*(x1-x2)+y2); } else{ //优弧 x0=(int)(0.5*(x1-x2)-tmp*(y1-y2)+x2); //圆心坐标 y0=(int)(0.5*(y1-y2)+tmp*(x1-x2)+y2); } x2-=x0; y2-=y0; x1-=x0; y1-=y0; delta=Getdelta1(x2,y2, R); while ( ABS(x1-x2)>1 || ABS(y1-y2)>1){ OSSemPend(Lcd_Disp_Sem, 0, &err); SetPixel(pdc,x2+x0, y2+y0,pdc->PenColor); if(x2>0 && y2>0){ //第一象限 if ( delta < 0 ){ delta1 = 2 * ( delta + y2) - 1; if ( delta1 <= 0 ) direction = 1;//选择H点 else direction = 2;//选择D点 } else if ( delta > 0 ){ delta2 = 2 * ( delta - x2 ) - 1; if ( delta2 <= 0 ) direction = 2;//选择D点 else direction = 3;//选择V点 } else //选择D点 direction = 2; } else if(x2<0 && y2>0){ //第二象限 if ( delta < 0 ){ delta1 = 2 * ( delta + y2) - 1; if ( delta1 <= 0 ) direction = 1;//选择H点 else direction = 8;//选择U点 } else if ( delta > 0 ){ delta2 = 2 * ( delta + x2 ) - 1; if ( delta2 <= 0 ) direction = 8;//选择U点 else direction = 7;//选择T点 } else //选择U点 direction = 8; } else if(x2<0 && y2<0){ //第三象限 if ( delta < 0 ){ delta1 = 2 * ( delta - y2) - 1; if ( delta1 <= 0 ) direction = 5;//选择R点 else direction = 6;//选择S点 } else if ( delta > 0 ){ delta2 = 2 * ( delta + x2 ) - 1; if ( delta2 <= 0 ) direction = 6;//选择S点 else direction = 7;//选择T点 } else //选择S点 direction = 6; } else if(x2>0 && y2<0){ //第四象限 if ( delta < 0 ){ delta1 = 2 * ( delta - y2) - 1; if ( delta1 <= 0 ) direction = 5;//选择R点 else direction = 4;//选择Q点 } else if ( delta > 0 ){ delta2 = 2 * ( delta - x2 ) - 1; if ( delta2 <= 0 ) direction = 4;//选择Q点 else direction = 3;//选择V点 } else //选择Q点 direction = 4; } else{ if(x2==0){ if(y2>0) x2++; else x2--; } else{ //y2==0 if(x2>0) y2--; else y2++; } delta=Getdelta1(x2,y2, R); } switch (direction) { case 1: x2++; delta += 2 * ABS(x2) + 1; break; case 2: x2++; y2--; delta += 2 * ( ABS(x2) - ABS(y2) + 1); break; case 3: y2--; delta += ( -2 * ABS(y2) + 1 ); break; case 4: x2--; y2--; delta += 2 * ( ABS(x2) - ABS(y2) + 1); break; case 5: x2--; delta += 2 * ABS(x2) + 1; break; case 6: x2--; y2++; delta += 2 * ( ABS(x2) - ABS(y2) + 1); break; case 7: y2++; delta += ( -2 * ABS(y2) + 1 ); break; case 8: x2++; y2++; delta += 2 * ( ABS(x2) - ABS(y2) + 1); break; } OSTimeDly(ticks); OSSemPost(Lcd_Disp_Sem); OSMboxPost(LCDFresh_MBox,(void*)1); //刷新LCD }}//画逆圆void ArcToDelay2(PDC pdc, int x1, int y1, int R, int ticks){ int delta, delta1, delta2, direction,x0,y0,dAB2,x2,y2; int tmpx,tmpy; double tmp; INT8U err; x2=pdc->DrawPointx; y2=pdc->DrawPointy; tmpx=x1-x2; tmpy=y1-y2; dAB2=tmpx*tmpx+tmpy*tmpy; if(dAB2==0) return; if(R*2>dAB2) return; tmp=sqrt(((double)R*R)/((double)dAB2)-0.25); if(R>0){//劣弧 x0=(int)(0.5*(x1-x2)-tmp*(y1-y2)+x2); //圆心坐标 y0=(int)(0.5*(y1-y2)+tmp*(x1-x2)+y2); } else{ //优弧 x0=(int)(0.5*(x1-x2)+tmp*(y1-y2)+x2); //圆心坐标 y0=(int)(0.5*(y1-y2)-tmp*(x1-x2)+y2); } x2-=x0; y2-=y0; x1-=x0; y1-=y0; delta=Getdelta2(x2,y2, R); while ( ABS(x1-x2)>1 || ABS(y1-y2)>1){ OSSemPend(Lcd_Disp_Sem, 0, &err); SetPixel(pdc,x2+x0, y2+y0,pdc->PenColor); if(x2>0 && y2>0){ //第一象限 if ( delta < 0 ){ delta1 = 2 * ( delta + y2) - 1; if ( delta1 <= 0 ) direction = 5;//选择R点 else direction = 6;//选择S点 } else if ( delta > 0 ){ delta2 = 2 * ( delta - x2 ) - 1; if ( delta2 <= 0 ) direction = 6;//选择S点 else direction = 7;//选择T点 } else //选择S点 direction = 6; } else if(x2<0 && y2>0){ //第二象限 if ( delta < 0 ){ delta1 = 2 * ( delta + y2) - 1; if ( delta1 <= 0 ) direction = 5;//选择R点 else direction = 4;//选择Q点 } else if ( delta > 0 ){ delta2 = 2 * ( delta + x2 ) - 1; if ( delta2 <= 0 ) direction = 4;//选择Q点 else direction = 3;//选择V点 } else //选择Q点 direction = 4; } else if(x2<0 && y2<0){ //第三象限 if ( delta < 0 ){ delta1 = 2 * ( delta - y2) - 1; if ( delta1 <= 0 ) direction = 1;//选择H点 else direction = 2;//选择D点 } else if ( delta > 0 ){ delta2 = 2 * ( delta + x2 ) - 1; if ( delta2 <= 0 ) direction = 2;//选择D点 else direction = 3;//选择V点 } else //选择D点 direction = 2; } else if(x2>0 && y2<0){ //第四象限 if ( delta < 0 ){ delta1 = 2 * ( delta - y2) - 1; if ( delta1 <= 0 ) direction = 1;//选择H点 else direction = 8;//选择U点 } else if ( delta > 0 ){ delta2 = 2 * ( delta - x2 ) - 1; if ( delta2 <= 0 ) direction = 8;//选择U点 else direction = 7;//选择T点 } else //选择U点 direction = 8; } else{ if(x2==0){ if(y2>0) x2--; else x2++; } else{ //y2==0 if(x2>0) y2++; else y2--; } delta=Getdelta2(x2,y2, R); } switch (direction) { case 1: x2++; delta += 2 * ABS(x2) + 1; break; case 2: x2++; y2--; delta += 2 * ( ABS(x2) - ABS(y2) + 1); break; case 3: y2--; delta += ( -2 * ABS(y2) + 1 ); break; case 4: x2--; y2--; delta += 2 * ( ABS(x2) - ABS(y2) + 1); break; case 5: x2--; delta += 2 * ABS(x2) + 1; break; case 6: x2--; y2++; delta += 2 * ( ABS(x2) - ABS(y2) + 1); break; case 7: y2++; delta += ( -2 * ABS(y2) + 1 ); break; case 8: x2++; y2++; delta += 2 * ( ABS(x2) - ABS(y2) + 1); break; } OSTimeDly(ticks); OSSemPost(Lcd_Disp_Sem); OSMboxPost(LCDFresh_MBox,(void*)1); //刷新LCD }}void ArcToDelay(PDC pdc, int x1, int y1, U8 arctype, int R, int ticks){ if(arctype){//逆圆 ArcToDelay2(pdc,x1,y1,R,ticks); } else{ //顺圆 ArcToDelay1(pdc,x1,y1,R,ticks); } pdc->DrawPointx=x1; pdc->DrawPointy=y1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -