Re-order the GDISP initialisation routine so that it initialises all displays before it tries to draw on any of them.
This also simplifies code.
This commit is contained in:
parent
539c6c305a
commit
0892135e23
1 changed files with 25 additions and 53 deletions
|
@ -509,7 +509,7 @@ static void line_clip(GDisplay *g) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#if GDISP_STARTUP_LOGO_TIMEOUT > 0
|
#if GDISP_STARTUP_LOGO_TIMEOUT > 0
|
||||||
static void StatupLogoDisplay(GDisplay *g) {
|
static void StartupLogoDisplay(GDisplay *g) {
|
||||||
coord_t x, y, w;
|
coord_t x, y, w;
|
||||||
const coord_t * p;
|
const coord_t * p;
|
||||||
static const coord_t blks[] = {
|
static const coord_t blks[] = {
|
||||||
|
@ -566,12 +566,11 @@ static void line_clip(GDisplay *g) {
|
||||||
void _gdispInit(void) {
|
void _gdispInit(void) {
|
||||||
GDisplay *g;
|
GDisplay *g;
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
|
|
||||||
|
/* Initialise all controllers */
|
||||||
#if GDISP_TOTAL_CONTROLLERS > 1
|
#if GDISP_TOTAL_CONTROLLERS > 1
|
||||||
uint16_t j;
|
uint16_t j;
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Initialise driver */
|
|
||||||
#if GDISP_TOTAL_CONTROLLERS > 1
|
|
||||||
for(g = GDisplayArray, j=0; j < GDISP_TOTAL_CONTROLLERS; j++)
|
for(g = GDisplayArray, j=0; j < GDISP_TOTAL_CONTROLLERS; j++)
|
||||||
for(i = 0; i < DisplayCountList[j]; g++, i++) {
|
for(i = 0; i < DisplayCountList[j]; g++, i++) {
|
||||||
g->vmt = ControllerList[j];
|
g->vmt = ControllerList[j];
|
||||||
|
@ -586,65 +585,38 @@ void _gdispInit(void) {
|
||||||
MUTEX_ENTER(g);
|
MUTEX_ENTER(g);
|
||||||
g->flags = 0;
|
g->flags = 0;
|
||||||
gdisp_lld_init(g);
|
gdisp_lld_init(g);
|
||||||
|
|
||||||
#if defined(GDISP_DEFAULT_ORIENTATION) && GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL
|
|
||||||
g->p.x = GDISP_CONTROL_ORIENTATION;
|
|
||||||
g->p.ptr = (void *)GDISP_DEFAULT_ORIENTATION;
|
|
||||||
#if GDISP_HARDWARE_CONTROL == HARDWARE_AUTODETECT
|
|
||||||
if (g->vmt->control)
|
|
||||||
#endif
|
|
||||||
gdisp_lld_control(g);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Set the initial clipping region
|
|
||||||
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
|
|
||||||
|
|
||||||
// Best is hardware clipping
|
|
||||||
#if GDISP_HARDWARE_CLIP
|
|
||||||
#if GDISP_HARDWARE_CLIP == HARDWARE_AUTODETECT
|
|
||||||
if (g->vmt->setclip)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
g->p.x = 0;
|
|
||||||
g->p.y = 0;
|
|
||||||
g->p.cx = g->g.Width;
|
|
||||||
g->p.cy = g->g.Height;
|
|
||||||
gdisp_lld_set_clip(g);
|
|
||||||
}
|
|
||||||
#if GDISP_HARDWARE_CLIP == HARDWARE_AUTODETECT
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Worst is software clipping
|
|
||||||
#if GDISP_HARDWARE_CLIP != TRUE
|
|
||||||
{
|
|
||||||
g->clipx0 = 0;
|
|
||||||
g->clipy0 = 0;
|
|
||||||
g->clipx1 = g->g.Width;
|
|
||||||
g->clipy1 = g->g.Height;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
MUTEX_EXIT(g);
|
MUTEX_EXIT(g);
|
||||||
gdispGClear(g, GDISP_STARTUP_COLOR);
|
|
||||||
#if GDISP_STARTUP_LOGO_TIMEOUT > 0
|
|
||||||
StatupLogoDisplay(g);
|
|
||||||
#endif
|
|
||||||
#if !GDISP_NEED_AUTOFLUSH && GDISP_HARDWARE_FLUSH
|
|
||||||
gdispGFlush(g);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the orientation, the clipping area, clear all the displays (and add the logo if required)
|
||||||
|
for(g = GDisplayArray, i = 0; i < GDISP_TOTAL_DISPLAYS; g++, i++) {
|
||||||
|
#if defined(GDISP_DEFAULT_ORIENTATION) && GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL
|
||||||
|
gdispGControl(g, GDISP_CONTROL_ORIENTATION, (void *)GDISP_DEFAULT_ORIENTATION);
|
||||||
|
#endif
|
||||||
|
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
|
||||||
|
gdispGSetClip(g, 0, 0, g->g.Width, g->g.Height);
|
||||||
|
#endif
|
||||||
|
gdispGClear(g, GDISP_STARTUP_COLOR);
|
||||||
|
#if GDISP_STARTUP_LOGO_TIMEOUT > 0
|
||||||
|
StartupLogoDisplay(g);
|
||||||
|
#endif
|
||||||
|
#if GDISP_HARDWARE_FLUSH
|
||||||
|
gdispGFlush(g);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Re-clear the display after the timeout if we added the logo
|
||||||
#if GDISP_STARTUP_LOGO_TIMEOUT > 0
|
#if GDISP_STARTUP_LOGO_TIMEOUT > 0
|
||||||
gfxSleepMilliseconds(GDISP_STARTUP_LOGO_TIMEOUT);
|
gfxSleepMilliseconds(GDISP_STARTUP_LOGO_TIMEOUT);
|
||||||
for(g = GDisplayArray, i = 0; i < GDISP_TOTAL_DISPLAYS; g++, i++) {
|
for(g = GDisplayArray, i = 0; i < GDISP_TOTAL_DISPLAYS; g++, i++) {
|
||||||
gdispGClear(g, GDISP_STARTUP_COLOR);
|
gdispGClear(g, GDISP_STARTUP_COLOR);
|
||||||
#if !GDISP_NEED_AUTOFLUSH && GDISP_HARDWARE_FLUSH
|
#if GDISP_HARDWARE_FLUSH
|
||||||
gdispGFlush(g);
|
gdispGFlush(g);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Start the automatic timer flush (if required)
|
||||||
#if GDISP_NEED_TIMERFLUSH
|
#if GDISP_NEED_TIMERFLUSH
|
||||||
gtimerInit(&FlushTimer);
|
gtimerInit(&FlushTimer);
|
||||||
gtimerStart(&FlushTimer, FlushTimerFn, 0, TRUE, GDISP_NEED_TIMERFLUSH);
|
gtimerStart(&FlushTimer, FlushTimerFn, 0, TRUE, GDISP_NEED_TIMERFLUSH);
|
||||||
|
@ -1178,7 +1150,7 @@ void gdispGBlitArea(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, c
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if GDISP_NEED_CLIP
|
#if GDISP_NEED_CLIP || GDISP_NEED_VALIDATION
|
||||||
void gdispGSetClip(GDisplay *g, 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) {
|
||||||
MUTEX_ENTER(g);
|
MUTEX_ENTER(g);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue