/********************************************************************* * * GUI_DrawHLine */ void GUI_DrawHLine(int y0, int x0, int x1) { #if (GUI_WINSUPPORT) GUI_RECT r; #endif GUI_LOCK(); #if (GUI_WINSUPPORT) WM_ADDORG(x0,y0); WM_ADDORGX(x1); r.x0 = x0; r.x1 = x1; r.y1 = r.y0 = y0; WM_ITERATE_START(&r) { #endif LCD_HL_DrawHLine(x0, y0, x1); #if (GUI_WINSUPPORT) } WM_ITERATE_END(); #endif GUI_UNLOCK(); }
static void _DrawArc(int x0, int y0, int rx, int ry, int Angle0, int Angle1, int xMul, int yMul) { float afx[4]; float afy[4]; float ri = rx-(GUI_Context.PenSize+1.5)/2; float ro = rx+(GUI_Context.PenSize+1.5)/2; float fAngle0 = Angle0*3.1415926/180; float fAngle1 = Angle1*3.1415926/180; float sin0 = sin(fAngle0); float sin1 = sin(fAngle1); float cos0 = cos(fAngle0); float cos1 = cos(fAngle1); U32 ri2 = ri*ri; U32 ro2 = ro*ro; int y, yMax, yMin; afy[0] = ri*sin0; afy[1] = ro*sin0; afy[2] = ri*sin1; afy[3] = ro*sin1; afx[0] = ri*cos0; afx[1] = ro*cos0; afx[2] = ri*cos1; afx[3] = ro*cos1; yMin = ceil(afy[0]); yMax = floor(afy[3]); /* Use Clipping rect to reduce calculation (if possible) */ if (GUI_Context.pClipRect_HL) { if (yMul ==1) { if (yMax > (GUI_Context.pClipRect_HL->y1 -y0)) yMax = (GUI_Context.pClipRect_HL->y1 -y0); if (yMin < (GUI_Context.pClipRect_HL->y0 -y0)) yMin = (GUI_Context.pClipRect_HL->y0 -y0); } if (yMul == -1) { if (yMin > (GUI_Context.pClipRect_HL->y1 -y0)) yMin = (GUI_Context.pClipRect_HL->y1 -y0); if (yMax < (GUI_Context.pClipRect_HL->y0 -y0)) yMax = (GUI_Context.pClipRect_HL->y0 -y0); } } /* Start drawing lines ... */ { int xMinDisp, xMaxDisp, xMin=0,xMax=0; for (y=yMax; y>=yMin; y--) { CalcX(&xMin, y, ri2); CalcX(&xMax, y, ro2); if ((float)y< afy[1]) { xMaxDisp = CalcInterSectLin(y,afy[0], afy[1], afx[0], afx[1]); } else { xMaxDisp = xMax; } if ((float)y > afy[2]) { xMinDisp = CalcInterSectLin(y,afy[2], afy[3], afx[2], afx[3]); } else { xMinDisp = xMin; } if (xMul>0) LCD_HL_DrawHLine(xMinDisp+x0, yMul*y+y0, xMaxDisp+x0); else LCD_HL_DrawHLine(-xMaxDisp+x0, yMul*y+y0, -xMinDisp+x0); } } #if 0 /* Test code */ { int i; GUI_SetColor( GUI_WHITE ); for (i=0; i<4; i++) LCD_HL_DrawPixel(afx[i]+x0, afy[i]+y0); } #endif GUI_USE_PARA(ry); }