NX circular drawing. Reduce computations; line caps needed only on every other line segment

This commit is contained in:
Gregory Nutt 2015-04-05 10:32:11 -06:00
parent 141846c6bf
commit 8bfd44ab63
3 changed files with 37 additions and 6 deletions

View File

@ -113,6 +113,7 @@ int nx_drawcircle(NXWINDOW hwnd, FAR const struct nxgl_point_s *center,
{ {
struct nxgl_point_s pts[NCIRCLE_POINTS]; struct nxgl_point_s pts[NCIRCLE_POINTS];
FAR struct nxgl_vector_s vector; FAR struct nxgl_vector_s vector;
bool capped;
int i; int i;
int ret; int ret;
@ -122,17 +123,27 @@ int nx_drawcircle(NXWINDOW hwnd, FAR const struct nxgl_point_s *center,
/* Draw each pair of points as a vector */ /* Draw each pair of points as a vector */
capped = false;
for (i = POINT_0p0; i < POINT_337p5; i++) for (i = POINT_0p0; i < POINT_337p5; i++)
{ {
/* Draw one line segment */
vector.pt1.x = pts[i].x; vector.pt1.x = pts[i].x;
vector.pt1.y = pts[i].y; vector.pt1.y = pts[i].y;
vector.pt2.x = pts[i+1].x; vector.pt2.x = pts[i+1].x;
vector.pt2.y = pts[i+1].y; vector.pt2.y = pts[i+1].y;
ret = nx_drawline(hwnd, &vector, width, color, true);
ret = nx_drawline(hwnd, &vector, width, color, capped);
if (ret != OK) if (ret != OK)
{ {
return ret; return ret;
} }
/* Every other line segment needs to have a circular line caps to join
* cleanly with the surround lines segments without line caps.
*/
capped = !capped;
} }
/* The final, closing vector is a special case */ /* The final, closing vector is a special case */
@ -141,5 +152,5 @@ int nx_drawcircle(NXWINDOW hwnd, FAR const struct nxgl_point_s *center,
vector.pt1.y = pts[POINT_337p5].y; vector.pt1.y = pts[POINT_337p5].y;
vector.pt2.x = pts[POINT_0p0].x; vector.pt2.x = pts[POINT_0p0].x;
vector.pt2.y = pts[POINT_0p0].y; vector.pt2.y = pts[POINT_0p0].y;
return nx_drawline(hwnd, &vector, width, color, true); return nx_drawline(hwnd, &vector, width, color, capped);
} }

View File

@ -113,6 +113,7 @@ int nxtk_drawcircletoolbar(NXTKWINDOW hfwnd, FAR const struct nxgl_point_s *cent
{ {
struct nxgl_point_s pts[NCIRCLE_POINTS]; struct nxgl_point_s pts[NCIRCLE_POINTS];
FAR struct nxgl_vector_s vector; FAR struct nxgl_vector_s vector;
bool capped;
int i; int i;
int ret; int ret;
@ -124,15 +125,24 @@ int nxtk_drawcircletoolbar(NXTKWINDOW hfwnd, FAR const struct nxgl_point_s *cent
for (i = POINT_0p0; i < POINT_337p5; i++) for (i = POINT_0p0; i < POINT_337p5; i++)
{ {
/* Draw one line segment */
vector.pt1.x = pts[i].x; vector.pt1.x = pts[i].x;
vector.pt1.y = pts[i].y; vector.pt1.y = pts[i].y;
vector.pt2.x = pts[i+1].x; vector.pt2.x = pts[i+1].x;
vector.pt2.y = pts[i+1].y; vector.pt2.y = pts[i+1].y;
ret = nxtk_drawlinetoolbar(hfwnd, &vector, width, color, true);
ret = nxtk_drawlinetoolbar(hfwnd, &vector, width, color, capped);
if (ret != OK) if (ret != OK)
{ {
return ret; return ret;
} }
/* Every other line segment needs to have a circular line caps to join
* cleanly with the surround lines segments without line caps.
*/
capped = !capped;
} }
/* The final, closing vector is a special case */ /* The final, closing vector is a special case */
@ -141,5 +151,5 @@ int nxtk_drawcircletoolbar(NXTKWINDOW hfwnd, FAR const struct nxgl_point_s *cent
vector.pt1.y = pts[POINT_337p5].y; vector.pt1.y = pts[POINT_337p5].y;
vector.pt2.x = pts[POINT_0p0].x; vector.pt2.x = pts[POINT_0p0].x;
vector.pt2.y = pts[POINT_0p0].y; vector.pt2.y = pts[POINT_0p0].y;
return nxtk_drawlinetoolbar(hfwnd, &vector, width, color, true); return nxtk_drawlinetoolbar(hfwnd, &vector, width, color, capped);
} }

View File

@ -113,6 +113,7 @@ int nxtk_drawcirclewindow(NXTKWINDOW hfwnd, FAR const struct nxgl_point_s *cente
{ {
struct nxgl_point_s pts[NCIRCLE_POINTS]; struct nxgl_point_s pts[NCIRCLE_POINTS];
FAR struct nxgl_vector_s vector; FAR struct nxgl_vector_s vector;
bool capped;
int i; int i;
int ret; int ret;
@ -124,15 +125,24 @@ int nxtk_drawcirclewindow(NXTKWINDOW hfwnd, FAR const struct nxgl_point_s *cente
for (i = POINT_0p0; i < POINT_337p5; i++) for (i = POINT_0p0; i < POINT_337p5; i++)
{ {
/* Draw one line segment */
vector.pt1.x = pts[i].x; vector.pt1.x = pts[i].x;
vector.pt1.y = pts[i].y; vector.pt1.y = pts[i].y;
vector.pt2.x = pts[i+1].x; vector.pt2.x = pts[i+1].x;
vector.pt2.y = pts[i+1].y; vector.pt2.y = pts[i+1].y;
ret = nxtk_drawlinewindow(hfwnd, &vector, width, color, true);
ret = nxtk_drawlinewindow(hfwnd, &vector, width, color, capped);
if (ret != OK) if (ret != OK)
{ {
return ret; return ret;
} }
/* Every other line segment needs to have a circular line caps to join
* cleanly with the surround lines segments without line caps.
*/
capped = !capped;
} }
/* The final, closing vector is a special case */ /* The final, closing vector is a special case */
@ -141,5 +151,5 @@ int nxtk_drawcirclewindow(NXTKWINDOW hfwnd, FAR const struct nxgl_point_s *cente
vector.pt1.y = pts[POINT_337p5].y; vector.pt1.y = pts[POINT_337p5].y;
vector.pt2.x = pts[POINT_0p0].x; vector.pt2.x = pts[POINT_0p0].x;
vector.pt2.y = pts[POINT_0p0].y; vector.pt2.y = pts[POINT_0p0].y;
return nxtk_drawlinewindow(hfwnd, &vector, width, color, true); return nxtk_drawlinewindow(hfwnd, &vector, width, color, capped);
} }