📄 drv_gui.c
字号:
wx = with/2;
wy = with-wx-1;
// 判断增长方向,或是否为水平线、垂直线、点
if(dx>0) // 判断x轴方向
{ dx_sym = 1; // dx>0,设置dx_sym=1
}
else
{ if(dx<0)
{ dx_sym = -1; // dx<0,设置dx_sym=-1
}
else
{ // dx==0,画垂直线,或一点
wx = x_start-wx;
if(wx<0) wx = 0;
wy = x_start+wy;
while(1)
{ x_start = wx;
gui_rline(x_start, y_start, y_end);
if(wx>=wy) break;
wx++;
}
return;
}
}
if(dy>0) // 判断y轴方向
{ dy_sym = 1; // dy>0,设置dy_sym=1
}
else
{ if(dy<0)
{ dy_sym = -1; // dy<0,设置dy_sym=-1
}
else
{ // dy==0,画水平线,或一点
wx = y_start-wx;
if(wx<0) wx = 0;
wy = y_start+wy;
while(1)
{ y_start = wx;
gui_hline(x_start, y_start, x_end);
if(wx>=wy) break;
wx++;
}
return;
}
}
// 将dx、dy取绝对值
dx = dx_sym * dx;
dy = dy_sym * dy;
// 计算2倍的dx及dy值
dx_x2 = dx*2;
dy_x2 = dy*2;
// 使用Bresenham法进行画直线
if(dx>=dy) // 对于dx>=dy,则使用x轴为基准
{ di = dy_x2 - dx;
while(x_start!=x_end)
{ // x轴向增长,则宽度在y方向,即画垂直线
draw_a = y_start-wx;
if(draw_a<0) draw_a = 0;
draw_b = y_start+wy;
gui_rline(x_start, draw_a, draw_b);
x_start += dx_sym;
if(di<0)
{ di += dy_x2; // 计算出下一步的决策值
}
else
{ di += dy_x2 - dx_x2;
y_start += dy_sym;
}
}
draw_a = y_start-wx;
if(draw_a<0) draw_a = 0;
draw_b = y_start+wy;
gui_rline(x_start, draw_a, draw_b);
}
else // 对于dx<dy,则使用y轴为基准
{ di = dx_x2 - dy;
while(y_start!=y_end)
{ // y轴向增长,则宽度在x方向,即画水平线
draw_a = x_start-wx;
if(draw_a<0) draw_a = 0;
draw_b = x_start+wy;
gui_hline(draw_a, y_start, draw_b);
y_start += dy_sym;
if(di<0)
{ di += dx_x2;
}
else
{ di += dx_x2 - dy_x2;
x_start += dx_sym;
}
}
draw_a = x_start-wx;
if(draw_a<0) draw_a = 0;
draw_b = x_start+wy;
gui_hline(draw_a, y_start, draw_b);
}
}
//=============================================================================
/****************************************************************************
* 名称:GUI_Circle()
* 功能:指定圆心位置及半径,画圆。
* 入口参数: x0 圆心的x坐标值
* y0 圆心的y坐标值
* r 圆的半径
* color 显示颜色
* 出口参数:无
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
/*void gui_circle(uint32 x0, uint32 y0, uint32 r)
{ int32 draw_x0, draw_y0; // 刽图点坐标变量
int32 draw_x1, draw_y1;
int32 draw_x2, draw_y2;
int32 draw_x3, draw_y3;
int32 draw_x4, draw_y4;
int32 draw_x5, draw_y5;
int32 draw_x6, draw_y6;
int32 draw_x7, draw_y7;
int32 xx, yy; // 画圆控制变量
int32 di; // 决策变量
// 参数过滤
if(0==r) return;
// 计算出8个特殊点(0、45、90、135、180、225、270度),进行显示
draw_x0 = draw_x1 = x0;
draw_y0 = draw_y1 = y0 + r;
if(draw_y0<SCREEN_HIGHT) gui_point(draw_x0, draw_y0); // 90度
draw_x2 = draw_x3 = x0;
draw_y2 = draw_y3 = y0 - r;
if(draw_y2>=0) gui_point(draw_x2, draw_y2); // 270度
draw_x4 = draw_x6 = x0 + r;
draw_y4 = draw_y6 = y0;
if(draw_x4<SCREEN_WIDTH) gui_point(draw_x4, draw_y4); // 0度
draw_x5 = draw_x7 = x0 - r;
draw_y5 = draw_y7 = y0;
if(draw_x5>=0) gui_point(draw_x5, draw_y5); // 180度
if(1==r) return; // 若半径为1,则已圆画完
// 使用Bresenham法进行画圆
di = 3 - 2*r; // 初始化决策变量
xx = 0;
yy = r;
while(xx<yy)
{ if(di<0)
{ di += 4*xx + 6;
}
else
{ di += 4*(xx - yy) + 10;
yy--;
draw_y0--;
draw_y1--;
draw_y2++;
draw_y3++;
draw_x4--;
draw_x5++;
draw_x6--;
draw_x7++;
}
xx++;
draw_x0++;
draw_x1--;
draw_x2++;
draw_x3--;
draw_y4++;
draw_y5++;
draw_y6--;
draw_y7--;
// 要判断当前点是否在有效范围内
if( (draw_x0<=SCREEN_WIDTH)&&(draw_y0>=0) )
{ gui_point(draw_x0, draw_y0);
}
if( (draw_x1>=0)&&(draw_y1>=0) )
{ gui_point(draw_x1, draw_y1);
}
if( (draw_x2<=SCREEN_WIDTH)&&(draw_y2<=SCREEN_HIGHT) )
{ gui_point(draw_x2, draw_y2);
}
if( (draw_x3>=0)&&(draw_y3<=SCREEN_HIGHT) )
{ gui_point(draw_x3, draw_y3);
}
if( (draw_x4<=SCREEN_WIDTH)&&(draw_y4>=0) )
{ gui_point(draw_x4, draw_y4);
}
if( (draw_x5>=0)&&(draw_y5>=0) )
{ gui_point(draw_x5, draw_y5);
}
if( (draw_x6<=SCREEN_WIDTH)&&(draw_y6<=SCREEN_HIGHT) )
{ gui_point(draw_x6, draw_y6);
}
if( (draw_x7>=0)&&(draw_y7<=SCREEN_HIGHT) )
{ gui_point(draw_x7, draw_y7);
}
}
}*/
//=============================================================================
/****************************************************************************
* 名称:GUI_CircleFill()
* 功能:指定圆心位置及半径,画圆并填充,填充色与边框色一样。
* 入口参数: x0 圆心的x坐标值
* y0 圆心的y坐标值
* r 圆的半径
* color 填充颜色
* 出口参数:无
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
void gui_circlefill(uint32 x0, uint32 y0, uint32 r)
{ int32 draw_x0, draw_y0; // 刽图点坐标变量
int32 draw_x1, draw_y1;
int32 draw_x2, draw_y2;
int32 draw_x3, draw_y3;
int32 draw_x4, draw_y4;
int32 draw_x5, draw_y5;
int32 draw_x6, draw_y6;
int32 draw_x7, draw_y7;
int32 fill_x0, fill_y0; // 填充所需的变量,使用垂直线填充
int32 fill_x1;
int32 xx, yy; // 画圆控制变量
int32 di; // 决策变量
// 参数过滤
if(0==r) return;
// 计算出4个特殊点(0、90、180、270度),进行显示
draw_x0 = draw_x1 = x0;
draw_y0 = draw_y1 = y0 + r;
if(draw_y0<SCREEN_HIGHT)
{ gui_point(draw_x0, draw_y0); // 90度
}
draw_x2 = draw_x3 = x0;
draw_y2 = draw_y3 = y0 - r;
if(draw_y2>=0)
{ gui_point(draw_x2, draw_y2); // 270度
}
draw_x4 = draw_x6 = x0 + r;
draw_y4 = draw_y6 = y0;
if(draw_x4<SCREEN_WIDTH)
{ gui_point(draw_x4, draw_y4); // 0度
fill_x1 = draw_x4;
}
else
{ fill_x1 = SCREEN_WIDTH;
}
fill_y0 = y0; // 设置填充线条起始点fill_x0
fill_x0 = x0 - r; // 设置填充线条结束点fill_y1
if(fill_x0<0) fill_x0 = 0;
gui_hline(fill_x0, fill_y0, fill_x1);
draw_x5 = draw_x7 = x0 - r;
draw_y5 = draw_y7 = y0;
if(draw_x5>=0)
{ gui_point(draw_x5, draw_y5); // 180度
}
if(1==r) return;
// 使用Bresenham法进行画圆
di = 3 - 2*r; // 初始化决策变量
xx = 0;
yy = r;
while(xx<yy)
{ if(di<0)
{ di += 4*xx + 6;
}
else
{ di += 4*(xx - yy) + 10;
yy--;
draw_y0--;
draw_y1--;
draw_y2++;
draw_y3++;
draw_x4--;
draw_x5++;
draw_x6--;
draw_x7++;
}
xx++;
draw_x0++;
draw_x1--;
draw_x2++;
draw_x3--;
draw_y4++;
draw_y5++;
draw_y6--;
draw_y7--;
// 要判断当前点是否在有效范围内
if( (draw_x0<=SCREEN_WIDTH)&&(draw_y0>=0) )
{ gui_point(draw_x0, draw_y0);
}
if( (draw_x1>=0)&&(draw_y1>=0) )
{ gui_point(draw_x1, draw_y1);
}
// 第二点水直线填充(下半圆的点)
if(draw_x1>=0)
{ // 设置填充线条起始点fill_x0
fill_x0 = draw_x1;
// 设置填充线条起始点fill_y0
fill_y0 = draw_y1;
if(fill_y0>SCREEN_HIGHT) fill_y0 = SCREEN_HIGHT;
if(fill_y0<0) fill_y0 = 0;
// 设置填充线条结束点fill_x1
fill_x1 = x0*2 - draw_x1;
if(fill_x1>SCREEN_WIDTH) fill_x1 = SCREEN_WIDTH;
gui_hline(fill_x0, fill_y0, fill_x1);
}
if( (draw_x2<=SCREEN_WIDTH)&&(draw_y2<=SCREEN_HIGHT) )
{ gui_point(draw_x2, draw_y2);
}
if( (draw_x3>=0)&&(draw_y3<=SCREEN_HIGHT) )
{ gui_point(draw_x3, draw_y3);
}
// 第四点垂直线填充(上半圆的点)
if(draw_x3>=0)
{ // 设置填充线条起始点fill_x0
fill_x0 = draw_x3;
// 设置填充线条起始点fill_y0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -