📄 j_graphic.c
字号:
/******************************************************************************
J_GUI
The JJJ's Graphics Interface Library
COPYRIGHT (c) JJJSTUDIO, 2006 BY JJJ.
-- ALL RIGHTS RESERVED --
Filename: J_Graphic.c
Author : Jianjun Jiang
Created : 2006/02/3
Website : http://www.jjjbbs.com
Modified: NO
Revision: 1.00
Readme :
******************************************************************************/
extern J_PEN J_Pen;
void J_SetPenColor(TCOLOR Color)
{
J_Pen.Color = Color;
}
void J_SetPenWidth(UINT8 Width)
{
J_Pen.Width = Width;
}
void J_DrawLine(UINT32 x1,UINT32 y1,UINT32 x2,UINT32 y2)
{
INT32 dx; // 直线x轴差值变量
INT32 dy; // 直线y轴差值变量
INT8 dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向
INT8 dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向
INT32 dx_x2; // dx*2值变量,用于加快运算速度
INT32 dy_x2; // dy*2值变量,用于加快运算速度
INT32 di; // 决策变量
dx = x2-x1;
dy = y2-y1;
if(dx>0)
dx_sym = 1;
else if(dx<0)
dx_sym = -1;
else
{
J_LCDVLine(x1,y1,y2,J_Pen.Color);
return;
}
if(dy>0)
dy_sym = 1;
else if(dy<0)
dy_sym = -1;
else
{
J_LCDHLine(x1,y1,x2,J_Pen.Color);
return;
}
dx = dx_sym * dx;
dy = dy_sym * dy;
dx_x2 = dx*2;
dy_x2 = dy*2;
//使用Bresenham法进行画直线
if(dx>=dy)
{
di = dy_x2 - dx;
while(x1!=x2)
{
J_LCDSetPixel(x1,y1,J_Pen.Color);
x1 += dx_sym;
if(di<0)
{
di += dy_x2;
}
else
{
di += dy_x2 - dx_x2;
y1 += dy_sym;
}
}
J_LCDSetPixel(x1,y1,J_Pen.Color);
}
else
{
di = dx_x2 - dy;
while(y1!=y2)
{
J_LCDSetPixel(x1,y1,J_Pen.Color);
y1 += dy_sym;
if(di<0)
{
di += dx_x2;
}
else
{
di += dx_x2 - dy_x2;
x1 += dx_sym;
}
}
J_LCDSetPixel(x1,y1,J_Pen.Color);
}
}
void J_DrawLineEx(UINT32 x1,UINT32 y1,UINT32 x2,UINT32 y2)
{
INT32 dx; // 直线x轴差值变量
INT32 dy; // 直线y轴差值变量
INT8 dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向
INT8 dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向
INT32 dx_x2; // dx*2值变量,用于加快运算速度
INT32 dy_x2; // dy*2值变量,用于加快运算速度
INT32 di; // 决策变量
INT32 wx,wy; // 线宽变量
INT32 draw_a,draw_b;
if(J_Pen.Width == 0)
return;
dx = x2-x1;
dy = y2-y1;
wx = J_Pen.Width/2;
wy = J_Pen.Width-wx-1;
if(dx>0)
dx_sym = 1;
else if(dx<0)
dx_sym = -1;
else
{
wx = x1-wx;
if(wx<0)
wx = 0;
wy = x1+wy;
while(1)
{
x1 = wx;
J_LCDVLine(x1, y1, y2, J_Pen.Color);
if(wx>=wy) break;
wx++;
}
return;
}
if(dy>0)
dy_sym = 1;
else if(dy<0)
dy_sym = -1;
else
{
wx = y1-wx;
if(wx<0)
wx = 0;
wy = y1+wy;
while(1)
{
y1 = wx;
J_LCDHLine(x1,y1,x2,J_Pen.Color);
if(wx>=wy) break;
wx++;
}
return;
}
dx = dx_sym * dx;
dy = dy_sym * dy;
dx_x2 = dx*2;
dy_x2 = dy*2;
//使用Bresenham法进行画直线
if(dx>=dy)
{
di = dy_x2 - dx;
while(x1!=x2)
{
draw_a = y1-wx;
if(draw_a<0)
draw_a = 0;
draw_b = y1+wy;
J_LCDVLine(x1,draw_a,draw_b,J_Pen.Color);
x1 += dx_sym;
if(di<0)
{
di += dy_x2;
}
else
{
di += dy_x2 - dx_x2;
y1 += dy_sym;
}
}
draw_a = y1-wx;
if(draw_a<0)
draw_a = 0;
draw_b = y1+wy;
J_LCDVLine(x1,draw_a,draw_b,J_Pen.Color);
}
else
{
di = dx_x2 - dy;
while(y1!=y2)
{
draw_a = x1-wx;
if(draw_a<0)
draw_a = 0;
draw_b = x1+wy;
J_LCDHLine(draw_a,y1,draw_b,J_Pen.Color);
y1 += dy_sym;
if(di<0)
{
di += dx_x2;
}
else
{
di += dx_x2 - dy_x2;
x1 += dx_sym;
}
}
draw_a = x1-wx;
if(draw_a<0)
draw_a = 0;
draw_b = x1+wy;
J_LCDHLine(draw_a,y1,draw_b,J_Pen.Color);
}
}
void J_DrawRect(UINT32 x1,UINT32 y1,UINT32 x2,UINT32 y2)
{
J_LCDHLine(x1,y1,x2,J_Pen.Color);
J_LCDHLine(x1,y2,x2,J_Pen.Color);
J_LCDVLine(x1,y1,y2,J_Pen.Color);
J_LCDVLine(x2,y1,y2,J_Pen.Color);
}
void J_DrawRectEx(UINT32 x1,UINT32 y1,UINT32 x2,UINT32 y2)
{
UINT32 t;
if(x1>x2)
{
t = x2;
x2 = x1;
x1 = t;
}
if(y1>y2)
{
t = y2;
y2 = y1;
y1 = t;
}
J_DrawLineEx(x1,y1,x2,y1);
J_DrawLineEx(x1,y2,x2,y2);
J_DrawLineEx(x1,y1,x1,y2);
J_DrawLineEx(x2,y1,x2,y2);
}
void J_DrawRectFill(UINT32 x1,UINT32 y1,UINT32 x2,UINT32 y2)
{
UINT32 t;
if(x1>x2)
{
t = x2;
x2 = x1;
x1 = t;
}
if(y1>y2)
{
t = y2;
y2 = y1;
y1 = t;
}
for(t=0;t<(y2-y1);t++)
J_LCDHLine(x1,y1+t,x2,J_Pen.Color);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -