diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gdisp/gdisp.c | 16 | ||||
| -rw-r--r-- | src/gwin/button.c | 74 | ||||
| -rw-r--r-- | src/gwin/graph.c | 724 | ||||
| -rw-r--r-- | src/gwin/gwin.c | 490 | 
4 files changed, 524 insertions, 780 deletions
diff --git a/src/gdisp/gdisp.c b/src/gdisp/gdisp.c index f18bb66f..d548eae5 100644 --- a/src/gdisp/gdisp.c +++ b/src/gdisp/gdisp.c @@ -566,16 +566,16 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {  }  #if GDISP_NEED_CONVEX_POLYGON -	void gdispDrawPoly(const point *pntarray, unsigned cnt, color_t color) { +	void gdispDrawPoly(coord_t tx, coord_t ty, const point *pntarray, unsigned cnt, color_t color) {  		const point	*epnt, *p;  		epnt = &pntarray[cnt-1];  		for(p = pntarray; p < epnt; p++) -			gdispDrawLine(p->x, p->y, p[1].x, p[1].y, color); -		gdispDrawLine(p->x, p->y, pntarray->x, pntarray->y, color); +			gdispDrawLine(tx+p->x, ty+p->y, tx+p[1].x, ty+p[1].y, color); +		gdispDrawLine(tx+p->x, ty+p->y, tx+pntarray->x, ty+pntarray->y, color);  	} -	void gdispFillConvexPoly(const point *pntarray, unsigned cnt, color_t color) { +	void gdispFillConvexPoly(coord_t tx, coord_t ty, const point *pntarray, unsigned cnt, color_t color) {  		const point	*lpnt, *rpnt, *epnts;  		fpcoord_t	lx, rx, lk, rk;  		coord_t		y, ymax, lxc, rxc; @@ -622,14 +622,14 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {  				 */  				if (lxc < rxc) {  					if (rxc - lxc == 1) -						gdispDrawPixel(lxc, y, color); +						gdispDrawPixel(tx+lxc, ty+y, color);  					else -						gdispDrawLine(lxc, y, rxc-1, y, color); +						gdispDrawLine(tx+lxc, ty+y, tx+rxc-1, ty+y, color);  				} else if (lxc > rxc) {  					if (lxc - rxc == 1) -						gdispDrawPixel(rxc, y, color); +						gdispDrawPixel(tx+rxc, ty+y, color);  					else -						gdispDrawLine(rxc, y, lxc-1, y, color); +						gdispDrawLine(tx+rxc, ty+y, tx+lxc-1, ty+y, color);  				}  				lx += lk; diff --git a/src/gwin/button.c b/src/gwin/button.c index e67e8c70..519dd1fe 100644 --- a/src/gwin/button.c +++ b/src/gwin/button.c @@ -306,16 +306,16 @@ void gwinButtonDraw_Square(GHandle gh, bool_t isdown, const char *txt, const GBu  		(void) param;  		point	arw[7]; -		arw[0].x = gh->x+gh->width/2; arw[0].y = gh->y; -		arw[1].x = gh->x+gh->width-1; arw[1].y = gh->y+gh->height/ARROWHEAD_DIVIDER; -		arw[2].x = gh->x+(gh->width + gh->width/ARROWBODY_DIVIDER)/2; arw[2].y = gh->y+gh->height/ARROWHEAD_DIVIDER; -		arw[3].x = gh->x+(gh->width + gh->width/ARROWBODY_DIVIDER)/2; arw[3].y = gh->y+gh->height-1; -		arw[4].x = gh->x+(gh->width - gh->width/ARROWBODY_DIVIDER)/2; arw[4].y = gh->y+gh->height-1; -		arw[5].x = gh->x+(gh->width - gh->width/ARROWBODY_DIVIDER)/2; arw[5].y = gh->y+gh->height/ARROWHEAD_DIVIDER; -		arw[6].x = gh->x; arw[6].y = gh->y+gh->height/ARROWHEAD_DIVIDER; - -		gdispFillConvexPoly(arw, 7, pstyle->color_fill); -		gdispDrawPoly(arw, 7, pstyle->color_edge); +		arw[0].x = gh->width/2; arw[0].y = 0; +		arw[1].x = gh->width-1; arw[1].y = gh->height/ARROWHEAD_DIVIDER; +		arw[2].x = (gh->width + gh->width/ARROWBODY_DIVIDER)/2; arw[2].y = gh->height/ARROWHEAD_DIVIDER; +		arw[3].x = (gh->width + gh->width/ARROWBODY_DIVIDER)/2; arw[3].y = gh->height-1; +		arw[4].x = (gh->width - gh->width/ARROWBODY_DIVIDER)/2; arw[4].y = gh->height-1; +		arw[5].x = (gh->width - gh->width/ARROWBODY_DIVIDER)/2; arw[5].y = gh->height/ARROWHEAD_DIVIDER; +		arw[6].x = 0; arw[6].y = gh->height/ARROWHEAD_DIVIDER; + +		gdispFillConvexPoly(gh->x, gh->y, arw, 7, pstyle->color_fill); +		gdispDrawPoly(gh->x, gh->y, arw, 7, pstyle->color_edge);  		gdispDrawStringBox(gh->x+1, gh->y+1, gh->width-2, gh->height-2, txt, gh->font, pstyle->color_txt, justifyCenter);  	} @@ -324,16 +324,16 @@ void gwinButtonDraw_Square(GHandle gh, bool_t isdown, const char *txt, const GBu  		(void) param;  		point	arw[7]; -		arw[0].x = gh->x+gh->width/2; arw[0].y = gh->y+gh->height-1; -		arw[1].x = gh->x+gh->width-1; arw[1].y = gh->y+gh->height-1-gh->height/ARROWHEAD_DIVIDER; -		arw[2].x = gh->x+(gh->width + gh->width/ARROWBODY_DIVIDER)/2; arw[2].y = gh->y+gh->height-1-gh->height/ARROWHEAD_DIVIDER; -		arw[3].x = gh->x+(gh->width + gh->width/ARROWBODY_DIVIDER)/2; arw[3].y = gh->y; -		arw[4].x = gh->x+(gh->width - gh->width/ARROWBODY_DIVIDER)/2; arw[4].y = gh->y; -		arw[5].x = gh->x+(gh->width - gh->width/ARROWBODY_DIVIDER)/2; arw[5].y = gh->y+gh->height-1-gh->height/ARROWHEAD_DIVIDER; -		arw[6].x = gh->x; arw[6].y = gh->y+gh->height-1-gh->height/ARROWHEAD_DIVIDER; +		arw[0].x = gh->width/2; arw[0].y = gh->height-1; +		arw[1].x = gh->width-1; arw[1].y = gh->height-1-gh->height/ARROWHEAD_DIVIDER; +		arw[2].x = (gh->width + gh->width/ARROWBODY_DIVIDER)/2; arw[2].y = gh->height-1-gh->height/ARROWHEAD_DIVIDER; +		arw[3].x = (gh->width + gh->width/ARROWBODY_DIVIDER)/2; arw[3].y = 0; +		arw[4].x = (gh->width - gh->width/ARROWBODY_DIVIDER)/2; arw[4].y = 0; +		arw[5].x = (gh->width - gh->width/ARROWBODY_DIVIDER)/2; arw[5].y = gh->height-1-gh->height/ARROWHEAD_DIVIDER; +		arw[6].x = 0; arw[6].y = gh->height-1-gh->height/ARROWHEAD_DIVIDER; -		gdispFillConvexPoly(arw, 7, pstyle->color_fill); -		gdispDrawPoly(arw, 7, pstyle->color_edge); +		gdispFillConvexPoly(gh->x, gh->y, arw, 7, pstyle->color_fill); +		gdispDrawPoly(gh->x, gh->y, arw, 7, pstyle->color_edge);  		gdispDrawStringBox(gh->x+1, gh->y+1, gh->width-2, gh->height-2, txt, gh->font, pstyle->color_txt, justifyCenter);  	} @@ -342,16 +342,16 @@ void gwinButtonDraw_Square(GHandle gh, bool_t isdown, const char *txt, const GBu  		(void) param;  		point	arw[7]; -		arw[0].x = gh->x; arw[0].y = gh->y+gh->height/2; -		arw[1].x = gh->x+gh->width/ARROWHEAD_DIVIDER; arw[1].y = gh->y; -		arw[2].x = gh->x+gh->width/ARROWHEAD_DIVIDER; arw[2].y = gh->y+(gh->height - gh->height/ARROWBODY_DIVIDER)/2; -		arw[3].x = gh->x+gh->width-1; arw[3].y = gh->y+(gh->height - gh->height/ARROWBODY_DIVIDER)/2; -		arw[4].x = gh->x+gh->width-1; arw[4].y = gh->y+(gh->height + gh->height/ARROWBODY_DIVIDER)/2; -		arw[5].x = gh->x+gh->width/ARROWHEAD_DIVIDER; arw[5].y = gh->y+(gh->height + gh->height/ARROWBODY_DIVIDER)/2; -		arw[6].x = gh->x+gh->width/ARROWHEAD_DIVIDER; arw[6].y = gh->y+gh->height-1; +		arw[0].x = 0; arw[0].y = gh->height/2; +		arw[1].x = gh->width/ARROWHEAD_DIVIDER; arw[1].y = 0; +		arw[2].x = gh->width/ARROWHEAD_DIVIDER; arw[2].y = (gh->height - gh->height/ARROWBODY_DIVIDER)/2; +		arw[3].x = gh->width-1; arw[3].y = (gh->height - gh->height/ARROWBODY_DIVIDER)/2; +		arw[4].x = gh->width-1; arw[4].y = (gh->height + gh->height/ARROWBODY_DIVIDER)/2; +		arw[5].x = gh->width/ARROWHEAD_DIVIDER; arw[5].y = (gh->height + gh->height/ARROWBODY_DIVIDER)/2; +		arw[6].x = gh->width/ARROWHEAD_DIVIDER; arw[6].y = gh->height-1; -		gdispFillConvexPoly(arw, 7, pstyle->color_fill); -		gdispDrawPoly(arw, 7, pstyle->color_edge); +		gdispFillConvexPoly(gh->x, gh->y, arw, 7, pstyle->color_fill); +		gdispDrawPoly(gh->x, gh->y, arw, 7, pstyle->color_edge);  		gdispDrawStringBox(gh->x+1, gh->y+1, gh->width-2, gh->height-2, txt, gh->font, pstyle->color_txt, justifyCenter);  	} @@ -360,16 +360,16 @@ void gwinButtonDraw_Square(GHandle gh, bool_t isdown, const char *txt, const GBu  		(void) param;  		point	arw[7]; -		arw[0].x = gh->x+gh->width-1; arw[0].y = gh->y+gh->height/2; -		arw[1].x = gh->x+gh->width-1-gh->width/ARROWHEAD_DIVIDER; arw[1].y = gh->y; -		arw[2].x = gh->x+gh->width-1-gh->width/ARROWHEAD_DIVIDER; arw[2].y = gh->y+(gh->height - gh->height/ARROWBODY_DIVIDER)/2; -		arw[3].x = gh->x; arw[3].y = gh->y+(gh->height - gh->height/ARROWBODY_DIVIDER)/2; -		arw[4].x = gh->x; arw[4].y = gh->y+(gh->height + gh->height/ARROWBODY_DIVIDER)/2; -		arw[5].x = gh->x+gh->width-1-gh->width/ARROWHEAD_DIVIDER; arw[5].y = gh->y+(gh->height + gh->height/ARROWBODY_DIVIDER)/2; -		arw[6].x = gh->x+gh->width-1-gh->width/ARROWHEAD_DIVIDER; arw[6].y = gh->y+gh->height-1; +		arw[0].x = gh->width-1; arw[0].y = gh->height/2; +		arw[1].x = gh->width-1-gh->width/ARROWHEAD_DIVIDER; arw[1].y = 0; +		arw[2].x = gh->width-1-gh->width/ARROWHEAD_DIVIDER; arw[2].y = (gh->height - gh->height/ARROWBODY_DIVIDER)/2; +		arw[3].x = 0; arw[3].y = (gh->height - gh->height/ARROWBODY_DIVIDER)/2; +		arw[4].x = 0; arw[4].y = (gh->height + gh->height/ARROWBODY_DIVIDER)/2; +		arw[5].x = gh->width-1-gh->width/ARROWHEAD_DIVIDER; arw[5].y = (gh->height + gh->height/ARROWBODY_DIVIDER)/2; +		arw[6].x = gh->width-1-gh->width/ARROWHEAD_DIVIDER; arw[6].y = gh->height-1; -		gdispFillConvexPoly(arw, 7, pstyle->color_fill); -		gdispDrawPoly(arw, 7, pstyle->color_edge); +		gdispFillConvexPoly(gh->x, gh->y, arw, 7, pstyle->color_fill); +		gdispDrawPoly(gh->x, gh->y, arw, 7, pstyle->color_edge);  		gdispDrawStringBox(gh->x+1, gh->y+1, gh->width-2, gh->height-2, txt, gh->font, pstyle->color_txt, justifyCenter);  	}  #endif diff --git a/src/gwin/graph.c b/src/gwin/graph.c index 89876584..eff42eb1 100644 --- a/src/gwin/graph.c +++ b/src/gwin/graph.c @@ -1,362 +1,362 @@ -/*
 -    ChibiOS/GFX - Copyright (C) 2012, 2013
 -                 Joel Bodenmann aka Tectu <joel@unormal.org>
 -
 -    This file is part of ChibiOS/GFX.
 -
 -    ChibiOS/GFX is free software; you can redistribute it and/or modify
 -    it under the terms of the GNU General Public License as published by
 -    the Free Software Foundation; either version 3 of the License, or
 -    (at your option) any later version.
 -
 -    ChibiOS/GFX is distributed in the hope that it will be useful,
 -    but WITHOUT ANY WARRANTY; without even the implied warranty of
 -    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 -    GNU General Public License for more details.
 -
 -    You should have received a copy of the GNU General Public License
 -    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 -*/
 -/**
 - * @file    src/gwin/graph.c
 - * @brief   GWIN sub-system button code.
 - *
 - * @defgroup Graph Graph
 - * @ingroup GWIN
 - *
 - * @{
 - */
 -
 -#include "ch.h"
 -#include "hal.h"
 -#include "gfx.h"
 -
 -#if (GFX_USE_GWIN && GWIN_NEED_GRAPH) || defined(__DOXYGEN__)
 -
 -#include "gwin/internal.h"
 -
 -#define GGRAPH_FLG_CONNECTPOINTS			(GWIN_FIRST_CONTROL_FLAG<<0)
 -#define GGRAPH_ARROW_SIZE					5
 -
 -static const GGraphStyle GGraphDefaultStyle = {
 -	{ GGRAPH_POINT_DOT, 0, White },			// point
 -	{ GGRAPH_LINE_DOT, 2, Gray },			// line
 -	{ GGRAPH_LINE_SOLID, 0, White },		// x axis
 -	{ GGRAPH_LINE_SOLID, 0, White },		// y axis
 -	{ GGRAPH_LINE_NONE, 0, White, 0 },		// x grid
 -	{ GGRAPH_LINE_NONE, 0, White, 0 },		// y grid
 -	GWIN_GRAPH_STYLE_XAXIS_ARROWS|GWIN_GRAPH_STYLE_YAXIS_ARROWS		// flags
 -};
 -
 -static void pointto(GGraphObject *gg, coord_t x, coord_t y, const GGraphPointStyle *style) {
 -	if (style->type == GGRAPH_POINT_NONE)
 -		return;
 -
 -	// Convert to device space. Note the y-axis is inverted.
 -	x += gg->gwin.x + gg->xorigin;
 -	y = gg->gwin.y + gg->gwin.height - 1 - gg->yorigin - y;
 -
 -	if (style->size <= 1) {
 -		gdispDrawPixel(x, y, style->color);
 -		return;
 -	}
 -
 -	switch(style->type) {
 -	case GGRAPH_POINT_SQUARE:
 -		gdispDrawBox(x-style->size, y-style->size, 2*style->size, 2*style->size, style->color);
 -		break;
 -#if GDISP_NEED_CIRCLE
 -	case GGRAPH_POINT_CIRCLE:
 -		gdispDrawCircle(x, y, style->size, style->color);
 -		break;
 -#endif
 -	case GGRAPH_POINT_DOT:
 -	default:
 -		gdispDrawPixel(x, y, style->color);
 -		break;
 -	}
 -}
 -
 -static void lineto(GGraphObject *gg, coord_t x0, coord_t y0, coord_t x1, coord_t y1, const GGraphLineStyle *style) {
 -	coord_t	dy, dx;
 -	coord_t addx, addy;
 -	coord_t P, diff, i;
 -	coord_t	run_on, run_off, run;
 -
 -	if (style->type == GGRAPH_LINE_NONE)
 -		return;
 -
 -	// Convert to device space. Note the y-axis is inverted.
 -	x0 += gg->gwin.x + gg->xorigin;
 -	y0 = gg->gwin.y + gg->gwin.height - 1 - gg->yorigin - y0;
 -	x1 += gg->gwin.x + gg->xorigin;
 -	y1 = gg->gwin.y + gg->gwin.height - 1 - gg->yorigin - y1;
 -
 -	if (style->size <= 0) {
 -		// Use the driver to draw a solid line
 -		gdispDrawLine(x0, y0, x1, y1, style->color);
 -		return;
 -	}
 -
 -	switch (style->type) {
 -	case GGRAPH_LINE_DOT:
 -		run_on = 1;
 -		run_off = -style->size;
 -		break;
 -
 -	case GGRAPH_LINE_DASH:
 -		run_on = style->size;
 -		run_off = -style->size;
 -		break;
 -
 -	case GGRAPH_LINE_SOLID:
 -	default:
 -		// Use the driver to draw a solid line
 -		gdispDrawLine(x0, y0, x1, y1, style->color);
 -		return;
 -	}
 -
 -	// Use Bresenham's algorithm modified to draw a stylized line
 -	run = 0;
 -	if (x1 >= x0) {
 -		dx = x1 - x0;
 -		addx = 1;
 -	} else {
 -		dx = x0 - x1;
 -		addx = -1;
 -	}
 -	if (y1 >= y0) {
 -		dy = y1 - y0;
 -		addy = 1;
 -	} else {
 -		dy = y0 - y1;
 -		addy = -1;
 -	}
 -
 -	if (dx >= dy) {
 -		dy *= 2;
 -		P = dy - dx;
 -		diff = P - dx;
 -
 -		for(i=0; i<=dx; ++i) {
 -			if (run++ >= 0) {
 -				if (run >= run_on)
 -					run = run_off;
 -				gdispDrawPixel(x0, y0, style->color);
 -			}
 -			if (P < 0) {
 -				P  += dy;
 -				x0 += addx;
 -			} else {
 -				P  += diff;
 -				x0 += addx;
 -				y0 += addy;
 -			}
 -		}
 -	} else {
 -		dx *= 2;
 -		P = dx - dy;
 -		diff = P - dy;
 -
 -		for(i=0; i<=dy; ++i) {
 -			if (run++ >= 0) {
 -				if (run >= run_on)
 -					run = run_off;
 -				gdispDrawPixel(x0, y0, style->color);
 -			}
 -			if (P < 0) {
 -				P  += dx;
 -				y0 += addy;
 -			} else {
 -				P  += diff;
 -				x0 += addx;
 -				y0 += addy;
 -			}
 -		}
 -	}
 -}
 -
 -GHandle gwinCreateGraph(GGraphObject *gg, coord_t x, coord_t y, coord_t width, coord_t height) {
 -	if (!(gg = (GGraphObject *)_gwinInit((GWindowObject *)gg, x, y, width, height, sizeof(GGraphObject))))
 -		return 0;
 -	gg->gwin.type = GW_GRAPH;
 -	gg->xorigin = gg->yorigin = 0;
 -	gg->lastx = gg->lasty = 0;
 -	gwinGraphSetStyle(&gg->gwin, &GGraphDefaultStyle);
 -	return (GHandle)gg;
 -}
 -
 -void gwinGraphSetStyle(GHandle gh, const GGraphStyle *pstyle) {
 -	#define gg	((GGraphObject *)gh)
 -
 -	if (gh->type != GW_GRAPH)
 -		return;
 -
 -	gg->style.point.type = pstyle->point.type;
 -	gg->style.point.size = pstyle->point.size;
 -	gg->style.point.color = pstyle->point.color;
 -	gg->style.line.type = pstyle->line.type;
 -	gg->style.line.size = pstyle->line.size;
 -	gg->style.line.color = pstyle->line.color;
 -	gg->style.xaxis.type = pstyle->xaxis.type;
 -	gg->style.xaxis.size = pstyle->xaxis.size;
 -	gg->style.xaxis.color = pstyle->xaxis.color;
 -	gg->style.yaxis.type = pstyle->yaxis.type;
 -	gg->style.yaxis.size = pstyle->yaxis.size;
 -	gg->style.yaxis.color = pstyle->yaxis.color;
 -	gg->style.xgrid.type = pstyle->xgrid.type;
 -	gg->style.xgrid.size = pstyle->xgrid.size;
 -	gg->style.xgrid.color = pstyle->xgrid.color;
 -	gg->style.xgrid.spacing = pstyle->xgrid.spacing;
 -	gg->style.ygrid.type = pstyle->ygrid.type;
 -	gg->style.ygrid.size = pstyle->ygrid.size;
 -	gg->style.ygrid.color = pstyle->ygrid.color;
 -	gg->style.ygrid.spacing = pstyle->ygrid.spacing;
 -	gg->style.flags = pstyle->flags;
 -
 -	#undef gg
 -}
 -
 -void gwinGraphSetOrigin(GHandle gh, coord_t x, coord_t y) {
 -	#define gg	((GGraphObject *)gh)
 -
 -	if (gh->type != GW_GRAPH)
 -		return;
 -
 -	gg->xorigin = x;
 -	gg->yorigin = y;
 -
 -	#undef gg
 -}
 -
 -void gwinGraphDrawAxis(GHandle gh) {
 -	#define gg	((GGraphObject *)gh)
 -	coord_t		i, xmin, ymin, xmax, ymax;
 -
 -	if (gh->type != GW_GRAPH)
 -		return;
 -
 -	xmin = -gg->xorigin;
 -	xmax = gh->width-gg->xorigin-1;
 -	ymin = -gg->yorigin;
 -	ymax = gh->height-gg->yorigin-1;
 -
 -	// x grid - this code assumes that the GGraphGridStyle is a superset of GGraphListStyle
 -	if (gg->style.xgrid.type != GGRAPH_LINE_NONE && gg->style.xgrid.spacing >= 2) {
 -		for(i = gg->style.xgrid.spacing; i <= xmax; i += gg->style.xgrid.spacing)
 -			lineto(gg, i, ymin, i, ymax, (GGraphLineStyle *)&gg->style.xgrid);
 -		for(i = -gg->style.xgrid.spacing; i >= xmin; i -= gg->style.xgrid.spacing)
 -			lineto(gg, i, ymin, i, ymax, (GGraphLineStyle *)&gg->style.xgrid);
 -	}
 -
 -	// y grid - this code assumes that the GGraphGridStyle is a superset of GGraphListStyle
 -	if (gg->style.ygrid.type != GGRAPH_LINE_NONE && gg->style.ygrid.spacing >= 2) {
 -		for(i = gg->style.ygrid.spacing; i <= ymax; i += gg->style.ygrid.spacing)
 -			lineto(gg, xmin, i, xmax, i, (GGraphLineStyle *)&gg->style.ygrid);
 -		for(i = -gg->style.ygrid.spacing; i >= ymin; i -= gg->style.ygrid.spacing)
 -			lineto(gg, xmin, i, xmax, i, (GGraphLineStyle *)&gg->style.ygrid);
 -	}
 -
 -	// x axis
 -	lineto(gg, xmin, 0, xmax, 0, &gg->style.xaxis);
 -	if ((gg->style.flags & GWIN_GRAPH_STYLE_XAXIS_NEGATIVE_ARROWS)) {
 -		if (xmin > 0 || xmin < -(GGRAPH_ARROW_SIZE+1)) {
 -			lineto(gg, xmin, 0, xmin+GGRAPH_ARROW_SIZE, GGRAPH_ARROW_SIZE, &gg->style.xaxis);
 -			lineto(gg, xmin, 0, xmin+GGRAPH_ARROW_SIZE, -GGRAPH_ARROW_SIZE, &gg->style.xaxis);
 -		}
 -	}
 -	if ((gg->style.flags & GWIN_GRAPH_STYLE_XAXIS_POSITIVE_ARROWS)) {
 -		if (xmax < 0 || xmax > (GGRAPH_ARROW_SIZE+1)) {
 -			lineto(gg, xmax, 0, xmax-GGRAPH_ARROW_SIZE, GGRAPH_ARROW_SIZE, &gg->style.xaxis);
 -			lineto(gg, xmax, 0, xmax-GGRAPH_ARROW_SIZE, -GGRAPH_ARROW_SIZE, &gg->style.xaxis);
 -		}
 -	}
 -
 -	// y axis
 -	lineto(gg, 0, ymin, 0, ymax, &gg->style.yaxis);
 -	if ((gg->style.flags & GWIN_GRAPH_STYLE_YAXIS_NEGATIVE_ARROWS)) {
 -		if (ymin > 0 || ymin < -(GGRAPH_ARROW_SIZE+1)) {
 -			lineto(gg, 0, ymin, GGRAPH_ARROW_SIZE, ymin+GGRAPH_ARROW_SIZE, &gg->style.yaxis);
 -			lineto(gg, 0, ymin, -GGRAPH_ARROW_SIZE, ymin+GGRAPH_ARROW_SIZE, &gg->style.yaxis);
 -		}
 -	}
 -	if ((gg->style.flags & GWIN_GRAPH_STYLE_YAXIS_POSITIVE_ARROWS)) {
 -		if (ymax < 0 || ymax > (GGRAPH_ARROW_SIZE+1)) {
 -			lineto(gg, 0, ymax, GGRAPH_ARROW_SIZE, ymax-GGRAPH_ARROW_SIZE, &gg->style.yaxis);
 -			lineto(gg, 0, ymax, -GGRAPH_ARROW_SIZE, ymax-GGRAPH_ARROW_SIZE, &gg->style.yaxis);
 -		}
 -	}
 -
 -	#undef gg
 -}
 -
 -void gwinGraphStartSet(GHandle gh) {
 -	if (gh->type != GW_GRAPH)
 -		return;
 -
 -	gh->flags &= ~GGRAPH_FLG_CONNECTPOINTS;
 -}
 -
 -void gwinGraphDrawPoint(GHandle gh, coord_t x, coord_t y) {
 -	#define gg	((GGraphObject *)gh)
 -
 -	if (gh->type != GW_GRAPH)
 -		return;
 -
 -	if ((gh->flags & GGRAPH_FLG_CONNECTPOINTS)) {
 -		// Draw the line
 -		lineto(gg, gg->lastx, gg->lasty, x, y, &gg->style.line);
 -
 -		// Redraw the previous point because the line may have overwritten it
 -		pointto(gg, gg->lastx, gg->lasty, &gg->style.point);
 -
 -	} else
 -		gh->flags |= GGRAPH_FLG_CONNECTPOINTS;
 -
 -	// Save this point for next time.
 -	gg->lastx = x;
 -	gg->lasty = y;
 -
 -	// Draw this point.
 -	pointto(gg, x, y, &gg->style.point);
 -
 -	#undef gg
 -}
 -
 -void gwinGraphDrawPoints(GHandle gh, const GGraphPoint *points, unsigned count) {
 -	#define gg	((GGraphObject *)gh)
 -	unsigned			i;
 -	const GGraphPoint	*p;
 -
 -	if (gh->type != GW_GRAPH)
 -		return;
 -
 -	// Draw the connecting lines
 -	for(p = points, i = 0; i < count; p++, i++) {
 -		if ((gh->flags & GGRAPH_FLG_CONNECTPOINTS)) {
 -			// Draw the line
 -			lineto(gg, gg->lastx, gg->lasty, p->x, p->y, &gg->style.line);
 -
 -			// Redraw the previous point because the line may have overwritten it
 -			if (i == 0)
 -				pointto(gg, gg->lastx, gg->lasty, &gg->style.point);
 -
 -		} else
 -			gh->flags |= GGRAPH_FLG_CONNECTPOINTS;
 -
 -		// Save this point for next time.
 -		gg->lastx = p->x;
 -		gg->lasty = p->y;
 -	}
 -
 -
 -	// Draw the points.
 -	for(p = points, i = 0; i < count; p++, i++)
 -		pointto(gg, p->x, p->y, &gg->style.point);
 -
 -	#undef gg
 -}
 -
 -#endif /* GFX_USE_GWIN && GWIN_NEED_GRAPH */
 -/** @} */
 -
 +/* +    ChibiOS/GFX - Copyright (C) 2012, 2013 +                 Joel Bodenmann aka Tectu <joel@unormal.org> + +    This file is part of ChibiOS/GFX. + +    ChibiOS/GFX is free software; you can redistribute it and/or modify +    it under the terms of the GNU General Public License as published by +    the Free Software Foundation; either version 3 of the License, or +    (at your option) any later version. + +    ChibiOS/GFX is distributed in the hope that it will be useful, +    but WITHOUT ANY WARRANTY; without even the implied warranty of +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +    GNU General Public License for more details. + +    You should have received a copy of the GNU General Public License +    along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ +/** + * @file    src/gwin/graph.c + * @brief   GWIN sub-system button code. + * + * @defgroup Graph Graph + * @ingroup GWIN + * + * @{ + */ + +#include "ch.h" +#include "hal.h" +#include "gfx.h" + +#if (GFX_USE_GWIN && GWIN_NEED_GRAPH) || defined(__DOXYGEN__) + +#include "gwin/internal.h" + +#define GGRAPH_FLG_CONNECTPOINTS			(GWIN_FIRST_CONTROL_FLAG<<0) +#define GGRAPH_ARROW_SIZE					5 + +static const GGraphStyle GGraphDefaultStyle = { +	{ GGRAPH_POINT_DOT, 0, White },			// point +	{ GGRAPH_LINE_DOT, 2, Gray },			// line +	{ GGRAPH_LINE_SOLID, 0, White },		// x axis +	{ GGRAPH_LINE_SOLID, 0, White },		// y axis +	{ GGRAPH_LINE_NONE, 0, White, 0 },		// x grid +	{ GGRAPH_LINE_NONE, 0, White, 0 },		// y grid +	GWIN_GRAPH_STYLE_XAXIS_ARROWS|GWIN_GRAPH_STYLE_YAXIS_ARROWS		// flags +}; + +static void pointto(GGraphObject *gg, coord_t x, coord_t y, const GGraphPointStyle *style) { +	if (style->type == GGRAPH_POINT_NONE) +		return; + +	// Convert to device space. Note the y-axis is inverted. +	x += gg->gwin.x + gg->xorigin; +	y = gg->gwin.y + gg->gwin.height - 1 - gg->yorigin - y; + +	if (style->size <= 1) { +		gdispDrawPixel(x, y, style->color); +		return; +	} + +	switch(style->type) { +	case GGRAPH_POINT_SQUARE: +		gdispDrawBox(x-style->size, y-style->size, 2*style->size, 2*style->size, style->color); +		break; +#if GDISP_NEED_CIRCLE +	case GGRAPH_POINT_CIRCLE: +		gdispDrawCircle(x, y, style->size, style->color); +		break; +#endif +	case GGRAPH_POINT_DOT: +	default: +		gdispDrawPixel(x, y, style->color); +		break; +	} +} + +static void lineto(GGraphObject *gg, coord_t x0, coord_t y0, coord_t x1, coord_t y1, const GGraphLineStyle *style) { +	coord_t	dy, dx; +	coord_t addx, addy; +	coord_t P, diff, i; +	coord_t	run_on, run_off, run; + +	if (style->type == GGRAPH_LINE_NONE) +		return; + +	// Convert to device space. Note the y-axis is inverted. +	x0 += gg->gwin.x + gg->xorigin; +	y0 = gg->gwin.y + gg->gwin.height - 1 - gg->yorigin - y0; +	x1 += gg->gwin.x + gg->xorigin; +	y1 = gg->gwin.y + gg->gwin.height - 1 - gg->yorigin - y1; + +	if (style->size <= 0) { +		// Use the driver to draw a solid line +		gdispDrawLine(x0, y0, x1, y1, style->color); +		return; +	} + +	switch (style->type) { +	case GGRAPH_LINE_DOT: +		run_on = 1; +		run_off = -style->size; +		break; + +	case GGRAPH_LINE_DASH: +		run_on = style->size; +		run_off = -style->size; +		break; + +	case GGRAPH_LINE_SOLID: +	default: +		// Use the driver to draw a solid line +		gdispDrawLine(x0, y0, x1, y1, style->color); +		return; +	} + +	// Use Bresenham's algorithm modified to draw a stylized line +	run = 0; +	if (x1 >= x0) { +		dx = x1 - x0; +		addx = 1; +	} else { +		dx = x0 - x1; +		addx = -1; +	} +	if (y1 >= y0) { +		dy = y1 - y0; +		addy = 1; +	} else { +		dy = y0 - y1; +		addy = -1; +	} + +	if (dx >= dy) { +		dy *= 2; +		P = dy - dx; +		diff = P - dx; + +		for(i=0; i<=dx; ++i) { +			if (run++ >= 0) { +				if (run >= run_on) +					run = run_off; +				gdispDrawPixel(x0, y0, style->color); +			} +			if (P < 0) { +				P  += dy; +				x0 += addx; +			} else { +				P  += diff; +				x0 += addx; +				y0 += addy; +			} +		} +	} else { +		dx *= 2; +		P = dx - dy; +		diff = P - dy; + +		for(i=0; i<=dy; ++i) { +			if (run++ >= 0) { +				if (run >= run_on) +					run = run_off; +				gdispDrawPixel(x0, y0, style->color); +			} +			if (P < 0) { +				P  += dx; +				y0 += addy; +			} else { +				P  += diff; +				x0 += addx; +				y0 += addy; +			} +		} +	} +} + +GHandle gwinCreateGraph(GGraphObject *gg, coord_t x, coord_t y, coord_t width, coord_t height) { +	if (!(gg = (GGraphObject *)_gwinInit((GWindowObject *)gg, x, y, width, height, sizeof(GGraphObject)))) +		return 0; +	gg->gwin.type = GW_GRAPH; +	gg->xorigin = gg->yorigin = 0; +	gg->lastx = gg->lasty = 0; +	gwinGraphSetStyle(&gg->gwin, &GGraphDefaultStyle); +	return (GHandle)gg; +} + +void gwinGraphSetStyle(GHandle gh, const GGraphStyle *pstyle) { +	#define gg	((GGraphObject *)gh) + +	if (gh->type != GW_GRAPH) +		return; + +	gg->style.point.type = pstyle->point.type; +	gg->style.point.size = pstyle->point.size; +	gg->style.point.color = pstyle->point.color; +	gg->style.line.type = pstyle->line.type; +	gg->style.line.size = pstyle->line.size; +	gg->style.line.color = pstyle->line.color; +	gg->style.xaxis.type = pstyle->xaxis.type; +	gg->style.xaxis.size = pstyle->xaxis.size; +	gg->style.xaxis.color = pstyle->xaxis.color; +	gg->style.yaxis.type = pstyle->yaxis.type; +	gg->style.yaxis.size = pstyle->yaxis.size; +	gg->style.yaxis.color = pstyle->yaxis.color; +	gg->style.xgrid.type = pstyle->xgrid.type; +	gg->style.xgrid.size = pstyle->xgrid.size; +	gg->style.xgrid.color = pstyle->xgrid.color; +	gg->style.xgrid.spacing = pstyle->xgrid.spacing; +	gg->style.ygrid.type = pstyle->ygrid.type; +	gg->style.ygrid.size = pstyle->ygrid.size; +	gg->style.ygrid.color = pstyle->ygrid.color; +	gg->style.ygrid.spacing = pstyle->ygrid.spacing; +	gg->style.flags = pstyle->flags; + +	#undef gg +} + +void gwinGraphSetOrigin(GHandle gh, coord_t x, coord_t y) { +	#define gg	((GGraphObject *)gh) + +	if (gh->type != GW_GRAPH) +		return; + +	gg->xorigin = x; +	gg->yorigin = y; + +	#undef gg +} + +void gwinGraphDrawAxis(GHandle gh) { +	#define gg	((GGraphObject *)gh) +	coord_t		i, xmin, ymin, xmax, ymax; + +	if (gh->type != GW_GRAPH) +		return; + +	xmin = -gg->xorigin; +	xmax = gh->width-gg->xorigin-1; +	ymin = -gg->yorigin; +	ymax = gh->height-gg->yorigin-1; + +	// x grid - this code assumes that the GGraphGridStyle is a superset of GGraphListStyle +	if (gg->style.xgrid.type != GGRAPH_LINE_NONE && gg->style.xgrid.spacing >= 2) { +		for(i = gg->style.xgrid.spacing; i <= xmax; i += gg->style.xgrid.spacing) +			lineto(gg, i, ymin, i, ymax, (GGraphLineStyle *)&gg->style.xgrid); +		for(i = -gg->style.xgrid.spacing; i >= xmin; i -= gg->style.xgrid.spacing) +			lineto(gg, i, ymin, i, ymax, (GGraphLineStyle *)&gg->style.xgrid); +	} + +	// y grid - this code assumes that the GGraphGridStyle is a superset of GGraphListStyle +	if (gg->style.ygrid.type != GGRAPH_LINE_NONE && gg->style.ygrid.spacing >= 2) { +		for(i = gg->style.ygrid.spacing; i <= ymax; i += gg->style.ygrid.spacing) +			lineto(gg, xmin, i, xmax, i, (GGraphLineStyle *)&gg->style.ygrid); +		for(i = -gg->style.ygrid.spacing; i >= ymin; i -= gg->style.ygrid.spacing) +			lineto(gg, xmin, i, xmax, i, (GGraphLineStyle *)&gg->style.ygrid); +	} + +	// x axis +	lineto(gg, xmin, 0, xmax, 0, &gg->style.xaxis); +	if ((gg->style.flags & GWIN_GRAPH_STYLE_XAXIS_NEGATIVE_ARROWS)) { +		if (xmin > 0 || xmin < -(GGRAPH_ARROW_SIZE+1)) { +			lineto(gg, xmin, 0, xmin+GGRAPH_ARROW_SIZE, GGRAPH_ARROW_SIZE, &gg->style.xaxis); +			lineto(gg, xmin, 0, xmin+GGRAPH_ARROW_SIZE, -GGRAPH_ARROW_SIZE, &gg->style.xaxis); +		} +	} +	if ((gg->style.flags & GWIN_GRAPH_STYLE_XAXIS_POSITIVE_ARROWS)) { +		if (xmax < 0 || xmax > (GGRAPH_ARROW_SIZE+1)) { +			lineto(gg, xmax, 0, xmax-GGRAPH_ARROW_SIZE, GGRAPH_ARROW_SIZE, &gg->style.xaxis); +			lineto(gg, xmax, 0, xmax-GGRAPH_ARROW_SIZE, -GGRAPH_ARROW_SIZE, &gg->style.xaxis); +		} +	} + +	// y axis +	lineto(gg, 0, ymin, 0, ymax, &gg->style.yaxis); +	if ((gg->style.flags & GWIN_GRAPH_STYLE_YAXIS_NEGATIVE_ARROWS)) { +		if (ymin > 0 || ymin < -(GGRAPH_ARROW_SIZE+1)) { +			lineto(gg, 0, ymin, GGRAPH_ARROW_SIZE, ymin+GGRAPH_ARROW_SIZE, &gg->style.yaxis); +			lineto(gg, 0, ymin, -GGRAPH_ARROW_SIZE, ymin+GGRAPH_ARROW_SIZE, &gg->style.yaxis); +		} +	} +	if ((gg->style.flags & GWIN_GRAPH_STYLE_YAXIS_POSITIVE_ARROWS)) { +		if (ymax < 0 || ymax > (GGRAPH_ARROW_SIZE+1)) { +			lineto(gg, 0, ymax, GGRAPH_ARROW_SIZE, ymax-GGRAPH_ARROW_SIZE, &gg->style.yaxis); +			lineto(gg, 0, ymax, -GGRAPH_ARROW_SIZE, ymax-GGRAPH_ARROW_SIZE, &gg->style.yaxis); +		} +	} + +	#undef gg +} + +void gwinGraphStartSet(GHandle gh) { +	if (gh->type != GW_GRAPH) +		return; + +	gh->flags &= ~GGRAPH_FLG_CONNECTPOINTS; +} + +void gwinGraphDrawPoint(GHandle gh, coord_t x, coord_t y) { +	#define gg	((GGraphObject *)gh) + +	if (gh->type != GW_GRAPH) +		return; + +	if ((gh->flags & GGRAPH_FLG_CONNECTPOINTS)) { +		// Draw the line +		lineto(gg, gg->lastx, gg->lasty, x, y, &gg->style.line); + +		// Redraw the previous point because the line may have overwritten it +		pointto(gg, gg->lastx, gg->lasty, &gg->style.point); + +	} else +		gh->flags |= GGRAPH_FLG_CONNECTPOINTS; + +	// Save this point for next time. +	gg->lastx = x; +	gg->lasty = y; + +	// Draw this point. +	pointto(gg, x, y, &gg->style.point); + +	#undef gg +} + +void gwinGraphDrawPoints(GHandle gh, const point *points, unsigned count) { +	#define gg	((GGraphObject *)gh) +	unsigned		i; +	const point		*p; + +	if (gh->type != GW_GRAPH) +		return; + +	// Draw the connecting lines +	for(p = points, i = 0; i < count; p++, i++) { +		if ((gh->flags & GGRAPH_FLG_CONNECTPOINTS)) { +			// Draw the line +			lineto(gg, gg->lastx, gg->lasty, p->x, p->y, &gg->style.line); + +			// Redraw the previous point because the line may have overwritten it +			if (i == 0) +				pointto(gg, gg->lastx, gg->lasty, &gg->style.point); + +		} else +			gh->flags |= GGRAPH_FLG_CONNECTPOINTS; + +		// Save this point for next time. +		gg->lastx = p->x; +		gg->lasty = p->y; +	} + + +	// Draw the points. +	for(p = points, i = 0; i < count; p++, i++) +		pointto(gg, p->x, p->y, &gg->style.point); + +	#undef gg +} + +#endif /* GFX_USE_GWIN && GWIN_NEED_GRAPH */ +/** @} */ + diff --git a/src/gwin/gwin.c b/src/gwin/gwin.c index d7fb5726..a2b702e2 100644 --- a/src/gwin/gwin.c +++ b/src/gwin/gwin.c @@ -31,7 +31,7 @@  #include "hal.h"  #include "gfx.h" -#if GFX_USE_GWIN || defined(__DOXYGEN__) +#if GFX_USE_GWIN  #include "gwin/internal.h" @@ -64,27 +64,12 @@ GHandle _gwinInit(GWindowObject *gw, coord_t x, coord_t y, coord_t width, coord_  	gw->height = height;  	gw->color = White;  	gw->bgcolor = Black; -#if GDISP_NEED_TEXT -	gw->font = 0; -#endif +	#if GDISP_NEED_TEXT +		gw->font = 0; +	#endif  	return (GHandle)gw;  } -/** - * @brief   Create a basic window. - * @return  NULL if there is no resultant drawing area, otherwise a window handle. - * - * @param[in] gw		The window structure to initialise. If this is NULL the structure is dynamically allocated. - * @param[in] x,y		The screen co-ordinates for the bottom left corner of the window - * @param[in] width		The width of the window - * @param[in] height	The height of the window - * @note				The default drawing color gets set to White and the background drawing color to Black. - * @note				No default font is set so make sure to set one before drawing any text. - * @note				The dimensions and position may be changed to fit on the real screen. - * @note				The window is not automatically cleared on creation. You must do that by calling gwinClear() (possibly after changing your background color) - * - * @api - */  GHandle gwinCreateWindow(GWindowObject *gw, coord_t x, coord_t y, coord_t width, coord_t height) {  	if (!(gw = (GWindowObject *)_gwinInit((GWindowObject *)gw, x, y, width, height, sizeof(GWindowObject))))  		return 0; @@ -92,13 +77,6 @@ GHandle gwinCreateWindow(GWindowObject *gw, coord_t x, coord_t y, coord_t width,  	return (GHandle)gw;  } -/** - * @brief   Destroy a window (of any type). Releases any dynamicly allocated memory. - * - * @param[in] gh		The window handle - * - * @api - */  void gwinDestroyWindow(GHandle gh) {  	// Clean up any type specific dynamic memory allocations  	switch(gh->type) { @@ -123,34 +101,18 @@ void gwinDestroyWindow(GHandle gh) {  	}  } -#if GDISP_NEED_TEXT || defined(__DOXYGEN__) -/** - * @brief   Set the current font for this window. - * - * @param[in] gh		The window handle - * @param[in] font		The font to use for text functions - * - * @api - */ -void gwinSetFont(GHandle gh, font_t font) { -	gh->font = font; -#if GWIN_NEED_CONSOLE -	if (font && gh->type == GW_CONSOLE) { -		((GConsoleObject *)gh)->fy = gdispGetFontMetric(font, fontHeight); -		((GConsoleObject *)gh)->fp = gdispGetFontMetric(font, fontCharPadding); +#if GDISP_NEED_TEXT +	void gwinSetFont(GHandle gh, font_t font) { +		gh->font = font; +	#if GWIN_NEED_CONSOLE +		if (font && gh->type == GW_CONSOLE) { +			((GConsoleObject *)gh)->fy = gdispGetFontMetric(font, fontHeight); +			((GConsoleObject *)gh)->fp = gdispGetFontMetric(font, fontCharPadding); +		} +	#endif  	}  #endif -} -#endif -/** - * @brief   Clear the window - * @note	Uses the current background color to clear the window - * - * @param[in] gh		The window handle - * - * @api - */  void gwinClear(GHandle gh) {  	#if GDISP_NEED_CLIP  		gdispSetClip(gh->x, gh->y, gh->width, gh->height); @@ -165,16 +127,6 @@ void gwinClear(GHandle gh) {  	#endif  } -/** - * @brief   Set a pixel in the window - * @note	Uses the current foreground color to set the pixel - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x,y		The coordinates of the pixel - * - * @api - */  void gwinDrawPixel(GHandle gh, coord_t x, coord_t y) {  	#if GDISP_NEED_CLIP  		gdispSetClip(gh->x, gh->y, gh->width, gh->height); @@ -182,17 +134,6 @@ void gwinDrawPixel(GHandle gh, coord_t x, coord_t y) {  	gdispDrawPixel(gh->x+x, gh->y+y, gh->color);  } -/** - * @brief   Draw a line in the window - * @note	Uses the current foreground color to draw the line - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x0,y0		The start position - * @param[in] x1,y1 	The end position - * - * @api - */  void gwinDrawLine(GHandle gh, coord_t x0, coord_t y0, coord_t x1, coord_t y1) {  	#if GDISP_NEED_CLIP  		gdispSetClip(gh->x, gh->y, gh->width, gh->height); @@ -200,17 +141,6 @@ void gwinDrawLine(GHandle gh, coord_t x0, coord_t y0, coord_t x1, coord_t y1) {  	gdispDrawLine(gh->x+x0, gh->y+y0, gh->x+x1, gh->y+y1, gh->color);  } -/** - * @brief   Draw a box in the window - * @note	Uses the current foreground color to draw the box - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x,y		The start position - * @param[in] cx,cy		The size of the box (outside dimensions) - * - * @api - */  void gwinDrawBox(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy) {  	#if GDISP_NEED_CLIP  		gdispSetClip(gh->x, gh->y, gh->width, gh->height); @@ -218,17 +148,6 @@ void gwinDrawBox(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy) {  	gdispDrawBox(gh->x+x, gh->y+y, cx, cy, gh->color);  } -/** - * @brief   Fill an rectangular area in the window - * @note	Uses the current foreground color to fill the box - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x,y		The start position - * @param[in] cx,cy		The size of the box (outside dimensions) - * - * @api - */  void gwinFillArea(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy) {  	#if GDISP_NEED_CLIP  		gdispSetClip(gh->x, gh->y, gh->width, gh->height); @@ -236,23 +155,6 @@ void gwinFillArea(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy) {  	gdispFillArea(gh->x+x, gh->y+y, cx, cy, gh->color);  } -/** - * @brief   Fill an area in the window using the supplied bitmap. - * @details The bitmap is in the pixel format specified by the low level driver - * @note	If GDISP_NEED_ASYNC is defined then the buffer must be static - * 			or at least retained until this call has finished the blit. You can - * 			tell when all graphics drawing is finished by @p gdispIsBusy() going FALSE. - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x, y		The start filled area - * @param[in] cx, cy	The width and height to be filled - * @param[in] srcx, srcy	The bitmap position to start the fill from - * @param[in] srccx		The width of a line in the bitmap. - * @param[in] buffer	The pixels to use to fill the area. - * - * @api - */  void gwinBlitArea(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx, coord_t srcy, coord_t srccx, const pixel_t *buffer) {  	#if GDISP_NEED_CLIP  		gdispSetClip(gh->x, gh->y, gh->width, gh->height); @@ -260,285 +162,127 @@ void gwinBlitArea(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy, coor  	gdispBlitAreaEx(gh->x+x, gh->y+y, cx, cy, srcx, srcy, srccx, buffer);  } -#if GDISP_NEED_CIRCLE || defined(__DOXYGEN__) -/** - * @brief   Draw a circle in the window. - * @note	Uses the current foreground color to draw the circle - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x, y		The center of the circle - * @param[in] radius	The radius of the circle - * - * @api - */ -void gwinDrawCircle(GHandle gh, coord_t x, coord_t y, coord_t radius) { -	#if GDISP_NEED_CLIP -		gdispSetClip(gh->x, gh->y, gh->width, gh->height); -	#endif -	gdispDrawCircle(gh->x+x, gh->y+y, radius, gh->color); -} -#endif +#if GDISP_NEED_CIRCLE +	void gwinDrawCircle(GHandle gh, coord_t x, coord_t y, coord_t radius) { +		#if GDISP_NEED_CLIP +			gdispSetClip(gh->x, gh->y, gh->width, gh->height); +		#endif +		gdispDrawCircle(gh->x+x, gh->y+y, radius, gh->color); +	} -#if GDISP_NEED_CIRCLE || defined(__DOXYGEN__) -/** - * @brief   Draw a filled circle in the window. - * @note	Uses the current foreground color to draw the filled circle - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x, y		The center of the circle - * @param[in] radius	The radius of the circle - * - * @api - */ -void gwinFillCircle(GHandle gh, coord_t x, coord_t y, coord_t radius) { -	#if GDISP_NEED_CLIP -		gdispSetClip(gh->x, gh->y, gh->width, gh->height); -	#endif -	gdispFillCircle(gh->x+x, gh->y+y, radius, gh->color); -} +	void gwinFillCircle(GHandle gh, coord_t x, coord_t y, coord_t radius) { +		#if GDISP_NEED_CLIP +			gdispSetClip(gh->x, gh->y, gh->width, gh->height); +		#endif +		gdispFillCircle(gh->x+x, gh->y+y, radius, gh->color); +	}  #endif -#if GDISP_NEED_ELLIPSE || defined(__DOXYGEN__) -/** - * @brief   Draw an ellipse. - * @note	Uses the current foreground color to draw the ellipse - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x,y		The center of the ellipse - * @param[in] a,b		The dimensions of the ellipse - * - * @api - */ -void gwinDrawEllipse(GHandle gh, coord_t x, coord_t y, coord_t a, coord_t b) { -	#if GDISP_NEED_CLIP -		gdispSetClip(gh->x, gh->y, gh->width, gh->height); -	#endif -	gdispDrawEllipse(gh->x+x, gh->y+y, a, b, gh->color); -} -#endif +#if GDISP_NEED_ELLIPSE +	void gwinDrawEllipse(GHandle gh, coord_t x, coord_t y, coord_t a, coord_t b) { +		#if GDISP_NEED_CLIP +			gdispSetClip(gh->x, gh->y, gh->width, gh->height); +		#endif +		gdispDrawEllipse(gh->x+x, gh->y+y, a, b, gh->color); +	} -#if GDISP_NEED_ELLIPSE || defined(__DOXYGEN__) -/** - * @brief   Draw an filled ellipse. - * @note	Uses the current foreground color to draw the filled ellipse - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x,y		The center of the ellipse - * @param[in] a,b		The dimensions of the ellipse - * - * @api - */ -void gwinFillEllipse(GHandle gh, coord_t x, coord_t y, coord_t a, coord_t b) { -	#if GDISP_NEED_CLIP -		gdispSetClip(gh->x, gh->y, gh->width, gh->height); -	#endif -	gdispFillEllipse(gh->x+x, gh->y+y, a, b, gh->color); -} +	void gwinFillEllipse(GHandle gh, coord_t x, coord_t y, coord_t a, coord_t b) { +		#if GDISP_NEED_CLIP +			gdispSetClip(gh->x, gh->y, gh->width, gh->height); +		#endif +		gdispFillEllipse(gh->x+x, gh->y+y, a, b, gh->color); +	}  #endif -#if GDISP_NEED_ARC || defined(__DOXYGEN__) -/* - * @brief	Draw an arc in the window. - * @note	Uses the current foreground color to draw the arc - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x,y		The center point - * @param[in] radius	The radius of the arc - * @param[in] start		The start angle (0 to 360) - * @param[in] end		The end angle (0 to 360) - * - * @api - */ -void gwinDrawArc(GHandle gh, coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle) { -	#if GDISP_NEED_CLIP -		gdispSetClip(gh->x, gh->y, gh->width, gh->height); -	#endif -	gdispDrawArc(gh->x+x, gh->y+y, radius, startangle, endangle, gh->color); -} -#endif +#if GDISP_NEED_ARC +	void gwinDrawArc(GHandle gh, coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle) { +		#if GDISP_NEED_CLIP +			gdispSetClip(gh->x, gh->y, gh->width, gh->height); +		#endif +		gdispDrawArc(gh->x+x, gh->y+y, radius, startangle, endangle, gh->color); +	} -#if GDISP_NEED_ARC || defined(__DOXYGEN__) -/* - * @brief	Draw a filled arc in the window. - * @note	Uses the current foreground color to draw the filled arc - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x,y		The center point - * @param[in] radius	The radius of the arc - * @param[in] start		The start angle (0 to 360) - * @param[in] end		The end angle (0 to 360) - * - * @api - */ -void gwinFillArc(GHandle gh, coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle) { -	#if GDISP_NEED_CLIP -		gdispSetClip(gh->x, gh->y, gh->width, gh->height); -	#endif -	gdispFillArc(gh->x+x, gh->y+y, radius, startangle, endangle, gh->color); -} +	void gwinFillArc(GHandle gh, coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle) { +		#if GDISP_NEED_CLIP +			gdispSetClip(gh->x, gh->y, gh->width, gh->height); +		#endif +		gdispFillArc(gh->x+x, gh->y+y, radius, startangle, endangle, gh->color); +	}  #endif -#if GDISP_NEED_PIXELREAD || defined(__DOXYGEN__) -/** - * @brief   Get the color of a pixel in the window. - * @return  The color of the pixel. - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x,y		The position in the window - * - * @api - */ -color_t gwinGetPixelColor(GHandle gh, coord_t x, coord_t y) { -	#if GDISP_NEED_CLIP -		gdispSetClip(gh->x, gh->y, gh->width, gh->height); -	#endif -	return gdispGetPixelColor(gh->x+x, gh->y+y); -} +#if GDISP_NEED_PIXELREAD +	color_t gwinGetPixelColor(GHandle gh, coord_t x, coord_t y) { +		#if GDISP_NEED_CLIP +			gdispSetClip(gh->x, gh->y, gh->width, gh->height); +		#endif +		return gdispGetPixelColor(gh->x+x, gh->y+y); +	}  #endif -#if GDISP_NEED_TEXT || defined(__DOXYGEN__) -/** - * @brief   Draw a text character at the specified position in the window. - * @pre		The font must have been set. - * @note	Uses the current foreground color to draw the character - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x,y		The position for the text - * @param[in] c			The character to draw - * - * @api - */ -void gwinDrawChar(GHandle gh, coord_t x, coord_t y, char c) { -	if (!gh->font) return; -	#if GDISP_NEED_CLIP -		gdispSetClip(gh->x, gh->y, gh->width, gh->height); -	#endif -	gdispDrawChar(gh->x+x, gh->y+y, c, gh->font, gh->color); -} -#endif +#if GDISP_NEED_TEXT +	void gwinDrawChar(GHandle gh, coord_t x, coord_t y, char c) { +		if (!gh->font) return; +		#if GDISP_NEED_CLIP +			gdispSetClip(gh->x, gh->y, gh->width, gh->height); +		#endif +		gdispDrawChar(gh->x+x, gh->y+y, c, gh->font, gh->color); +	} -#if GDISP_NEED_TEXT || defined(__DOXYGEN__) -/** - * @brief   Draw a text character with a filled background at the specified position in the window. - * @pre		The font must have been set. - * @note	Uses the current foreground color to draw the character and fills the background using the background drawing color - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x,y		The position for the text - * @param[in] c			The character to draw - * - * @api - */ -void gwinFillChar(GHandle gh, coord_t x, coord_t y, char c) { -	if (!gh->font) return; -	#if GDISP_NEED_CLIP -		gdispSetClip(gh->x, gh->y, gh->width, gh->height); -	#endif -	gdispFillChar(gh->x+x, gh->y+y, c, gh->font, gh->color, gh->bgcolor); -} -#endif +	void gwinFillChar(GHandle gh, coord_t x, coord_t y, char c) { +		if (!gh->font) return; +		#if GDISP_NEED_CLIP +			gdispSetClip(gh->x, gh->y, gh->width, gh->height); +		#endif +		gdispFillChar(gh->x+x, gh->y+y, c, gh->font, gh->color, gh->bgcolor); +	} -#if GDISP_NEED_TEXT || defined(__DOXYGEN__) -/** - * @brief   Draw a text string in the window - * @pre		The font must have been set. - * @note	Uses the current foreground color to draw the character - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x,y		The position for the text - * @param[in] str		The string to draw - * - * @api - */ -void gwinDrawString(GHandle gh, coord_t x, coord_t y, const char *str) { -	if (!gh->font) return; -	#if GDISP_NEED_CLIP -		gdispSetClip(gh->x, gh->y, gh->width, gh->height); -	#endif -	gdispDrawString(gh->x+x, gh->y+y, str, gh->font, gh->color); -} -#endif +	void gwinDrawString(GHandle gh, coord_t x, coord_t y, const char *str) { +		if (!gh->font) return; +		#if GDISP_NEED_CLIP +			gdispSetClip(gh->x, gh->y, gh->width, gh->height); +		#endif +		gdispDrawString(gh->x+x, gh->y+y, str, gh->font, gh->color); +	} -#if GDISP_NEED_TEXT || defined(__DOXYGEN__) -/** - * @brief   Draw a text string with a filled background in the window - * @pre		The font must have been set. - * @note	Uses the current foreground color to draw the character and fills the background using the background drawing color - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x,y		The position for the text - * @param[in] str		The string to draw - * - * @api - */ -void gwinFillString(GHandle gh, coord_t x, coord_t y, const char *str) { -	if (!gh->font) return; -	#if GDISP_NEED_CLIP -		gdispSetClip(gh->x, gh->y, gh->width, gh->height); -	#endif -	gdispFillString(gh->x+x, gh->y+y, str, gh->font, gh->color, gh->bgcolor); -} -#endif +	void gwinFillString(GHandle gh, coord_t x, coord_t y, const char *str) { +		if (!gh->font) return; +		#if GDISP_NEED_CLIP +			gdispSetClip(gh->x, gh->y, gh->width, gh->height); +		#endif +		gdispFillString(gh->x+x, gh->y+y, str, gh->font, gh->color, gh->bgcolor); +	} -#if GDISP_NEED_TEXT || defined(__DOXYGEN__) -/** - * @brief   Draw a text string verticly centered within the specified box. - * @pre		The font must have been set. - * @note	Uses the current foreground color to draw the character. - * @note    The specified box does not need to align with the window box - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x,y		The position for the text (need to define top-right or base-line - check code) - * @param[in] cx,cy		The width and height of the box - * @param[in] str		The string to draw - * @param[in] justify	Justify the text left, center or right within the box - * - * @api - */ -void gwinDrawStringBox(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy, const char* str, justify_t justify) { -	if (!gh->font) return; -	#if GDISP_NEED_CLIP -		gdispSetClip(gh->x, gh->y, gh->width, gh->height); -	#endif -	gdispDrawStringBox(gh->x+x, gh->y+y, cx, cy, str, gh->font, gh->color, justify); -} +	void gwinDrawStringBox(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy, const char* str, justify_t justify) { +		if (!gh->font) return; +		#if GDISP_NEED_CLIP +			gdispSetClip(gh->x, gh->y, gh->width, gh->height); +		#endif +		gdispDrawStringBox(gh->x+x, gh->y+y, cx, cy, str, gh->font, gh->color, justify); +	} + +	void gwinFillStringBox(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy, const char* str, justify_t justify) { +		if (!gh->font) return; +		#if GDISP_NEED_CLIP +			gdispSetClip(gh->x, gh->y, gh->width, gh->height); +		#endif +		gdispFillStringBox(gh->x+x, gh->y+y, cx, cy, str, gh->font, gh->color, gh->bgcolor, justify); +	}  #endif -#if GDISP_NEED_TEXT || defined(__DOXYGEN__) -/** - * @brief   Draw a text string verticly centered within the specified filled box. - * @pre		The font must have been set. - * @note	Uses the current foreground color to draw the character and fills the background using the background drawing color - * @note    The entire box is filled. Note this box does not need to align with the window box - * @note	May leave GDISP clipping to this window's dimensions - * - * @param[in] gh		The window handle - * @param[in] x,y		The position for the text (need to define top-right or base-line - check code) - * @param[in] cx,cy		The width and height of the box - * @param[in] str		The string to draw - * @param[in] justify	Justify the text left, center or right within the box - * - * @api - */ -void gwinFillStringBox(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy, const char* str, justify_t justify) { -	if (!gh->font) return; -	#if GDISP_NEED_CLIP -		gdispSetClip(gh->x, gh->y, gh->width, gh->height); -	#endif -	gdispFillStringBox(gh->x+x, gh->y+y, cx, cy, str, gh->font, gh->color, gh->bgcolor, justify); -} +#if GDISP_NEED_CONVEX_POLYGON +	void gwinDrawPoly(GHandle gh, coord_t tx, coord_t ty, const point *pntarray, unsigned cnt) { +		#if GDISP_NEED_CLIP +			gdispSetClip(gh->x, gh->y, gh->width, gh->height); +		#endif +		gdispDrawPoly(tx+gh->x, ty+gh->y, pntarray, cnt, gh->color); +	} + +	void gwinFillConvexPoly(GHandle gh, coord_t tx, coord_t ty, const point *pntarray, unsigned cnt) { +		#if GDISP_NEED_CLIP +			gdispSetClip(gh->x, gh->y, gh->width, gh->height); +		#endif +		gdispFillConvexPoly(tx+gh->x, ty+gh->y, pntarray, cnt, gh->color); +	}  #endif  #endif /* GFX_USE_GWIN */  | 
