Multiple displays across one or more controllers is now fully supported.

Only the Win32 driver supports this so far.
Other drivers are currently broken due to API changes and will be fixed.
ugfx_release_2.6
inmarket 2013-10-12 13:24:40 +10:00
parent b3ee216bd2
commit d22bc07e7a
11 changed files with 1862 additions and 1428 deletions

File diff suppressed because it is too large Load Diff

View File

@ -16,15 +16,12 @@
#ifndef _GDISP_LLD_CONFIG_H #ifndef _GDISP_LLD_CONFIG_H
#define _GDISP_LLD_CONFIG_H #define _GDISP_LLD_CONFIG_H
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/ #if GFX_USE_GDISP
/*===========================================================================*/ /*===========================================================================*/
/* Driver hardware support. */ /* Driver hardware support. */
/*===========================================================================*/ /*===========================================================================*/
#define GDISP_DRIVER_NAME "Win32"
#define GDISP_DRIVER_STRUCT GDISP_Win32
#define GDISP_HARDWARE_DRAWPIXEL TRUE #define GDISP_HARDWARE_DRAWPIXEL TRUE
#define GDISP_HARDWARE_FILLS TRUE #define GDISP_HARDWARE_FILLS TRUE
#define GDISP_HARDWARE_PIXELREAD TRUE #define GDISP_HARDWARE_PIXELREAD TRUE
@ -32,7 +29,7 @@
#define GDISP_HARDWARE_BITFILLS TRUE #define GDISP_HARDWARE_BITFILLS TRUE
#define GDISP_HARDWARE_SCROLL TRUE #define GDISP_HARDWARE_SCROLL TRUE
#define GDISP_LLD_PIXELFORMAT GDISP_PIXELFORMAT_RGB888 #define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB888
#endif /* GFX_USE_GDISP */ #endif /* GFX_USE_GDISP */

View File

@ -20,9 +20,16 @@
#if GFX_USE_GINPUT && GINPUT_NEED_TOGGLE #if GFX_USE_GINPUT && GINPUT_NEED_TOGGLE
#define GINPUT_TOGGLE_POLL_PERIOD TIME_INFINITE // We are interrupt driven (or polled - ether works here) #define GINPUT_TOGGLE_POLL_PERIOD TIME_INFINITE // We are interrupt driven (or polled - either works here)
#define GINPUT_TOGGLE_NUM_PORTS 8 // The total number of toggle inputs
#define GINPUT_TOGGLE_CONFIG_ENTRIES 1 // The total number of GToggleConfig entries // This driver is unique in that it can support 8 buttons per window across multiple windows.
// GINPUT_TOGGLE_CONFIG_ENTRIES just must be less than the number of GDISP windows (GDISP_DRIVER_COUNT_WIN32).
#ifndef GINPUT_TOGGLE_CONFIG_ENTRIES
#define GINPUT_TOGGLE_CONFIG_ENTRIES 1 // The total number of GToggleConfig entries
#endif
// The total number of toggle inputs
#define GINPUT_TOGGLE_NUM_PORTS (8 * GINPUT_TOGGLE_CONFIG_ENTRIES)
#define GINPUT_TOGGLE_SW1 0 // Switch 1 - Toggle #define GINPUT_TOGGLE_SW1 0 // Switch 1 - Toggle
#define GINPUT_TOGGLE_SW2 1 // Switch 2 - Toggle #define GINPUT_TOGGLE_SW2 1 // Switch 2 - Toggle
@ -33,6 +40,8 @@
#define GINPUT_TOGGLE_MOMENTARY2 5 // Switch 6 - Momentary #define GINPUT_TOGGLE_MOMENTARY2 5 // Switch 6 - Momentary
#define GINPUT_TOGGLE_MOMENTARY3 6 // Switch 7 - Momentary #define GINPUT_TOGGLE_MOMENTARY3 6 // Switch 7 - Momentary
#define GINPUT_TOGGLE_MOMENTARY4 7 // Switch 8 - Momentary #define GINPUT_TOGGLE_MOMENTARY4 7 // Switch 8 - Momentary
// This pattern of switch and momentary action is repeated across all windows.
#endif /* GFX_USE_GDISP && GINPUT_NEED_TOGGLE */ #endif /* GFX_USE_GDISP && GINPUT_NEED_TOGGLE */

View File

@ -22,7 +22,12 @@
/* Driver hardware support. */ /* Driver hardware support. */
/*===========================================================================*/ /*===========================================================================*/
#define GDISP_DRIVER_NAME "Linux emulator - X11" #ifndef GDISP_DRIVER_COUNT_X11
#define GDISP_DRIVER_COUNT_X11 1
#endif
#define GDISP_DRIVER_COUNT GDISP_DRIVER_COUNT_X11
#define GDISP_DRIVER_NAME "Linux emulator - X11"
#define GDISP_DRIVER_STRUCT GDISP_X11 #define GDISP_DRIVER_STRUCT GDISP_X11
#define GDISP_HARDWARE_DRAWPIXEL TRUE #define GDISP_HARDWARE_DRAWPIXEL TRUE
@ -32,7 +37,7 @@
#define GDISP_HARDWARE_PIXELREAD TRUE #define GDISP_HARDWARE_PIXELREAD TRUE
#define GDISP_HARDWARE_CONTROL FALSE #define GDISP_HARDWARE_CONTROL FALSE
#define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB888 #define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB888
#endif /* GFX_USE_GDISP */ #endif /* GFX_USE_GDISP */

