aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorAndrew Hannam <andrewh@inmarket.com.au>2012-10-30 18:18:29 +1000
committerAndrew Hannam <andrewh@inmarket.com.au>2012-10-30 18:18:29 +1000
commitd3b4c499ab0267dbcad3d5972bb0317fdba9043e (patch)
treea78f9434ae3b7a91ede62e8e1622be6eba015b11 /include
parenta55da05d2e0de3aad7cf7b1c12700a141e9e88b2 (diff)
downloaduGFX-d3b4c499ab0267dbcad3d5972bb0317fdba9043e.tar.gz
uGFX-d3b4c499ab0267dbcad3d5972bb0317fdba9043e.tar.bz2
uGFX-d3b4c499ab0267dbcad3d5972bb0317fdba9043e.zip
GDISP fixes and new routines. Many GWIN changes.
GDISP: Fix gdisp???Arc to use (possibly) hardware accelerated routines. Fix Arc orientation so 0 degrees is on x axis and 90 degrees points to the top of screen (instead of the bottom). Add rounded box routines (if ARC support is turned on). Add a gdispDrawStringBox to match the gdispFillStringBox routine. Repair prototypes in wrong place in gdisp.h GWIN: Extract the concept of a Window Handle to allow many new features. Allow dynamic creation of window objects as well as static initialisation. Seperate the console code into a console specific window type. Add buttons as a specific window type. The drawing code is complete, the input (touch or mouse) is still to be implemented.
Diffstat (limited to 'include')
-rw-r--r--include/gdisp.h22
-rw-r--r--include/gdisp_emulation.c116
-rw-r--r--include/gdisp_fonts.h1
-rw-r--r--include/gwin.h201
4 files changed, 258 insertions, 82 deletions
diff --git a/include/gdisp.h b/include/gdisp.h
index 9e3a3b77..3964e9bd 100644
--- a/include/gdisp.h
+++ b/include/gdisp.h
@@ -166,6 +166,9 @@ extern "C" {
#endif
#if GDISP_NEED_MULTITHREAD || GDISP_NEED_ASYNC
+ /* These routines can be hardware accelerated
+ * - Do not add a routine here unless it has also been added to the hardware acceleration layer
+ */
/* Base Functions */
bool_t gdispInit(void);
@@ -253,8 +256,9 @@ extern "C" {
#endif
-/* Now obsolete functions */
-#define gdispBlitArea(x, y, cx, cy, buffer) gdispBlitAreaEx(x, y, cx, cy, 0, 0, cx, buffer)
+/* These routines are not hardware accelerated
+ * - Do not add a hardware accelerated routines here.
+ */
/* Extra drawing functions */
void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
@@ -263,17 +267,31 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
#if GDISP_NEED_TEXT
void gdispDrawString(coord_t x, coord_t y, const char *str, font_t font, color_t color);
void gdispFillString(coord_t x, coord_t y, const char *str, font_t font, color_t color, color_t bgcolor);
+ void gdispDrawStringBox(coord_t x, coord_t y, coord_t cx, coord_t cy, const char* str, font_t font, color_t color, justify_t justify);
void gdispFillStringBox(coord_t x, coord_t y, coord_t cx, coord_t cy, const char* str, font_t font, color_t color, color_t bgColor, justify_t justify);
coord_t gdispGetFontMetric(font_t font, fontmetric_t metric);
coord_t gdispGetCharWidth(char c, font_t font);
coord_t gdispGetStringWidth(const char* str, font_t font);
#endif
+/* Extra Arc Functions */
+#if GDISP_NEED_ARC
+ void gdispDrawRoundedBox(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t radius, color_t color);
+ void gdispFillRoundedBox(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t radius, color_t color);
+#endif
+
/* Support routine for packed pixel formats */
#ifndef gdispPackPixels
void gdispPackPixels(const pixel_t *buf, coord_t cx, coord_t x, coord_t y, color_t color);
#endif
+/* Macro definitions
+ *
+ */
+
+/* Now obsolete functions */
+#define gdispBlitArea(x, y, cx, cy, buffer) gdispBlitAreaEx(x, y, cx, cy, 0, 0, cx, buffer)
+
/* Macro definitions for common gets and sets */
#define gdispSetPowerMode(powerMode) gdispControl(GDISP_CONTROL_POWER, (void *)(unsigned)(powerMode))
#define gdispSetOrientation(newOrientation) gdispControl(GDISP_CONTROL_ORIENTATION, (void *)(unsigned)(newOrientation))
diff --git a/include/gdisp_emulation.c b/include/gdisp_emulation.c
index 34596b61..ec3e6a66 100644
--- a/include/gdisp_emulation.c
+++ b/include/gdisp_emulation.c
@@ -291,7 +291,7 @@
#if GDISP_NEED_ARC && !GDISP_HARDWARE_ARCS
- #include <maths.h>
+ #include <math.h>
/*
* @brief Internal helper function for gdispDrawArc()
@@ -307,7 +307,7 @@
* @notapi
*/
static void _draw_arc(coord_t x, coord_t y, uint16_t start, uint16_t end, uint16_t radius, color_t color) {
- if (start >= 0 && start <= 180) {
+ if (/*start >= 0 && */start <= 180) {
float x_maxI = x + radius*cos(start*M_PI/180);
float x_minI;
@@ -322,13 +322,13 @@
do {
if(x-a <= x_maxI && x-a >= x_minI)
- GDISP_LLD(drawpixel)(x-a, y+b, color);
+ GDISP_LLD(drawpixel)(x-a, y-b, color);
if(x+a <= x_maxI && x+a >= x_minI)
- GDISP_LLD(drawpixel)(x+a, y+b, color);
+ GDISP_LLD(drawpixel)(x+a, y-b, color);
if(x-b <= x_maxI && x-b >= x_minI)
- GDISP_LLD(drawpixel)(x-b, y+a, color);
+ GDISP_LLD(drawpixel)(x-b, y-a, color);
if(x+b <= x_maxI && x+b >= x_minI)
- GDISP_LLD(drawpixel)(x+b, y+a, color);
+ GDISP_LLD(drawpixel)(x+b, y-a, color);
if (P < 0) {
P = P + 3 + 2*a;
@@ -356,13 +356,13 @@
do {
if(x-a <= x_maxII && x-a >= x_minII)
- GDISP_LLD(drawpixel)(x-a, y-b, color);
+ GDISP_LLD(drawpixel)(x-a, y+b, color);
if(x+a <= x_maxII && x+a >= x_minII)
- GDISP_LLD(drawpixel)(x+a, y-b, color);
+ GDISP_LLD(drawpixel)(x+a, y+b, color);
if(x-b <= x_maxII && x-b >= x_minII)
- GDISP_LLD(drawpixel)(x-b, y-a, color);
+ GDISP_LLD(drawpixel)(x-b, y+a, color);
if(x+b <= x_maxII && x+b >= x_minII)
- GDISP_LLD(drawpixel)(x+b, y-a, color);
+ GDISP_LLD(drawpixel)(x+b, y+a, color);
if (P < 0) {
P = P + 3 + 2*a;
@@ -387,14 +387,96 @@
#endif
#if GDISP_NEED_ARC && !GDISP_HARDWARE_ARCFILLS
+ /*
+ * @brief Internal helper function for gdispDrawArc()
+ *
+ * @note DO NOT USE DIRECTLY!
+ *
+ * @param[in] x, y The middle point of the arc
+ * @param[in] start The start angle of the arc
+ * @param[in] end The end angle of the arc
+ * @param[in] radius The radius of the arc
+ * @param[in] color The color in which the arc will be drawn
+ *
+ * @notapi
+ */
+ static void _fill_arc(coord_t x, coord_t y, uint16_t start, uint16_t end, uint16_t radius, color_t color) {
+ if (/*start >= 0 && */start <= 180) {
+ float x_maxI = x + radius*cos(start*M_PI/180);
+ float x_minI;
+
+ if (end > 180)
+ x_minI = x - radius;
+ else
+ x_minI = x + radius*cos(end*M_PI/180);
+
+ int a = 0;
+ int b = radius;
+ int P = 1 - radius;
+
+ do {
+ if(x-a <= x_maxI && x-a >= x_minI)
+ GDISP_LLD(drawline)(x, y, x-a, y-b, color);
+ if(x+a <= x_maxI && x+a >= x_minI)
+ GDISP_LLD(drawline)(x, y, x+a, y-b, color);
+ if(x-b <= x_maxI && x-b >= x_minI)
+ GDISP_LLD(drawline)(x, y, x-b, y-a, color);
+ if(x+b <= x_maxI && x+b >= x_minI)
+ GDISP_LLD(drawline)(x, y, x+b, y-a, color);
+
+ if (P < 0) {
+ P = P + 3 + 2*a;
+ a = a + 1;
+ } else {
+ P = P + 5 + 2*(a - b);
+ a = a + 1;
+ b = b - 1;
+ }
+ } while(a <= b);
+ }
+
+ if (end > 180 && end <= 360) {
+ float x_maxII = x+radius*cos(end*M_PI/180);
+ float x_minII;
+
+ if(start <= 180)
+ x_minII = x - radius;
+ else
+ x_minII = x+radius*cos(start*M_PI/180);
+
+ int a = 0;
+ int b = radius;
+ int P = 1 - radius;
+
+ do {
+ if(x-a <= x_maxII && x-a >= x_minII)
+ GDISP_LLD(drawline)(x, y, x-a, y+b, color);
+ if(x+a <= x_maxII && x+a >= x_minII)
+ GDISP_LLD(drawline)(x, y, x+a, y+b, color);
+ if(x-b <= x_maxII && x-b >= x_minII)
+ GDISP_LLD(drawline)(x, y, x-b, y+a, color);
+ if(x+b <= x_maxII && x+b >= x_minII)
+ GDISP_LLD(drawline)(x, y, x+b, y+a, color);
+
+ if (P < 0) {
+ P = P + 3 + 2*a;
+ a = a + 1;
+ } else {
+ P = P + 5 + 2*(a - b);
+ a = a + 1;
+ b = b - 1;
+ }
+ } while (a <= b);
+ }
+ }
+
void GDISP_LLD(fillarc)(coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle, color_t color) {
- (void)x;
- (void)y;
- (void)radius;
- (void)startangle;
- (void)endangle;
- (void)color;
-#warning "GDISP: FillArc Emulation Not Implemented Yet"
+ if(endangle < startangle) {
+ _fill_arc(x, y, startangle, 360, radius, color);
+ _fill_arc(x, y, 0, endangle, radius, color);
+ } else {
+ _fill_arc(x, y, startangle, endangle, radius, color);
+ }
}
#endif
diff --git a/include/gdisp_fonts.h b/include/gdisp_fonts.h
index 1a2cb3d7..4b9f2287 100644
--- a/include/gdisp_fonts.h
+++ b/include/gdisp_fonts.h
@@ -88,4 +88,3 @@ struct font {
#endif /* _GDISP_FONTS_H */
/** @} */
-
diff --git a/include/gwin.h b/include/gwin.h
index 7dfa4c68..79b8371c 100644
--- a/include/gwin.h
+++ b/include/gwin.h
@@ -45,52 +45,119 @@
* @name GWIN more complex functionality to be compiled
* @{
*/
+ /**
+ * @brief Should console functions be included.
+ * @details Defaults to TRUE
+ */
+ #ifndef GWIN_NEED_CONSOLE
+ #define GWIN_NEED_CONSOLE TRUE
+ #endif
+ /**
+ * @brief Should button functions be included.
+ * @details Defaults to FALSE for now as implementation is not complete
+ */
+ #ifndef GWIN_NEED_BUTTON
+ #define GWIN_NEED_BUTTON FALSE
+ #endif
+
/** @} */
/*===========================================================================*/
/* Low Level Driver details and error checks. */
/*===========================================================================*/
-#if !GFX_USE_GDISP
+#if !defined(GFX_USE_GDISP)
#error "GWIN: GFX_USE_GDISP must also be defined"
#endif
-
#include "gdisp.h"
#if !GDISP_NEED_CLIP
#warning "GWIN: Drawing can occur outside the defined window as GDISP_NEED_CLIP is FALSE"
#endif
+#if GWIN_NEED_CONSOLE && !GDISP_NEED_TEXT
+ #error "GWIN: Text support (GDISP_NEED_TEXT) is required if GWIN_NEED_CONSOLE is defined."
+#endif
+
+#if GWIN_NEED_BUTTON && !GDISP_NEED_TEXT
+ #error "GWIN: Text support (GDISP_NEED_TEXT) is required if GWIN_NEED_BUTTON is defined."
+#endif
+
+#if GWIN_NEED_BUTTON
+ #warning "GWIN: Button support is not complete yet"
+#endif
+
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
-/**
- * @extends BaseAsynchronousChannelVMT
- *
- * @brief @p GWindow virtual methods table.
- */
-struct GWindowVMT {
- _base_asynchronous_channel_methods
-};
-
-struct GWindowText {
- const struct GWindowVMT *vmt;
- _base_asynchronous_channel_data
- font_t font; // Current font
- uint8_t fy; // Current font height
- uint8_t fp; // Current font inter-character spacing
- coord_t cx,cy; // Cursor position
-};
-
-typedef struct GWindow_t {
+typedef enum GWindowType_e {
+ GW_WINDOW, GW_CONSOLE, GW_BUTTON
+ } GWindowType;
+
+// A basic window
+typedef struct GWindowObject_t {
+ GWindowType type; // What type of window is this
+ uint16_t flags; // Internal flags
+ coord_t x, y; // Screen relative position
+ coord_t width, height; // Dimensions of this window
+ color_t color, bgcolor; // Current drawing colors
#if GDISP_NEED_TEXT
- struct GWindowText txt;
+ font_t font; // Current font
+#endif
+} GWindowObject, * GHandle;
+
+#if GWIN_NEED_CONSOLE
+ // A console window. Supports wrapped text writing and a cursor.
+ typedef struct GConsoleObject_t {
+ GWindowObject gwin;
+
+ struct GConsoleWindowStream_t {
+ const struct GConsoleWindowVMT_t *vmt;
+ _base_asynchronous_channel_data
+ } stream;
+
+ coord_t cx,cy; // Cursor position
+ uint8_t fy; // Current font height
+ uint8_t fp; // Current font inter-character spacing
+ } GConsoleObject;
+#endif
+
+#if GWIN_NEED_BUTTON
+ typedef enum GButtonShape_e {
+ GBTN_3D, GBTN_SQUARE, GBTN_ROUNDED, GBTN_ELLIPSE
+ } GButtonShape;
+
+ typedef struct GButtonStyle_t {
+ GButtonShape shape;
+ color_t color_up_edge;
+ color_t color_up_fill;
+ color_t color_up_txt;
+ color_t color_dn_edge;
+ color_t color_dn_fill;
+ color_t color_dn_txt;
+ } GButtonStyle;
+
+ typedef enum GButtonType_e {
+ GBTN_NORMAL, GBTN_TOGGLE
+ } GButtonType;
+
+ typedef enum GButtonState_e {
+ GBTN_UP, GBTN_DOWN
+ } GButtonState;
+
+ // A button window
+ typedef struct GButtonObject_t {
+ GWindowObject gwin;
+
+ GButtonStyle style;
+ GButtonState state;
+ GButtonType type;
+ const char * txt;
+ void * callback; // To be fixed
+ void * inputsrc; // To be fixed
+ } GButtonObject;
#endif
- coord_t x, y; // Screen relative position
- coord_t width, height; // Dimensions of this window
- color_t color, bgcolor; // Current drawing colors
-} GWindow;
/*===========================================================================*/
/* External declarations. */
@@ -101,70 +168,81 @@ extern "C" {
#endif
/* Base Functions */
-bool_t gwinInit(GWindow *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);
+void gwinDestroyWindow(GHandle gh);
/* Status Functions */
-#define gwinGetScreenX(gw) ((gw)->x)
-#define gwinGetScreenY(gw) ((gw)->y)
-#define gwinGetWidth(gw) ((gw)->width)
-#define gwinGetHeight(gw) ((gw)->height)
+#define gwinGetScreenX(gh) ((gh)->x)
+#define gwinGetScreenY(gh) ((gh)->y)
+#define gwinGetWidth(gh) ((gh)->width)
+#define gwinGetHeight(gh) ((gh)->height)
/* Set up for drawing */
-#define gwinSetColor(gw, clr) (gw)->color = (clr)
-#define gwinSetBgColor(gw, bgclr) (gw)->bgcolor = (bgclr)
+#define gwinSetColor(gh, clr) (gh)->color = (clr)
+#define gwinSetBgColor(gh, bgclr) (gh)->bgcolor = (bgclr)
/* Set up for text */
#if GDISP_NEED_TEXT
-void gwinSetFont(GWindow *gw, font_t font);
-#define gwinGetStream(gw) ((BaseSequentialStream *)gw)
+void gwinSetFont(GHandle gh, font_t font);
#endif
/* Drawing Functions */
-void gwinClear(GWindow *gw);
-void gwinDrawPixel(GWindow *gw, coord_t x, coord_t y);
-void gwinDrawLine(GWindow *gw, coord_t x0, coord_t y0, coord_t x1, coord_t y1);
-void gwinDrawBox(GWindow *gw, coord_t x, coord_t y, coord_t cx, coord_t cy);
-void gwinFillArea(GWindow *gw, coord_t x, coord_t y, coord_t cx, coord_t cy);
-void gwinBlitArea(GWindow *gw, 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 gwinClear(GHandle gh);
+void gwinDrawPixel(GHandle gh, coord_t x, coord_t y);
+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);
+void gwinFillArea(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy);
+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
-void gwinDrawCircle(GWindow *gw, coord_t x, coord_t y, coord_t radius);
-void gwinFillCircle(GWindow *gw, coord_t x, coord_t y, coord_t radius);
+void gwinDrawCircle(GHandle gh, coord_t x, coord_t y, coord_t radius);
+void gwinFillCircle(GHandle gh, coord_t x, coord_t y, coord_t radius);
#endif
/* Ellipse Functions */
#if GDISP_NEED_ELLIPSE
-void gwinDrawEllipse(GWindow *gw, coord_t x, coord_t y, coord_t a, coord_t b);
-void gwinFillEllipse(GWindow *gw, coord_t x, coord_t y, coord_t a, coord_t b);
+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);
#endif
/* Arc Functions */
#if GDISP_NEED_ARC
-void gwinDrawArc(GWindow *gw, coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle);
-void gwinFillArc(GWindow *gw, coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle);
+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);
#endif
/* Read a pixel Function */
#if GDISP_NEED_PIXELREAD
-color_t gwinGetPixelColor(GWindow *gw, coord_t x, coord_t y);
-#endif
-
-/* Scrolling Function - clears the area scrolled out */
-#if GDISP_NEED_SCROLL
-void gwinVerticalScroll(GWindow *gw, int lines);
+color_t gwinGetPixelColor(GHandle gh, coord_t x, coord_t y);
#endif
/* Extra Text Functions */
#if GDISP_NEED_TEXT
-void gwinDrawChar(GWindow *gw, coord_t x, coord_t y, char c);
-void gwinFillChar(GWindow *gw, coord_t x, coord_t y, char c);
-void gwinDrawString(GWindow *gw, coord_t x, coord_t y, const char *str);
-void gwinFillString(GWindow *gw, coord_t x, coord_t y, const char *str);
-void gwinBoxString(GWindow *gw, coord_t x, coord_t y, coord_t cx, coord_t cy, const char* str, justify_t justify);
-void gwinPutChar(GWindow *gw, char c);
-void gwinPutString(GWindow *gw, const char *str);
-void gwinPutCharArray(GWindow *gw, const char *str, size_t n);
+void gwinDrawChar(GHandle gh, coord_t x, coord_t y, char c);
+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);
+void gwinDrawStringBox(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy, const char* str, justify_t justify);
+void gwinFillStringBox(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy, const char* str, justify_t justify);
+#endif
+
+#if GWIN_NEED_CONSOLE
+GHandle gwinCreateConsole(GConsoleObject *gc, coord_t x, coord_t y, coord_t width, coord_t height, font_t font);
+BaseSequentialStream *gwinGetConsoleStream(GHandle gh);
+void gwinPutChar(GHandle gh, char c);
+void gwinPutString(GHandle gh, const char *str);
+void gwinPutCharArray(GHandle gh, const char *str, size_t n);
+#endif
+
+#if GWIN_NEED_BUTTON
+GHandle gwinCreateButton(GButtonObject *gb, coord_t x, coord_t y, coord_t width, coord_t height, font_t font, GButtonType type);
+void gwinSetButtonStyle(GHandle gh, const GButtonStyle *style);
+void gwinSetButtonText(GHandle gh, const char *txt, bool_t useAlloc);
+void gwinButtonDraw(GHandle gh);
+#define gwinGetButtonState(gh) (((GButtonObject *)(gh))->state)
+//void gwinSetButtonCallback(GHandle gh, ????);
+//void gwinSetButtonInput(GHandle gh, ????);
#endif
#ifdef __cplusplus
@@ -175,4 +253,3 @@ void gwinPutCharArray(GWindow *gw, const char *str, size_t n);
#endif /* _GWIN_H */
/** @} */
-