GWIN doc update and poly functions

Add poly functions to GWIN
Move doxygen documentation to header file
remotes/origin_old/ugfx_release_2.6
Andrew Hannam 2013-03-18 18:29:28 +10:00
parent d678352b9a
commit 285f1977ed
2 changed files with 626 additions and 565 deletions

View File

@ -1,186 +1,503 @@
/* /*
ChibiOS/GFX - Copyright (C) 2012, 2013 ChibiOS/GFX - Copyright (C) 2012, 2013
Joel Bodenmann aka Tectu <joel@unormal.org> Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX. This file is part of ChibiOS/GFX.
ChibiOS/GFX is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or the Free Software Foundation; either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
ChibiOS/GFX is distributed in the hope that it will be useful, ChibiOS/GFX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* @file include/gwin/gwin.h * @file include/gwin/gwin.h
* @brief GWIN Graphic window subsystem header file. * @brief GWIN Graphic window subsystem header file.
* *
* @defgroup Window Window * @defgroup Window Window
* @ingroup GWIN * @ingroup GWIN
* *
* @details GWIN provides a basic window manager which allows it to easily * @details GWIN provides a basic window manager which allows it to easily
* create and destroy different windows on runtime. Each window * create and destroy different windows on runtime. Each window
* will have it's own properties such as colors, brushes as well as * will have it's own properties such as colors, brushes as well as
* it's own drawing origin. * it's own drawing origin.
* Moving the windows around is not supported yet. * Moving the windows around is not supported yet.
* *
* @pre GFX_USE_GWIN must be set to TRUE in your gfxconf.h * @pre GFX_USE_GWIN must be set to TRUE in your gfxconf.h
* *
* @{ * @{
*/ */
#ifndef _GWIN_H #ifndef _GWIN_H
#define _GWIN_H #define _GWIN_H
#include "gfx.h" #include "gfx.h"
#if GFX_USE_GWIN || defined(__DOXYGEN__) #if GFX_USE_GWIN || defined(__DOXYGEN__)
/*===========================================================================*/ /*===========================================================================*/
/* Type definitions */ /* Type definitions */
/*===========================================================================*/ /*===========================================================================*/
typedef uint16_t GWindowType; typedef uint16_t GWindowType;
#define GW_WINDOW 0x0000 #define GW_WINDOW 0x0000
#define GW_FIRST_USER_WINDOW 0x8000 #define GW_FIRST_USER_WINDOW 0x8000
// A basic window // A basic window
typedef struct GWindowObject_t { typedef struct GWindowObject_t {
GWindowType type; // What type of window is this GWindowType type; // What type of window is this
uint16_t flags; // Internal flags uint16_t flags; // Internal flags
coord_t x, y; // Screen relative position coord_t x, y; // Screen relative position
coord_t width, height; // Dimensions of this window coord_t width, height; // Dimensions of this window
color_t color, bgcolor; // Current drawing colors color_t color, bgcolor; // Current drawing colors
#if GDISP_NEED_TEXT #if GDISP_NEED_TEXT
font_t font; // Current font font_t font; // Current font
#endif #endif
} GWindowObject, * GHandle; } GWindowObject, * GHandle;
/*===========================================================================*/ /*===========================================================================*/
/* External declarations. */ /* External declarations. */
/*===========================================================================*/ /*===========================================================================*/
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/* Base Functions */ /* Base Functions */
GHandle gwinCreateWindow(GWindowObject *gw, coord_t x, coord_t y, coord_t width, coord_t height);
void gwinDestroyWindow(GHandle gh); /**
* @brief Create a basic window.
/** * @return NULL if there is no resultant drawing area, otherwise a window handle.
* @brief Get the X coordinate of the window *
* @details Returns the X coordinate of the origin of the window. * @param[in] gw The window structure to initialize. If this is NULL the structure is dynamically allocated.
* The coordinate is relative to the physical screen zero point. * @param[in] x,y The screen coordinates for the bottom left corner of the window
* * @param[in] width The width of the window
* @param[in] gh 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.
#define gwinGetScreenX(gh) ((gh)->x) * @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)
* @brief Get the Y coordinate of the window *
* @details Returns the Y coordinate of the origin of the window. * @api
* The coordinate is relative to the physical screen zero point. */
* GHandle gwinCreateWindow(GWindowObject *gw, coord_t x, coord_t y, coord_t width, coord_t height);
* @param[in] gh The window
*/ /**
#define gwinGetScreenY(gh) ((gh)->y) * @brief Destroy a window (of any type). Releases any dynamically allocated memory.
*
/** * @param[in] gh The window handle
* @brief Get the width of the window *
* * @api
* @param[in] gh The window */
*/ void gwinDestroyWindow(GHandle gh);
#define gwinGetWidth(gh) ((gh)->width)
/**
/** * @brief Get the X coordinate of the window
* @brief Get the height of the window * @details Returns the X coordinate of the origin of the window.
* * The coordinate is relative to the physical screen zero point.
* @param[in] gh The window *
*/ * @param[in] gh The window
#define gwinGetHeight(gh) ((gh)->height) */
#define gwinGetScreenX(gh) ((gh)->x)
/**
* @brief Set foreground color /**
* @details Set the color which will be used to draw * @brief Get the Y coordinate of the window
* * @details Returns the Y coordinate of the origin of the window.
* @param[in] gh The window * The coordinate is relative to the physical screen zero point.
* @param[in] clr The color to be set *
*/ * @param[in] gh The window
#define gwinSetColor(gh, clr) (gh)->color = (clr) */
#define gwinGetScreenY(gh) ((gh)->y)
/**
* @brief Set background color /**
* @details Set the color which will be used as background * @brief Get the width of the window
* @note gwinClear() must be called to set the background color *
* * @param[in] gh The window
* @param[in] gh The window */
* @param[in] bgclr The background color #define gwinGetWidth(gh) ((gh)->width)
*/
#define gwinSetBgColor(gh, bgclr) (gh)->bgcolor = (bgclr) /**
* @brief Get the height of the window
/* Set up for text */ *
#if GDISP_NEED_TEXT * @param[in] gh The window
void gwinSetFont(GHandle gh, font_t font); */
#endif #define gwinGetHeight(gh) ((gh)->height)
/* Drawing Functions */ /**
void gwinClear(GHandle gh); * @brief Set foreground color
void gwinDrawPixel(GHandle gh, coord_t x, coord_t y); * @details Set the color which will be used to draw
void gwinDrawLine(GHandle gh, coord_t x0, coord_t y0, coord_t x1, coord_t y1); *
void gwinDrawBox(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy); * @param[in] gh The window
void gwinFillArea(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy); * @param[in] clr The color to be set
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); */
#define gwinSetColor(gh, clr) (gh)->color = (clr)
/* Circle Functions */
#if GDISP_NEED_CIRCLE /**
void gwinDrawCircle(GHandle gh, coord_t x, coord_t y, coord_t radius); * @brief Set background color
void gwinFillCircle(GHandle gh, coord_t x, coord_t y, coord_t radius); * @details Set the color which will be used as background
#endif * @note gwinClear() must be called to set the background color
*
/* Ellipse Functions */ * @param[in] gh The window
#if GDISP_NEED_ELLIPSE * @param[in] bgclr The background color
void gwinDrawEllipse(GHandle gh, coord_t x, coord_t y, coord_t a, coord_t b); */
void gwinFillEllipse(GHandle gh, coord_t x, coord_t y, coord_t a, coord_t b); #define gwinSetBgColor(gh, bgclr) (gh)->bgcolor = (bgclr)
#endif
/* Set up for text */
/* Arc Functions */
#if GDISP_NEED_ARC #if GDISP_NEED_TEXT || defined(__DOXYGEN__)
void gwinDrawArc(GHandle gh, coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle); /**
void gwinFillArc(GHandle gh, coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle); * @brief Set the current font for this window.
#endif *
* @param[in] gh The window handle
/* Read a pixel Function */ * @param[in] font The font to use for text functions
#if GDISP_NEED_PIXELREAD *
color_t gwinGetPixelColor(GHandle gh, coord_t x, coord_t y); * @api
#endif */
void gwinSetFont(GHandle gh, font_t font);
/* Extra Text Functions */ #endif
#if GDISP_NEED_TEXT
void gwinDrawChar(GHandle gh, coord_t x, coord_t y, char c); /* Drawing Functions */
void gwinFillChar(GHandle gh, coord_t x, coord_t y, char c);
void gwinDrawString(GHandle gh, coord_t x, coord_t y, const char *str); /**
void gwinFillString(GHandle gh, coord_t x, coord_t y, const char *str); * @brief Clear the window
void gwinDrawStringBox(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy, const char* str, justify_t justify); * @note Uses the current background color to clear the window
void gwinFillStringBox(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy, const char* str, justify_t justify); *
#endif * @param[in] gh The window handle
*
#ifdef __cplusplus * @api
} */
#endif void gwinClear(GHandle gh);
/* Include extra window types */ /**
#include "gwin/console.h" * @brief Set a pixel in the window
#include "gwin/button.h" * @note Uses the current foreground color to set the pixel
#include "gwin/graph.h" * @note May leave GDISP clipping to this window's dimensions
*
#endif /* GFX_USE_GWIN */ * @param[in] gh The window handle
* @param[in] x,y The coordinates of the pixel
#endif /* _GWIN_H */ *
/** @} */ * @api
*/
void gwinDrawPixel(GHandle gh, coord_t x, coord_t y);
/**
* @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);
/**
* @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);
/**
* @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);
/**
* @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);
/* Circle Functions */
#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);
/**
* @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);
#endif
/* Ellipse Functions */
#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);
/**
* @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);
#endif
/* Arc Functions */
#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);
/*
* @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);
#endif
/* Read a pixel Function */
#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);
#endif
/* Extra Text Functions */
#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);
/**
* @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);
/**
* @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);
/**
* @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);
/**
* @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);
/**
* @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);
#endif
#if GDISP_NEED_CONVEX_POLYGON || defined(__DOXYGEN__)
/**
* @brief Draw an enclosed polygon (convex, non-convex or complex).
*
* @note Uses the current foreground color.
*
* @param[in] gh The window handle
* @param[in] tx, ty Transform all points in pntarray by tx, ty
* @param[in] pntarray An array of points
* @param[in] cnt The number of points in the array
*
* @api
*/
void gwinDrawPoly(GHandle gh, coord_t tx, coord_t ty, const point *pntarray, unsigned cnt);
/**
* @brief Fill a convex polygon
* @details Doesn't handle non-convex or complex polygons.
*
* @note Uses the current foreground color.
*
* @param[in] gh The window handle
* @param[in] tx, ty Transform all points in pntarray by tx, ty
* @param[in] pntarray An array of points
* @param[in] cnt The number of points in the array
*
* @note Convex polygons are those that have no internal angles. That is;
* you can draw a line from any point on the polygon to any other point
* on the polygon without it going outside the polygon. In our case we generalise
* this a little by saying that an infinite horizontal line (at any y value) will cross
* no more than two edges on the polygon. Some non-convex polygons do fit this criteria
* and can therefore be drawn.
* @note This routine is designed to be very efficient with even simple display hardware.
*
* @api
*/
void gwinFillConvexPoly(GHandle gh, coord_t tx, coord_t ty, const point *pntarray, unsigned cnt);
#endif
#ifdef __cplusplus
}
#endif
/* Include extra window types */
#include "gwin/console.h"
#include "gwin/button.h"
#include "gwin/graph.h"
#endif /* GFX_USE_GWIN */
#endif /* _GWIN_H */
/** @} */