View File

@ -141,6 +141,29 @@
#define GMISC_NEED_FIXEDTRIG FALSE #define GMISC_NEED_FIXEDTRIG FALSE
#define GMISC_NEED_INVSQRT FALSE #define GMISC_NEED_INVSQRT FALSE
/* Optional Multiple Display support */
/*
#define GDISP_TOTAL_DISPLAYS 1
#define GDISP_TOTAL_CONTROLLERS 1
// Extra stuff needed for when GDISP_TOTAL_CONTROLLERS > 1
#define GDISP_CONTROLLER_LIST GDISPVMT_Win32, GDISPVMT_Win32
#define GDISP_CONTROLLER_DISPLAYS 1, 1
#define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB888
#define GDISP_HARDWARE_STREAM_WRITE FALSE
#define GDISP_HARDWARE_STREAM_READ FALSE
#define GDISP_HARDWARE_STREAM_POS FALSE
#define GDISP_HARDWARE_DRAWPIXEL FALSE
#define GDISP_HARDWARE_CLEARS FALSE
#define GDISP_HARDWARE_FILLS FALSE
#define GDISP_HARDWARE_BITFILLS FALSE
#define GDISP_HARDWARE_SCROLL FALSE
#define GDISP_HARDWARE_PIXELREAD FALSE
#define GDISP_HARDWARE_CONTROL FALSE
#define GDISP_HARDWARE_QUERY FALSE
#define GDISP_HARDWARE_CLIP FALSE
*/
/* Optional Parameters for various subsystems */ /* Optional Parameters for various subsystems */
/* /*
#define GDISP_LINEBUF_SIZE 128 #define GDISP_LINEBUF_SIZE 128

View File

@ -17,6 +17,10 @@
* *
* @pre GFX_USE_GDISP must be set to TRUE in gfxconf.h * @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; uint8_t Contrast;
} GDISPControl; } 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. */ /* Constants. */
@ -150,75 +165,69 @@ extern GDISPControl *GDISP;
/* Defines relating to the display hardware */ /* Defines relating to the display hardware */
/*===========================================================================*/ /*===========================================================================*/
#if GDISP_MULTIPLE_DRIVERS || defined(__DOXYGEN__) #if !defined(GDISP_TOTAL_CONTROLLERS) || GDISP_TOTAL_CONTROLLERS == 1
/** // Pull in the default hardware configuration for a single controller.
* @name GDISP pixel format choices // If we have multiple controllers the settings must be set in the
* @{ // users gfxconf.h file.
*/
/**
* @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
#include "gdisp_lld_config.h" #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 #ifndef GDISP_PIXELFORMAT
#define GDISP_PIXELFORMAT GDISP_LLD_PIXELFORMAT #define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_ERROR
#endif #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 #ifndef GDISP_PACKED_PIXELS
#define GDISP_PACKED_PIXELS FALSE #define GDISP_PACKED_PIXELS FALSE
#endif #endif
/**
* @brief Do lines of pixels require packing for a blit
* @note Ignored if GDISP_PACKED_PIXELS is FALSE
*/
#ifndef GDISP_PACKED_LINES #ifndef GDISP_PACKED_LINES
#define GDISP_PACKED_LINES FALSE #define GDISP_PACKED_LINES FALSE
#endif #endif
#endif /** @} */
/*===========================================================================*/ /*===========================================================================*/
/* Defines related to the pixel format */ /* Defines related to the pixel format */
@ -356,48 +365,68 @@ extern "C" {
*/ */
color_t gdispBlendColor(color_t fg, color_t bg, uint8_t alpha); 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 */ /* Drawing Functions */
/** /**
* @brief Clear the display to the specified color. * @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 * @param[in] color The color to use when clearing the screen
* *
* @api * @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. * @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] x,y The position to set the pixel.
* @param[in] color The color to use * @param[in] color The color to use
* *
* @api * @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. * @brief Draw a line.
* *
* @param[in] g The display to use
* @param[in] x0,y0 The start position * @param[in] x0,y0 The start position
* @param[in] x1,y1 The end position * @param[in] x1,y1 The end position
* @param[in] color The color to use * @param[in] color The color to use
* *
* @api * @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. * @brief Fill an area with a color.
* *
* @param[in] g The display to use
* @param[in] x,y The start position * @param[in] x,y The start position
* @param[in] cx,cy The size of the box (outside dimensions) * @param[in] cx,cy The size of the box (outside dimensions)
* @param[in] color The color to use * @param[in] color The color to use
* *
* @api * @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. * @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 * 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. * 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] x,y The start position
* @param[in] cx,cy The size of the filled area * @param[in] cx,cy The size of the filled area
* @param[in] srcx,srcy The bitmap position to start the fill form * @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 * @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. * @brief Draw a rectangular box.
* *
* @param[in] g The display to use
* @param[in] x,y The start position * @param[in] x,y The start position
* @param[in] cx,cy The size of the box (outside dimensions) * @param[in] cx,cy The size of the box (outside dimensions)
* @param[in] color The color to use * @param[in] color The color to use
* *
* @api * @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 */ /* 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 * @note A streaming operation may be terminated early (without writing to every location
* in the stream area) by calling @p gdispStreamStop(). * in the stream area) by calling @p gdispStreamStop().
* *
* @param[in] g The display to use
* @param[in] x,y The start position * @param[in] x,y The start position
* @param[in] cx,cy The size of the streamable area * @param[in] cx,cy The size of the streamable area
* *
* @api * @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. * @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 * @note If the gdispStreamStart() has not been called (or failed due to clipping), the
* data provided here is simply thrown away. * data provided here is simply thrown away.
* *
* @param[in] g The display to use
* @param[in] color The color of the pixel to write * @param[in] color The color of the pixel to write
* *
* @api * @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. * @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 * @note If the gdispStreamStart() has not been called (or failed due to clipping), this
* call is simply ignored. * call is simply ignored.
* *
* @param[in] g The display to use
*
* @api * @api
*/ */
void gdispStreamStop(void); void gdispGStreamStop(GDisplay *g);
#define gdispStreamStop() gdispGStreamStop(GDISP)
#endif #endif
/* Clipping Functions */ /* 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. * @brief Clip all drawing to the defined area.
* *
* @param[in] x,y The start position * @param[in] g The display to use
* @param[in] cx,cy The size of the clip area * @param[in] x,y The start position
* @param[in] cx,cy The size of the clip area
* *
* @api * @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 #endif
/* Circle Functions */ /* 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. * @brief Draw a circle.
* *
* @param[in] g The display to use
* @param[in] x,y The center of the circle * @param[in] x,y The center of the circle
* @param[in] radius The radius of the circle * @param[in] radius The radius of the circle
* @param[in] color The color to use * @param[in] color The color to use
* *
* @api * @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. * @brief Draw a filled circle.
* *
* @param[in] g The display to use
* @param[in] x,y The center of the circle * @param[in] x,y The center of the circle
* @param[in] radius The radius of the circle * @param[in] radius The radius of the circle
* @param[in] color The color to use * @param[in] color The color to use
* *
* @api * @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 #endif
/* Ellipse Functions */ /* 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. * @brief Draw an ellipse.
* *
* @param[in] x,y The center of the ellipse * @param[in] g The display to use
* @param[in] a,b The dimensions of the ellipse * @param[in] x,y The center of the ellipse
* @param[in] color The color to use * @param[in] a,b The dimensions of the ellipse
* @param[in] color The color to use
* *
* @api * @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. * @brief Draw a filled ellipse.
* *
* @param[in] x,y The center of the ellipse * @param[in] g The display to use
* @param[in] a,b The dimensions of the ellipse * @param[in] x,y The center of the ellipse
* @param[in] color The color to use * @param[in] a,b The dimensions of the ellipse
* @param[in] color The color to use
* *
* @api * @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 #endif
/* Arc Functions */ /* 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. * @brief Draw an arc.
* *
* @param[in] g The display to use
* @param[in] x0,y0 The center point * @param[in] x0,y0 The center point
* @param[in] radius The radius of the arc * @param[in] radius The radius of the arc
* @param[in] start The start angle (0 to 360) * @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 * @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. * @brief Draw a filled arc.
* @note Not very efficient currently - does lots of overdrawing * @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] x0,y0 The center point
* @param[in] radius The radius of the arc * @param[in] radius The radius of the arc
* @param[in] start The start angle (0 to 360) * @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 * @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 #endif
/* Read a pixel Function */ /* 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. * @brief Get the color of a pixel.
* @return The color of the 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 * @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 #endif
/* Scrolling Function - clears the area scrolled out */ /* 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 Optional.
* @note If lines is >= cy, it is equivelent to a area fill with bgcolor. * @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] g The display to use
* @param[in] cx, cy The size of the area to be scrolled * @param[in] x, y The start of the area to be scrolled
* @param[in] lines The number of lines to scroll (Can be positive or negative) * @param[in] cx, cy The size of the area to be scrolled
* @param[in] bgcolor The color to fill the newly exposed area. * @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 * @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 #endif
/* Set driver specific control */ /* 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 * @note Depending on the hardware implementation this function may not
* support some codes. They will be ignored. * support some codes. They will be ignored.
* *
* @param[in] g The display to use
* @param[in] what what you want to control * @param[in] what what you want to control
* @param[in] value The value to be assigned * @param[in] value The value to be assigned
* *
* @api * @api
*/ */
void gdispControl(unsigned what, void *value); void gdispGControl(GDisplay *g, unsigned what, void *value);
#define gdispControl(w,v) gdispGControl(GDISP,w,v)
#endif #endif
/* Query driver specific data */ /* 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 The result must be typecast to the correct type.
* @note An unsupported query will return (void *)-1. * @note An unsupported query will return (void *)-1.
* *
* @param[in] g The display to use
* @param[in] what What to query * @param[in] what What to query
* *
* @api * @api
*/ */
void *gdispQuery(unsigned what); void *gdispGQuery(GDisplay *g, unsigned what);
#define gdispQuery(w) gdispGQuery(GDISP,w)
#endif #endif
#if GDISP_NEED_CONVEX_POLYGON || defined(__DOXYGEN__) #if GDISP_NEED_CONVEX_POLYGON || defined(__DOXYGEN__)
/** /**
* @brief Draw an enclosed polygon (convex, non-convex or complex). * @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] tx, ty Transform all points in pntarray by tx, ty
* @param[in] pntarray An array of points * @param[in] pntarray An array of points
* @param[in] cnt The number of points in the array * @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 * @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 * @brief Fill a convex polygon
* @details Doesn't handle non-convex or complex polygons. * @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] tx, ty Transform all points in pntarray by tx, ty
* @param[in] pntarray An array of points * @param[in] pntarray An array of points
* @param[in] cnt The number of points in the array * @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 * @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 #endif
/* Text Functions */ /* 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. * @brief Draw a text character.
* *
* @param[in] g The display to use
* @param[in] x,y The position for the text * @param[in] x,y The position for the text
* @param[in] c The character to draw * @param[in] c The character to draw
* @param[in] font The font to use * @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 * @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. * @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] x,y The position for the text
* @param[in] c The character to draw * @param[in] c The character to draw
* @param[in] font The font to use * @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 * @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. * @brief Draw a text string.
* *
* @param[in] g The display to use
* @param[in] x,y The position for the text * @param[in] x,y The position for the text
* @param[in] font The font to use * @param[in] font The font to use
* @param[in] str The string to draw * @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 * @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. * @brief Draw a text string.
* *
* @param[in] g The display to use
* @param[in] x,y The position for the text * @param[in] x,y The position for the text
* @param[in] str The string to draw * @param[in] str The string to draw
* @param[in] font The font to use * @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 * @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. * @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] 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] cx,cy The width and height of the box
* @param[in] str The string to draw * @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 * @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. * @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 * @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] 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] cx,cy The width and height of the box
* @param[in] str The string to draw * @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 * @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. * @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 * @brief Draw a rectangular box with rounded corners
* *
* @param[in] g The display to use
* @param[in] x,y The start position * @param[in] x,y The start position
* @param[in] cx,cy The size of the box (outside dimensions) * @param[in] cx,cy The size of the box (outside dimensions)
* @param[in] radius The radius of the rounded corners * @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 * @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 * @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] x,y The start position
* @param[in] cx,cy The size of the box (outside dimensions) * @param[in] cx,cy The size of the box (outside dimensions)
* @param[in] radius The radius of the rounded corners * @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 * @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 #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 */ /* 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 */ /* 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. * @brief Set the display power mode.
* @note Ignored if not supported by the display. * @note Ignored if not supported by the display.
* *
* @param[in] g The display to use
* @param[in] powerMode The new power mode * @param[in] powerMode The new power mode
* *
* @api * @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. * @brief Set the display orientation.
* @note Ignored if not supported by the display. * @note Ignored if not supported by the display.
* *
* @param[in] g The display to use
* @param[in] newOrientation The new orientation * @param[in] newOrientation The new orientation
* *
* @api * @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. * @brief Set the display backlight.
* @note Ignored if not supported by the display. * @note Ignored if not supported by the display.
* *
* @param[in] g The display to use
* @param[in] percent The new brightness (0 - 100%) * @param[in] percent The new brightness (0 - 100%)
* *
* @note For displays that only support backlight off and on, * @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 * @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. * @brief Set the display contrast.
* @note Ignored if not supported by the display. * @note Ignored if not supported by the display.
* *
* @param[in] g The display to use
* @param[in] percent The new contrast (0 - 100%) * @param[in] percent The new contrast (0 - 100%)
* *
* @api * @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. * @brief Get the display width in pixels.
* *
* @param[in] g The display to use
*
* @api * @api
*/ */
#define gdispGetWidth() (GDISP->Width) #define gdispGGetWidth(g) (((GDISPControl *)(g))->Width)
#define gdispGetWidth() gdispGGetWidth(GDISP)
/** /**
* @brief Get the display height in pixels. * @brief Get the display height in pixels.
* *
* @param[in] g The display to use
*
* @api * @api
*/ */
#define gdispGetHeight() (GDISP->Height) #define gdispGGetHeight(g) (((GDISPControl *)(g))->Height)
#define gdispGetHeight() gdispGGetHeight(GDISP)
/** /**
* @brief Get the current display power mode. * @brief Get the current display power mode.
* *
* @param[in] g The display to use
*
* @api * @api
*/ */
#define gdispGetPowerMode() (GDISP->Powermode) #define gdispGGetPowerMode(g) (((GDISPControl *)(g))->Powermode)
#define gdispGetPowerMode() gdispGGetPowerMode(GDISP)
/** /**
* @brief Get the current display orientation. * @brief Get the current display orientation.
* *
* @param[in] g The display to use
*
* @api * @api
*/ */
#define gdispGetOrientation() (GDISP->Orientation) #define gdispGGetOrientation(g) (((GDISPControl *)(g))->Orientation)
#define gdispGetOrientation() gdispGGetOrientation(GDISP)
/** /**
* @brief Get the current display backlight brightness. * @brief Get the current display backlight brightness.
* *
* @param[in] g The display to use
*
* @api * @api
*/ */
#define gdispGetBacklight() (GDISP->Backlight) #define gdispGGetBacklight(g) (((GDISPControl *)(g))->Backlight)
#define gdispGetBacklight() gdispGGetBacklight(GDISP)
/** /**
* @brief Get the current display contrast. * @brief Get the current display contrast.
* *
* @param[in] g The display to use
*
* @api * @api
*/ */
#define gdispGetContrast() (GDISP->Contrast) #define gdispGGetContrast(g) (((GDISPControl *)(g))->Contrast)
#define gdispGetContrast() gdispGGetContrast(GDISP)
/* More interesting macro's */ /* More interesting macro's */
/** /**
* @brief Reset the clip area to the full screen * @brief Reset the clip area to the full screen
* *
* @param[in] g The display to use
*
* @api * @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 #ifdef __cplusplus
} }

View File

@ -18,140 +18,136 @@
#if GFX_USE_GDISP || defined(__DOXYGEN__) #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. */ /* 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
*/ */
/** #ifndef GDISP_HARDWARE_STREAM_WRITE
* @brief Hardware streaming writing is supported. #define GDISP_HARDWARE_STREAM_WRITE FALSE
* @details If set to @p FALSE software emulation is used. #endif
* @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
/** /**
* @brief Hardware streaming reading of the display surface is supported. * @brief Hardware streaming reading of the display surface is supported.
* @details If set to @p FALSE this routine is not available. * @details If set to @p FALSE this routine is not available.
*/ */
#ifndef GDISP_HARDWARE_STREAM_READ #ifndef GDISP_HARDWARE_STREAM_READ
#define GDISP_HARDWARE_STREAM_READ FALSE #define GDISP_HARDWARE_STREAM_READ FALSE
#endif #endif
/** /**
* @brief Hardware supports setting the cursor position within the stream window. * @brief Hardware supports setting the cursor position within the stream window.
* @details If set to @p FALSE this routine is not available. * @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. * @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 * It should therefore not be implemented unless it is cheaper than just setting
* a new window. * a new window.
*/ */
#ifndef GDISP_HARDWARE_STREAM_POS #ifndef GDISP_HARDWARE_STREAM_POS
#define GDISP_HARDWARE_STREAM_POS FALSE #define GDISP_HARDWARE_STREAM_POS FALSE
#endif #endif
/** /**
* @brief Hardware accelerated draw pixel. * @brief Hardware accelerated draw pixel.
* @details If set to @p FALSE software emulation is used. * @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 * @note Either GDISP_HARDWARE_STREAM_WRITE or GDISP_HARDWARE_DRAWPIXEL must be provided by the driver
*/ */
#ifndef GDISP_HARDWARE_DRAWPIXEL #ifndef GDISP_HARDWARE_DRAWPIXEL
#define GDISP_HARDWARE_DRAWPIXEL FALSE #define GDISP_HARDWARE_DRAWPIXEL FALSE
#endif #endif
/** /**
* @brief Hardware accelerated screen clears. * @brief Hardware accelerated screen clears.
* @details If set to @p FALSE software emulation is used. * @details If set to @p FALSE software emulation is used.
* @note This clears the entire display surface regardless of the clipping area currently set * @note This clears the entire display surface regardless of the clipping area currently set
*/ */
#ifndef GDISP_HARDWARE_CLEARS #ifndef GDISP_HARDWARE_CLEARS
#define GDISP_HARDWARE_CLEARS FALSE #define GDISP_HARDWARE_CLEARS FALSE
#endif #endif
/** /**
* @brief Hardware accelerated rectangular fills. * @brief Hardware accelerated rectangular fills.
* @details If set to @p FALSE software emulation is used. * @details If set to @p FALSE software emulation is used.
*/ */
#ifndef GDISP_HARDWARE_FILLS #ifndef GDISP_HARDWARE_FILLS
#define GDISP_HARDWARE_FILLS FALSE #define GDISP_HARDWARE_FILLS FALSE
#endif #endif
/** /**
* @brief Hardware accelerated fills from an image. * @brief Hardware accelerated fills from an image.
* @details If set to @p FALSE software emulation is used. * @details If set to @p FALSE software emulation is used.
*/ */
#ifndef GDISP_HARDWARE_BITFILLS #ifndef GDISP_HARDWARE_BITFILLS
#define GDISP_HARDWARE_BITFILLS FALSE #define GDISP_HARDWARE_BITFILLS FALSE
#endif #endif
/** /**
* @brief Hardware accelerated scrolling. * @brief Hardware accelerated scrolling.
* @details If set to @p FALSE there is no support for scrolling. * @details If set to @p FALSE there is no support for scrolling.
*/ */
#ifndef GDISP_HARDWARE_SCROLL #ifndef GDISP_HARDWARE_SCROLL
#define GDISP_HARDWARE_SCROLL FALSE #define GDISP_HARDWARE_SCROLL FALSE
#endif #endif
/** /**
* @brief Reading back of pixel values. * @brief Reading back of pixel values.
* @details If set to @p FALSE there is no support for pixel read-back. * @details If set to @p FALSE there is no support for pixel read-back.
*/ */
#ifndef GDISP_HARDWARE_PIXELREAD #ifndef GDISP_HARDWARE_PIXELREAD
#define GDISP_HARDWARE_PIXELREAD FALSE #define GDISP_HARDWARE_PIXELREAD FALSE
#endif #endif
/** /**
* @brief The driver supports one or more control commands. * @brief The driver supports one or more control commands.
* @details If set to @p FALSE there is no support for control commands. * @details If set to @p FALSE there is no support for control commands.
*/ */
#ifndef GDISP_HARDWARE_CONTROL #ifndef GDISP_HARDWARE_CONTROL
#define GDISP_HARDWARE_CONTROL FALSE #define GDISP_HARDWARE_CONTROL FALSE
#endif #endif
/** /**
* @brief The driver supports a non-standard query. * @brief The driver supports a non-standard query.
* @details If set to @p FALSE there is no support for non-standard queries. * @details If set to @p FALSE there is no support for non-standard queries.
*/ */
#ifndef GDISP_HARDWARE_QUERY #ifndef GDISP_HARDWARE_QUERY
#define GDISP_HARDWARE_QUERY FALSE #define GDISP_HARDWARE_QUERY FALSE
#endif #endif
/** /**
* @brief The driver supports a clipping in hardware. * @brief The driver supports a clipping in hardware.
* @details If set to @p FALSE there is no support for non-standard queries. * @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 * @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. * 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 * @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 * driver do not exceed the display area (provided GDISP_NEED_CLIP or GDISP_NEED_VALIDATION
* has been set). * has been set).
*/ */
#ifndef GDISP_HARDWARE_CLIP #ifndef GDISP_HARDWARE_CLIP
#define GDISP_HARDWARE_CLIP FALSE #define GDISP_HARDWARE_CLIP FALSE
#endif #endif
/** @} */ /** @} */
#endif
/*===========================================================================*/ /*===========================================================================*/
/* External declarations. */ /* External declarations. */
/*===========================================================================*/ /*===========================================================================*/
typedef struct GDISPDriver { typedef struct GDisplay {
GDISPControl g; GDISPControl g; // The public GDISP stuff - must be the first element
#if GDISP_MULTIPLE_DRIVERS #if GDISP_TOTAL_CONTROLLERS > 1
const struct GDISPVMT const * vmt; const struct GDISPVMT const * vmt; // The Virtual Method Table
#endif #endif
void * priv; // A private area just for the drivers use.
uint16_t flags; uint16_t flags;
#define GDISP_FLG_INSTREAM 0x0001 // We are in a user based stream operation #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 #define GDISP_FLG_SCRSTREAM 0x0002 // The stream area currently covers the whole screen
@ -163,7 +159,7 @@ typedef struct GDISPDriver {
#endif #endif
// Software clipping // 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 clipx0, clipy0;
coord_t clipx1, clipy1; /* not inclusive */ coord_t clipx1, clipy1; /* not inclusive */
#endif #endif
@ -195,10 +191,10 @@ typedef struct GDISPDriver {
color_t linebuf[GDISP_LINEBUF_SIZE]; color_t linebuf[GDISP_LINEBUF_SIZE];
#endif #endif
} GDISPDriver; } GDisplay;
#if !GDISP_MULTIPLE_DRIVERS || defined(GDISP_LLD_DECLARATIONS) || defined(__DOXYGEN__) #if GDISP_TOTAL_CONTROLLERS == 1 || defined(GDISP_DRIVER_VMT) || defined(__DOXYGEN__)
#if GDISP_MULTIPLE_DRIVERS #if GDISP_TOTAL_CONTROLLERS > 1
#define LLDSPEC static #define LLDSPEC static
#else #else
#define LLDSPEC #define LLDSPEC
@ -212,9 +208,10 @@ typedef struct GDISPDriver {
* @brief Initialize the driver. * @brief Initialize the driver.
* @return TRUE if successful. * @return TRUE if successful.
* @param[in] g The driver structure * @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 * @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__) #if GDISP_HARDWARE_STREAM_WRITE || defined(__DOXYGEN__)
/** /**
@ -230,7 +227,7 @@ typedef struct GDISPDriver {
* undefined results. * undefined results.
* @note This must be followed by a call to @p gdisp_lld_write_pos() if GDISP_HARDWARE_STREAM_POS is TRUE. * @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 * @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. * @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 * @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. * @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__) #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. * @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
#endif #endif
@ -280,7 +277,7 @@ typedef struct GDISPDriver {
* @note Streaming operations that wrap the defined window have * @note Streaming operations that wrap the defined window have
* undefined results. * 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 * @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. * @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 * @brief End the current streaming operation
@ -301,7 +298,7 @@ typedef struct GDISPDriver {
* *
* @note The parameter variables must not be altered by the driver. * @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 #endif
#if GDISP_HARDWARE_DRAWPIXEL || defined(__DOXYGEN__) #if GDISP_HARDWARE_DRAWPIXEL || defined(__DOXYGEN__)
@ -315,7 +312,7 @@ typedef struct GDISPDriver {
* *
* @note The parameter variables must not be altered by the driver. * @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 #endif
#if GDISP_HARDWARE_CLEARS || defined(__DOXYGEN__) #if GDISP_HARDWARE_CLEARS || defined(__DOXYGEN__)
@ -328,7 +325,7 @@ typedef struct GDISPDriver {
* *
* @note The parameter variables must not be altered by the driver. * @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 #endif
#if GDISP_HARDWARE_FILLS || defined(__DOXYGEN__) #if GDISP_HARDWARE_FILLS || defined(__DOXYGEN__)
@ -343,7 +340,7 @@ typedef struct GDISPDriver {
* *
* @note The parameter variables must not be altered by the driver. * @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 #endif
#if GDISP_HARDWARE_BITFILLS || defined(__DOXYGEN__) #if GDISP_HARDWARE_BITFILLS || defined(__DOXYGEN__)
@ -360,7 +357,7 @@ typedef struct GDISPDriver {
* *
* @note The parameter variables must not be altered by the driver. * @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 #endif
#if GDISP_HARDWARE_PIXELREAD || defined(__DOXYGEN__) #if GDISP_HARDWARE_PIXELREAD || defined(__DOXYGEN__)
@ -374,7 +371,7 @@ typedef struct GDISPDriver {
* *
* @note The parameter variables must not be altered by the driver. * @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 #endif
#if (GDISP_HARDWARE_SCROLL && GDISP_NEED_SCROLL) || defined(__DOXYGEN__) #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 * @note Clearing the exposed area on the scroll operation is not
* needed as the high level code handles this. * 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 #endif
#if (GDISP_HARDWARE_CONTROL && GDISP_NEED_CONTROL) || defined(__DOXYGEN__) #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. * @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 #endif
#if (GDISP_HARDWARE_QUERY && GDISP_NEED_QUERY) || defined(__DOXYGEN__) #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. * @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 #endif
#if (GDISP_HARDWARE_CLIP && (GDISP_NEED_CLIP || GDISP_NEED_VALIDATION)) || defined(__DOXYGEN__) #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. * @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 #endif
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #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 { typedef struct GDISPVMT {
bool_t (*init)(GDISPDriver *g); bool_t (*init)(GDisplay *g, unsigned display);
void (*writestart)(GDISPDriver *g); // Uses p.x,p.y p.cx,p.cy void (*writestart)(GDisplay *g); // Uses p.x,p.y p.cx,p.cy
void (*writepos)(GDISPDriver *g); // Uses p.x,p.y void (*writepos)(GDisplay *g); // Uses p.x,p.y
void (*writecolor)(GDISPDriver *g); // Uses p.color void (*writecolor)(GDisplay *g); // Uses p.color
void (*writestop)(GDISPDriver *g); // Uses no parameters void (*writestop)(GDisplay *g); // Uses no parameters
void (*readstart)(GDISPDriver *g); // Uses p.x,p.y p.cx,p.cy void (*readstart)(GDisplay *g); // Uses p.x,p.y p.cx,p.cy
color_t (*readcolor)(GDISPDriver *g); // Uses no parameters color_t (*readcolor)(GDisplay *g); // Uses no parameters
void (*readstop)(GDISPDriver *g); // Uses no parameters void (*readstop)(GDisplay *g); // Uses no parameters
void (*pixel)(GDISPDriver *g); // Uses p.x,p.y p.color void (*pixel)(GDisplay *g); // Uses p.x,p.y p.color
void (*clear)(GDISPDriver *g); // Uses p.color void (*clear)(GDisplay *g); // Uses p.color
void (*fill)(GDISPDriver *g); // Uses p.x,p.y p.cx,p.cy p.color void (*fill)(GDisplay *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) 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)(GDISPDriver *g); // Uses p.x,p.y color_t (*get)(GDisplay *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 (*vscroll)(GDisplay *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 (*control)(GDisplay *g); // Uses p.x (=what) p.ptr (=value)
void *(*query)(GDISPDriver *g); // Uses p.x (=what); void *(*query)(GDisplay *g); // Uses p.x (=what);
void (*setclip)(GDISPDriver *g); // Uses p.x,p.y p.cx,p.cy void (*setclip)(GDisplay *g); // Uses p.x,p.y p.cx,p.cy
} GDISPVMT; } GDISPVMT;
#ifdef GDISP_LLD_DECLARATIONS #if defined(GDISP_DRIVER_VMT)
#define GDISP_DRIVER_STRUCT_INIT {{0}, &VMT} const GDISPVMT const GDISP_DRIVER_VMT[1] = {{
static const GDISPVMT VMT = {
gdisp_lld_init, gdisp_lld_init,
#if GDISP_HARDWARE_STREAM_WRITE #if GDISP_HARDWARE_STREAM_WRITE
gdisp_lld_write_start, gdisp_lld_write_start,
@ -480,7 +476,7 @@ typedef struct GDISPDriver {
gdisp_lld_write_color, gdisp_lld_write_color,
gdisp_lld_write_stop, gdisp_lld_write_stop,
#else #else
0, 0, 0, 0, 0, 0, 0,
#endif #endif
#if GDISP_HARDWARE_STREAM_READ #if GDISP_HARDWARE_STREAM_READ
gdisp_lld_read_start, gdisp_lld_read_start,
@ -534,11 +530,10 @@ typedef struct GDISPDriver {
#else #else
0, 0,
#endif #endif
}; }};
GDISPDriver GDISP_DRIVER_STRUCT = {{0}, &VMT};
#else #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_start(g) g->vmt->writestart(g)
#define gdisp_lld_write_pos(g) g->vmt->writepos(g) #define gdisp_lld_write_pos(g) g->vmt->writepos(g)
#define gdisp_lld_write_color(g) g->vmt->writecolor(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_control(g) g->vmt->control(g)
#define gdisp_lld_query(g) g->vmt->query(g) #define gdisp_lld_query(g) g->vmt->query(g)
#define gdisp_lld_set_clip(g) g->vmt->setclip(g) #define gdisp_lld_set_clip(g) g->vmt->setclip(g)
extern GDISPDriver GDISP_DRIVER_STRUCT;
#endif // GDISP_LLD_DECLARATIONS #endif // GDISP_LLD_DECLARATIONS
#else // GDISP_MULTIPLE_DRIVERS #endif // GDISP_TOTAL_CONTROLLERS > 1
#ifdef GDISP_LLD_DECLARATIONS
GDISPDriver GDISP_DRIVER_STRUCT;
#else
extern GDISPDriver GDISP_DRIVER_STRUCT;
#endif
#endif // GDISP_MULTIPLE_DRIVERS
/* Verify information for packed pixels and define a non-packed pixel macro */ /* Verify information for packed pixels and define a non-packed pixel macro */
#if !GDISP_PACKED_PIXELS #if !GDISP_PACKED_PIXELS

View File

@ -20,19 +20,6 @@
* @name GDISP Functionality to be included * @name GDISP Functionality to be included
* @{ * @{
*/ */
/**
* @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. * @brief Should all operations be clipped to the screen and colors validated.
* @details Defaults to TRUE. * @details Defaults to TRUE.
@ -155,6 +142,50 @@
#ifndef GDISP_NEED_IMAGE #ifndef GDISP_NEED_IMAGE
#define GDISP_NEED_IMAGE FALSE #define GDISP_NEED_IMAGE FALSE
#endif #endif
/**
* @}
*
* @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
/** /**
* @} * @}
* *

View File

@ -134,12 +134,14 @@
#endif #endif
#if GFX_USE_GDISP #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 #ifndef GDISP_PIXELFORMAT
#if GFX_DISPLAY_RULE_WARNINGS #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 #endif
#define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB565
#endif #endif
#endif #endif
#if GDISP_NEED_ANTIALIAS && !GDISP_NEED_PIXELREAD #if GDISP_NEED_ANTIALIAS && !GDISP_NEED_PIXELREAD

File diff suppressed because it is too large Load Diff

View File

@ -71,7 +71,6 @@ void gfxInit(void) {
#endif #endif
#if GFX_USE_GDISP #if GFX_USE_GDISP
_gdispInit(); _gdispInit();
gdispClear(Black);
#endif #endif
#if GFX_USE_GWIN #if GFX_USE_GWIN
_gwinInit(); _gwinInit();