aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/gdisp/gdisp.h343
-rw-r--r--include/gdisp/lld/gdisp_lld.h319
-rw-r--r--include/gdisp/options.h57
-rw-r--r--include/gfx_rules.h8
4 files changed, 428 insertions, 299 deletions
diff --git a/include/gdisp/gdisp.h b/include/gdisp/gdisp.h
index 6b2f5b47..7f0f8012 100644
--- a/include/gdisp/gdisp.h
+++ b/include/gdisp/gdisp.h
@@ -17,6 +17,10 @@
*
* @pre GFX_USE_GDISP must be set to TRUE in gfxconf.h
*
+ * @note Each drawing routine supports a gispXXXX and a gdispGXXXX function. The difference is that the
+ * gdispXXXX function does not require a display to be specified. Note there is a slight anomoly
+ * in the naming with gdispGBlitArea() vs gdispBlitAreaEx() and gdispBlitArea(), the later of
+ * which is now deprecated.
* @{
*/
@@ -79,7 +83,18 @@ typedef struct GDISPControl {
uint8_t Contrast;
} GDISPControl;
-extern GDISPControl *GDISP;
+/*
+ * Our black box display structure. We know only one thing about it...
+ * The first member is a GDISPControl structure.
+ */
+typedef struct GDisplay GDisplay;
+
+/**
+ * @brief The default screen to use for the gdispXXXX calls.
+ * @note This is set by default to the first display in the system. You can change
+ * it by calling @p gdispGSetDisplay().
+ */
+extern GDisplay *GDISP;
/*===========================================================================*/
/* Constants. */
@@ -150,75 +165,69 @@ extern GDISPControl *GDISP;
/* Defines relating to the display hardware */
/*===========================================================================*/
-#if GDISP_MULTIPLE_DRIVERS || defined(__DOXYGEN__)
- /**
- * @name GDISP pixel format choices
- * @{
- */
- /**
- * @brief The pixel format.
- * @default It generally defaults to the hardware pixel format.
- * @note This doesn't need to match the hardware pixel format.
- * It is definitely more efficient when it does.
- * @note When GDISP_MULTIPLE_DRIVERS is defined, this should
- * also be explicitly defined to ensure the best match
- * with your hardware across all devices.
- * @note Should be set to one of the following:
- * GDISP_PIXELFORMAT_RGB565
- * GDISP_PIXELFORMAT_BGR565
- * GDISP_PIXELFORMAT_RGB888
- * GDISP_PIXELFORMAT_RGB444
- * GDISP_PIXELFORMAT_RGB332
- * GDISP_PIXELFORMAT_RGB666
- * GDISP_PIXELFORMAT_CUSTOM
- * @note If you set GDISP_PIXELFORMAT_CUSTOM you need to also define
- * color_t, RGB2COLOR(r,g,b), HTML2COLOR(h),
- * RED_OF(c), GREEN_OF(c), BLUE_OF(c),
- * COLOR(c) and MASKCOLOR.
- */
- #ifndef GDISP_PIXELFORMAT
- #define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_ERROR
- #endif
- /**
- * @brief Do pixels require packing for a blit
- * @note Is only valid for a pixel format that doesn't fill it's datatype. ie formats:
- * GDISP_PIXELFORMAT_RGB888
- * GDISP_PIXELFORMAT_RGB444
- * GDISP_PIXELFORMAT_RGB666
- * GDISP_PIXELFORMAT_CUSTOM
- * @note If you use GDISP_PIXELFORMAT_CUSTOM and packed bit fills
- * you need to also define @p gdispPackPixels(buf,cx,x,y,c)
- * @note If you are using GDISP_HARDWARE_BITFILLS = FALSE then the pixel
- * format must not be a packed format as the software blit does
- * not support packed pixels
- * @note Very few cases should actually require packed pixels as the low
- * level driver can also pack on the fly as it is sending it
- * to the graphics device.
- */
- #ifndef GDISP_PACKED_PIXELS
- #define GDISP_PACKED_PIXELS FALSE
- #endif
-
- /**
- * @brief Do lines of pixels require packing for a blit
- * @note Ignored if GDISP_PACKED_PIXELS is FALSE
- */
- #ifndef GDISP_PACKED_LINES
- #define GDISP_PACKED_LINES FALSE
- #endif
- /** @} */
-#else
+#if !defined(GDISP_TOTAL_CONTROLLERS) || GDISP_TOTAL_CONTROLLERS == 1
+ // Pull in the default hardware configuration for a single controller.
+ // If we have multiple controllers the settings must be set in the
+ // users gfxconf.h file.
#include "gdisp_lld_config.h"
+#endif
+
+/**
+ * @name GDISP pixel format choices
+ * @{
+ */
+ /**
+ * @brief The pixel format.
+ * @default It generally defaults to the hardware pixel format.
+ * @note This doesn't need to match the hardware pixel format.
+ * It is definitely more efficient when it does.
+ * @note When GDISP_TOTAL_CONTROLLERS > 1, this should
+ * also be explicitly defined to ensure the best match
+ * with your hardware across all devices.
+ * @note Should be set to one of the following:
+ * GDISP_PIXELFORMAT_RGB565
+ * GDISP_PIXELFORMAT_BGR565
+ * GDISP_PIXELFORMAT_RGB888
+ * GDISP_PIXELFORMAT_RGB444
+ * GDISP_PIXELFORMAT_RGB332
+ * GDISP_PIXELFORMAT_RGB666
+ * GDISP_PIXELFORMAT_CUSTOM
+ * @note If you set GDISP_PIXELFORMAT_CUSTOM you need to also define
+ * color_t, RGB2COLOR(r,g,b), HTML2COLOR(h),
+ * RED_OF(c), GREEN_OF(c), BLUE_OF(c),
+ * COLOR(c) and MASKCOLOR.
+ */
#ifndef GDISP_PIXELFORMAT
- #define GDISP_PIXELFORMAT GDISP_LLD_PIXELFORMAT
+ #define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_ERROR
#endif
+ /**
+ * @brief Do pixels require packing for a blit
+ * @note Is only valid for a pixel format that doesn't fill it's datatype. ie formats:
+ * GDISP_PIXELFORMAT_RGB888
+ * GDISP_PIXELFORMAT_RGB444
+ * GDISP_PIXELFORMAT_RGB666
+ * GDISP_PIXELFORMAT_CUSTOM
+ * @note If you use GDISP_PIXELFORMAT_CUSTOM and packed bit fills
+ * you need to also define @p gdispPackPixels(buf,cx,x,y,c)
+ * @note If you are using GDISP_HARDWARE_BITFILLS = FALSE then the pixel
+ * format must not be a packed format as the software blit does
+ * not support packed pixels
+ * @note Very few cases should actually require packed pixels as the low
+ * level driver can also pack on the fly as it is sending it
+ * to the graphics device.
+ */
#ifndef GDISP_PACKED_PIXELS
#define GDISP_PACKED_PIXELS FALSE
#endif
+
+ /**
+ * @brief Do lines of pixels require packing for a blit
+ * @note Ignored if GDISP_PACKED_PIXELS is FALSE
+ */
#ifndef GDISP_PACKED_LINES
#define GDISP_PACKED_LINES FALSE
#endif
-#endif
+/** @} */
/*===========================================================================*/
/* Defines related to the pixel format */
@@ -356,48 +365,68 @@ extern "C" {
*/
color_t gdispBlendColor(color_t fg, color_t bg, uint8_t alpha);
+/**
+ * @brief Set the current default display to the specified display
+ * @note The default display is used for the gdispXxxx functions.
+ * @note Displays are numbered from 0 to GDISP_TOTAL_DISPLAYS - 1
+ * @note If an invalid display number is specified the request is ignored.
+ *
+ * @param[in] display The display number (0..n)
+ *
+ * @api
+ */
+void gdispSetDisplay(unsigned display);
+
/* Drawing Functions */
/**
* @brief Clear the display to the specified color.
*
+ * @param[in] g The display to use
* @param[in] color The color to use when clearing the screen
*
* @api
*/
-void gdispClear(color_t color);
+void gdispGClear(GDisplay *g, color_t color);
+#define gdispClear(c) gdispGClear(GDISP, c)
/**
* @brief Set a pixel in the specified color.
*
+ * @param[in] g The display to use
* @param[in] x,y The position to set the pixel.
* @param[in] color The color to use
*
* @api
*/
-void gdispDrawPixel(coord_t x, coord_t y, color_t color);
+void gdispGDrawPixel(GDisplay *g, coord_t x, coord_t y, color_t color);
+#define gdispDrawPixel(x,y,c) gdispGDrawPixel(GDISP,x,y,c)
/**
* @brief Draw a line.
*
+ * @param[in] g The display to use
* @param[in] x0,y0 The start position
* @param[in] x1,y1 The end position
* @param[in] color The color to use
*
* @api
*/
-void gdispDrawLine(coord_t x0, coord_t y0, coord_t x1, coord_t y1, color_t color);
+void gdispGDrawLine(GDisplay *g, coord_t x0, coord_t y0, coord_t x1, coord_t y1, color_t color);
+#define gdispDrawLine(x0,y0,x1,y1,c) gdispGDrawLine(GDISP,x0,y0,x1,y1,c)
/**
* @brief Fill an area with a color.
*
+ * @param[in] g The display to use
* @param[in] x,y The start position
* @param[in] cx,cy The size of the box (outside dimensions)
* @param[in] color The color to use
*
* @api
*/
-void gdispFillArea(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
+void gdispGFillArea(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
+#define gdispFillArea(x,y,cx,cy,c) gdispGFillArea(GDISP,x,y,cx,cy,c)
/**
* @brief Fill an area using the supplied bitmap.
@@ -409,6 +438,7 @@ void gdispFillArea(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
* 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.
*
+ * @param[in] g The display to use
* @param[in] x,y The start position
* @param[in] cx,cy The size of the filled area
* @param[in] srcx,srcy The bitmap position to start the fill form
@@ -417,18 +447,21 @@ void gdispFillArea(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
*
* @api
*/
-void gdispBlitAreaEx(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 gdispGBlitArea(GDisplay *g, 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 gdispBlitAreaEx(x,y,cx,cy,sx,sy,rx,b) gdispGBlitArea(GDISP,x,y,cx,cy,sx,sy,rx,b)
/**
* @brief Draw a rectangular box.
*
+ * @param[in] g The display to use
* @param[in] x,y The start position
* @param[in] cx,cy The size of the box (outside dimensions)
* @param[in] color The color to use
*
* @api
*/
-void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
+void gdispGDrawBox(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
+#define gdispDrawBox(x,y,cx,cy,c) gdispGDrawBox(GDISP,x,y,cx,cy,c)
/* Streaming Functions */
@@ -450,12 +483,14 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
* @note A streaming operation may be terminated early (without writing to every location
* in the stream area) by calling @p gdispStreamStop().
*
+ * @param[in] g The display to use
* @param[in] x,y The start position
* @param[in] cx,cy The size of the streamable area
*
* @api
*/
- void gdispStreamStart(coord_t x, coord_t y, coord_t cx, coord_t cy);
+ void gdispGStreamStart(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy);
+ #define gdispStreamStart(x,y,cx,cy) gdispGStreamStart(GDISP,x,y,cx,cy)
/**
* @brief Send pixel data to the stream.
@@ -464,11 +499,13 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
* @note If the gdispStreamStart() has not been called (or failed due to clipping), the
* data provided here is simply thrown away.
*
+ * @param[in] g The display to use
* @param[in] color The color of the pixel to write
*
* @api
*/
- void gdispStreamColor(color_t color);
+ void gdispGStreamColor(GDisplay *g, color_t color);
+ #define gdispStreamColor(c) gdispGStreamColor(GDISP,c)
/**
* @brief Finish the current streaming operation.
@@ -477,9 +514,12 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
* @note If the gdispStreamStart() has not been called (or failed due to clipping), this
* call is simply ignored.
*
+ * @param[in] g The display to use
+ *
* @api
*/
- void gdispStreamStop(void);
+ void gdispGStreamStop(GDisplay *g);
+ #define gdispStreamStop() gdispGStreamStop(GDISP)
#endif
/* Clipping Functions */
@@ -488,12 +528,14 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
/**
* @brief Clip all drawing to the defined area.
*
- * @param[in] x,y The start position
- * @param[in] cx,cy The size of the clip area
+ * @param[in] g The display to use
+ * @param[in] x,y The start position
+ * @param[in] cx,cy The size of the clip area
*
* @api
*/
- void gdispSetClip(coord_t x, coord_t y, coord_t cx, coord_t cy);
+ void gdispGSetClip(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy);
+ #define gdispSetClip(x,y,cx,cy) gdispGSetClip(GDISP,x,y,cx,cy)
#endif
/* Circle Functions */
@@ -502,24 +544,28 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
/**
* @brief Draw a circle.
*
+ * @param[in] g The display to use
* @param[in] x,y The center of the circle
* @param[in] radius The radius of the circle
* @param[in] color The color to use
*
* @api
*/
- void gdispDrawCircle(coord_t x, coord_t y, coord_t radius, color_t color);
+ void gdispGDrawCircle(GDisplay *g, coord_t x, coord_t y, coord_t radius, color_t color);
+ #define gdispDrawCircle(x,y,r,c) gdispGDrawCircle(GDISP,x,y,r,c)
/**
* @brief Draw a filled circle.
*
+ * @param[in] g The display to use
* @param[in] x,y The center of the circle
* @param[in] radius The radius of the circle
* @param[in] color The color to use
*
* @api
*/
- void gdispFillCircle(coord_t x, coord_t y, coord_t radius, color_t color);
+ void gdispGFillCircle(GDisplay *g, coord_t x, coord_t y, coord_t radius, color_t color);
+ #define gdispFillCircle(x,y,r,c) gdispGFillCircle(GDISP,x,y,r,c)
#endif
/* Ellipse Functions */
@@ -528,24 +574,28 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
/**
* @brief Draw an ellipse.
*
- * @param[in] x,y The center of the ellipse
- * @param[in] a,b The dimensions of the ellipse
- * @param[in] color The color to use
+ * @param[in] g The display to use
+ * @param[in] x,y The center of the ellipse
+ * @param[in] a,b The dimensions of the ellipse
+ * @param[in] color The color to use
*
* @api
*/
- void gdispDrawEllipse(coord_t x, coord_t y, coord_t a, coord_t b, color_t color);
+ void gdispGDrawEllipse(GDisplay *g, coord_t x, coord_t y, coord_t a, coord_t b, color_t color);
+ #define gdispDrawEllipse(x,y,a,b,c) gdispGDrawEllipse(GDISP,x,y,a,b,c)
/**
* @brief Draw a filled ellipse.
*
- * @param[in] x,y The center of the ellipse
- * @param[in] a,b The dimensions of the ellipse
- * @param[in] color The color to use
+ * @param[in] g The display to use
+ * @param[in] x,y The center of the ellipse
+ * @param[in] a,b The dimensions of the ellipse
+ * @param[in] color The color to use
*
* @api
*/
- void gdispFillEllipse(coord_t x, coord_t y, coord_t a, coord_t b, color_t color);
+ void gdispGFillEllipse(GDisplay *g, coord_t x, coord_t y, coord_t a, coord_t b, color_t color);
+ #define gdispFillEllipse(x,y,a,b,c) gdispGFillEllipse(GDISP,x,y,a,b,c)
#endif
/* Arc Functions */
@@ -554,6 +604,7 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
/*
* @brief Draw an arc.
*
+ * @param[in] g The display to use
* @param[in] x0,y0 The center point
* @param[in] radius The radius of the arc
* @param[in] start The start angle (0 to 360)
@@ -562,12 +613,14 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
*
* @api
*/
- void gdispDrawArc(coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle, color_t color);
+ void gdispGDrawArc(GDisplay *g, coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle, color_t color);
+ #define gdispDrawArc(x,y,r,s,e,c) gdispGDrawArc(GDISP,x,y,r,s,e,c)
/*
* @brief Draw a filled arc.
* @note Not very efficient currently - does lots of overdrawing
*
+ * @param[in] g The display to use
* @param[in] x0,y0 The center point
* @param[in] radius The radius of the arc
* @param[in] start The start angle (0 to 360)
@@ -576,7 +629,8 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
*
* @api
*/
- void gdispFillArc(coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle, color_t color);
+ void gdispGFillArc(GDisplay *g, coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle, color_t color);
+ #define gdispFillArc(x,y,r,s,e,c) gdispGFillArc(GDISP,x,y,r,s,e,c)
#endif
/* Read a pixel Function */
@@ -586,11 +640,13 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
* @brief Get the color of a pixel.
* @return The color of the pixel.
*
- * @param[in] x,y The position of the pixel
+ * @param[in] g The display to use
+ * @param[in] x,y The position of the pixel
*
* @api
*/
- color_t gdispGetPixelColor(coord_t x, coord_t y);
+ color_t gdispGGetPixelColor(GDisplay *g, coord_t x, coord_t y);
+ #define gdispGetPixelColor(x,y) gdispGGetPixelColor(GDISP,x,y)
#endif
/* Scrolling Function - clears the area scrolled out */
@@ -602,14 +658,16 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
* @note Optional.
* @note If lines is >= cy, it is equivelent to a area fill with bgcolor.
*
- * @param[in] x, y The start of the area to be scrolled
- * @param[in] cx, cy The size of the area to be scrolled
- * @param[in] lines The number of lines to scroll (Can be positive or negative)
- * @param[in] bgcolor The color to fill the newly exposed area.
+ * @param[in] g The display to use
+ * @param[in] x, y The start of the area to be scrolled
+ * @param[in] cx, cy The size of the area to be scrolled
+ * @param[in] lines The number of lines to scroll (Can be positive or negative)
+ * @param[in] bgcolor The color to fill the newly exposed area.
*
* @api
*/
- void gdispVerticalScroll(coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor);
+ void gdispGVerticalScroll(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor);
+ #define gdispVerticalScroll(x,y,cx,cy,l,b) gdispGVerticalScroll(GDISP,x,y,cx,cy,l,b)
#endif
/* Set driver specific control */
@@ -620,12 +678,14 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
* @note Depending on the hardware implementation this function may not
* support some codes. They will be ignored.
*
+ * @param[in] g The display to use
* @param[in] what what you want to control
* @param[in] value The value to be assigned
*
* @api
*/
- void gdispControl(unsigned what, void *value);
+ void gdispGControl(GDisplay *g, unsigned what, void *value);
+ #define gdispControl(w,v) gdispGControl(GDISP,w,v)
#endif
/* Query driver specific data */
@@ -636,17 +696,20 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
* @note The result must be typecast to the correct type.
* @note An unsupported query will return (void *)-1.
*
+ * @param[in] g The display to use
* @param[in] what What to query
*
* @api
*/
- void *gdispQuery(unsigned what);
+ void *gdispGQuery(GDisplay *g, unsigned what);
+ #define gdispQuery(w) gdispGQuery(GDISP,w)
#endif
#if GDISP_NEED_CONVEX_POLYGON || defined(__DOXYGEN__)
/**
* @brief Draw an enclosed polygon (convex, non-convex or complex).
*
+ * @param[in] g The display to use
* @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
@@ -654,12 +717,14 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
*
* @api
*/
- void gdispDrawPoly(coord_t tx, coord_t ty, const point *pntarray, unsigned cnt, color_t color);
+ void gdispGDrawPoly(GDisplay *g, coord_t tx, coord_t ty, const point *pntarray, unsigned cnt, color_t color);
+ #define gdispDrawPoly(x,y,p,i,c) gdispGDrawPoly(GDISP,x,y,p,i,c)
/**
* @brief Fill a convex polygon
* @details Doesn't handle non-convex or complex polygons.
*
+ * @param[in] g The display to use
* @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
@@ -675,7 +740,8 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
*
* @api
*/
- void gdispFillConvexPoly(coord_t tx, coord_t ty, const point *pntarray, unsigned cnt, color_t color);
+ void gdispGFillConvexPoly(GDisplay *g, coord_t tx, coord_t ty, const point *pntarray, unsigned cnt, color_t color);
+ #define gdispFillConvexPoly(x,y,p,i,c) gdispGFillConvexPoly(GDISP,x,y,p,i,c)
#endif
/* Text Functions */
@@ -684,6 +750,7 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
/**
* @brief Draw a text character.
*
+ * @param[in] g The display to use
* @param[in] x,y The position for the text
* @param[in] c The character to draw
* @param[in] font The font to use
@@ -691,11 +758,13 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
*
* @api
*/
- void gdispDrawChar(coord_t x, coord_t y, uint16_t c, font_t font, color_t color);
+ void gdispGDrawChar(GDisplay *g, coord_t x, coord_t y, uint16_t c, font_t font, color_t color);
+ #define gdispDrawChar(x,y,s,f,c) gdispGDrawChar(GDISP,x,y,s,f,c)
/**
* @brief Draw a text character with a filled background.
*
+ * @param[in] g The display to use
* @param[in] x,y The position for the text
* @param[in] c The character to draw
* @param[in] font The font to use
@@ -704,11 +773,13 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
*
* @api
*/
- void gdispFillChar(coord_t x, coord_t y, uint16_t c, font_t font, color_t color, color_t bgcolor);
+ void gdispGFillChar(GDisplay *g, coord_t x, coord_t y, uint16_t c, font_t font, color_t color, color_t bgcolor);
+ #define gdispFillChar(x,y,s,f,c,b) gdispGFillChar(GDISP,x,y,s,f,c,b)
/**
* @brief Draw a text string.
*
+ * @param[in] g The display to use
* @param[in] x,y The position for the text
* @param[in] font The font to use
* @param[in] str The string to draw
@@ -716,11 +787,13 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
*
* @api
*/
- void gdispDrawString(coord_t x, coord_t y, const char *str, font_t font, color_t color);
+ void gdispGDrawString(GDisplay *g, coord_t x, coord_t y, const char *str, font_t font, color_t color);
+ #define gdispDrawString(x,y,s,f,c) gdispGDrawString(GDISP,x,y,s,f,c)
/**
* @brief Draw a text string.
*
+ * @param[in] g The display to use
* @param[in] x,y The position for the text
* @param[in] str The string to draw
* @param[in] font The font to use
@@ -729,11 +802,13 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
*
* @api
*/
- void gdispFillString(coord_t x, coord_t y, const char *str, font_t font, color_t color, color_t bgcolor);
+ void gdispGFillString(GDisplay *g, coord_t x, coord_t y, const char *str, font_t font, color_t color, color_t bgcolor);
+ #define gdispFillString(x,y,s,f,c,b) gdispGFillString(GDISP,x,y,s,f,c,b)
/**
* @brief Draw a text string vertically centered within the specified box.
*
+ * @param[in] g The display to use
* @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
@@ -743,12 +818,14 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
*
* @api
*/
- 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 gdispGDrawStringBox(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, const char* str, font_t font, color_t color, justify_t justify);
+ #define gdispDrawStringBox(x,y,cx,cy,s,f,c,j) gdispGDrawStringBox(GDISP,x,y,cx,cy,s,f,c,j)
/**
* @brief Draw a text string vertically centered within the specified box. The box background is filled with the specified background color.
* @note The entire box is filled
*
+ * @param[in] g The display to use
* @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
@@ -759,7 +836,8 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
*
* @api
*/
- 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);
+ void gdispGFillStringBox(GDisplay *g, 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);
+ #define gdispFillStringBox(x,y,cx,cy,s,f,c,b,j) gdispGFillStringBox(GDISP,x,y,cx,cy,s,f,c,b,j)
/**
* @brief Get a metric of a font.
@@ -844,6 +922,7 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
/**
* @brief Draw a rectangular box with rounded corners
*
+ * @param[in] g The display to use
* @param[in] x,y The start position
* @param[in] cx,cy The size of the box (outside dimensions)
* @param[in] radius The radius of the rounded corners
@@ -851,11 +930,13 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
*
* @api
*/
- void gdispDrawRoundedBox(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t radius, color_t color);
+ void gdispGDrawRoundedBox(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t radius, color_t color);
+ #define gdispDrawRoundedBox(x,y,cx,cy,r,c) gdispGDrawRoundedBox(GDISP,x,y,cx,cy,r,c)
/**
* @brief Draw a filled rectangular box with rounded corners
*
+ * @param[in] g The display to use
* @param[in] x,y The start position
* @param[in] cx,cy The size of the box (outside dimensions)
* @param[in] radius The radius of the rounded corners
@@ -863,7 +944,8 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
*
* @api
*/
- void gdispFillRoundedBox(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t radius, color_t color);
+ void gdispGFillRoundedBox(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t radius, color_t color);
+ #define gdispFillRoundedBox(x,y,cx,cy,r,c) gdispGFillRoundedBox(GDISP,x,y,cx,cy,r,c)
#endif
/*
@@ -871,7 +953,7 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
*/
/* Now obsolete functions */
-#define gdispBlitArea(x, y, cx, cy, buffer) gdispBlitAreaEx(x, y, cx, cy, 0, 0, cx, buffer)
+#define gdispBlitArea(x, y, cx, cy, buffer) gdispGBlitArea(GDISP, x, y, cx, cy, 0, 0, cx, buffer)
/* Macro definitions for common gets and sets */
@@ -879,26 +961,31 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
* @brief Set the display power mode.
* @note Ignored if not supported by the display.
*
+ * @param[in] g The display to use
* @param[in] powerMode The new power mode
*
* @api
*/
-#define gdispSetPowerMode(powerMode) gdispControl(GDISP_CONTROL_POWER, (void *)(unsigned)(powerMode))
+#define gdispGSetPowerMode(g, powerMode) gdispGControl((g), GDISP_CONTROL_POWER, (void *)(unsigned)(powerMode))
+#define gdispSetPowerMode(powerMode) gdispGControl(GDISP, GDISP_CONTROL_POWER, (void *)(unsigned)(powerMode))
/**
* @brief Set the display orientation.
* @note Ignored if not supported by the display.
*
+ * @param[in] g The display to use
* @param[in] newOrientation The new orientation
*
* @api
*/
-#define gdispSetOrientation(newOrientation) gdispControl(GDISP_CONTROL_ORIENTATION, (void *)(unsigned)(newOrientation))
+#define gdispGSetOrientation(g, newOrientation) gdispGControl((g), GDISP_CONTROL_ORIENTATION, (void *)(unsigned)(newOrientation))
+#define gdispSetOrientation(newOrientation) gdispGControl(GDISP, GDISP_CONTROL_ORIENTATION, (void *)(unsigned)(newOrientation))
/**
* @brief Set the display backlight.
* @note Ignored if not supported by the display.
*
+ * @param[in] g The display to use
* @param[in] percent The new brightness (0 - 100%)
*
* @note For displays that only support backlight off and on,
@@ -906,68 +993,92 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
*
* @api
*/
-#define gdispSetBacklight(percent) gdispControl(GDISP_CONTROL_BACKLIGHT, (void *)(unsigned)(percent))
+#define gdispGSetBacklight(g, percent) gdispGControl((g), GDISP_CONTROL_BACKLIGHT, (void *)(unsigned)(percent))
+#define gdispSetBacklight(percent) gdispGControl(GDISP, GDISP_CONTROL_BACKLIGHT, (void *)(unsigned)(percent))
/**
* @brief Set the display contrast.
* @note Ignored if not supported by the display.
*
+ * @param[in] g The display to use
* @param[in] percent The new contrast (0 - 100%)
*
* @api
*/
-#define gdispSetContrast(percent) gdispControl(GDISP_CONTROL_CONTRAST, (void *)(unsigned)(percent))
+#define gdispGSetContrast(g, percent) gdispGControl((g), GDISP_CONTROL_CONTRAST, (void *)(unsigned)(percent))
+#define gdispSetContrast(percent) gdispGControl(GDISP, GDISP_CONTROL_CONTRAST, (void *)(unsigned)(percent))
/**
* @brief Get the display width in pixels.
*
+ * @param[in] g The display to use
+ *
* @api
*/
-#define gdispGetWidth() (GDISP->Width)
+#define gdispGGetWidth(g) (((GDISPControl *)(g))->Width)
+#define gdispGetWidth() gdispGGetWidth(GDISP)
/**
* @brief Get the display height in pixels.
*
+ * @param[in] g The display to use
+ *
* @api
*/
-#define gdispGetHeight() (GDISP->Height)
+#define gdispGGetHeight(g) (((GDISPControl *)(g))->Height)
+#define gdispGetHeight() gdispGGetHeight(GDISP)
/**
* @brief Get the current display power mode.
*
+ * @param[in] g The display to use
+ *
* @api
*/
-#define gdispGetPowerMode() (GDISP->Powermode)
+#define gdispGGetPowerMode(g) (((GDISPControl *)(g))->Powermode)
+#define gdispGetPowerMode() gdispGGetPowerMode(GDISP)
/**
* @brief Get the current display orientation.
*
+ * @param[in] g The display to use
+ *
* @api
*/
-#define gdispGetOrientation() (GDISP->Orientation)
+#define gdispGGetOrientation(g) (((GDISPControl *)(g))->Orientation)
+#define gdispGetOrientation() gdispGGetOrientation(GDISP)
/**
* @brief Get the current display backlight brightness.
*
+ * @param[in] g The display to use
+ *
* @api
*/
-#define gdispGetBacklight() (GDISP->Backlight)
+#define gdispGGetBacklight(g) (((GDISPControl *)(g))->Backlight)
+#define gdispGetBacklight() gdispGGetBacklight(GDISP)
/**
* @brief Get the current display contrast.
*
+ * @param[in] g The display to use
+ *
* @api
*/
-#define gdispGetContrast() (GDISP->Contrast)
+#define gdispGGetContrast(g) (((GDISPControl *)(g))->Contrast)
+#define gdispGetContrast() gdispGGetContrast(GDISP)
/* More interesting macro's */
/**
* @brief Reset the clip area to the full screen
*
+ * @param[in] g The display to use
+ *
* @api
*/
-#define gdispUnsetClip() gdispSetClip(0,0,gdispGetWidth(),gdispGetHeight())
+#define gdispGUnsetClip(g) gdispGSetClip((g),0,0,(g)->Width,(g)->Height)
+#define gdispUnsetClip() gdispGUnsetClip(GDISP)
#ifdef __cplusplus
}
diff --git a/include/gdisp/lld/gdisp_lld.h b/include/gdisp/lld/gdisp_lld.h
index 4813d828..2a6f90b7 100644
--- a/include/gdisp/lld/gdisp_lld.h
+++ b/include/gdisp/lld/gdisp_lld.h
@@ -18,140 +18,136 @@
#if GFX_USE_GDISP || defined(__DOXYGEN__)
-#if GDISP_MULTIPLE_DRIVERS && defined(GDISP_LLD_DECLARATIONS)
- // include hardware definitions
- #include "gdisp_lld_config.h"
-#endif
-
/*===========================================================================*/
/* Error checks. */
/*===========================================================================*/
-#if !GDISP_MULTIPLE_DRIVERS || defined(GDISP_LLD_DECLARATIONS)
+/**
+ * @name GDISP hardware accelerated support
+ * @{
+ */
/**
- * @name GDISP hardware accelerated support
- * @{
+ * @brief Hardware streaming writing is supported.
+ * @details If set to @p FALSE software emulation is used.
+ * @note Either GDISP_HARDWARE_STREAM_WRITE or GDISP_HARDWARE_DRAWPIXEL must be provided by the driver
*/
- /**
- * @brief Hardware streaming writing is supported.
- * @details If set to @p FALSE software emulation is used.
- * @note Either GDISP_HARDWARE_STREAM_WRITE or GDISP_HARDWARE_DRAWPIXEL must be provided by the driver
- */
- #ifndef GDISP_HARDWARE_STREAM_WRITE
- #define GDISP_HARDWARE_STREAM_WRITE FALSE
- #endif
+ #ifndef GDISP_HARDWARE_STREAM_WRITE
+ #define GDISP_HARDWARE_STREAM_WRITE FALSE
+ #endif
- /**
- * @brief Hardware streaming reading of the display surface is supported.
- * @details If set to @p FALSE this routine is not available.
- */
- #ifndef GDISP_HARDWARE_STREAM_READ
- #define GDISP_HARDWARE_STREAM_READ FALSE
- #endif
+ /**
+ * @brief Hardware streaming reading of the display surface is supported.
+ * @details If set to @p FALSE this routine is not available.
+ */
+ #ifndef GDISP_HARDWARE_STREAM_READ
+ #define GDISP_HARDWARE_STREAM_READ FALSE
+ #endif
- /**
- * @brief Hardware supports setting the cursor position within the stream window.
- * @details If set to @p FALSE this routine is not available.
- * @note This is used to optimise setting of individual pixels within a stream window.
- * It should therefore not be implemented unless it is cheaper than just setting
- * a new window.
- */
- #ifndef GDISP_HARDWARE_STREAM_POS
- #define GDISP_HARDWARE_STREAM_POS FALSE
- #endif
+ /**
+ * @brief Hardware supports setting the cursor position within the stream window.
+ * @details If set to @p FALSE this routine is not available.
+ * @note This is used to optimise setting of individual pixels within a stream window.
+ * It should therefore not be implemented unless it is cheaper than just setting
+ * a new window.
+ */
+ #ifndef GDISP_HARDWARE_STREAM_POS
+ #define GDISP_HARDWARE_STREAM_POS FALSE
+ #endif
- /**
- * @brief Hardware accelerated draw pixel.
- * @details If set to @p FALSE software emulation is used.
- * @note Either GDISP_HARDWARE_STREAM_WRITE or GDISP_HARDWARE_DRAWPIXEL must be provided by the driver
- */
- #ifndef GDISP_HARDWARE_DRAWPIXEL
- #define GDISP_HARDWARE_DRAWPIXEL FALSE
- #endif
+ /**
+ * @brief Hardware accelerated draw pixel.
+ * @details If set to @p FALSE software emulation is used.
+ * @note Either GDISP_HARDWARE_STREAM_WRITE or GDISP_HARDWARE_DRAWPIXEL must be provided by the driver
+ */
+ #ifndef GDISP_HARDWARE_DRAWPIXEL
+ #define GDISP_HARDWARE_DRAWPIXEL FALSE
+ #endif
- /**
- * @brief Hardware accelerated screen clears.
- * @details If set to @p FALSE software emulation is used.
- * @note This clears the entire display surface regardless of the clipping area currently set
- */
- #ifndef GDISP_HARDWARE_CLEARS
- #define GDISP_HARDWARE_CLEARS FALSE
- #endif
+ /**
+ * @brief Hardware accelerated screen clears.
+ * @details If set to @p FALSE software emulation is used.
+ * @note This clears the entire display surface regardless of the clipping area currently set
+ */
+ #ifndef GDISP_HARDWARE_CLEARS
+ #define GDISP_HARDWARE_CLEARS FALSE
+ #endif
- /**
- * @brief Hardware accelerated rectangular fills.
- * @details If set to @p FALSE software emulation is used.
- */
- #ifndef GDISP_HARDWARE_FILLS
- #define GDISP_HARDWARE_FILLS FALSE
- #endif
+ /**
+ * @brief Hardware accelerated rectangular fills.
+ * @details If set to @p FALSE software emulation is used.
+ */
+ #ifndef GDISP_HARDWARE_FILLS
+ #define GDISP_HARDWARE_FILLS FALSE
+ #endif
- /**
- * @brief Hardware accelerated fills from an image.
- * @details If set to @p FALSE software emulation is used.
- */
- #ifndef GDISP_HARDWARE_BITFILLS
- #define GDISP_HARDWARE_BITFILLS FALSE
- #endif
+ /**
+ * @brief Hardware accelerated fills from an image.
+ * @details If set to @p FALSE software emulation is used.
+ */
+ #ifndef GDISP_HARDWARE_BITFILLS
+ #define GDISP_HARDWARE_BITFILLS FALSE
+ #endif
- /**
- * @brief Hardware accelerated scrolling.
- * @details If set to @p FALSE there is no support for scrolling.
- */
- #ifndef GDISP_HARDWARE_SCROLL
- #define GDISP_HARDWARE_SCROLL FALSE
- #endif
+ /**
+ * @brief Hardware accelerated scrolling.
+ * @details If set to @p FALSE there is no support for scrolling.
+ */
+ #ifndef GDISP_HARDWARE_SCROLL
+ #define GDISP_HARDWARE_SCROLL FALSE
+ #endif
- /**
- * @brief Reading back of pixel values.
- * @details If set to @p FALSE there is no support for pixel read-back.
- */
- #ifndef GDISP_HARDWARE_PIXELREAD
- #define GDISP_HARDWARE_PIXELREAD FALSE
- #endif
+ /**
+ * @brief Reading back of pixel values.
+ * @details If set to @p FALSE there is no support for pixel read-back.
+ */
+ #ifndef GDISP_HARDWARE_PIXELREAD
+ #define GDISP_HARDWARE_PIXELREAD FALSE
+ #endif
- /**
- * @brief The driver supports one or more control commands.
- * @details If set to @p FALSE there is no support for control commands.
- */
- #ifndef GDISP_HARDWARE_CONTROL
- #define GDISP_HARDWARE_CONTROL FALSE
- #endif
+ /**
+ * @brief The driver supports one or more control commands.
+ * @details If set to @p FALSE there is no support for control commands.
+ */
+ #ifndef GDISP_HARDWARE_CONTROL
+ #define GDISP_HARDWARE_CONTROL FALSE
+ #endif
- /**
- * @brief The driver supports a non-standard query.
- * @details If set to @p FALSE there is no support for non-standard queries.
- */
- #ifndef GDISP_HARDWARE_QUERY
- #define GDISP_HARDWARE_QUERY FALSE
- #endif
+ /**
+ * @brief The driver supports a non-standard query.
+ * @details If set to @p FALSE there is no support for non-standard queries.
+ */
+ #ifndef GDISP_HARDWARE_QUERY
+ #define GDISP_HARDWARE_QUERY FALSE
+ #endif
- /**
- * @brief The driver supports a clipping in hardware.
- * @details If set to @p FALSE there is no support for non-standard queries.
- * @note If this is defined the driver must perform its own clipping on all calls to
- * the driver and respond appropriately if a parameter is outside the display area.
- * @note If this is not defined then the software ensures that all calls to the
- * driver do not exceed the display area (provided GDISP_NEED_CLIP or GDISP_NEED_VALIDATION
- * has been set).
- */
- #ifndef GDISP_HARDWARE_CLIP
- #define GDISP_HARDWARE_CLIP FALSE
- #endif
- /** @} */
-#endif
+ /**
+ * @brief The driver supports a clipping in hardware.
+ * @details If set to @p FALSE there is no support for non-standard queries.
+ * @note If this is defined the driver must perform its own clipping on all calls to
+ * the driver and respond appropriately if a parameter is outside the display area.
+ * @note If this is not defined then the software ensures that all calls to the
+ * driver do not exceed the display area (provided GDISP_NEED_CLIP or GDISP_NEED_VALIDATION
+ * has been set).
+ */
+ #ifndef GDISP_HARDWARE_CLIP
+ #define GDISP_HARDWARE_CLIP FALSE
+ #endif
+/** @} */
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
-typedef struct GDISPDriver {
- GDISPControl g;
+typedef struct GDisplay {
+ GDISPControl g; // The public GDISP stuff - must be the first element
- #if GDISP_MULTIPLE_DRIVERS
- const struct GDISPVMT const * vmt;
+ #if GDISP_TOTAL_CONTROLLERS > 1
+ const struct GDISPVMT const * vmt; // The Virtual Method Table
#endif
+ void * priv; // A private area just for the drivers use.
+
+
uint16_t flags;
#define GDISP_FLG_INSTREAM 0x0001 // We are in a user based stream operation
#define GDISP_FLG_SCRSTREAM 0x0002 // The stream area currently covers the whole screen
@@ -163,7 +159,7 @@ typedef struct GDISPDriver {
#endif
// Software clipping
- #if (GDISP_MULTIPLE_DRIVERS || !GDISP_HARDWARE_CLIP) && (GDISP_NEED_CLIP || GDISP_NEED_VALIDATION)
+ #if !GDISP_HARDWARE_CLIP && (GDISP_NEED_CLIP || GDISP_NEED_VALIDATION)
coord_t clipx0, clipy0;
coord_t clipx1, clipy1; /* not inclusive */
#endif
@@ -195,10 +191,10 @@ typedef struct GDISPDriver {
color_t linebuf[GDISP_LINEBUF_SIZE];
#endif
-} GDISPDriver;
+} GDisplay;
-#if !GDISP_MULTIPLE_DRIVERS || defined(GDISP_LLD_DECLARATIONS) || defined(__DOXYGEN__)
- #if GDISP_MULTIPLE_DRIVERS
+#if GDISP_TOTAL_CONTROLLERS == 1 || defined(GDISP_DRIVER_VMT) || defined(__DOXYGEN__)
+ #if GDISP_TOTAL_CONTROLLERS > 1
#define LLDSPEC static
#else
#define LLDSPEC
@@ -212,9 +208,10 @@ typedef struct GDISPDriver {
* @brief Initialize the driver.
* @return TRUE if successful.
* @param[in] g The driver structure
+ * @param[in] display The display number for this controller 0..n
* @param[out] g->g The driver must fill in the GDISPControl structure
*/
- LLDSPEC bool_t gdisp_lld_init(GDISPDriver *g);
+ LLDSPEC bool_t gdisp_lld_init(GDisplay *g, unsigned display);
#if GDISP_HARDWARE_STREAM_WRITE || defined(__DOXYGEN__)
/**
@@ -230,7 +227,7 @@ typedef struct GDISPDriver {
* undefined results.
* @note This must be followed by a call to @p gdisp_lld_write_pos() if GDISP_HARDWARE_STREAM_POS is TRUE.
*/
- LLDSPEC void gdisp_lld_write_start(GDISPDriver *g);
+ LLDSPEC void gdisp_lld_write_start(GDisplay *g);
/**
* @brief Send a pixel to the current streaming position and then increment that position
@@ -241,7 +238,7 @@ typedef struct GDISPDriver {
*
* @note The parameter variables must not be altered by the driver.
*/
- LLDSPEC void gdisp_lld_write_color(GDISPDriver *g);
+ LLDSPEC void gdisp_lld_write_color(GDisplay *g);
/**
* @brief End the current streaming write operation
@@ -251,7 +248,7 @@ typedef struct GDISPDriver {
*
* @note The parameter variables must not be altered by the driver.
*/
- LLDSPEC void gdisp_lld_write_stop(GDISPDriver *g);
+ LLDSPEC void gdisp_lld_write_stop(GDisplay *g);
#if GDISP_HARDWARE_STREAM_POS || defined(__DOXYGEN__)
/**
@@ -263,7 +260,7 @@ typedef struct GDISPDriver {
*
* @note The parameter variables must not be altered by the driver.
*/
- LLDSPEC void gdisp_lld_write_pos(GDISPDriver *g);
+ LLDSPEC void gdisp_lld_write_pos(GDisplay *g);
#endif
#endif
@@ -280,7 +277,7 @@ typedef struct GDISPDriver {
* @note Streaming operations that wrap the defined window have
* undefined results.
*/
- LLDSPEC void gdisp_lld_read_start(GDISPDriver *g);
+ LLDSPEC void gdisp_lld_read_start(GDisplay *g);
/**
* @brief Read a pixel from the current streaming position and then increment that position
@@ -291,7 +288,7 @@ typedef struct GDISPDriver {
*
* @note The parameter variables must not be altered by the driver.
*/
- LLDSPEC color_t gdisp_lld_read_color(GDISPDriver *g);
+ LLDSPEC color_t gdisp_lld_read_color(GDisplay *g);
/**
* @brief End the current streaming operation
@@ -301,7 +298,7 @@ typedef struct GDISPDriver {
*
* @note The parameter variables must not be altered by the driver.
*/
- LLDSPEC void gdisp_lld_read_stop(GDISPDriver *g);
+ LLDSPEC void gdisp_lld_read_stop(GDisplay *g);
#endif
#if GDISP_HARDWARE_DRAWPIXEL || defined(__DOXYGEN__)
@@ -315,7 +312,7 @@ typedef struct GDISPDriver {
*
* @note The parameter variables must not be altered by the driver.
*/
- LLDSPEC void gdisp_lld_draw_pixel(GDISPDriver *g);
+ LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g);
#endif
#if GDISP_HARDWARE_CLEARS || defined(__DOXYGEN__)
@@ -328,7 +325,7 @@ typedef struct GDISPDriver {
*
* @note The parameter variables must not be altered by the driver.
*/
- LLDSPEC void gdisp_lld_clear(GDISPDriver *g);
+ LLDSPEC void gdisp_lld_clear(GDisplay *g);
#endif
#if GDISP_HARDWARE_FILLS || defined(__DOXYGEN__)
@@ -343,7 +340,7 @@ typedef struct GDISPDriver {
*
* @note The parameter variables must not be altered by the driver.
*/
- LLDSPEC void gdisp_lld_fill_area(GDISPDriver *g);
+ LLDSPEC void gdisp_lld_fill_area(GDisplay *g);
#endif
#if GDISP_HARDWARE_BITFILLS || defined(__DOXYGEN__)
@@ -360,7 +357,7 @@ typedef struct GDISPDriver {
*
* @note The parameter variables must not be altered by the driver.
*/
- LLDSPEC void gdisp_lld_blit_area(GDISPDriver *g);
+ LLDSPEC void gdisp_lld_blit_area(GDisplay *g);
#endif
#if GDISP_HARDWARE_PIXELREAD || defined(__DOXYGEN__)
@@ -374,7 +371,7 @@ typedef struct GDISPDriver {
*
* @note The parameter variables must not be altered by the driver.
*/
- LLDSPEC color_t gdisp_lld_get_pixel_color(GDISPDriver *g);
+ LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g);
#endif
#if (GDISP_HARDWARE_SCROLL && GDISP_NEED_SCROLL) || defined(__DOXYGEN__)
@@ -393,7 +390,7 @@ typedef struct GDISPDriver {
* @note Clearing the exposed area on the scroll operation is not
* needed as the high level code handles this.
*/
- LLDSPEC void gdisp_lld_vertical_scroll(GDISPDriver *g);
+ LLDSPEC void gdisp_lld_vertical_scroll(GDisplay *g);
#endif
#if (GDISP_HARDWARE_CONTROL && GDISP_NEED_CONTROL) || defined(__DOXYGEN__)
@@ -407,7 +404,7 @@ typedef struct GDISPDriver {
*
* @note The parameter variables must not be altered by the driver.
*/
- LLDSPEC void gdisp_lld_control(GDISPDriver *g);
+ LLDSPEC void gdisp_lld_control(GDisplay *g);
#endif
#if (GDISP_HARDWARE_QUERY && GDISP_NEED_QUERY) || defined(__DOXYGEN__)
@@ -421,7 +418,7 @@ typedef struct GDISPDriver {
*
* @note The parameter variables must not be altered by the driver.
*/
- LLDSPEC void *gdisp_lld_query(GDISPDriver *g); // Uses p.x (=what);
+ LLDSPEC void *gdisp_lld_query(GDisplay *g); // Uses p.x (=what);
#endif
#if (GDISP_HARDWARE_CLIP && (GDISP_NEED_CLIP || GDISP_NEED_VALIDATION)) || defined(__DOXYGEN__)
@@ -435,40 +432,39 @@ typedef struct GDISPDriver {
*
* @note The parameter variables must not be altered by the driver.
*/
- LLDSPEC void gdisp_lld_set_clip(GDISPDriver *g);
+ LLDSPEC void gdisp_lld_set_clip(GDisplay *g);
#endif
#ifdef __cplusplus
}
#endif
-#endif // !GDISP_MULTIPLE_DRIVERS || defined(GDISP_LLD_DECLARATIONS)
+#endif // GDISP_TOTAL_CONTROLLERS == 1 || defined(GDISP_DRIVER_VMT)
-#if GDISP_MULTIPLE_DRIVERS
+#if GDISP_TOTAL_CONTROLLERS > 1
typedef struct GDISPVMT {
- bool_t (*init)(GDISPDriver *g);
- void (*writestart)(GDISPDriver *g); // Uses p.x,p.y p.cx,p.cy
- void (*writepos)(GDISPDriver *g); // Uses p.x,p.y
- void (*writecolor)(GDISPDriver *g); // Uses p.color
- void (*writestop)(GDISPDriver *g); // Uses no parameters
- void (*readstart)(GDISPDriver *g); // Uses p.x,p.y p.cx,p.cy
- color_t (*readcolor)(GDISPDriver *g); // Uses no parameters
- void (*readstop)(GDISPDriver *g); // Uses no parameters
- void (*pixel)(GDISPDriver *g); // Uses p.x,p.y p.color
- void (*clear)(GDISPDriver *g); // Uses p.color
- void (*fill)(GDISPDriver *g); // Uses p.x,p.y p.cx,p.cy p.color
- void (*blit)(GDISPDriver *g); // Uses p.x,p.y p.cx,p.cy p.x1,p.y1 (=srcx,srcy) p.x2 (=srccx), p.ptr (=buffer)
- color_t (*get)(GDISPDriver *g); // Uses p.x,p.y
- void (*vscroll)(GDISPDriver *g); // Uses p.x,p.y p.cx,p.cy, p.y1 (=lines) p.color
- void (*control)(GDISPDriver *g); // Uses p.x (=what) p.ptr (=value)
- void *(*query)(GDISPDriver *g); // Uses p.x (=what);
- void (*setclip)(GDISPDriver *g); // Uses p.x,p.y p.cx,p.cy
+ bool_t (*init)(GDisplay *g, unsigned display);
+ void (*writestart)(GDisplay *g); // Uses p.x,p.y p.cx,p.cy
+ void (*writepos)(GDisplay *g); // Uses p.x,p.y
+ void (*writecolor)(GDisplay *g); // Uses p.color
+ void (*writestop)(GDisplay *g); // Uses no parameters
+ void (*readstart)(GDisplay *g); // Uses p.x,p.y p.cx,p.cy
+ color_t (*readcolor)(GDisplay *g); // Uses no parameters
+ void (*readstop)(GDisplay *g); // Uses no parameters
+ void (*pixel)(GDisplay *g); // Uses p.x,p.y p.color
+ void (*clear)(GDisplay *g); // Uses p.color
+ void (*fill)(GDisplay *g); // Uses p.x,p.y p.cx,p.cy p.color
+ void (*blit)(GDisplay *g); // Uses p.x,p.y p.cx,p.cy p.x1,p.y1 (=srcx,srcy) p.x2 (=srccx), p.ptr (=buffer)
+ color_t (*get)(GDisplay *g); // Uses p.x,p.y
+ void (*vscroll)(GDisplay *g); // Uses p.x,p.y p.cx,p.cy, p.y1 (=lines) p.color
+ void (*control)(GDisplay *g); // Uses p.x (=what) p.ptr (=value)
+ void *(*query)(GDisplay *g); // Uses p.x (=what);
+ void (*setclip)(GDisplay *g); // Uses p.x,p.y p.cx,p.cy
} GDISPVMT;
- #ifdef GDISP_LLD_DECLARATIONS
- #define GDISP_DRIVER_STRUCT_INIT {{0}, &VMT}
- static const GDISPVMT VMT = {
+ #if defined(GDISP_DRIVER_VMT)
+ const GDISPVMT const GDISP_DRIVER_VMT[1] = {{
gdisp_lld_init,
#if GDISP_HARDWARE_STREAM_WRITE
gdisp_lld_write_start,
@@ -480,7 +476,7 @@ typedef struct GDISPDriver {
gdisp_lld_write_color,
gdisp_lld_write_stop,
#else
- 0, 0, 0,
+ 0, 0, 0, 0,
#endif
#if GDISP_HARDWARE_STREAM_READ
gdisp_lld_read_start,
@@ -534,11 +530,10 @@ typedef struct GDISPDriver {
#else
0,
#endif
- };
- GDISPDriver GDISP_DRIVER_STRUCT = {{0}, &VMT};
+ }};
#else
- #define gdisp_lld_init(g) g->vmt->init(g)
+ #define gdisp_lld_init(g, display) g->vmt->init(g, display)
#define gdisp_lld_write_start(g) g->vmt->writestart(g)
#define gdisp_lld_write_pos(g) g->vmt->writepos(g)
#define gdisp_lld_write_color(g) g->vmt->writecolor(g)
@@ -555,19 +550,9 @@ typedef struct GDISPDriver {
#define gdisp_lld_control(g) g->vmt->control(g)
#define gdisp_lld_query(g) g->vmt->query(g)
#define gdisp_lld_set_clip(g) g->vmt->setclip(g)
-
- extern GDISPDriver GDISP_DRIVER_STRUCT;
-
#endif // GDISP_LLD_DECLARATIONS
-#else // GDISP_MULTIPLE_DRIVERS
- #ifdef GDISP_LLD_DECLARATIONS
- GDISPDriver GDISP_DRIVER_STRUCT;
- #else
- extern GDISPDriver GDISP_DRIVER_STRUCT;
- #endif
-
-#endif // GDISP_MULTIPLE_DRIVERS
+#endif // GDISP_TOTAL_CONTROLLERS > 1
/* Verify information for packed pixels and define a non-packed pixel macro */
#if !GDISP_PACKED_PIXELS
diff --git a/include/gdisp/options.h b/include/gdisp/options.h
index 1a0f6907..9af7788f 100644
--- a/include/gdisp/options.h
+++ b/include/gdisp/options.h
@@ -21,19 +21,6 @@
* @{
*/
/**
- * @brief Should support for multiple displays be provided.
- * @details Defaults to FALSE.
- * @note Setting this to TRUE can significantly increase code size as many
- * optimizations that remove code through conditional compilation can't
- * be done. It may also slow some graphics operations as extra tests must
- * be performed to determine how to do a particular operation. For these
- * reasons do not set it to TRUE unless you really need multiple display
- * support.
- */
- #ifndef GDISP_MULTIPLE_DRIVERS
- #define GDISP_MULTIPLE_DRIVERS FALSE
- #endif
- /**
* @brief Should all operations be clipped to the screen and colors validated.
* @details Defaults to TRUE.
* @note If this is FALSE, any operations that extend beyond the
@@ -158,6 +145,50 @@
/**
* @}
*
+ * @name GDISP Multiple Display Support
+ * @{
+ */
+ /**
+ * @brief The total number of displays.
+ * @note This can be on just one type of controller or spread across several different controllers
+ */
+ #ifndef GDISP_TOTAL_DISPLAYS
+ #define GDISP_TOTAL_DISPLAYS 1
+ #endif
+ /**
+ * @brief The total number of controllers.
+ * @note If this is greater than one, all the hardware acceleration options below
+ * and the pixel format must be manually specified in your gfxconf.h along with
+ * @p GDISP_CONTROLLER_LIST. See the gdisp_lld_config.h in each driver to get a list
+ * of hardware capabilities for each driver in order to work out the common set across
+ * all the controllers you want to use.
+ */
+ #ifndef GDISP_TOTAL_CONTROLLERS
+ #define GDISP_TOTAL_CONTROLLERS 1
+ #endif
+
+ #if defined(__DOXYGEN__)
+ /**
+ * @brief The list of controllers.
+ * @note This is required if @p GDISP_TOTAL_CONTROLLERS is greater than one.
+ * @note The number of entries must match @p GDISP_TOTAL_CONTROLLERS.
+ * @note See the gdisp_lld.c in each driver (near the top) to get the name of the VMT for a driver.
+ * @note Replace this example with your own definition in your gfxconf.h file.
+ */
+ #define GDISP_CONTROLLER_LIST GDISPVMT_Win32, GDISPVMT_SSD1963
+ /**
+ * @brief The number of displays for each controller.
+ * @note This is required if @p GDISP_TOTAL_CONTROLLERS is greater than one.
+ * @note The number of entries must match @p GDISP_TOTAL_CONTROLLERS.
+ * @note The sum of all the display counts must equal @p GDISP_TOTAL_DISPLAYS (3 for this example)
+ * or bad things will happen.
+ * @note Replace this example with your own definition in your gfxconf.h file.
+ */
+ #define GDISP_CONTROLLER_DISPLAYS 2, 1
+ #endif
+/**
+ * @}
+ *
* @name GDISP Image Options
* @pre GDISP_NEED_IMAGE must be TRUE
* @{
diff --git a/include/gfx_rules.h b/include/gfx_rules.h
index a8dd031e..c58fc5ba 100644
--- a/include/gfx_rules.h
+++ b/include/gfx_rules.h
@@ -134,12 +134,14 @@
#endif
#if GFX_USE_GDISP
- #if GDISP_MULTIPLE_DRIVERS
+ #if GDISP_TOTAL_CONTROLLERS > 1
+ #ifndef GDISP_CONTROLLER_LIST
+ #error "GDISP Multiple Controllers: You must specify a value for GDISP_CONTROLLER_LIST"
+ #endif
#ifndef GDISP_PIXELFORMAT
#if GFX_DISPLAY_RULE_WARNINGS
- #warning "GDISP: GDISP_MULTIPLE_DRIVERS requires GDISP_PIXELFORMAT to be set. It has been defaulted to GDISP_PIXELFORMAT_RGB565."
+ #error "GDISP Multiple Controllers: You must specify a value for GDISP_PIXELFORMAT"
#endif
- #define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB565
#endif
#endif
#if GDISP_NEED_ANTIALIAS && !GDISP_NEED_PIXELREAD