View File

@ -31,7 +31,7 @@
#include "hal.h" #include "hal.h"
#include "gfx.h" #include "gfx.h"
#if GFX_USE_GWIN || defined(__DOXYGEN__) #if GFX_USE_GWIN
#include "gwin/internal.h" #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->height = height;
gw->color = White; gw->color = White;
gw->bgcolor = Black; gw->bgcolor = Black;
#if GDISP_NEED_TEXT #if GDISP_NEED_TEXT
gw->font = 0; gw->font = 0;
#endif #endif
return (GHandle)gw; 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) { 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)))) if (!(gw = (GWindowObject *)_gwinInit((GWindowObject *)gw, x, y, width, height, sizeof(GWindowObject))))
return 0; return 0;
@ -92,13 +77,6 @@ GHandle gwinCreateWindow(GWindowObject *gw, coord_t x, coord_t y, coord_t width,
return (GHandle)gw; 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) { void gwinDestroyWindow(GHandle gh) {
// Clean up any type specific dynamic memory allocations // Clean up any type specific dynamic memory allocations
switch(gh->type) { switch(gh->type) {
@ -123,34 +101,18 @@ void gwinDestroyWindow(GHandle gh) {
} }
} }
#if GDISP_NEED_TEXT || defined(__DOXYGEN__) #if GDISP_NEED_TEXT
/** void gwinSetFont(GHandle gh, font_t font) {
* @brief Set the current font for this window. gh->font = font;
* #if GWIN_NEED_CONSOLE
* @param[in] gh The window handle if (font && gh->type == GW_CONSOLE) {
* @param[in] font The font to use for text functions ((GConsoleObject *)gh)->fy = gdispGetFontMetric(font, fontHeight);
* ((GConsoleObject *)gh)->fp = gdispGetFontMetric(font, fontCharPadding);
* @api }
*/ #endif
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) { void gwinClear(GHandle gh) {
#if GDISP_NEED_CLIP #if GDISP_NEED_CLIP
gdispSetClip(gh->x, gh->y, gh->width, gh->height); gdispSetClip(gh->x, gh->y, gh->width, gh->height);
@ -165,16 +127,6 @@ void gwinClear(GHandle gh) {
#endif #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) { void gwinDrawPixel(GHandle gh, coord_t x, coord_t y) {
#if GDISP_NEED_CLIP #if GDISP_NEED_CLIP
gdispSetClip(gh->x, gh->y, gh->width, gh->height); 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); 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) { void gwinDrawLine(GHandle gh, coord_t x0, coord_t y0, coord_t x1, coord_t y1) {
#if GDISP_NEED_CLIP #if GDISP_NEED_CLIP
gdispSetClip(gh->x, gh->y, gh->width, gh->height); 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); 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) { void gwinDrawBox(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy) {
#if GDISP_NEED_CLIP #if GDISP_NEED_CLIP
gdispSetClip(gh->x, gh->y, gh->width, gh->height); 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); 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) { void gwinFillArea(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy) {
#if GDISP_NEED_CLIP #if GDISP_NEED_CLIP
gdispSetClip(gh->x, gh->y, gh->width, gh->height); 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); 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) { 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 #if GDISP_NEED_CLIP
gdispSetClip(gh->x, gh->y, gh->width, gh->height); 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); gdispBlitAreaEx(gh->x+x, gh->y+y, cx, cy, srcx, srcy, srccx, buffer);
} }
#if GDISP_NEED_CIRCLE || defined(__DOXYGEN__) #if GDISP_NEED_CIRCLE
/** void gwinDrawCircle(GHandle gh, coord_t x, coord_t y, coord_t radius) {
* @brief Draw a circle in the window. #if GDISP_NEED_CLIP
* @note Uses the current foreground color to draw the circle gdispSetClip(gh->x, gh->y, gh->width, gh->height);
* @note May leave GDISP clipping to this window's dimensions #endif
* gdispDrawCircle(gh->x+x, gh->y+y, radius, gh->color);
* @param[in] gh The window handle }
* @param[in] x, y The center of the circle
* @param[in] radius The radius of the circle void gwinFillCircle(GHandle gh, coord_t x, coord_t y, coord_t radius) {
* #if GDISP_NEED_CLIP
* @api gdispSetClip(gh->x, gh->y, gh->width, gh->height);
*/ #endif
void gwinDrawCircle(GHandle gh, coord_t x, coord_t y, coord_t radius) { gdispFillCircle(gh->x+x, gh->y+y, radius, gh->color);
#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 #endif
#if GDISP_NEED_CIRCLE || defined(__DOXYGEN__) #if GDISP_NEED_ELLIPSE
/** void gwinDrawEllipse(GHandle gh, coord_t x, coord_t y, coord_t a, coord_t b) {
* @brief Draw a filled circle in the window. #if GDISP_NEED_CLIP
* @note Uses the current foreground color to draw the filled circle gdispSetClip(gh->x, gh->y, gh->width, gh->height);
* @note May leave GDISP clipping to this window's dimensions #endif
* gdispDrawEllipse(gh->x+x, gh->y+y, a, b, gh->color);
* @param[in] gh The window handle }
* @param[in] x, y The center of the circle
* @param[in] radius The radius of the circle void gwinFillEllipse(GHandle gh, coord_t x, coord_t y, coord_t a, coord_t b) {
* #if GDISP_NEED_CLIP
* @api gdispSetClip(gh->x, gh->y, gh->width, gh->height);
*/ #endif
void gwinFillCircle(GHandle gh, coord_t x, coord_t y, coord_t radius) { gdispFillEllipse(gh->x+x, gh->y+y, a, b, gh->color);
#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 #endif
#if GDISP_NEED_ELLIPSE || defined(__DOXYGEN__) #if GDISP_NEED_ARC
/** void gwinDrawArc(GHandle gh, coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle) {
* @brief Draw an ellipse. #if GDISP_NEED_CLIP
* @note Uses the current foreground color to draw the ellipse gdispSetClip(gh->x, gh->y, gh->width, gh->height);
* @note May leave GDISP clipping to this window's dimensions #endif
* gdispDrawArc(gh->x+x, gh->y+y, radius, startangle, endangle, gh->color);
* @param[in] gh The window handle }
* @param[in] x,y The center of the ellipse
* @param[in] a,b The dimensions of the ellipse void gwinFillArc(GHandle gh, coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle) {
* #if GDISP_NEED_CLIP
* @api gdispSetClip(gh->x, gh->y, gh->width, gh->height);
*/ #endif
void gwinDrawEllipse(GHandle gh, coord_t x, coord_t y, coord_t a, coord_t b) { gdispFillArc(gh->x+x, gh->y+y, radius, startangle, endangle, gh->color);
#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 #endif
#if GDISP_NEED_ELLIPSE || defined(__DOXYGEN__) #if GDISP_NEED_PIXELREAD
/** color_t gwinGetPixelColor(GHandle gh, coord_t x, coord_t y) {
* @brief Draw an filled ellipse. #if GDISP_NEED_CLIP
* @note Uses the current foreground color to draw the filled ellipse gdispSetClip(gh->x, gh->y, gh->width, gh->height);
* @note May leave GDISP clipping to this window's dimensions #endif
* return gdispGetPixelColor(gh->x+x, gh->y+y);
* @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);
}
#endif #endif
#if GDISP_NEED_ARC || defined(__DOXYGEN__) #if GDISP_NEED_TEXT
/* void gwinDrawChar(GHandle gh, coord_t x, coord_t y, char c) {
* @brief Draw an arc in the window. if (!gh->font) return;
* @note Uses the current foreground color to draw the arc #if GDISP_NEED_CLIP
* @note May leave GDISP clipping to this window's dimensions gdispSetClip(gh->x, gh->y, gh->width, gh->height);
* #endif
* @param[in] gh The window handle gdispDrawChar(gh->x+x, gh->y+y, c, gh->font, gh->color);
* @param[in] x,y The center point }
* @param[in] radius The radius of the arc
* @param[in] start The start angle (0 to 360) void gwinFillChar(GHandle gh, coord_t x, coord_t y, char c) {
* @param[in] end The end angle (0 to 360) if (!gh->font) return;
* #if GDISP_NEED_CLIP
* @api gdispSetClip(gh->x, gh->y, gh->width, gh->height);
*/ #endif
void gwinDrawArc(GHandle gh, coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle) { gdispFillChar(gh->x+x, gh->y+y, c, gh->font, gh->color, gh->bgcolor);
#if GDISP_NEED_CLIP }
gdispSetClip(gh->x, gh->y, gh->width, gh->height);
#endif void gwinDrawString(GHandle gh, coord_t x, coord_t y, const char *str) {
gdispDrawArc(gh->x+x, gh->y+y, radius, startangle, endangle, gh->color); 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);
}
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);
}
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 #endif
#if GDISP_NEED_ARC || defined(__DOXYGEN__) #if GDISP_NEED_CONVEX_POLYGON
/* void gwinDrawPoly(GHandle gh, coord_t tx, coord_t ty, const point *pntarray, unsigned cnt) {
* @brief Draw a filled arc in the window. #if GDISP_NEED_CLIP
* @note Uses the current foreground color to draw the filled arc gdispSetClip(gh->x, gh->y, gh->width, gh->height);
* @note May leave GDISP clipping to this window's dimensions #endif
* gdispDrawPoly(tx+gh->x, ty+gh->y, pntarray, cnt, gh->color);
* @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);
}
#endif
#if GDISP_NEED_PIXELREAD || defined(__DOXYGEN__) void gwinFillConvexPoly(GHandle gh, coord_t tx, coord_t ty, const point *pntarray, unsigned cnt) {
/** #if GDISP_NEED_CLIP
* @brief Get the color of a pixel in the window. gdispSetClip(gh->x, gh->y, gh->width, gh->height);
* @return The color of the pixel. #endif
* @note May leave GDISP clipping to this window's dimensions gdispFillConvexPoly(tx+gh->x, ty+gh->y, pntarray, cnt, gh->color);
* }
* @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);
}
#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 || 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
#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
#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
#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);
}
#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);
}
#endif #endif
#endif /* GFX_USE_GWIN */ #endif /* GFX_USE_GWIN */