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

📄 display.c

📁 在移植成功ucos核的基础上扩充了该操作系统的许多没有功能。如文件系统
💻 C
📖 第 1 页 / 共 3 页
字号:
	BITMAPFILEHEADER bmpfileheader;
	BITMAPINFOHEADER bmpinfoheader;

	if((pfile=OpenOSFile(filename, FILEMODE_READ))==NULL)
		return;

	ReadOSFile(pfile, (U8*)bmp, 2);

//	if((bmp[0]&0xffff)!='MB' )	//不是bmp文件
	if(bmp[0]!='B' ||bmp[1] !='M')
		return;

	ReadOSFile(pfile, (U8*)&bmpfileheader, sizeof(BITMAPFILEHEADER));
	ReadOSFile(pfile, (U8*)&bmpinfoheader, sizeof(BITMAPINFOHEADER));

	cx=bmpinfoheader.biWidth;
	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 + -