📄 display.c
字号:
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 + -