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

📄 display.c

📁 ads1.2的一个工程
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -