📄 myprogram.txt
字号:
//-----------------------------------------------------------------------------------------------------
tmErrorCode_t GetDrawableInfo(tmSWVersion_t *pVersion,tmPowerState_t *pState)
{
tmErrorCode_t errcode;
if(TM_OK != (errcode = tmhwDrawGetPowerState(pState)))
return errcode;
if(TM_OK != (errcode = tmhwDrawGetSWVersion (pVersion)))
return errcode;
}
//----------------------------------------------------------------------------------------------------
//函数名:clearBox
//输 入:pDraw,box,pColor
//输 出: TM_OK 或错误号
//完成人: nxf
//完成日期: 2005-5-25
//描 述: 清除某一给定矩形区域
//参数说明:box - 矩形区域 pColor -颜色
//-----------------------------------------------------------------------------------------------------
tmErrorCode_t clearBox(
tmhwDrawable_t *pDst, // I: -> our drawable
tmhwUnkColor_t color, // I: color to which to clear
tmRect_t box // I: rectangle to clear
)
{
tmErrorCode_t errcode;
static const tmhwDrawFillFlags_t fillFlags =
{
tmhwDrawRop2CopyPen, // rop2
tmhwDrawCmpOpNone, // compareOp
FALSE // sync
};
if (
TM_OK != (
errcode = tmhwDrawFill(
pDst,
&box,
1,
color,
fillFlags
)
)
)
{
#ifdef PRNT_ERRINFO
myprintf("Clear Box failed.\n");
#endif
return errcode;
}
return errcode;
}
//----------------------------------------------------------------------------------------------------
//函数名:DrawableFill
//输 入:pDraw,rect,pColor
//输 出: TM_OK 或错误号
//完成人: nxf
//完成日期: 2005-5-25
//描 述: 填充某一给定矩形区域
//参数说明:rect - 矩形区域 pColor -颜色
//-----------------------------------------------------------------------------------------------------
tmErrorCode_t DrawableFill(
tmhwDrawable_t *pDraw,
tmhwUnkColor_t pColour,
tmRect_t rect
)
{
tmErrorCode_t errcode;
if(!InitFlg)
{
myprintf("Drawable hasn't been initialized.\n");
return TMHW_ERR_DRAW_NO_DEVICE_OK;
}
else
{
static const tmhwDrawFillFlags_t fillFlags =
{
tmhwDrawRop2CopyPen,
tmhwDrawCmpOpNone,
FALSE
};
tmhwUnkColor_t color;
if(rect.ul.x <0 || rect.lr.x <0 || rect.ul.y <0 || rect.lr.y <0 || \
rect.ul.x > pDraw->shape.x || rect.ul.y > pDraw->shape.y || \
rect.lr.x > pDraw->shape.x || rect.lr.y > pDraw->shape.y
)
{
#ifdef PRNT_ERRINFO
myprintf("The Rect to be filled out of range.\n");
#endif
return TMHW_ERR_DRAW_BAD_RECTS;
}
//myprintf("now clearbox..\n");
// clearBox(pDraw, PCOLOR(0,0,0), fillarea);
// myprintf("clearbox finished.\n");
if (
TM_OK != (
errcode = tmhwDrawFill(
pScreen,
&rect,
1,
pColour,
fillFlags
)
)
)
{
#ifdef PRNT_ERRINFO
myprintf("Fill Rectangle failed.err=%s\n",errcode);
#endif
return errcode;
}//if
return errcode;
}//else
}//DrawableFill()
//----------------------------------------------------------------------------------------------------
//函数名:DrawableLine
//输 入:pDraw,startXY,endXY,pColor
//输 出: TM_OK 或错误号
//完成人: nxf
//完成日期: 2005-5-25
//描 述: 画某一给定直线
//参数说明:startXY - 直线起点坐标 endXY - 直线终点坐标 pColor -颜色
//-----------------------------------------------------------------------------------------------------
tmErrorCode_t DrawableLine(
tmhwDrawable_t *pDst, // I: -> our drawable
tmXY_t startXY, // I: rectangle in which we test
tmXY_t endXY, // I: # cycles of swirl
tmhwUnkColor_t pColor // I: -> palette in which to look up colors
)
{
Int32 b0, b1, bE;
UInt32 nPixels;
tmXY_t dXY;
UInt32 dMin, dMax, t;
tmErrorCode_t errcode;
static const tmhwDrawLineFlags_t kLineFlags =
{
tmhwDrawRop2CopyPen, // rop2
0, // octant; filled in by code
tmhwDrawCmpOpNone, // compareOp
FALSE // sync
};
tmhwDrawLineFlags_t flags;
flags = kLineFlags;
dXY.x = endXY.x - startXY.x;
dXY.y = endXY.y - startXY.y;
if (dXY.x > 0)
{
flags.octant = 0;
dMax = dXY.x;
}
else
{
flags.octant = 3;
dMax = -dXY.x;
}
if (dXY.y > 0)
{
dMin = dXY.y;
}
else
{
flags.octant ^= 7;
dMin = -dXY.y;
}
if (dMin > dMax)
{
t = dMax;
dMax = dMin;
dMin = t;
flags.octant ^= 1;
}
nPixels = dMax;
b0 = (dMin - dMax) << 1;
b1 = dMin << 1;
bE = (dMin << 1) - dMax;// + fudge[flags.octant];
if(TM_OK!=(errcode=tmhwDrawLine(
pDst, // dst drawable
startXY, // start drawing here
nPixels+1, // number of pixels to draw
pColor, // pixel drawing color
b0, // b0: diagonal step incr
b1, // b1: axial step incr
bE, // bE: initial error term
flags // rop, octant, cc, sync
)))
{
#ifdef PRNT_ERRINFO
myprintf("Draw line failed.err=%s\n",errcode);
#endif
return errcode;
}
return errcode;
}
//----------------------------------------------------------------------------------------------------
//函数名:DrawableSetPixel
//输 入:pDraw,pixelXY,pColor
//输 出: TM_OK 或错误号
//完成人: nxf
//完成日期: 2005-5-25
//描 述: 画某一给定坐标点
//参数说明:pixelXY - 待画点坐标 pColor -颜色
//-----------------------------------------------------------------------------------------------------
tmErrorCode_t DrawableSetPixel(
tmhwDrawable_t *pDraw,
tmXY_t pixelXY,
tmhwUnkColor_t pColor
)
{
tmErrorCode_t errcode;
static const tmXY_t pstart =
{
0,0
};
static const tmXY_t pend =
{
0,1
};
static const tmhwDrawLineFlags_t kLineFlags =
{
tmhwDrawRop2CopyPen, // rop2
0, // octant; filled in by code
tmhwDrawCmpOpNone, // compareOp
FALSE // sync
};
tmhwUnkColor_t clr;
tmhwDrawLineFlags_t flags;
flags = kLineFlags;
flags.octant = 4;
clr = 0x00;
if(TM_OK !=(errcode = DrawableLine(pScreen,pstart,pend,clr)))
{
#ifdef PRNT_ERRINFO
myprintf("SetPixel Preprocessing failed.err=%d\n",errcode);
#endif
return errcode;
}
if(TM_OK!=(errcode=tmhwDrawLine(
pDraw,
pixelXY,
1,
pColor,
0,
0,
0,
flags ) )
)
{
#ifdef PRNT_ERRINFO
myprintf("SetPixel failed.err=%d\n",errcode);
#endif
return errcode;
}
return errcode;
}
//-----------------------------------------------------------------------------------------------------
//函数名:SetFgBgColors
//输 入:pDraw,fgColor,bgColor
//输 出: TM_OK 或错误号
//完成人: nxf
//完成日期: 2005-5-25
//描 述: 设置屏幕的前景和背景颜色
//参数说明:fgColor - 前景色 bgColor -背景色
//-----------------------------------------------------------------------------------------------------
tmErrorCode_t SetFgBgColors(
tmhwDrawable_t *pDraw,
tmhwUnkColor_t fgColor,
tmhwUnkColor_t bgColor)
{
tmErrorCode_t errcode;
if(!InitFlg)
{
#ifdef PRNT_ERRINFO
myprintf("Drawable hasn't been initilazed.\n");
#endif
return ERR_RETURN;
}
if(TM_OK !=(errcode = tmhwDrawSetFgBgColors(pDraw,fgColor,bgColor)))
{
#ifdef PRNT_ERRINFO
myprintf("Drawable hasn't been initilazed.\n");
#endif
return errcode;
}
return errcode;
}
//------------------------------------------------------------------------------------------------------
//函数名: PlotPoints
//输 入: pDraw,xcenter,ycenter,x,y,pColor,octant
//输 出: 无
//完成人: nxf
//完成日期: 2005-5-26
//描 述: 完成给定坐标点的绘画
//参数说明:(xcenter,ycenter)-图形中心原点。octant - 坐标象限。
//------------------------------------------------------------------------------------------------------
void PlotPoints (tmhwDrawable_t *pDraw,int xcenter, int ycenter, int x, int
y,tmhwUnkColor_t pColor,int octant)
{
static tmXY_t dotXY =
{
0,0
};
switch(octant)
{
case 0: //四个象限
{
dotXY.x = xcenter + x;
dotXY.y = ycenter + y;
DrawableSetPixel(pDraw,dotXY,pColor);
dotXY.x = xcenter - x;
dotXY.y = ycenter + y;
DrawableSetPixel(pDraw,dotXY,pColor);
dotXY.x = xcenter + x;
dotXY.y = ycenter - y;
DrawableSetPixel(pDraw,dotXY,pColor);
dotXY.x = xcenter - x;
dotXY.y = ycenter - y;
DrawableSetPixel(pDraw,dotXY,pColor);
break;
}
case 1: //仅第一象限
{
dotXY.x = xcenter + x;
dotXY.y = ycenter + y;
DrawableSetPixel(pDraw,dotXY,pColor);
break;
}
case 2://仅第二象限
{
dotXY.x = xcenter - x;
dotXY.y = ycenter + y;
DrawableSetPixel(pDraw,dotXY,pColor);
break;
}
case 3://仅第三象限
{
dotXY.x = xcenter - x;
dotXY.y = ycenter - y;
DrawableSetPixel(pDraw,dotXY,pColor);
break;
}
case 4://仅第四象限
{
dotXY.x = xcenter + x;
dotXY.y = ycenter - y;
DrawableSetPixel(pDraw,dotXY,pColor);
break;
}
default:
{
#ifdef PRNT_ERRINFO
myprintf("octant is wrong.\n");
#endif
}
};
}
//--------------------------------------------------------------------------------------------------
//函数名: DrawableArc
//输 入: pDraw,xcenter,ycenter,rx,ry,pclr,octant,startx,endx,width
//输 出: SUCCESS_RETURN 或 ERR_RETURN
//完成人: nxf
//完成日期: 2005-5-26
//描 述: 完成任意指定宽度弧线的绘画,圆、椭圆、弧线段等,以及完成图形的填充功能。
//参数说明:
//(xcenter,ycenter)-坐标原点。rx - 横半径,ry - 纵半径.
//octant - 象限的指定值。 0:四个象限都选中,1:仅第一象限,...4:仅第四象限.
//posy - 开始点y坐标值。开始点为(startx,starty).其中starty=(int)posy
//posendy - 终止点y坐标值。终止点为(endx,endy).其中endy=(int)posendy
//--------------------------------------------------------------------------------------------------
int DrawableArc(tmhwDrawable_t *pDraw,int xcenter, int ycenter, int rx, int
ry,tmhwUnkColor_t pclr,int octant,int startx,int endx,int width)
{
int i,x,starty,endy;
int tmp_y;
int min_x=0;
float posy,posendy;
int rx2 = rx * rx;
int ry2 = ry * ry;
int tworx2 = 2 * rx2;
int twory2 = 2 * ry2;
int p,p2;
int y = ry;
int px = 0;
int py = tworx2 * y;
if(startx < 0 || endx < 0 || startx > rx || \
startx > endx || width < 0 || width > ry)
{
#ifdef PRNT_ERRINFO
myprintf("parameter statx or width is wrong.\n");
#endif
return ERR_RETURN;
}
//=======开始及终止点Y坐标的计算==================================
posy = sqrt((rx*rx*ry*ry - ry*ry*startx*startx)/(rx*rx));
starty = (int)posy;
posendy= sqrt((rx*rx*ry*ry - ry*ry*endx*endx)/(rx*rx));
endy = (int)posendy;
//================================================================
x = startx;
y = starty;
min_x = rx; //计算x方向上的最小值,用于环形椭圆
tmp_y = y; //保存y值
for( i = 1; i <= width && y >0; i++) //宽度处理
{
PlotPoints(pDraw,xcenter, ycenter, x, y--,pclr,octant);
if(!y)
{
if(x < min_x)
min_x =x;
}
}
y = tmp_y; //恢复y
p = ry2 - (rx2 * ry) + (0.25 * rx2);
while (ry2*(x+1) < rx2*(y-0.5)) //画上半部分
{
if (p<0)
{
p +=ry2*(2*x+3);
x++;
}
else
{
p +=(ry2*(2*x+3)+rx2*(-2*y+2));
x++;
y--;
}
tmp_y = y; //保存y值
for( i = 1; i <= width && y >0; i++) //宽度处理
{
PlotPoints(pDraw,xcenter, ycenter, x, y--,pclr,octant);
if(!y)
{
if(x < min_x)
min_x =x;
}
}
y = tmp_y;
}
p2 = ry2*(x+0.5)*(x+0.5) + rx2*(y-1)*(y-1) - rx2*ry2; //下半部分,初始化p2
while (y >= endy)
{
if (p2 <0)
{
p2 +=ry2*(2*x+2)+rx2*(-2*y+3);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -