?? gui.c
字號:
GUI_Point(draw_x2, draw_y2, color);
while( (radius_yy*xx) < (radius_xx*yy) )
{
if(di<0)
{
di+= radius_yy2*(2*xx+3);
}
else
{
di += radius_yy2*(2*xx+3) + 4*radius_xx - 4*radius_xx*yy;
yy--;
draw_y0--;
draw_y1--;
draw_y2++;
draw_y3++;
}
xx ++; // x軸加1
draw_x0++;
draw_x1--;
draw_x2++;
draw_x3--;
GUI_Point(draw_x0, draw_y0, color);
GUI_Point(draw_x1, draw_y1, color);
GUI_Point(draw_x2, draw_y2, color);
GUI_Point(draw_x3, draw_y3, color);
}
di = radius_xx2*(yy-1)*(yy-1) + radius_yy2*xx*xx + radius_yy + radius_yy2*xx - radius_xx2*radius_yy;
while(yy>=0)
{
if(di<0)
{
di+= radius_xx2*3 + 4*radius_yy*xx + 4*radius_yy - 2*radius_xx2*yy;
xx ++; // x軸加1
draw_x0++;
draw_x1--;
draw_x2++;
draw_x3--;
}
else
{
di += radius_xx2*3 - 2*radius_xx2*yy;
}
yy--;
draw_y0--;
draw_y1--;
draw_y2++;
draw_y3++;
GUI_Point(draw_x0, draw_y0, color);
GUI_Point(draw_x1, draw_y1, color);
GUI_Point(draw_x2, draw_y2, color);
GUI_Point(draw_x3, draw_y3, color);
}
}
/****************************************************************************
* 名稱:GUI_EllipseFill()
* 功能:畫正橢圓,并填充。給定橢圓的四個點的參數,最左、最右點的x軸坐標值為x0、x1,最上、最下點
* 的y軸坐標為y0、y1。
* 入口參數:x0 最左點的x坐標值
* x1 最右點的x坐標值
* y0 最上點的y坐標值
* y1 最下點的y坐標值
* color 填充顏色
* 出口參數:無
* 說明:操作失敗原因是指定地址超出有效范圍。
****************************************************************************/
void GUI_EllipseFill(uint32 x0, uint32 x1, uint32 y0, uint32 y1, TCOLOR color)
{
int32 draw_x0, draw_y0; // 劊圖點坐標變量
int32 draw_x1, draw_y1;
int32 draw_x2, draw_y2;
int32 draw_x3, draw_y3;
int32 xx, yy; // 畫圖控制變量
int32 center_x, center_y; // 橢圓中心點坐標變量
int32 radius_x, radius_y; // 橢圓的半徑,x軸半徑和y軸半徑
int32 radius_xx, radius_yy; // 半徑乘平方值
int32 radius_xx2, radius_yy2; // 半徑乘平方值的兩倍
int32 di; // 定義決策變量
/* 參數過濾 */
if( (x0==x1) || (y0==y1) )
return;
/* 計算出橢圓中心點坐標 */
center_x = (x0 + x1) >> 1;
center_y = (y0 + y1) >> 1;
/* 計算出橢圓的半徑,x軸半徑和y軸半徑 */
if(x0 > x1)
{
radius_x = (x0 - x1) >> 1;
}
else
{
radius_x = (x1 - x0) >> 1;
}
if(y0 > y1)
{
radius_y = (y0 - y1) >> 1;
}
else
{
radius_y = (y1 - y0) >> 1;
}
/* 計算半徑乘平方值 */
radius_xx = radius_x * radius_x;
radius_yy = radius_y * radius_y;
/* 計算半徑乘4值 */
radius_xx2 = radius_xx<<1;
radius_yy2 = radius_yy<<1;
/* 初始化畫圖變量 */
xx = 0;
yy = radius_y;
di = radius_yy2 + radius_xx - radius_xx2*radius_y ; // 初始化決策變量
/* 計算出橢圓y軸上的兩個端點坐標,作為作圖起點 */
draw_x0 = draw_x1 = draw_x2 = draw_x3 = center_x;
draw_y0 = draw_y1 = center_y + radius_y;
draw_y2 = draw_y3 = center_y - radius_y;
GUI_Point(draw_x0, draw_y0, color); // 畫y軸上的兩個端點
GUI_Point(draw_x2, draw_y2, color);
while( (radius_yy*xx) < (radius_xx*yy) )
{
if(di<0)
{
di+= radius_yy2*(2*xx+3);
}
else
{
di += radius_yy2*(2*xx+3) + 4*radius_xx - 4*radius_xx*yy;
yy--;
draw_y0--;
draw_y1--;
draw_y2++;
draw_y3++;
}
xx ++; // x軸加1
draw_x0++;
draw_x1--;
draw_x2++;
draw_x3--;
GUI_Point(draw_x0, draw_y0, color);
GUI_Point(draw_x1, draw_y1, color);
GUI_Point(draw_x2, draw_y2, color);
GUI_Point(draw_x3, draw_y3, color);
/* 若y軸已變化,進行填充 */
if(di>=0)
{
GUI_HLine(draw_x0, draw_y0, draw_x1, color);
GUI_HLine(draw_x2, draw_y2, draw_x3, color);
}
}
di = radius_xx2*(yy-1)*(yy-1) + radius_yy2*xx*xx + radius_yy + radius_yy2*xx - radius_xx2*radius_yy;
while(yy>=0)
{
if(di<0)
{
di+= radius_xx2*3 + 4*radius_yy*xx + 4*radius_yy - 2*radius_xx2*yy;
xx ++; // x軸加1
draw_x0++;
draw_x1--;
draw_x2++;
draw_x3--;
}
else
{
di += radius_xx2*3 - 2*radius_xx2*yy;
}
yy--;
draw_y0--;
draw_y1--;
draw_y2++;
draw_y3++;
GUI_Point(draw_x0, draw_y0, color);
GUI_Point(draw_x1, draw_y1, color);
GUI_Point(draw_x2, draw_y2, color);
GUI_Point(draw_x3, draw_y3, color);
/* y軸已變化,進行填充 */
GUI_HLine(draw_x0, draw_y0, draw_x1, color);
GUI_HLine(draw_x2, draw_y2, draw_x3, color);
}
}
#endif
#if GUI_FloodFill_EN==1
/****************************************************************************
* 名稱:GUI_ReadLeftPoint()
* 功能:找出指定點左邊最近的非color點。
* 入口參數:x0 指定點的x坐標值
* y0 指定點的y坐標值
* color 指定顏色值
* 出口參數:返回該點的x軸坐標值。
* 說明:若沒有找出,則返回最左的x坐標0。
****************************************************************************/
uint32 GUI_ReadLeftPoint(uint32 x0, uint32 y0, TCOLOR color)
{
uint32 i;
TCOLOR bakc;
for(i=x0-1; i>0; i--)
{
GUI_ReadPoint(i, y0, &bakc);
if( GUI_CmpColor(bakc,color)==0 )
return(i+1); // 若找到,則返回
}
GUI_ReadPoint(i, y0, &bakc);
if( GUI_CmpColor(bakc,color)==0 )
return(1); // 若找到,則返回
return(0);
}
/****************************************************************************
* 名稱:GUI_ReadRightPoint()
* 功能:找出指定點右邊最近的非color點。
* 入口參數:x0 指定點的x軸坐標值
* y0 指定點的y軸坐標值
* color 指定顏色值
* 出口參數:返回該點的x軸坐標值。
* 說明:若沒有找出,則返回最右的x坐標GUI_LCM_XMAX。
****************************************************************************/
uint32 GUI_ReadRightPoint(uint32 x0, uint32 y0, TCOLOR color)
{
uint32 i;
TCOLOR bakc;
for(i=x0+1; i<GUI_LCM_XMAX; i++)
{
GUI_ReadPoint(i, y0, &bakc);
if( GUI_CmpColor(bakc,color)==0 )
return(i-1); // 若找到,則返回
}
return(GUI_LCM_XMAX);
}
/****************************************************************************
* 名稱:GUI_CmpPointColor()
* 功能:判斷指定點上的顏色是否為某種顏色。
* 入口參數:x 指定點的x軸坐標值
* y 指定點的y軸坐標值
* color 顏色值
* 出口參數:返回1表示相同,返回0表示不相同。
* 說明:
****************************************************************************/
int GUI_CmpPointColor(uint32 x, uint32 y, TCOLOR color)
{
TCOLOR bakc;
GUI_ReadPoint(x, y, &bakc);
return( GUI_CmpColor(bakc,color) );
}
/* 定義折點個數 */
#ifndef DOWNP_N
#define DOWNP_N 20
#endif
#ifndef UPP_N
#define UPP_N 20
#endif
/****************************************************************************
* 名稱:GUI_FloodFill()
* 功能:圖形填充,將指定點內的封閉圖形進行填充。對指定點的顏色區(qū)域進行填充,即不是該顏色
* 的像素為邊界(如,指定點上的顏色為紅色,則其它顏色像素均為邊界)。
* 入口參數:x0 指定點的x坐標值
* y0 指定點的y坐標值
* color 填充顏色
* 出口參數:無
* 說明:操作失敗原因是指定地址超出有效范圍、指定點不在封閉圖形內。
****************************************************************************/
void GUI_FloodFill(uint32 x0, uint32 y0, TCOLOR color)
{
PointXY down_point[DOWNP_N]; // 定義向下填充轉折點緩沖區(qū)
uint8 down_no; // 向下折點個數
PointXY up_point[UPP_N]; // 定義向上填充轉折點緩沖區(qū)
uint8 up_no; // 向上折點個數
TCOLOR fcolor; // 填充點上的顏色
uint32 xx, yy; // 填充臨時x,y變量 (當前填充行的中點)
uint32 xx0; // 當前填充行的左x值變量
uint32 xx1; // 當前填充行的右y值變量
uint32 i;
uint32 x0_bak, y0_bak;
uint32 x1_bak;
/* 參數過濾 */
if(x0>=GUI_LCM_XMAX)
return;
if(y0>=GUI_LCM_YMAX)
return;
/* 判斷指定點是否為填充顏色,若是則直接返回 */
GUI_ReadPoint(x0, y0, &fcolor); // 取得填充點的顏色
if( GUI_CmpColor(fcolor,color)!=0 )
return;
y0_bak = y0;
x0_bak = xx0 = GUI_ReadLeftPoint(x0, y0, fcolor); // 找出當前y坐標上的最左邊的點
x1_bak = xx1 = GUI_ReadRightPoint(x0, y0, fcolor); // 找出當前y坐標上的最右邊的點
down_point[0].x = up_point[0].x = (xx1 + xx0)/2;
down_point[0].y = up_point[0].y = y0;
down_no = 1;
up_no = 1;
/* 開始向上填充 */
FILL_UP:
if(0==up_no)
goto FILL_DOWN; // 若向下掃描已完成,則退出
xx = up_point[up_no-1].x; // 否則取出下一折點
yy = up_point[up_no-1].y;
up_no--;
xx0 = GUI_ReadLeftPoint(xx, yy, fcolor);
xx1 = GUI_ReadRightPoint(xx, yy, fcolor);
while(1)
{
yy += 1; // 中心點向上一點
if( GUI_CmpPointColor(xx, yy, fcolor)==0 )
{ /* 判斷此點是否為終點,若是則退出此次循環(huán) */
for(i=xx0; i<=xx1; i++) // 查找此行是否有需填充點
{
if( GUI_CmpPointColor(i, yy, fcolor)!=0 ) break;
}
if(i>xx1)
goto FILL_UP;
/* 找出新一行中最右邊的點 */
xx = i; // 更新xx到要填充的有效區(qū)域內
xx1 = GUI_ReadRightPoint(xx, yy, fcolor);
}
else
{ /* 找出新一行中最右邊的點 */
xx1 = GUI_ReadRightPoint(xx, yy, fcolor);
}
xx0 = GUI_ReadLeftPoint(xx, yy, fcolor);
/* 向下折點。使用y0作為折點變量,x0作為上一折點變量 */
if(down_no<DOWNP_N)
{
y0 = xx0;
x0 = y0-1;
for(i=y0; i<=xx1; i++)
{
if( GUI_CmpPointColor(i, yy-1, fcolor)==0 ) // 更新折點
{
y0 = i;
}
else
{
if(x0!=y0) // 找到新的折點
{
x0 = y0;
down_point[down_no].x = i;
down_point[down_no].y = yy;
down_no++;
}
}
if(down_no>=DOWNP_N)
break; // 若緩沖區(qū)已保存滿,則退出
} // end of for(i=y0+1; i<xx1; i++)
} // end of if(down_no<DOWNP_N)
xx = (xx1 + xx0)/2; // 更新中心點
GUI_HLine(xx0, yy, xx1, color); // 填充一行
/* 向上折點。使用y0作為折點變量,x0作為上一折點變量 */
if(up_no<UPP_N)
{
y0 = xx0;
x0 = y0-1;
for(i=y0; i<=xx1; i++)
{
if( GUI_CmpPointColor(i, yy+1, fcolor)==0 ) // 更新折點
{
y0 = i;
}
else
{
if(x0!=y0) // 找到新的折點
{
x0 = y0;
up_point[up_no].x = i;
up_point[up_no].y = yy;
up_no++;
}
}
if(up_no>=UPP_N)
break; // 若緩沖區(qū)已保存滿,則退出
}
} // end of if(up_no<UPP_N)
} // end of while(1)
/* 向下填充 */
FILL_DOWN:
if(0==down_no)
{
if(0==up_no)
{
GUI_HLine(x0_bak, y0_bak, x1_bak, color);
return; // 若向下掃描已完成,且沒有發(fā)現新的向上折點,則退出
}
else
{
goto FILL_UP;
}
}
xx = down_point[down_no-1].x; // 否則取出下一折點
yy = down_point[down_no-1].y;
down_no--;
xx0 = GUI_ReadLeftPoint(xx, yy, fcolor);
xx1 = GUI_ReadRightPoint(xx, yy, fcolor);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -