aboutsummaryrefslogtreecommitdiffstats
path: root/src/gdisp
diff options
context:
space:
mode:
authorinmarket <andrewh@inmarket.com.au>2013-10-12 13:24:40 +1000
committerinmarket <andrewh@inmarket.com.au>2013-10-12 13:24:40 +1000
commitd22bc07e7adf459b2b83fcd0e5bd6475c18e1e9a (patch)
tree0907d29a9695d1b93b02de1582345aea6446e991 /src/gdisp
parentb3ee216bd2565e8ab9298f1f54b8e6df762b7d58 (diff)
downloaduGFX-d22bc07e7adf459b2b83fcd0e5bd6475c18e1e9a.tar.gz
uGFX-d22bc07e7adf459b2b83fcd0e5bd6475c18e1e9a.tar.bz2
uGFX-d22bc07e7adf459b2b83fcd0e5bd6475c18e1e9a.zip
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.
Diffstat (limited to 'src/gdisp')
-rw-r--r--src/gdisp/gdisp.c1773
1 files changed, 910 insertions, 863 deletions
diff --git a/src/gdisp/gdisp.c b/src/gdisp/gdisp.c
index 756d5c1d..41f2f0f9 100644
--- a/src/gdisp/gdisp.c
+++ b/src/gdisp/gdisp.c
@@ -31,81 +31,92 @@
#define INLINE
#endif
+// Number of milliseconds for the startup logo - 0 means disabled.
+#define GDISP_STARTUP_LOGO_TIMEOUT 1000
+
/*===========================================================================*/
/* Driver local variables. */
/*===========================================================================*/
-#define GC ((GDISPDriver *)GDISP)
-GDISPControl *GDISP = &GDISP_DRIVER_STRUCT.g;
+// The controller array, the display array and the default display
+#if GDISP_TOTAL_CONTROLLERS > 1
+ typedef const struct GDISPVMT const VMTEL[1];
+ extern VMTEL GDISP_CONTROLLER_LIST;
+ static const struct GDISPVMT const * ControllerList[GDISP_TOTAL_CONTROLLERS] = {GDISP_CONTROLLER_LIST};
+ static const unsigned DisplayCountList[GDISP_TOTAL_CONTROLLERS] = {GDISP_CONTROLLER_DISPLAYS};
+#endif
+static GDisplay GDisplayArray[GDISP_TOTAL_DISPLAYS];
+GDisplay *GDISP = GDisplayArray;
#if GDISP_NEED_MULTITHREAD
- #define MUTEX_INIT() gfxMutexInit(&GC->mutex)
- #define MUTEX_ENTER() gfxMutexEnter(&GC->mutex)
- #define MUTEX_EXIT() gfxMutexExit(&GC->mutex)
+ #define MUTEX_INIT(g) gfxMutexInit(&(g)->mutex)
+ #define MUTEX_ENTER(g) gfxMutexEnter(&(g)->mutex)
+ #define MUTEX_EXIT(g) gfxMutexExit(&(g)->mutex)
#else
- #define MUTEX_INIT()
- #define MUTEX_ENTER()
- #define MUTEX_EXIT()
+ #define MUTEX_INIT(g)
+ #define MUTEX_ENTER(g)
+ #define MUTEX_EXIT(g)
#endif
#define NEED_CLIPPING (!GDISP_HARDWARE_CLIP && (GDISP_NEED_VALIDATION || GDISP_NEED_CLIP))
+
/*==========================================================================*/
/* Internal functions. */
/*==========================================================================*/
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- static INLINE void setglobalwindow(void) {
+ static INLINE void setglobalwindow(GDisplay *g) {
coord_t x, y;
- x = GC->p.x; y = GC->p.y;
- GC->p.cx = GC->g.Width; GC->p.cy = GC->g.Height;
- gdisp_lld_write_start(GC);
- GC->p.x = x; GC->p.y = y;
- GC->flags |= GDISP_FLG_SCRSTREAM;
+ x = g->p.x; y = g->p.y;
+ g->p.cx = g->g.Width; g->p.cy = g->g.Height;
+ gdisp_lld_write_start(g);
+ g->p.x = x; g->p.y = y;
+ g->flags |= GDISP_FLG_SCRSTREAM;
}
#endif
-// drawpixel_clip()
+// drawpixel_clip(g)
// Parameters: x,y
// Alters: cx, cy (if using streaming)
#if GDISP_HARDWARE_DRAWPIXEL
// Best is hardware accelerated pixel draw
#if NEED_CLIPPING
- static INLINE void drawpixel_clip(void) {
- if (GC->p.x >= GC->clipx0 && GC->p.x < GC->clipx1 && GC->p.y >= GC->clipy0 && GC->p.y < GC->clipy1)
- gdisp_lld_draw_pixel(GC);
+ static INLINE void drawpixel_clip(GDisplay *g) {
+ if (g->p.x >= g->clipx0 && g->p.x < g->clipx1 && g->p.y >= g->clipy0 && g->p.y < g->clipy1)
+ gdisp_lld_draw_pixel(g);
}
#else
- #define drawpixel_clip() gdisp_lld_draw_pixel(GC)
+ #define drawpixel_clip(g) gdisp_lld_draw_pixel(g)
#endif
#elif GDISP_HARDWARE_STREAM_POS
// Next best is cursor based streaming
- static INLINE void drawpixel_clip(void) {
+ static INLINE void drawpixel_clip(GDisplay *g) {
#if NEED_CLIPPING
- if (GC->p.x < GC->clipx0 || GC->p.x >= GC->clipx1 || GC->p.y < GC->clipy0 || GC->p.y >= GC->clipy1)
+ if (g->p.x < g->clipx0 || g->p.x >= g->clipx1 || g->p.y < g->clipy0 || g->p.y >= g->clipy1)
return;
#endif
- if (!(GC->flags & GDISP_FLG_SCRSTREAM))
- setglobalwindow();
- gdisp_lld_write_pos(GC);
- gdisp_lld_write_color(GC);
+ if (!(g->flags & GDISP_FLG_SCRSTREAM))
+ setglobalwindow(g);
+ gdisp_lld_write_pos(g);
+ gdisp_lld_write_color(g);
}
#else
// Worst is streaming
- static INLINE void drawpixel_clip(void) {
+ static INLINE void drawpixel_clip(GDisplay *g) {
#if NEED_CLIPPING
- if (GC->p.x < GC->clipx0 || GC->p.x >= GC->clipx1 || GC->p.y < GC->clipy0 || GC->p.y >= GC->clipy1)
+ if (g->p.x < g->clipx0 || g->p.x >= g->clipx1 || g->p.y < g->clipy0 || g->p.y >= g->clipy1)
return;
#endif
- GC->p.cx = GC->p.cy = 1;
- gdisp_lld_write_start(GC);
- gdisp_lld_write_color(GC);
- gdisp_lld_write_stop(GC);
+ g->p.cx = g->p.cy = 1;
+ gdisp_lld_write_start(g);
+ gdisp_lld_write_color(g);
+ gdisp_lld_write_stop(g);
}
#endif
-// fillarea()
+// fillarea(g)
// Parameters: x,y cx,cy and color
// Alters: nothing
// Note: This is not clipped
@@ -113,94 +124,94 @@ GDISPControl *GDISP = &GDISP_DRIVER_STRUCT.g;
// if GDISP_HARDWARE_STREAM_WRITE and GDISP_HARDWARE_STREAM_POS is set.
#if GDISP_HARDWARE_FILLS
// Best is hardware accelerated area fill
- #define fillarea() gdisp_lld_fill_area(GC)
+ #define fillarea(g) gdisp_lld_fill_area(g)
#elif GDISP_HARDWARE_STREAM_WRITE
// Next best is hardware streaming
- static INLINE void fillarea(void) {
+ static INLINE void fillarea(GDisplay *g) {
uint32_t area;
- area = (uint32_t)GC->p.cx * GC->p.cy;
+ area = (uint32_t)g->p.cx * g->p.cy;
#if GDISP_HARDWARE_STREAM_POS
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- gdisp_lld_write_start(GC);
+ gdisp_lld_write_start(g);
#if GDISP_HARDWARE_STREAM_POS
- gdisp_lld_write_pos(GC);
+ gdisp_lld_write_pos(g);
#endif
for(; area; area--)
- gdisp_lld_write_color(GC);
- gdisp_lld_write_stop(GC);
+ gdisp_lld_write_color(g);
+ gdisp_lld_write_stop(g);
}
#else
// Worst is drawing pixels
- static INLINE void fillarea(void) {
+ static INLINE void fillarea(GDisplay *g) {
coord_t x0, y0, x1, y1;
- x0 = GC->p.x;
- y0 = GC->p.y;
- x1 = GC->p.x + GC->p.cx;
- y1 = GC->p.y + GC->p.cy;
- for(; GC->p.y < y1; GC->p.y++, GC->p.x = x0)
- for(; GC->p.x < x1; GC->p.x++)
- gdisp_lld_draw_pixel(GC);
- GC->p.y = y0;
+ x0 = g->p.x;
+ y0 = g->p.y;
+ x1 = g->p.x + g->p.cx;
+ y1 = g->p.y + g->p.cy;
+ for(; g->p.y < y1; g->p.y++, g->p.x = x0)
+ for(; g->p.x < x1; g->p.x++)
+ gdisp_lld_draw_pixel(g);
+ g->p.y = y0;
}
#endif
#if NEED_CLIPPING
- #define TEST_CLIP_AREA(x,y,cx,cy) \
- if ((x) < GC->clipx0) { (cx) -= GC->clipx0 - (x); (x) = GC->clipx0; } \
- if ((y) < GC->clipy0) { (cy) -= GC->clipy0 - (y); (y) = GC->clipy0; } \
- if ((x) + (cx) > GC->clipx1) (cx) = GC->clipx1 - (x); \
- if ((y) + (cy) > GC->clipy1) (cy) = GC->clipy1 - (y); \
- if ((cx) > 0 && (cy) > 0)
+ #define TEST_CLIP_AREA(g) \
+ if ((g)->p.x < (g)->clipx0) { (g)->p.cx -= (g)->clipx0 - (g)->p.x; (g)->p.x = (g)->clipx0; } \
+ if ((g)->p.y < (g)->clipy0) { (g)->p.cy -= (g)->clipy0 - (g)->p.y; (g)->p.y = (g)->clipy0; } \
+ if ((g)->p.x + (g)->p.cx > (g)->clipx1) (g)->p.cx = (g)->clipx1 - (g)->p.x; \
+ if ((g)->p.y + (g)->p.cy > (g)->clipy1) (g)->p.cy = (g)->clipy1 - (g)->p.y; \
+ if ((g)->p.cx > 0 && (g)->p.cy > 0)
#else
- #define TEST_CLIP_AREA(x,y,cx,cy)
+ #define TEST_CLIP_AREA(g)
#endif
// Parameters: x,y and x1
// Alters: x,y x1,y1 cx,cy
// Assumes the window covers the screen and a write_stop() will occur later
// if GDISP_HARDWARE_STREAM_WRITE and GDISP_HARDWARE_STREAM_POS is set.
-static void hline_clip(void) {
+static void hline_clip(GDisplay *g) {
// Swap the points if necessary so it always goes from x to x1
- if (GC->p.x1 < GC->p.x) {
- GC->p.cx = GC->p.x; GC->p.x = GC->p.x1; GC->p.x1 = GC->p.cx;
+ if (g->p.x1 < g->p.x) {
+ g->p.cx = g->p.x; g->p.x = g->p.x1; g->p.x1 = g->p.cx;
}
// Clipping
#if NEED_CLIPPING
- if (GC->p.y < GC->clipy0 || GC->p.y >= GC->clipy1) return;
- if (GC->p.x < GC->clipx0) GC->p.x = GC->clipx0;
- if (GC->p.x1 >= GC->clipx1) GC->p.x1 = GC->clipx1 - 1;
- if (GC->p.x1 < GC->p.x) return;
+ if (g->p.y < g->clipy0 || g->p.y >= g->clipy1) return;
+ if (g->p.x < g->clipx0) g->p.x = g->clipx0;
+ if (g->p.x1 >= g->clipx1) g->p.x1 = g->clipx1 - 1;
+ if (g->p.x1 < g->p.x) return;
#endif
// This is an optimization for the point case. It is only worthwhile however if we
// have hardware fills or if we support both hardware pixel drawing and hardware streaming
#if GDISP_HARDWARE_FILLS || (GDISP_HARDWARE_DRAWPIXEL && GDISP_HARDWARE_STREAM_WRITE)
// Is this a point
- if (GC->p.x == GC->p.x1) {
+ if (g->p.x == g->p.x1) {
#if GDISP_HARDWARE_DRAWPIXEL
// Best is hardware accelerated pixel draw
- gdisp_lld_draw_pixel(GC);
+ gdisp_lld_draw_pixel(g);
#elif GDISP_HARDWARE_STREAM_POS
// Next best is cursor based streaming
- if (!(GC->flags & GDISP_FLG_SCRSTREAM))
- setglobalwindow();
- gdisp_lld_write_pos(GC);
- gdisp_lld_write_color(GC);
+ if (!(g->flags & GDISP_FLG_SCRSTREAM))
+ setglobalwindow(g);
+ gdisp_lld_write_pos(g);
+ gdisp_lld_write_color(g);
#else
// Worst is streaming
- GC->p.cx = GC->p.cy = 1;
- gdisp_lld_write_start(GC);
- gdisp_lld_write_color(GC);
- gdisp_lld_write_stop(GC);
+ g->p.cx = g->p.cy = 1;
+ gdisp_lld_write_start(g);
+ gdisp_lld_write_color(g);
+ gdisp_lld_write_stop(g);
#endif
return;
}
@@ -208,65 +219,65 @@ static void hline_clip(void) {
#if GDISP_HARDWARE_FILLS
// Best is hardware accelerated area fill
- GC->p.cx = GC->p.x1 - GC->p.x + 1;
- GC->p.cy = 1;
- gdisp_lld_fill_area(GC);
+ g->p.cx = g->p.x1 - g->p.x + 1;
+ g->p.cy = 1;
+ gdisp_lld_fill_area(g);
#elif GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
// Next best is cursor based streaming
- if (!(GC->flags & GDISP_FLG_SCRSTREAM))
- setglobalwindow();
- gdisp_lld_write_pos(GC);
- do { gdisp_lld_write_color(GC); } while(GC->p.cx--);
+ if (!(g->flags & GDISP_FLG_SCRSTREAM))
+ setglobalwindow(g);
+ gdisp_lld_write_pos(g);
+ do { gdisp_lld_write_color(g); } while(g->p.cx--);
#elif GDISP_HARDWARE_STREAM_WRITE
// Next best is streaming
- GC->p.cx = GC->p.x1 - GC->p.x + 1;
- GC->p.cy = 1;
- gdisp_lld_write_start(GC);
- do { gdisp_lld_write_color(GC); } while(GC->p.cx--);
- gdisp_lld_write_stop(GC);
+ g->p.cx = g->p.x1 - g->p.x + 1;
+ g->p.cy = 1;
+ gdisp_lld_write_start(g);
+ do { gdisp_lld_write_color(g); } while(g->p.cx--);
+ gdisp_lld_write_stop(g);
#else
// Worst is drawing pixels
- for(; GC->p.x <= GC->p.x1; GC->p.x++)
- gdisp_lld_draw_pixel(GC);
+ for(; g->p.x <= g->p.x1; g->p.x++)
+ gdisp_lld_draw_pixel(g);
#endif
}
// Parameters: x,y and y1
// Alters: x,y x1,y1 cx,cy
-static void vline_clip(void) {
+static void vline_clip(GDisplay *g) {
// Swap the points if necessary so it always goes from y to y1
- if (GC->p.y1 < GC->p.y) {
- GC->p.cy = GC->p.y; GC->p.y = GC->p.y1; GC->p.y1 = GC->p.cy;
+ if (g->p.y1 < g->p.y) {
+ g->p.cy = g->p.y; g->p.y = g->p.y1; g->p.y1 = g->p.cy;
}
// Clipping
#if NEED_CLIPPING
- if (GC->p.x < GC->clipx0 || GC->p.x >= GC->clipx1) return;
- if (GC->p.y < GC->clipy0) GC->p.y = GC->clipy0;
- if (GC->p.y1 >= GC->clipy1) GC->p.y1 = GC->clipy1 - 1;
- if (GC->p.y1 < GC->p.y) return;
+ if (g->p.x < g->clipx0 || g->p.x >= g->clipx1) return;
+ if (g->p.y < g->clipy0) g->p.y = g->clipy0;
+ if (g->p.y1 >= g->clipy1) g->p.y1 = g->clipy1 - 1;
+ if (g->p.y1 < g->p.y) return;
#endif
// This is an optimization for the point case. It is only worthwhile however if we
// have hardware fills or if we support both hardware pixel drawing and hardware streaming
#if GDISP_HARDWARE_FILLS || (GDISP_HARDWARE_DRAWPIXEL && GDISP_HARDWARE_STREAM_WRITE) || (GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE)
// Is this a point
- if (GC->p.y == GC->p.y1) {
+ if (g->p.y == g->p.y1) {
#if GDISP_HARDWARE_DRAWPIXEL
// Best is hardware accelerated pixel draw
- gdisp_lld_draw_pixel(GC);
+ gdisp_lld_draw_pixel(g);
#elif GDISP_HARDWARE_STREAM_POS
// Next best is cursor based streaming
- if (!(GC->flags & GDISP_FLG_SCRSTREAM))
- setglobalwindow();
- gdisp_lld_write_pos(GC);
- gdisp_lld_write_color(GC);
+ if (!(g->flags & GDISP_FLG_SCRSTREAM))
+ setglobalwindow(g);
+ gdisp_lld_write_pos(g);
+ gdisp_lld_write_color(g);
#else
// Worst is streaming
- GC->p.cx = GC->p.cy = 1;
- gdisp_lld_write_start(GC);
- gdisp_lld_write_color(GC);
- gdisp_lld_write_stop(GC);
+ g->p.cx = g->p.cy = 1;
+ gdisp_lld_write_start(g);
+ gdisp_lld_write_color(g);
+ gdisp_lld_write_stop(g);
#endif
return;
}
@@ -274,48 +285,48 @@ static void vline_clip(void) {
#if GDISP_HARDWARE_FILLS
// Best is hardware accelerated area fill
- GC->p.cy = GC->p.y1 - GC->p.y + 1;
- GC->p.cx = 1;
- gdisp_lld_fill_area(GC);
+ g->p.cy = g->p.y1 - g->p.y + 1;
+ g->p.cx = 1;
+ gdisp_lld_fill_area(g);
#elif GDISP_HARDWARE_STREAM_WRITE
// Next best is streaming
#if GDISP_HARDWARE_STREAM_POS
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- GC->p.cy = GC->p.y1 - GC->p.y + 1;
- GC->p.cx = 1;
- gdisp_lld_write_start(GC);
+ g->p.cy = g->p.y1 - g->p.y + 1;
+ g->p.cx = 1;
+ gdisp_lld_write_start(g);
#if GDISP_HARDWARE_STREAM_POS
- gdisp_lld_write_pos(GC);
+ gdisp_lld_write_pos(g);
#endif
- do { gdisp_lld_write_color(GC); } while(GC->p.cy--);
- gdisp_lld_write_stop(GC);
+ do { gdisp_lld_write_color(g); } while(g->p.cy--);
+ gdisp_lld_write_stop(g);
#else
// Worst is drawing pixels
- for(; GC->p.y <= GC->p.y1; GC->p.y++)
- gdisp_lld_draw_pixel(GC);
+ for(; g->p.y <= g->p.y1; g->p.y++)
+ gdisp_lld_draw_pixel(g);
#endif
}
// Parameters: x,y and x1,y1
// Alters: x,y x1,y1 cx,cy
-static void line_clip(void) {
+static void line_clip(GDisplay *g) {
int16_t dy, dx;
int16_t addx, addy;
int16_t P, diff, i;
// Is this a horizontal line (or a point)
- if (GC->p.y == GC->p.y1) {
- hline_clip();
+ if (g->p.y == g->p.y1) {
+ hline_clip(g);
return;
}
// Is this a vertical line (or a point)
- if (GC->p.x == GC->p.x1) {
- vline_clip();
+ if (g->p.x == g->p.x1) {
+ vline_clip(g);
return;
}
@@ -327,18 +338,18 @@ static void line_clip(void) {
// When clipping is needed, all the clipping could also be done up front
// instead of on each pixel.
- if (GC->p.x1 >= GC->p.x) {
- dx = GC->p.x1 - GC->p.x;
+ if (g->p.x1 >= g->p.x) {
+ dx = g->p.x1 - g->p.x;
addx = 1;
} else {
- dx = GC->p.x - GC->p.x1;
+ dx = g->p.x - g->p.x1;
addx = -1;
}
- if (GC->p.y1 >= GC->p.y) {
- dy = GC->p.y1 - GC->p.y;
+ if (g->p.y1 >= g->p.y) {
+ dy = g->p.y1 - g->p.y;
addy = 1;
} else {
- dy = GC->p.y - GC->p.y1;
+ dy = g->p.y - g->p.y1;
addy = -1;
}
@@ -348,14 +359,14 @@ static void line_clip(void) {
diff = P - dx;
for(i=0; i<=dx; ++i) {
- drawpixel_clip();
+ drawpixel_clip(g);
if (P < 0) {
P += dy;
- GC->p.x += addx;
+ g->p.x += addx;
} else {
P += diff;
- GC->p.x += addx;
- GC->p.y += addy;
+ g->p.x += addx;
+ g->p.y += addy;
}
}
} else {
@@ -364,90 +375,126 @@ static void line_clip(void) {
diff = P - dy;
for(i=0; i<=dy; ++i) {
- drawpixel_clip();
+ drawpixel_clip(g);
if (P < 0) {
P += dx;
- GC->p.y += addy;
+ g->p.y += addy;
} else {
P += diff;
- GC->p.x += addx;
- GC->p.y += addy;
+ g->p.x += addx;
+ g->p.y += addy;
}
}
}
}
+#if GDISP_STARTUP_LOGO_TIMEOUT > 0
+ static void StatupLogoDisplay(GDisplay *g) {
+ gdispGClear(g, Black);
+ gdispGFillArea(g, g->g.Width/4, g->g.Height/4, g->g.Width/2, g->g.Height/2, Blue);
+ }
+#endif
+
/*===========================================================================*/
/* Driver exported functions. */
/*===========================================================================*/
/* Our module initialiser */
void _gdispInit(void) {
- MUTEX_INIT();
+ GDisplay *g;
+ unsigned i;
+ #if GDISP_TOTAL_CONTROLLERS > 1
+ unsigned j;
+ #endif
+
/* Initialise driver */
- MUTEX_ENTER();
- GC->flags = 0;
- gdisp_lld_init(GC);
- #if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
- #if GDISP_HARDWARE_CLIP
- GC->p.x = x;
- GC->p.y = y;
- GC->p.cx = cx;
- GC->p.cy = cy;
- gdisp_lld_set_clip(GC);
- #else
- GC->clipx0 = 0;
- GC->clipy0 = 0;
- GC->clipx1 = GC->g.Width;
- GC->clipy1 = GC->g.Height;
- #endif
+ #if GDISP_TOTAL_CONTROLLERS > 1
+ for(g = GDisplayArray, j=0; j < GDISP_TOTAL_CONTROLLERS; j++)
+ for(i = 0; i < DisplayCountList[j]; g++, i++) {
+ g->vmt = ControllerList[j];
+ #else
+ for(g = GDisplayArray, i = 0; i < GDISP_TOTAL_DISPLAYS; g++, i++) {
+ #endif
+ MUTEX_INIT(g);
+ MUTEX_ENTER(g);
+ g->flags = 0;
+ gdisp_lld_init(g, i);
+ #if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
+ #if GDISP_HARDWARE_CLIP
+ g->p.x = x;
+ g->p.y = y;
+ g->p.cx = cx;
+ g->p.cy = cy;
+ gdisp_lld_set_clip(g);
+ #else
+ g->clipx0 = 0;
+ g->clipy0 = 0;
+ g->clipx1 = g->g.Width;
+ g->clipy1 = g->g.Height;
+ #endif
+ #endif
+ MUTEX_EXIT(g);
+ #if GDISP_STARTUP_LOGO_TIMEOUT > 0
+ StatupLogoDisplay(g);
+ #else
+ gdispGClear(g, Black);
+ #endif
+ }
+ #if GDISP_STARTUP_LOGO_TIMEOUT > 0
+ gfxSleepMilliseconds(GDISP_STARTUP_LOGO_TIMEOUT);
+ for(g = GDisplayArray, i = 0; i < GDISP_TOTAL_DISPLAYS; g++, i++)
+ gdispGClear(g, Black);
#endif
- MUTEX_EXIT();
+}
+
+void gdispSetDisplay(unsigned display) {
+ if (display < GDISP_TOTAL_DISPLAYS)
+ GDISP = &GDisplayArray[display];
}
#if GDISP_NEED_STREAMING
- void gdispStreamStart(coord_t x, coord_t y, coord_t cx, coord_t cy) {
- MUTEX_ENTER();
+ void gdispGStreamStart(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy) {
+ MUTEX_ENTER(g);
#if NEED_CLIPPING
// Test if the area is valid - if not then exit
- if (x < GC->clipx0 || x+cx > GC->clipx1 || y < GC->clipy0 || y+cy > GC->clipy1) {
- MUTEX_EXIT();
+ if (x < g->clipx0 || x+cx > g->clipx1 || y < g->clipy0 || y+cy > g->clipy1) {
+ MUTEX_EXIT(g);
return;
}
#endif
- GC->flags |= GDISP_FLG_INSTREAM;
+ g->flags |= GDISP_FLG_INSTREAM;
#if GDISP_HARDWARE_STREAM_WRITE
// Best is hardware streaming
- GC->p.x = x;
- GC->p.y = y;
- GC->p.cx = cx;
- GC->p.cy = cy;
- gdisp_lld_write_start(GC);
+ g->p.x = x;
+ g->p.y = y;
+ g->p.cx = cx;
+ g->p.cy = cy;
+ gdisp_lld_write_start(g);
#if GDISP_HARDWARE_STREAM_POS
- gdisp_lld_write_pos(GC);
+ gdisp_lld_write_pos(g);
#endif
#else
// Worst - save the parameters and use pixel drawing
// Use x,y as the current position, x1,y1 as the save position and x2,y2 as the end position, cx = bufpos
- GC->p.x1 = GC->p.x = x;
- GC->p.y1 = GC->p.y = y;
- GC->p.x2 = x + cx;
- GC->p.y2 = y + cy;
+ g->p.x1 = g->p.x = x;
+ g->p.y1 = g->p.y = y;
+ g->p.x2 = x + cx;
+ g->p.y2 = y + cy;
#if (GDISP_LINEBUF_SIZE != 0 && GDISP_HARDWARE_BITFILLS) || GDISP_HARDWARE_FILLS
- GC->p.cx = 0;
- GC->p.cy = 1;
+ g->p.cx = 0;
+ g->p.cy = 1;
#endif
#endif
// Don't release the mutex as gdispStreamEnd() will do that.
}
- void gdispStreamColor(color_t color) {
+ void gdispGStreamColor(GDisplay *g, color_t color) {
#if !GDISP_HARDWARE_STREAM_WRITE && GDISP_LINEBUF_SIZE != 0 && GDISP_HARDWARE_BITFILLS
coord_t sx1, sy1;
#endif
@@ -455,224 +502,224 @@ void _gdispInit(void) {
// Don't touch the mutex as we should already own it
// Ignore this call if we are not streaming
- if (!(GC->flags & GDISP_FLG_INSTREAM))
+ if (!(g->flags & GDISP_FLG_INSTREAM))
return;
#if GDISP_HARDWARE_STREAM_WRITE
// Best is hardware streaming
- GC->p.color = color;
- gdisp_lld_write_color(GC);
+ g->p.color = color;
+ gdisp_lld_write_color(g);
#elif GDISP_LINEBUF_SIZE != 0 && GDISP_HARDWARE_BITFILLS
- GC->linebuf[GC->p.cx++] = color;
- if (GC->p.cx >= GDISP_LINEBUF_SIZE) {
- sx1 = GC->p.x1;
- sy1 = GC->p.y1;
- GC->p.x1 = 0;
- GC->p.y1 = 0;
- GC->p.ptr = (void *)GC->linebuf;
- gdisp_lld_blit_area(GC);
- GC->p.x1 = sx1;
- GC->p.y1 = sy1;
- GC->p.x += GC->p.cx;
- GC->p.cx = 0;
+ g->linebuf[g->p.cx++] = color;
+ if (g->p.cx >= GDISP_LINEBUF_SIZE) {
+ sx1 = g->p.x1;
+ sy1 = g->p.y1;
+ g->p.x1 = 0;
+ g->p.y1 = 0;
+ g->p.ptr = (void *)g->linebuf;
+ gdisp_lld_blit_area(g);
+ g->p.x1 = sx1;
+ g->p.y1 = sy1;
+ g->p.x += g->p.cx;
+ g->p.cx = 0;
}
// Just wrap at end-of-line and end-of-buffer
- if (GC->p.x+GC->p.cx >= GC->p.x2) {
- if (GC->p.cx) {
- sx1 = GC->p.x1;
- sy1 = GC->p.y1;
- GC->p.x1 = 0;
- GC->p.y1 = 0;
- GC->p.ptr = (void *)GC->linebuf;
- gdisp_lld_blit_area(GC);
- GC->p.x1 = sx1;
- GC->p.y1 = sy1;
- GC->p.cx = 0;
+ if (g->p.x+g->p.cx >= g->p.x2) {
+ if (g->p.cx) {
+ sx1 = g->p.x1;
+ sy1 = g->p.y1;
+ g->p.x1 = 0;
+ g->p.y1 = 0;
+ g->p.ptr = (void *)g->linebuf;
+ gdisp_lld_blit_area(g);
+ g->p.x1 = sx1;
+ g->p.y1 = sy1;
+ g->p.cx = 0;
}
- GC->p.x = GC->p.x1;
- if (++GC->p.y >= GC->p.y2)
- GC->p.y = GC->p.y1;
+ g->p.x = g->p.x1;
+ if (++g->p.y >= g->p.y2)
+ g->p.y = g->p.y1;
}
#elif GDISP_HARDWARE_FILLS
// Only slightly better than drawing pixels is to look for runs and use fill area
- if (!GC->p.cx || GC->p.color == color) {
- GC->p.cx++;
- GC->p.color = color;
+ if (!g->p.cx || g->p.color == color) {
+ g->p.cx++;
+ g->p.color = color;
} else {
- if (GC->p.cx == 1)
- gdisp_lld_draw_pixel(GC);
+ if (g->p.cx == 1)
+ gdisp_lld_draw_pixel(g);
else
- gdisp_lld_fill_area(GC);
- GC->p.x += GC->p.cx;
- GC->p.color = color;
- GC->p.cx = 1;
+ gdisp_lld_fill_area(g);
+ g->p.x += g->p.cx;
+ g->p.color = color;
+ g->p.cx = 1;
}
// Just wrap at end-of-line and end-of-buffer
- if (GC->p.x+GC->p.cx >= GC->p.x2) {
- if (GC->p.cx) {
- if (GC->p.cx == 1)
- gdisp_lld_draw_pixel(GC);
+ if (g->p.x+g->p.cx >= g->p.x2) {
+ if (g->p.cx) {
+ if (g->p.cx == 1)
+ gdisp_lld_draw_pixel(g);
else
- gdisp_lld_fill_area(GC);
- GC->p.cx = 0;
+ gdisp_lld_fill_area(g);
+ g->p.cx = 0;
}
- GC->p.x = GC->p.x1;
- if (++GC->p.y >= GC->p.y2)
- GC->p.y = GC->p.y1;
+ g->p.x = g->p.x1;
+ if (++g->p.y >= g->p.y2)
+ g->p.y = g->p.y1;
}
#else
// Worst is using pixel drawing
- GC->p.color = color;
- gdisp_lld_draw_pixel(GC);
+ g->p.color = color;
+ gdisp_lld_draw_pixel(g);
// Just wrap at end-of-line and end-of-buffer
- if (++GC->p.x >= GC->p.x2) {
- GC->p.x = GC->p.x1;
- if (++GC->p.y >= GC->p.y2)
- GC->p.y = GC->p.y1;
+ if (++g->p.x >= g->p.x2) {
+ g->p.x = g->p.x1;
+ if (++g->p.y >= g->p.y2)
+ g->p.y = g->p.y1;
}
#endif
}
- void gdispStreamStop(void) {
+ void gdispGStreamStop(GDisplay *g) {
// Only release the mutex and end the stream if we are actually streaming.
- if (!(GC->flags & GDISP_FLG_INSTREAM))
+ if (!(g->flags & GDISP_FLG_INSTREAM))
return;
#if GDISP_HARDWARE_STREAM_WRITE
- gdisp_lld_write_stop(GC);
+ gdisp_lld_write_stop(g);
#elif GDISP_LINEBUF_SIZE != 0 && GDISP_HARDWARE_BITFILLS
- if (GC->p.cx) {
- GC->p.x1 = 0;
- GC->p.y1 = 0;
- GC->p.ptr = (void *)GC->linebuf;
- gdisp_lld_blit_area(GC);
+ if (g->p.cx) {
+ g->p.x1 = 0;
+ g->p.y1 = 0;
+ g->p.ptr = (void *)g->linebuf;
+ gdisp_lld_blit_area(g);
}
#elif GDISP_HARDWARE_FILLS
- if (GC->p.cx) {
- if (GC->p.cx == 1)
- gdisp_lld_draw_pixel(GC);
+ if (g->p.cx) {
+ if (g->p.cx == 1)
+ gdisp_lld_draw_pixel(g);
else
- gdisp_lld_fill_area(GC);
+ gdisp_lld_fill_area(g);
}
#endif
- GC->flags &= ~GDISP_FLG_INSTREAM;
- MUTEX_EXIT();
+ g->flags &= ~GDISP_FLG_INSTREAM;
+ MUTEX_EXIT(g);
}
#endif
-void gdispDrawPixel(coord_t x, coord_t y, color_t color) {
- MUTEX_ENTER();
- GC->p.x = x;
- GC->p.y = y;
- GC->p.color = color;
- drawpixel_clip();
+void gdispGDrawPixel(GDisplay *g, coord_t x, coord_t y, color_t color) {
+ MUTEX_ENTER(g);
+ g->p.x = x;
+ g->p.y = y;
+ g->p.color = color;
+ drawpixel_clip(g);
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
-void gdispDrawLine(coord_t x0, coord_t y0, coord_t x1, coord_t y1, color_t color) {
- MUTEX_ENTER();
- GC->p.x = x0;
- GC->p.y = y0;
- GC->p.x1 = x1;
- GC->p.y1 = y1;
- GC->p.color = color;
- line_clip();
+void gdispGDrawLine(GDisplay *g, coord_t x0, coord_t y0, coord_t x1, coord_t y1, color_t color) {
+ MUTEX_ENTER(g);
+ g->p.x = x0;
+ g->p.y = y0;
+ g->p.x1 = x1;
+ g->p.y1 = y1;
+ g->p.color = color;
+ line_clip(g);
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
-void gdispClear(color_t color) {
+void gdispGClear(GDisplay *g, color_t color) {
// Note - clear() ignores the clipping area. It clears the screen.
- MUTEX_ENTER();
+ MUTEX_ENTER(g);
#if GDISP_HARDWARE_CLEARS
// Best is hardware accelerated clear
- GC->p.color = color;
- gdisp_lld_clear(GC);
+ g->p.color = color;
+ gdisp_lld_clear(g);
#elif GDISP_HARDWARE_FILLS
// Next best is hardware accelerated area fill
- GC->p.x = GC->p.y = 0;
- GC->p.cx = GC->g.Width;
- GC->p.cy = GC->g.Height;
- GC->p.color = color;
- gdisp_lld_fill_area(GC);
+ g->p.x = g->p.y = 0;
+ g->p.cx = g->g.Width;
+ g->p.cy = g->g.Height;
+ g->p.color = color;
+ gdisp_lld_fill_area(g);
#elif GDISP_HARDWARE_STREAM_WRITE
// Next best is streaming
uint32_t area;
- GC->p.x = GC->p.y = 0;
- GC->p.cx = GC->g.Width;
- GC->p.cy = GC->g.Height;
- GC->p.color = color;
- area = (uint32_t)GC->p.cx * GC->p.cy;
+ g->p.x = g->p.y = 0;
+ g->p.cx = g->g.Width;
+ g->p.cy = g->g.Height;
+ g->p.color = color;
+ area = (uint32_t)g->p.cx * g->p.cy;
- gdisp_lld_write_start(GC);
+ gdisp_lld_write_start(g);
#if GDISP_HARDWARE_STREAM_POS
- gdisp_lld_write_pos(GC);
+ gdisp_lld_write_pos(g);
#endif
for(; area; area--)
- gdisp_lld_write_color(GC);
- gdisp_lld_write_stop(GC);
+ gdisp_lld_write_color(g);
+ gdisp_lld_write_stop(g);
#else
// Worst is drawing pixels
- GC->p.color = color;
- for(GC->p.y = 0; GC->p.y < GC->g.Height; GC->p.y++)
- for(GC->p.x = 0; GC->p.x < GC->g.Width; GC->p.x++)
- gdisp_lld_draw_pixel(GC);
+ g->p.color = color;
+ for(g->p.y = 0; g->p.y < g->g.Height; g->p.y++)
+ for(g->p.x = 0; g->p.x < g->g.Width; g->p.x++)
+ gdisp_lld_draw_pixel(g);
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
-void gdispFillArea(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
- MUTEX_ENTER();
- TEST_CLIP_AREA(x,y,cx,cy) {
- GC->p.x = x;
- GC->p.y = y;
- GC->p.cx = cx;
- GC->p.cy = cy;
- GC->p.color = color;
- fillarea();
+void gdispGFillArea(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
+ MUTEX_ENTER(g);
+ g->p.x = x;
+ g->p.y = y;
+ g->p.cx = cx;
+ g->p.cy = cy;
+ g->p.color = color;
+ TEST_CLIP_AREA(g) {
+ fillarea(g);
}
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
-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) {
- MUTEX_ENTER();
+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) {
+ MUTEX_ENTER(g);
#if NEED_CLIPPING
- // This is a different cliping to fillarea() as it needs to take into account srcx,srcy
- if (x < GC->clipx0) { cx -= GC->clipx0 - x; srcx += GC->clipx0 - x; x = GC->clipx0; }
- if (y < GC->clipy0) { cy -= GC->clipy0 - y; srcy += GC->clipy0 - x; y = GC->clipy0; }
- if (x+cx > GC->clipx1) cx = GC->clipx1 - x;
- if (y+cy > GC->clipy1) cy = GC->clipy1 - y;
+ // This is a different cliping to fillarea(g) as it needs to take into account srcx,srcy
+ if (x < g->clipx0) { cx -= g->clipx0 - x; srcx += g->clipx0 - x; x = g->clipx0; }
+ if (y < g->clipy0) { cy -= g->clipy0 - y; srcy += g->clipy0 - x; y = g->clipy0; }
+ if (x+cx > g->clipx1) cx = g->clipx1 - x;
+ if (y+cy > g->clipy1) cy = g->clipy1 - y;
if (srcx+cx > srccx) cx = srccx - srcx;
- if (cx <= 0 || cy <= 0) { MUTEX_EXIT(); return; }
+ if (cx <= 0 || cy <= 0) { MUTEX_EXIT(g); return; }
#endif
#if GDISP_HARDWARE_BITFILLS
// Best is hardware bitfills
- GC->p.x = x;
- GC->p.y = y;
- GC->p.cx = cx;
- GC->p.cy = cy;
- GC->p.x1 = srcx;
- GC->p.y1 = srcy;
- GC->p.x2 = srccx;
- GC->p.ptr = (void *)buffer;
- gdisp_lld_blit_area(GC);
+ g->p.x = x;
+ g->p.y = y;
+ g->p.cx = cx;
+ g->p.cy = cy;
+ g->p.x1 = srcx;
+ g->p.y1 = srcy;
+ g->p.x2 = srccx;
+ g->p.ptr = (void *)buffer;
+ gdisp_lld_blit_area(g);
#elif GDISP_HARDWARE_STREAM_WRITE
// Next best is hardware streaming
@@ -682,21 +729,21 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
srcy = y + cy;
srccx -= cx;
- GC->p.x = x;
- GC->p.y = y;
- GC->p.cx = cx;
- GC->p.cy = cy;
- gdisp_lld_write_start(GC);
+ g->p.x = x;
+ g->p.y = y;
+ g->p.cx = cx;
+ g->p.cy = cy;
+ gdisp_lld_write_start(g);
#if GDISP_HARDWARE_STREAM_POS
- gdisp_lld_write_pos(GC);
+ gdisp_lld_write_pos(g);
#endif
- for(GC->p.y = y; GC->p.y < srcy; GC->p.y++, buffer += srccx) {
- for(GC->p.x = x; GC->p.x < srcx; GC->p.x++) {
- GC->p.color = *buffer++;
- gdisp_lld_write_color(GC);
+ for(g->p.y = y; g->p.y < srcy; g->p.y++, buffer += srccx) {
+ for(g->p.x = x; g->p.x < srcx; g->p.x++) {
+ g->p.color = *buffer++;
+ gdisp_lld_write_color(g);
}
}
- gdisp_lld_write_stop(GC);
+ gdisp_lld_write_stop(g);
#elif GDISP_HARDWARE_FILLS
// Only slightly better than drawing pixels is to look for runs and use fill area
@@ -706,19 +753,19 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
srcy = y + cy;
srccx -= cx;
- GC->p.cy = 1;
- for(GC->p.y = y; GC->p.y < srcy; GC->p.y++, buffer += srccx) {
- for(GC->p.x=x; GC->p.x < srcx; GC->p.x += GC->p.cx) {
- GC->p.cx=1;
- GC->p.color = *buffer++;
- while(GC->p.x+GC->p.cx < srcx && *buffer == GC->p.color) {
- GC->p.cx++;
+ g->p.cy = 1;
+ for(g->p.y = y; g->p.y < srcy; g->p.y++, buffer += srccx) {
+ for(g->p.x=x; g->p.x < srcx; g->p.x += g->p.cx) {
+ g->p.cx=1;
+ g->p.color = *buffer++;
+ while(g->p.x+g->p.cx < srcx && *buffer == g->p.color) {
+ g->p.cx++;
buffer++;
}
- if (GC->p.cx == 1) {
- gdisp_lld_draw_pixel(GC);
+ if (g->p.cx == 1) {
+ gdisp_lld_draw_pixel(g);
} else {
- gdisp_lld_fill_area(GC);
+ gdisp_lld_fill_area(g);
}
}
}
@@ -731,135 +778,135 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
srcy = y + cy;
srccx -= cx;
- for(GC->p.y = y; GC->p.y < srcy; GC->p.y++, buffer += srccx) {
- for(GC->p.x=x; GC->p.x < srcx; GC->p.x++) {
- GC->p.color = *buffer++;
- gdisp_lld_draw_pixel(GC);
+ for(g->p.y = y; g->p.y < srcy; g->p.y++, buffer += srccx) {
+ for(g->p.x=x; g->p.x < srcx; g->p.x++) {
+ g->p.color = *buffer++;
+ gdisp_lld_draw_pixel(g);
}
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
#if GDISP_NEED_CLIP
- void gdispSetClip(coord_t x, coord_t y, coord_t cx, coord_t cy) {
- MUTEX_ENTER();
+ void gdispGSetClip(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy) {
+ MUTEX_ENTER(g);
#if GDISP_HARDWARE_CLIP
// Best is using hardware clipping
- GC->p.x = x;
- GC->p.y = y;
- GC->p.cx = cx;
- GC->p.cy = cy;
- gdisp_lld_set_clip(GC);
+ g->p.x = x;
+ g->p.y = y;
+ g->p.cx = cx;
+ g->p.cy = cy;
+ gdisp_lld_set_clip(g);
#else
// Worst is using software clipping
if (x < 0) { cx += x; x = 0; }
if (y < 0) { cy += y; y = 0; }
- if (cx <= 0 || cy <= 0 || x >= GC->g.Width || y >= GC->g.Height) { MUTEX_EXIT(); return; }
- GC->clipx0 = x;
- GC->clipy0 = y;
- GC->clipx1 = x+cx; if (GC->clipx1 > GC->g.Width) GC->clipx1 = GC->g.Width;
- GC->clipy1 = y+cy; if (GC->clipy1 > GC->g.Height) GC->clipy1 = GC->g.Height;
+ if (cx <= 0 || cy <= 0 || x >= g->g.Width || y >= g->g.Height) { MUTEX_EXIT(g); return; }
+ g->clipx0 = x;
+ g->clipy0 = y;
+ g->clipx1 = x+cx; if (g->clipx1 > g->g.Width) g->clipx1 = g->g.Width;
+ g->clipy1 = y+cy; if (g->clipy1 > g->g.Height) g->clipy1 = g->g.Height;
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
#endif
#if GDISP_NEED_CIRCLE
- 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) {
coord_t a, b, P;
- MUTEX_ENTER();
+ MUTEX_ENTER(g);
// Calculate intermediates
a = 1;
b = radius;
P = 4 - radius;
- GC->p.color = color;
+ g->p.color = color;
// Away we go using Bresenham's circle algorithm
// Optimized to prevent double drawing
- GC->p.x = x; GC->p.y = y + b; drawpixel_clip();
- GC->p.x = x; GC->p.y = y - b; drawpixel_clip();
- GC->p.x = x + b; GC->p.y = y; drawpixel_clip();
- GC->p.x = x - b; GC->p.y = y; drawpixel_clip();
+ g->p.x = x; g->p.y = y + b; drawpixel_clip(g);
+ g->p.x = x; g->p.y = y - b; drawpixel_clip(g);
+ g->p.x = x + b; g->p.y = y; drawpixel_clip(g);
+ g->p.x = x - b; g->p.y = y; drawpixel_clip(g);
do {
- GC->p.x = x + a; GC->p.y = y + b; drawpixel_clip();
- GC->p.x = x + a; GC->p.y = y - b; drawpixel_clip();
- GC->p.x = x + b; GC->p.y = y + a; drawpixel_clip();
- GC->p.x = x - b; GC->p.y = y + a; drawpixel_clip();
- GC->p.x = x - a; GC->p.y = y + b; drawpixel_clip();
- GC->p.x = x - a; GC->p.y = y - b; drawpixel_clip();
- GC->p.x = x + b; GC->p.y = y - a; drawpixel_clip();
- GC->p.x = x - b; GC->p.y = y - a; drawpixel_clip();
+ g->p.x = x + a; g->p.y = y + b; drawpixel_clip(g);
+ g->p.x = x + a; g->p.y = y - b; drawpixel_clip(g);
+ g->p.x = x + b; g->p.y = y + a; drawpixel_clip(g);
+ g->p.x = x - b; g->p.y = y + a; drawpixel_clip(g);
+ g->p.x = x - a; g->p.y = y + b; drawpixel_clip(g);
+ g->p.x = x - a; g->p.y = y - b; drawpixel_clip(g);
+ g->p.x = x + b; g->p.y = y - a; drawpixel_clip(g);
+ g->p.x = x - b; g->p.y = y - a; drawpixel_clip(g);
if (P < 0)
P += 3 + 2*a++;
else
P += 5 + 2*(a++ - b--);
} while(a < b);
- GC->p.x = x + a; GC->p.y = y + b; drawpixel_clip();
- GC->p.x = x + a; GC->p.y = y - b; drawpixel_clip();
- GC->p.x = x - a; GC->p.y = y + b; drawpixel_clip();
- GC->p.x = x - a; GC->p.y = y - b; drawpixel_clip();
+ g->p.x = x + a; g->p.y = y + b; drawpixel_clip(g);
+ g->p.x = x + a; g->p.y = y - b; drawpixel_clip(g);
+ g->p.x = x - a; g->p.y = y + b; drawpixel_clip(g);
+ g->p.x = x - a; g->p.y = y - b; drawpixel_clip(g);
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
#endif
#if GDISP_NEED_CIRCLE
- 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) {
coord_t a, b, P;
- MUTEX_ENTER();
+ MUTEX_ENTER(g);
// Calculate intermediates
a = 1;
b = radius;
P = 4 - radius;
- GC->p.color = color;
+ g->p.color = color;
// Away we go using Bresenham's circle algorithm
// This is optimized to prevent overdrawing by drawing a line only when a variable is about to change value
- GC->p.y = y; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip();
- GC->p.y = y+b; GC->p.x = x; drawpixel_clip();
- GC->p.y = y-b; GC->p.x = x; drawpixel_clip();
+ g->p.y = y; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g);
+ g->p.y = y+b; g->p.x = x; drawpixel_clip(g);
+ g->p.y = y-b; g->p.x = x; drawpixel_clip(g);
do {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip();
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip();
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g);
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g);
if (P < 0) {
P += 3 + 2*a++;
} else {
- GC->p.y = y+b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip();
- GC->p.y = y-b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip();
+ g->p.y = y+b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g);
+ g->p.y = y-b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g);
P += 5 + 2*(a++ - b--);
}
} while(a < b);
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip();
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip();
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g);
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g);
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
#endif
#if GDISP_NEED_ELLIPSE
- 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) {
coord_t dx, dy;
int32_t a2, b2;
int32_t err, e2;
- MUTEX_ENTER();
+ MUTEX_ENTER(g);
// Calculate intermediates
dx = 0;
@@ -867,14 +914,14 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
a2 = a*a;
b2 = b*b;
err = b2-(2*b-1)*a2;
- GC->p.color = color;
+ g->p.color = color;
// Away we go using Bresenham's ellipse algorithm
do {
- GC->p.x = x + dx; GC->p.y = y + dy; drawpixel_clip();
- GC->p.x = x - dx; GC->p.y = y + dy; drawpixel_clip();
- GC->p.x = x - dx; GC->p.y = y - dy; drawpixel_clip();
- GC->p.x = x + dx; GC->p.y = y - dy; drawpixel_clip();
+ g->p.x = x + dx; g->p.y = y + dy; drawpixel_clip(g);
+ g->p.x = x - dx; g->p.y = y + dy; drawpixel_clip(g);
+ g->p.x = x - dx; g->p.y = y - dy; drawpixel_clip(g);
+ g->p.x = x + dx; g->p.y = y - dy; drawpixel_clip(g);
e2 = 2*err;
if(e2 < (2*dx+1)*b2) {
@@ -888,22 +935,22 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
} while(dy >= 0);
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
#endif
#if GDISP_NEED_ELLIPSE
- 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) {
coord_t dx, dy;
int32_t a2, b2;
int32_t err, e2;
- MUTEX_ENTER();
+ MUTEX_ENTER(g);
// Calculate intermediates
dx = 0;
@@ -911,7 +958,7 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
a2 = a*a;
b2 = b*b;
err = b2-(2*b-1)*a2;
- GC->p.color = color;
+ g->p.color = color;
// Away we go using Bresenham's ellipse algorithm
// This is optimized to prevent overdrawing by drawing a line only when a y is about to change value
@@ -922,20 +969,20 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
err += (2*dx+1)*b2;
}
if(e2 > -(2*dy-1)*a2) {
- GC->p.y = y + dy; GC->p.x = x - dx; GC->p.x1 = x + dx; hline_clip();
- if (y) { GC->p.y = y - dy; GC->p.x = x - dx; GC->p.x1 = x + dx; hline_clip(); }
+ g->p.y = y + dy; g->p.x = x - dx; g->p.x1 = x + dx; hline_clip(g);
+ if (y) { g->p.y = y - dy; g->p.x = x - dx; g->p.x1 = x + dx; hline_clip(g); }
dy--;
err -= (2*dy-1)*a2;
}
} while(dy >= 0);
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
#endif
@@ -944,7 +991,7 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
#include <math.h>
#endif
- void gdispDrawArc(coord_t x, coord_t y, coord_t radius, coord_t start, coord_t end, color_t color) {
+ void gdispGDrawArc(GDisplay *g, coord_t x, coord_t y, coord_t radius, coord_t start, coord_t end, color_t color) {
coord_t a, b, P, sedge, eedge;
uint8_t full, sbit, ebit, tbit;
@@ -970,8 +1017,8 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
for(tbit=sbit<<1; tbit < ebit; tbit<<=1) full |= tbit;
}
- MUTEX_ENTER();
- GC->p.color = color;
+ MUTEX_ENTER(g);
+ g->p.color = color;
if (full) {
// Draw full sectors
@@ -979,33 +1026,33 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
a = 1;
b = radius;
P = 4 - radius;
- if (full & 0x60) { GC->p.y = y+b; GC->p.x = x; drawpixel_clip(); }
- if (full & 0x06) { GC->p.y = y-b; GC->p.x = x; drawpixel_clip(); }
- if (full & 0x81) { GC->p.y = y; GC->p.x = x+b; drawpixel_clip(); }
- if (full & 0x18) { GC->p.y = y; GC->p.x = x-b; drawpixel_clip(); }
+ if (full & 0x60) { g->p.y = y+b; g->p.x = x; drawpixel_clip(g); }
+ if (full & 0x06) { g->p.y = y-b; g->p.x = x; drawpixel_clip(g); }
+ if (full & 0x81) { g->p.y = y; g->p.x = x+b; drawpixel_clip(g); }
+ if (full & 0x18) { g->p.y = y; g->p.x = x-b; drawpixel_clip(g); }
do {
- if (full & 0x01) { GC->p.x = x+b; GC->p.y = y-a; drawpixel_clip(); }
- if (full & 0x02) { GC->p.x = x+a; GC->p.y = y-b; drawpixel_clip(); }
- if (full & 0x04) { GC->p.x = x-a; GC->p.y = y-b; drawpixel_clip(); }
- if (full & 0x08) { GC->p.x = x-b; GC->p.y = y-a; drawpixel_clip(); }
- if (full & 0x10) { GC->p.x = x-b; GC->p.y = y+a; drawpixel_clip(); }
- if (full & 0x20) { GC->p.x = x-a; GC->p.y = y+b; drawpixel_clip(); }
- if (full & 0x40) { GC->p.x = x+a; GC->p.y = y+b; drawpixel_clip(); }
- if (full & 0x80) { GC->p.x = x+b; GC->p.y = y+a; drawpixel_clip(); }
+ if (full & 0x01) { g->p.x = x+b; g->p.y = y-a; drawpixel_clip(g); }
+ if (full & 0x02) { g->p.x = x+a; g->p.y = y-b; drawpixel_clip(g); }
+ if (full & 0x04) { g->p.x = x-a; g->p.y = y-b; drawpixel_clip(g); }
+ if (full & 0x08) { g->p.x = x-b; g->p.y = y-a; drawpixel_clip(g); }
+ if (full & 0x10) { g->p.x = x-b; g->p.y = y+a; drawpixel_clip(g); }
+ if (full & 0x20) { g->p.x = x-a; g->p.y = y+b; drawpixel_clip(g); }
+ if (full & 0x40) { g->p.x = x+a; g->p.y = y+b; drawpixel_clip(g); }
+ if (full & 0x80) { g->p.x = x+b; g->p.y = y+a; drawpixel_clip(g); }
if (P < 0)
P += 3 + 2*a++;
else
P += 5 + 2*(a++ - b--);
} while(a < b);
- if (full & 0xC0) { GC->p.x = x+a; GC->p.y = y+b; drawpixel_clip(); }
- if (full & 0x0C) { GC->p.x = x-a; GC->p.y = y-b; drawpixel_clip(); }
- if (full & 0x03) { GC->p.x = x+a; GC->p.y = y-b; drawpixel_clip(); }
- if (full & 0x30) { GC->p.x = x-a; GC->p.y = y+b; drawpixel_clip(); }
+ if (full & 0xC0) { g->p.x = x+a; g->p.y = y+b; drawpixel_clip(g); }
+ if (full & 0x0C) { g->p.x = x-a; g->p.y = y-b; drawpixel_clip(g); }
+ if (full & 0x03) { g->p.x = x+a; g->p.y = y-b; drawpixel_clip(g); }
+ if (full & 0x30) { g->p.x = x-a; g->p.y = y+b; drawpixel_clip(g); }
if (full == 0xFF) {
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
MUTEX_EXIT;
@@ -1032,116 +1079,116 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
a = 1;
b = radius;
P = 4 - radius;
- if ((sbit & 0x20) || (ebit & 0x40)) { GC->p.x = x; GC->p.y = y+b; drawpixel_clip(); }
- if ((sbit & 0x02) || (ebit & 0x04)) { GC->p.x = x; GC->p.y = y-b; drawpixel_clip(); }
- if ((sbit & 0x80) || (ebit & 0x01)) { GC->p.x = x+b; GC->p.y = y; drawpixel_clip(); }
- if ((sbit & 0x08) || (ebit & 0x10)) { GC->p.x = x-b; GC->p.y = y; drawpixel_clip(); }
+ if ((sbit & 0x20) || (ebit & 0x40)) { g->p.x = x; g->p.y = y+b; drawpixel_clip(g); }
+ if ((sbit & 0x02) || (ebit & 0x04)) { g->p.x = x; g->p.y = y-b; drawpixel_clip(g); }
+ if ((sbit & 0x80) || (ebit & 0x01)) { g->p.x = x+b; g->p.y = y; drawpixel_clip(g); }
+ if ((sbit & 0x08) || (ebit & 0x10)) { g->p.x = x-b; g->p.y = y; drawpixel_clip(g); }
do {
- if (((sbit & 0x01) && a >= sedge) || ((ebit & 0x01) && a <= eedge)) { GC->p.x = x+b; GC->p.y = y-a; drawpixel_clip(); }
- if (((sbit & 0x02) && a <= sedge) || ((ebit & 0x02) && a >= eedge)) { GC->p.x = x+a; GC->p.y = y-b; drawpixel_clip(); }
- if (((sbit & 0x04) && a >= sedge) || ((ebit & 0x04) && a <= eedge)) { GC->p.x = x-a; GC->p.y = y-b; drawpixel_clip(); }
- if (((sbit & 0x08) && a <= sedge) || ((ebit & 0x08) && a >= eedge)) { GC->p.x = x-b; GC->p.y = y-a; drawpixel_clip(); }
- if (((sbit & 0x10) && a >= sedge) || ((ebit & 0x10) && a <= eedge)) { GC->p.x = x-b; GC->p.y = y+a; drawpixel_clip(); }
- if (((sbit & 0x20) && a <= sedge) || ((ebit & 0x20) && a >= eedge)) { GC->p.x = x-a; GC->p.y = y+b; drawpixel_clip(); }
- if (((sbit & 0x40) && a >= sedge) || ((ebit & 0x40) && a <= eedge)) { GC->p.x = x+a; GC->p.y = y+b; drawpixel_clip(); }
- if (((sbit & 0x80) && a <= sedge) || ((ebit & 0x80) && a >= eedge)) { GC->p.x = x+b; GC->p.y = y+a; drawpixel_clip(); }
+ if (((sbit & 0x01) && a >= sedge) || ((ebit & 0x01) && a <= eedge)) { g->p.x = x+b; g->p.y = y-a; drawpixel_clip(g); }
+ if (((sbit & 0x02) && a <= sedge) || ((ebit & 0x02) && a >= eedge)) { g->p.x = x+a; g->p.y = y-b; drawpixel_clip(g); }
+ if (((sbit & 0x04) && a >= sedge) || ((ebit & 0x04) && a <= eedge)) { g->p.x = x-a; g->p.y = y-b; drawpixel_clip(g); }
+ if (((sbit & 0x08) && a <= sedge) || ((ebit & 0x08) && a >= eedge)) { g->p.x = x-b; g->p.y = y-a; drawpixel_clip(g); }
+ if (((sbit & 0x10) && a >= sedge) || ((ebit & 0x10) && a <= eedge)) { g->p.x = x-b; g->p.y = y+a; drawpixel_clip(g); }
+ if (((sbit & 0x20) && a <= sedge) || ((ebit & 0x20) && a >= eedge)) { g->p.x = x-a; g->p.y = y+b; drawpixel_clip(g); }
+ if (((sbit & 0x40) && a >= sedge) || ((ebit & 0x40) && a <= eedge)) { g->p.x = x+a; g->p.y = y+b; drawpixel_clip(g); }
+ if (((sbit & 0x80) && a <= sedge) || ((ebit & 0x80) && a >= eedge)) { g->p.x = x+b; g->p.y = y+a; drawpixel_clip(g); }
if (P < 0)
P += 3 + 2*a++;
else
P += 5 + 2*(a++ - b--);
} while(a < b);
if (((sbit & 0x40) && a >= sedge) || ((ebit & 0x40) && a <= eedge) || ((sbit & 0x80) && a <= sedge) || ((ebit & 0x80) && a >= eedge))
- { GC->p.x = x+a; GC->p.y = y+b; drawpixel_clip(); }
+ { g->p.x = x+a; g->p.y = y+b; drawpixel_clip(g); }
if (((sbit & 0x04) && a >= sedge) || ((ebit & 0x04) && a <= eedge) || ((sbit & 0x08) && a <= sedge) || ((ebit & 0x08) && a >= eedge))
- { GC->p.x = x-a; GC->p.y = y-b; drawpixel_clip(); }
+ { g->p.x = x-a; g->p.y = y-b; drawpixel_clip(g); }
if (((sbit & 0x01) && a >= sedge) || ((ebit & 0x01) && a <= eedge) || ((sbit & 0x02) && a <= sedge) || ((ebit & 0x02) && a >= eedge))
- { GC->p.x = x+a; GC->p.y = y-b; drawpixel_clip(); }
+ { g->p.x = x+a; g->p.y = y-b; drawpixel_clip(g); }
if (((sbit & 0x10) && a >= sedge) || ((ebit & 0x10) && a <= eedge) || ((sbit & 0x20) && a <= sedge) || ((ebit & 0x20) && a >= eedge))
- { GC->p.x = x-a; GC->p.y = y+b; drawpixel_clip(); }
+ { g->p.x = x-a; g->p.y = y+b; drawpixel_clip(g); }
} else if (end < start) {
// Draw start/end sector where it is a non-internal angle
// Optimized to prevent double drawing
a = 1;
b = radius;
P = 4 - radius;
- if (sbit & 0x60) { GC->p.x = x; GC->p.y = y+b; drawpixel_clip(); }
- if (sbit & 0x06) { GC->p.x = x; GC->p.y = y-b; drawpixel_clip(); }
- if (sbit & 0x81) { GC->p.x = x+b; GC->p.y = y; drawpixel_clip(); }
- if (sbit & 0x18) { GC->p.x = x-b; GC->p.y = y; drawpixel_clip(); }
+ if (sbit & 0x60) { g->p.x = x; g->p.y = y+b; drawpixel_clip(g); }
+ if (sbit & 0x06) { g->p.x = x; g->p.y = y-b; drawpixel_clip(g); }
+ if (sbit & 0x81) { g->p.x = x+b; g->p.y = y; drawpixel_clip(g); }
+ if (sbit & 0x18) { g->p.x = x-b; g->p.y = y; drawpixel_clip(g); }
do {
- if ((sbit & 0x01) && (a >= sedge || a <= eedge)) { GC->p.x = x+b; GC->p.y = y-a; drawpixel_clip(); }
- if ((sbit & 0x02) && (a <= sedge || a >= eedge)) { GC->p.x = x+a; GC->p.y = y-b; drawpixel_clip(); }
- if ((sbit & 0x04) && (a >= sedge || a <= eedge)) { GC->p.x = x-a; GC->p.y = y-b; drawpixel_clip(); }
- if ((sbit & 0x08) && (a <= sedge || a >= eedge)) { GC->p.x = x-b; GC->p.y = y-a; drawpixel_clip(); }
- if ((sbit & 0x10) && (a >= sedge || a <= eedge)) { GC->p.x = x-b; GC->p.y = y+a; drawpixel_clip(); }
- if ((sbit & 0x20) && (a <= sedge || a >= eedge)) { GC->p.x = x-a; GC->p.y = y+b; drawpixel_clip(); }
- if ((sbit & 0x40) && (a >= sedge || a <= eedge)) { GC->p.x = x+a; GC->p.y = y+b; drawpixel_clip(); }
- if ((sbit & 0x80) && (a <= sedge || a >= eedge)) { GC->p.x = x+b; GC->p.y = y+a; drawpixel_clip(); }
+ if ((sbit & 0x01) && (a >= sedge || a <= eedge)) { g->p.x = x+b; g->p.y = y-a; drawpixel_clip(g); }
+ if ((sbit & 0x02) && (a <= sedge || a >= eedge)) { g->p.x = x+a; g->p.y = y-b; drawpixel_clip(g); }
+ if ((sbit & 0x04) && (a >= sedge || a <= eedge)) { g->p.x = x-a; g->p.y = y-b; drawpixel_clip(g); }
+ if ((sbit & 0x08) && (a <= sedge || a >= eedge)) { g->p.x = x-b; g->p.y = y-a; drawpixel_clip(g); }
+ if ((sbit & 0x10) && (a >= sedge || a <= eedge)) { g->p.x = x-b; g->p.y = y+a; drawpixel_clip(g); }
+ if ((sbit & 0x20) && (a <= sedge || a >= eedge)) { g->p.x = x-a; g->p.y = y+b; drawpixel_clip(g); }
+ if ((sbit & 0x40) && (a >= sedge || a <= eedge)) { g->p.x = x+a; g->p.y = y+b; drawpixel_clip(g); }
+ if ((sbit & 0x80) && (a <= sedge || a >= eedge)) { g->p.x = x+b; g->p.y = y+a; drawpixel_clip(g); }
if (P < 0)
P += 3 + 2*a++;
else
P += 5 + 2*(a++ - b--);
} while(a < b);
if (((sbit & 0x04) && (a >= sedge || a <= eedge)) || ((sbit & 0x08) && (a <= sedge || a >= eedge)))
- { GC->p.x = x-a; GC->p.y = y-b; drawpixel_clip(); }
+ { g->p.x = x-a; g->p.y = y-b; drawpixel_clip(g); }
if (((sbit & 0x40) && (a >= sedge || a <= eedge)) || ((sbit & 0x80) && (a <= sedge || a >= eedge)))
- { GC->p.x = x+a; GC->p.y = y+b; drawpixel_clip(); }
+ { g->p.x = x+a; g->p.y = y+b; drawpixel_clip(g); }
if (((sbit & 0x01) && (a >= sedge || a <= eedge)) || ((sbit & 0x02) && (a <= sedge || a >= eedge)))
- { GC->p.x = x+a; GC->p.y = y-b; drawpixel_clip(); }
+ { g->p.x = x+a; g->p.y = y-b; drawpixel_clip(g); }
if (((sbit & 0x10) && (a >= sedge || a <= eedge)) || ((sbit & 0x20) && (a <= sedge || a >= eedge)))
- { GC->p.x = x-a; GC->p.y = y+b; drawpixel_clip(); }
+ { g->p.x = x-a; g->p.y = y+b; drawpixel_clip(g); }
} else {
// Draw start/end sector where it is a internal angle
// Optimized to prevent double drawing
a = 1;
b = radius;
P = 4 - radius;
- if (((sbit & 0x20) && !eedge) || ((sbit & 0x40) && !sedge)) { GC->p.x = x; GC->p.y = y+b; drawpixel_clip(); }
- if (((sbit & 0x02) && !eedge) || ((sbit & 0x04) && !sedge)) { GC->p.x = x; GC->p.y = y-b; drawpixel_clip(); }
- if (((sbit & 0x80) && !eedge) || ((sbit & 0x01) && !sedge)) { GC->p.x = x+b; GC->p.y = y; drawpixel_clip(); }
- if (((sbit & 0x08) && !eedge) || ((sbit & 0x10) && !sedge)) { GC->p.x = x-b; GC->p.y = y; drawpixel_clip(); }
+ if (((sbit & 0x20) && !eedge) || ((sbit & 0x40) && !sedge)) { g->p.x = x; g->p.y = y+b; drawpixel_clip(g); }
+ if (((sbit & 0x02) && !eedge) || ((sbit & 0x04) && !sedge)) { g->p.x = x; g->p.y = y-b; drawpixel_clip(g); }
+ if (((sbit & 0x80) && !eedge) || ((sbit & 0x01) && !sedge)) { g->p.x = x+b; g->p.y = y; drawpixel_clip(g); }
+ if (((sbit & 0x08) && !eedge) || ((sbit & 0x10) && !sedge)) { g->p.x = x-b; g->p.y = y; drawpixel_clip(g); }
do {
- if (((sbit & 0x01) && a >= sedge && a <= eedge)) { GC->p.x = x+b; GC->p.y = y-a; drawpixel_clip(); }
- if (((sbit & 0x02) && a <= sedge && a >= eedge)) { GC->p.x = x+a; GC->p.y = y-b; drawpixel_clip(); }
- if (((sbit & 0x04) && a >= sedge && a <= eedge)) { GC->p.x = x-a; GC->p.y = y-b; drawpixel_clip(); }
- if (((sbit & 0x08) && a <= sedge && a >= eedge)) { GC->p.x = x-b; GC->p.y = y-a; drawpixel_clip(); }
- if (((sbit & 0x10) && a >= sedge && a <= eedge)) { GC->p.x = x-b; GC->p.y = y+a; drawpixel_clip(); }
- if (((sbit & 0x20) && a <= sedge && a >= eedge)) { GC->p.x = x-a; GC->p.y = y+b; drawpixel_clip(); }
- if (((sbit & 0x40) && a >= sedge && a <= eedge)) { GC->p.x = x+a; GC->p.y = y+b; drawpixel_clip(); }
- if (((sbit & 0x80) && a <= sedge && a >= eedge)) { GC->p.x = x+b; GC->p.y = y+a; drawpixel_clip(); }
+ if (((sbit & 0x01) && a >= sedge && a <= eedge)) { g->p.x = x+b; g->p.y = y-a; drawpixel_clip(g); }
+ if (((sbit & 0x02) && a <= sedge && a >= eedge)) { g->p.x = x+a; g->p.y = y-b; drawpixel_clip(g); }
+ if (((sbit & 0x04) && a >= sedge && a <= eedge)) { g->p.x = x-a; g->p.y = y-b; drawpixel_clip(g); }
+ if (((sbit & 0x08) && a <= sedge && a >= eedge)) { g->p.x = x-b; g->p.y = y-a; drawpixel_clip(g); }
+ if (((sbit & 0x10) && a >= sedge && a <= eedge)) { g->p.x = x-b; g->p.y = y+a; drawpixel_clip(g); }
+ if (((sbit & 0x20) && a <= sedge && a >= eedge)) { g->p.x = x-a; g->p.y = y+b; drawpixel_clip(g); }
+ if (((sbit & 0x40) && a >= sedge && a <= eedge)) { g->p.x = x+a; g->p.y = y+b; drawpixel_clip(g); }
+ if (((sbit & 0x80) && a <= sedge && a >= eedge)) { g->p.x = x+b; g->p.y = y+a; drawpixel_clip(g); }
if (P < 0)
P += 3 + 2*a++;
else
P += 5 + 2*(a++ - b--);
} while(a < b);
if (((sbit & 0x04) && a >= sedge && a <= eedge) || ((sbit & 0x08) && a <= sedge && a >= eedge))
- { GC->p.x = x-a; GC->p.y = y-b; drawpixel_clip(); }
+ { g->p.x = x-a; g->p.y = y-b; drawpixel_clip(g); }
if (((sbit & 0x40) && a >= sedge && a <= eedge) || ((sbit & 0x80) && a <= sedge && a >= eedge))
- { GC->p.x = x+a; GC->p.y = y+b; drawpixel_clip(); }
+ { g->p.x = x+a; g->p.y = y+b; drawpixel_clip(g); }
if (((sbit & 0x01) && a >= sedge && a <= eedge) || ((sbit & 0x02) && a <= sedge && a >= eedge))
- { GC->p.x = x+a; GC->p.y = y-b; drawpixel_clip(); }
+ { g->p.x = x+a; g->p.y = y-b; drawpixel_clip(g); }
if (((sbit & 0x10) && a >= sedge && a <= eedge) || ((sbit & 0x20) && a <= sedge && a >= eedge))
- { GC->p.x = x-a; GC->p.y = y+b; drawpixel_clip(); }
+ { g->p.x = x-a; g->p.y = y+b; drawpixel_clip(g); }
}
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
#endif
#if GDISP_NEED_ARC
- void gdispFillArc(coord_t x, coord_t y, coord_t radius, coord_t start, coord_t end, color_t color) {
+ void gdispGFillArc(GDisplay *g, coord_t x, coord_t y, coord_t radius, coord_t start, coord_t end, color_t color) {
coord_t a, b, P;
coord_t sy, ey;
fixed sxa, sxb, sxd, exa, exb, exd;
uint8_t qtr;
- MUTEX_ENTER();
+ MUTEX_ENTER(g);
// Do the trig to get the formulas for the start and end lines.
sxa = exa = FIXED(x)+FIXED0_5;
@@ -1170,7 +1217,7 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
a = 1;
b = radius;
P = 4 - radius;
- GC->p.color = color;
+ g->p.color = color;
sxb += sxa;
exb += exa;
@@ -1181,50 +1228,50 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
case 0: // S2E2 sy <= ey
case 1: // S1E2 sy <= ey
if (ey && sy) {
- GC->p.x = x; GC->p.x1 = x; // E2S
+ g->p.x = x; g->p.x1 = x; // E2S
sxa -= sxd; exa -= exd;
} else if (sy) {
- GC->p.x = x-b; GC->p.x1 = x; // C2S
+ g->p.x = x-b; g->p.x1 = x; // C2S
sxa -= sxd;
} else if (ey) {
- GC->p.x = x; GC->p.x1 = x+b; // E2C
+ g->p.x = x; g->p.x1 = x+b; // E2C
exa -= exd;
} else {
- GC->p.x = x-b; GC->p.x1 = x+b; // C2C
+ g->p.x = x-b; g->p.x1 = x+b; // C2C
}
- GC->p.y = y;
- hline_clip();
+ g->p.y = y;
+ hline_clip(g);
do {
if (-a >= ey) {
- GC->p.y = y-a; GC->p.x = NONFIXED(exa); GC->p.x1 = NONFIXED(sxa); hline_clip(); // E2S
+ g->p.y = y-a; g->p.x = NONFIXED(exa); g->p.x1 = NONFIXED(sxa); hline_clip(g); // E2S
sxa -= sxd; exa -= exd;
} else if (-a >= sy) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = NONFIXED(sxa); hline_clip(); // C2S
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = NONFIXED(sxa); hline_clip(g); // C2S
sxa -= sxd;
} else if (qtr & 1) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
if (P < 0) {
P += 3 + 2*a++;
} else {
if (-b >= ey) {
- GC->p.y = y-b; GC->p.x = NONFIXED(exb); GC->p.x1 = NONFIXED(sxb); hline_clip(); // E2S
+ g->p.y = y-b; g->p.x = NONFIXED(exb); g->p.x1 = NONFIXED(sxb); hline_clip(g); // E2S
sxb += sxd; exb += exd;
} else if (-b >= sy) {
- GC->p.y = y-b; GC->p.x = x-a; GC->p.x1 = NONFIXED(sxb); hline_clip(); // C2S
+ g->p.y = y-b; g->p.x = x-a; g->p.x1 = NONFIXED(sxb); hline_clip(g); // C2S
sxb += sxd;
} else if (qtr & 1) {
- GC->p.y = y-b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y-b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g); // C2C
}
P += 5 + 2*(a++ - b--);
}
} while(a < b);
if (-a >= ey) {
- GC->p.y = y-a; GC->p.x = NONFIXED(exa); GC->p.x1 = NONFIXED(sxa); hline_clip(); // E2S
+ g->p.y = y-a; g->p.x = NONFIXED(exa); g->p.x1 = NONFIXED(sxa); hline_clip(g); // E2S
} else if (-a >= sy) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = NONFIXED(sxa); hline_clip(); // C2S
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = NONFIXED(sxa); hline_clip(g); // C2S
} else if (qtr & 1) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
break;
@@ -1236,92 +1283,92 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
case 19: // S4E2 sy > ey
case 22: // S3E1 sy > ey
case 23: // S4E1 sy > ey
- GC->p.y = y; GC->p.x = x; GC->p.x1 = x+b; hline_clip(); // SE2C
+ g->p.y = y; g->p.x = x; g->p.x1 = x+b; hline_clip(g); // SE2C
sxa += sxd; exa -= exd;
do {
if (-a >= ey) {
- GC->p.y = y-a; GC->p.x = NONFIXED(exa); GC->p.x1 = x+b; hline_clip(); // E2C
+ g->p.y = y-a; g->p.x = NONFIXED(exa); g->p.x1 = x+b; hline_clip(g); // E2C
exa -= exd;
} else if (!(qtr & 4)) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
if (a <= sy) {
- GC->p.y = y+a; GC->p.x = NONFIXED(sxa); GC->p.x1 = x+b; hline_clip(); // S2C
+ g->p.y = y+a; g->p.x = NONFIXED(sxa); g->p.x1 = x+b; hline_clip(g); // S2C
sxa += sxd;
} else if (!(qtr & 1)) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
if (P < 0) {
P += 3 + 2*a++;
} else {
if (-b >= ey) {
- GC->p.y = y-b; GC->p.x = NONFIXED(exb); GC->p.x1 = x+a; hline_clip(); // E2C
+ g->p.y = y-b; g->p.x = NONFIXED(exb); g->p.x1 = x+a; hline_clip(g); // E2C
exb += exd;
} else if (!(qtr & 4)) {
- GC->p.y = y-b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y-b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g); // C2C
}
if (b <= sy) {
- GC->p.y = y+b; GC->p.x = NONFIXED(sxb); GC->p.x1 = x+a; hline_clip(); // S2C
+ g->p.y = y+b; g->p.x = NONFIXED(sxb); g->p.x1 = x+a; hline_clip(g); // S2C
sxb -= sxd;
} else if (!(qtr & 1)) {
- GC->p.y = y+b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y+b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g); // C2C
}
P += 5 + 2*(a++ - b--);
}
} while(a < b);
if (-a >= ey) {
- GC->p.y = y-a; GC->p.x = NONFIXED(exa); GC->p.x1 = x+b; hline_clip(); // E2C
+ g->p.y = y-a; g->p.x = NONFIXED(exa); g->p.x1 = x+b; hline_clip(g); // E2C
} else if (!(qtr & 4)) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
if (a <= sy) {
- GC->p.y = y+a; GC->p.x = NONFIXED(sxa); GC->p.x1 = x+a; hline_clip(); // S2C
+ g->p.y = y+a; g->p.x = NONFIXED(sxa); g->p.x1 = x+a; hline_clip(g); // S2C
} else if (!(qtr & 1)) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = x+a; hline_clip(g); // C2C
}
break;
case 4: // S2E1 sy <= ey
case 5: // S1E1 sy <= ey
- GC->p.y = y; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
do {
if (-a >= ey) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = NONFIXED(sxa); hline_clip(); // C2S
- GC->p.y = y-a; GC->p.x = NONFIXED(exa); GC->p.x1 = x+b; hline_clip(); // E2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = NONFIXED(sxa); hline_clip(g); // C2S
+ g->p.y = y-a; g->p.x = NONFIXED(exa); g->p.x1 = x+b; hline_clip(g); // E2C
sxa -= sxd; exa -= exd;
} else if (-a >= sy) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = NONFIXED(sxa); hline_clip(); // C2S
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = NONFIXED(sxa); hline_clip(g); // C2S
sxa -= sxd;
} else if (qtr & 1) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
if (P < 0) {
P += 3 + 2*a++;
} else {
if (-b >= ey) {
- GC->p.y = y-b; GC->p.x = x-a; GC->p.x1 = NONFIXED(sxb); hline_clip(); // C2S
- GC->p.y = y-b; GC->p.x = NONFIXED(exb); GC->p.x1 = x+a; hline_clip(); // E2C
+ g->p.y = y-b; g->p.x = x-a; g->p.x1 = NONFIXED(sxb); hline_clip(g); // C2S
+ g->p.y = y-b; g->p.x = NONFIXED(exb); g->p.x1 = x+a; hline_clip(g); // E2C
sxb += sxd; exb += exd;
} else if (-b >= sy) {
- GC->p.y = y-b; GC->p.x = x-a; GC->p.x1 = NONFIXED(sxb); hline_clip(); // C2S
+ g->p.y = y-b; g->p.x = x-a; g->p.x1 = NONFIXED(sxb); hline_clip(g); // C2S
sxb += sxd;
} else if (qtr & 1) {
- GC->p.y = y-b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y-b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g); // C2C
}
- GC->p.y = y+b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y+b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g); // C2C
P += 5 + 2*(a++ - b--);
}
} while(a < b);
if (-a >= ey) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = NONFIXED(sxa); hline_clip(); // C2S
- GC->p.y = y-a; GC->p.x = NONFIXED(exa); GC->p.x1 = x+b; hline_clip(); // E2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = NONFIXED(sxa); hline_clip(g); // C2S
+ g->p.y = y-a; g->p.x = NONFIXED(exa); g->p.x1 = x+b; hline_clip(g); // E2C
} else if (-a >= sy) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = NONFIXED(sxa); hline_clip(); // C2S
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = NONFIXED(sxa); hline_clip(g); // C2S
} else if (qtr & 1) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
- GC->p.y = y+b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y+b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g); // C2C
break;
case 8: // S2E3 sy <= ey
@@ -1332,261 +1379,261 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
case 25: // S1E3 sy > ey
case 28: // S2E3 sy > ey
case 29: // S1E3 sy > ey
- GC->p.y = y; GC->p.x = x-b; GC->p.x1 = x; hline_clip(); // C2SE
+ g->p.y = y; g->p.x = x-b; g->p.x1 = x; hline_clip(g); // C2SE
sxa -= sxd; exa += exd;
do {
if (-a >= sy) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = NONFIXED(sxa); hline_clip(); // C2S
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = NONFIXED(sxa); hline_clip(g); // C2S
sxa -= sxd;
} else if (qtr & 1) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
if (a <= ey) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = NONFIXED(exa); hline_clip(); // C2E
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = NONFIXED(exa); hline_clip(g); // C2E
exa += exd;
} else if (qtr & 4) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
if (P < 0) {
P += 3 + 2*a++;
} else {
if (-b >= sy) {
- GC->p.y = y-b; GC->p.x = x-a; GC->p.x1 = NONFIXED(sxb); hline_clip(); // C2S
+ g->p.y = y-b; g->p.x = x-a; g->p.x1 = NONFIXED(sxb); hline_clip(g); // C2S
sxb += sxd;
} else if (qtr & 1) {
- GC->p.y = y-b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y-b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g); // C2C
}
if (b <= ey) {
- GC->p.y = y+b; GC->p.x = x-a; GC->p.x1 = NONFIXED(exb); hline_clip(); // C2E
+ g->p.y = y+b; g->p.x = x-a; g->p.x1 = NONFIXED(exb); hline_clip(g); // C2E
exb -= exd;
} else if (qtr & 4) {
- GC->p.y = y+b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y+b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g); // C2C
}
P += 5 + 2*(a++ - b--);
}
} while(a < b);
if (-a >= sy) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = NONFIXED(sxa); hline_clip(); // C2S
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = NONFIXED(sxa); hline_clip(g); // C2S
} else if (qtr & 1) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
if (a <= ey) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = NONFIXED(exa); hline_clip(); // C2E
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = NONFIXED(exa); hline_clip(g); // C2E
} else if (qtr & 4) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = x+a; hline_clip(g); // C2C
}
break;
case 10: // S3E3 sy <= ey
case 14: // S3E4 sy <= ey
- GC->p.y = y; GC->p.x = x; drawpixel_clip(); // S2E
+ g->p.y = y; g->p.x = x; drawpixel_clip(g); // S2E
sxa += sxd; exa += exd;
do {
if (a <= sy) {
- GC->p.y = y+a; GC->p.x = NONFIXED(sxa); GC->p.x1 = NONFIXED(exa); hline_clip(); // S2E
+ g->p.y = y+a; g->p.x = NONFIXED(sxa); g->p.x1 = NONFIXED(exa); hline_clip(g); // S2E
sxa += sxd; exa += exd;
} else if (a <= ey) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = NONFIXED(exa); hline_clip(); // C2E
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = NONFIXED(exa); hline_clip(g); // C2E
exa += exd;
} else if (qtr & 4) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
if (P < 0) {
P += 3 + 2*a++;
} else {
if (b <= sy) {
- GC->p.y = y+b; GC->p.x = NONFIXED(sxb); GC->p.x1 = NONFIXED(exb); hline_clip(); // S2E
+ g->p.y = y+b; g->p.x = NONFIXED(sxb); g->p.x1 = NONFIXED(exb); hline_clip(g); // S2E
sxb -= sxd; exb -= exd;
} else if (b <= ey) {
- GC->p.y = y+b; GC->p.x = x-a; GC->p.x1 = NONFIXED(exb); hline_clip(); // C2E
+ g->p.y = y+b; g->p.x = x-a; g->p.x1 = NONFIXED(exb); hline_clip(g); // C2E
exb -= exd;
} else if (qtr & 4) {
- GC->p.y = y+b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y+b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g); // C2C
}
P += 5 + 2*(a++ - b--);
}
} while(a < b);
if (a <= sy) {
- GC->p.y = y+a; GC->p.x = NONFIXED(sxa); GC->p.x1 = NONFIXED(exa); hline_clip(); // S2E
+ g->p.y = y+a; g->p.x = NONFIXED(sxa); g->p.x1 = NONFIXED(exa); hline_clip(g); // S2E
} else if (a <= ey) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = NONFIXED(exa); hline_clip(); // C2E
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = NONFIXED(exa); hline_clip(g); // C2E
} else if (qtr & 4) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
break;
case 11: // S4E3 sy <= ey
case 15: // S4E4 sy <= ey
- GC->p.y = y; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
do {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
if (a <= sy) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = NONFIXED(exa); hline_clip(); // C2E
- GC->p.y = y+a; GC->p.x = NONFIXED(sxa); GC->p.x1 = x+b; hline_clip(); // S2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = NONFIXED(exa); hline_clip(g); // C2E
+ g->p.y = y+a; g->p.x = NONFIXED(sxa); g->p.x1 = x+b; hline_clip(g); // S2C
sxa += sxd; exa += exd;
} else if (a <= ey) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = NONFIXED(exa); hline_clip(); // C2E
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = NONFIXED(exa); hline_clip(g); // C2E
exa += exd;
} else if (qtr & 4) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
if (P < 0) {
P += 3 + 2*a++;
} else {
- GC->p.y = y-b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y-b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g); // C2C
if (b <= sy) {
- GC->p.y = y+b; GC->p.x = x-a; GC->p.x1 = NONFIXED(exb); hline_clip(); // C2E
- GC->p.y = y+b; GC->p.x = NONFIXED(sxb); GC->p.x1 = x+a; hline_clip(); // S2C
+ g->p.y = y+b; g->p.x = x-a; g->p.x1 = NONFIXED(exb); hline_clip(g); // C2E
+ g->p.y = y+b; g->p.x = NONFIXED(sxb); g->p.x1 = x+a; hline_clip(g); // S2C
sxb -= sxd; exb -= exd;
} else if (b <= ey) {
- GC->p.y = y+b; GC->p.x = x-a; GC->p.x1 = NONFIXED(exb); hline_clip(); // C2E
+ g->p.y = y+b; g->p.x = x-a; g->p.x1 = NONFIXED(exb); hline_clip(g); // C2E
exb -= exd;
} else if (qtr & 4) {
- GC->p.y = y+b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y+b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g); // C2C
}
P += 5 + 2*(a++ - b--);
}
} while(a < b);
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
if (a <= sy) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = NONFIXED(exa); hline_clip(); // C2E
- GC->p.y = y+a; GC->p.x = NONFIXED(sxa); GC->p.x1 = x+b; hline_clip(); // S2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = NONFIXED(exa); hline_clip(g); // C2E
+ g->p.y = y+a; g->p.x = NONFIXED(sxa); g->p.x1 = x+b; hline_clip(g); // S2C
} else if (a <= ey) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = NONFIXED(exa); hline_clip(); // C2E
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = NONFIXED(exa); hline_clip(g); // C2E
} else if (qtr & 4) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
break;
case 16: // S2E2 sy > ey
case 20: // S2E1 sy > ey
- GC->p.y = y; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
sxa -= sxd; exa -= exd;
do {
if (-a >= sy) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = NONFIXED(sxa); hline_clip(); // C2S
- GC->p.y = y-a; GC->p.x = NONFIXED(exa); GC->p.x1 = x+b; hline_clip(); // E2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = NONFIXED(sxa); hline_clip(g); // C2S
+ g->p.y = y-a; g->p.x = NONFIXED(exa); g->p.x1 = x+b; hline_clip(g); // E2C
sxa -= sxd; exa -= exd;
} else if (-a >= ey) {
- GC->p.y = y-a; GC->p.x = NONFIXED(exa); GC->p.x1 = x+b; hline_clip(); // E2C
+ g->p.y = y-a; g->p.x = NONFIXED(exa); g->p.x1 = x+b; hline_clip(g); // E2C
exa -= exd;
} else if (!(qtr & 4)){
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
if (P < 0) {
P += 3 + 2*a++;
} else {
if (-b >= sy) {
- GC->p.y = y-b; GC->p.x = x-a; GC->p.x1 = NONFIXED(sxb); hline_clip(); // C2S
- GC->p.y = y-b; GC->p.x = NONFIXED(exb); GC->p.x1 = x+a; hline_clip(); // E2C
+ g->p.y = y-b; g->p.x = x-a; g->p.x1 = NONFIXED(sxb); hline_clip(g); // C2S
+ g->p.y = y-b; g->p.x = NONFIXED(exb); g->p.x1 = x+a; hline_clip(g); // E2C
sxb += sxd; exb += exd;
} else if (-b >= ey) {
- GC->p.y = y-b; GC->p.x = NONFIXED(exb); GC->p.x1 = x+a; hline_clip(); // E2C
+ g->p.y = y-b; g->p.x = NONFIXED(exb); g->p.x1 = x+a; hline_clip(g); // E2C
exb += exd;
} else if (!(qtr & 4)){
- GC->p.y = y-b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y-b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g); // C2C
}
- GC->p.y = y+b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y+b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g); // C2C
P += 5 + 2*(a++ - b--);
}
} while(a < b);
if (-a >= sy) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = NONFIXED(sxa); hline_clip(); // C2S
- GC->p.y = y-a; GC->p.x = NONFIXED(exa); GC->p.x1 = x+b; hline_clip(); // E2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = NONFIXED(sxa); hline_clip(g); // C2S
+ g->p.y = y-a; g->p.x = NONFIXED(exa); g->p.x1 = x+b; hline_clip(g); // E2C
} else if (-a >= ey) {
- GC->p.y = y-a; GC->p.x = NONFIXED(exa); GC->p.x1 = x+b; hline_clip(); // E2C
+ g->p.y = y-a; g->p.x = NONFIXED(exa); g->p.x1 = x+b; hline_clip(g); // E2C
} else if (!(qtr & 4)){
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
break;
case 17: // S1E2 sy > ey
case 21: // S1E1 sy > ey
if (sy) {
- GC->p.x = x; GC->p.x1 = x; // E2S
+ g->p.x = x; g->p.x1 = x; // E2S
sxa -= sxd; exa -= exd;
} else {
- GC->p.x = x; GC->p.x1 = x+b; // E2C
+ g->p.x = x; g->p.x1 = x+b; // E2C
exa -= exd;
}
- GC->p.y = y;
- hline_clip();
+ g->p.y = y;
+ hline_clip(g);
do {
if (-a >= sy) {
- GC->p.y = y-a; GC->p.x = NONFIXED(exa); GC->p.x1 = NONFIXED(sxa); hline_clip(); // E2S
+ g->p.y = y-a; g->p.x = NONFIXED(exa); g->p.x1 = NONFIXED(sxa); hline_clip(g); // E2S
sxa -= sxd; exa -= exd;
} else if (-a >= ey) {
- GC->p.y = y-a; GC->p.x = NONFIXED(exa); GC->p.x1 = x+b; hline_clip(); // E2C
+ g->p.y = y-a; g->p.x = NONFIXED(exa); g->p.x1 = x+b; hline_clip(g); // E2C
exa -= exd;
} else if (!(qtr & 4)) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
if (P < 0) {
P += 3 + 2*a++;
} else {
if (-b >= sy) {
- GC->p.y = y-b; GC->p.x = NONFIXED(exb); GC->p.x1 = NONFIXED(sxb); hline_clip(); // E2S
+ g->p.y = y-b; g->p.x = NONFIXED(exb); g->p.x1 = NONFIXED(sxb); hline_clip(g); // E2S
sxb += sxd; exb += exd;
} else if (-b >= ey) {
- GC->p.y = y-b; GC->p.x = NONFIXED(exb); GC->p.x1 = x+a; hline_clip(); // E2C
+ g->p.y = y-b; g->p.x = NONFIXED(exb); g->p.x1 = x+a; hline_clip(g); // E2C
exb += exd;
} else if (!(qtr & 4)) {
- GC->p.y = y-b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y-b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g); // C2C
}
P += 5 + 2*(a++ - b--);
}
} while(a < b);
if (-a >= sy) {
- GC->p.y = y-a; GC->p.x = NONFIXED(exa); GC->p.x1 = NONFIXED(sxa); hline_clip(); // E2S
+ g->p.y = y-a; g->p.x = NONFIXED(exa); g->p.x1 = NONFIXED(sxa); hline_clip(g); // E2S
} else if (-a >= ey) {
- GC->p.y = y-a; GC->p.x = NONFIXED(exa); GC->p.x1 = x+b; hline_clip(); // E2C
+ g->p.y = y-a; g->p.x = NONFIXED(exa); g->p.x1 = x+b; hline_clip(g); // E2C
} else if (!(qtr & 4)) {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
break;
case 26: // S3E3 sy > ey
case 27: // S4E3 sy > ey
- GC->p.y = y; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
do {
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
if (a <= ey) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = NONFIXED(exa); hline_clip(); // C2E
- GC->p.y = y+a; GC->p.x = NONFIXED(sxa); GC->p.x1 = x+b; hline_clip(); // S2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = NONFIXED(exa); hline_clip(g); // C2E
+ g->p.y = y+a; g->p.x = NONFIXED(sxa); g->p.x1 = x+b; hline_clip(g); // S2C
sxa += sxd; exa += exd;
} else if (a <= sy) {
- GC->p.y = y+a; GC->p.x = NONFIXED(sxa); GC->p.x1 = x+b; hline_clip(); // S2C
+ g->p.y = y+a; g->p.x = NONFIXED(sxa); g->p.x1 = x+b; hline_clip(g); // S2C
sxa += sxd;
} else if (!(qtr & 1)) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
if (P < 0) {
P += 3 + 2*a++;
} else {
- GC->p.y = y-b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y-b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g); // C2C
if (b <= ey) {
- GC->p.y = y+b; GC->p.x = x-a; GC->p.x1 = NONFIXED(exb); hline_clip(); // C2E
- GC->p.y = y+b; GC->p.x = NONFIXED(sxb); GC->p.x1 = x+a; hline_clip(); // S2C
+ g->p.y = y+b; g->p.x = x-a; g->p.x1 = NONFIXED(exb); hline_clip(g); // C2E
+ g->p.y = y+b; g->p.x = NONFIXED(sxb); g->p.x1 = x+a; hline_clip(g); // S2C
sxb -= sxd; exb -= exd;
} else if (b <= sy) {
- GC->p.y = y+b; GC->p.x = NONFIXED(sxb); GC->p.x1 = x+a; hline_clip(); // S2C
+ g->p.y = y+b; g->p.x = NONFIXED(sxb); g->p.x1 = x+a; hline_clip(g); // S2C
sxb -= sxd;
} else if (!(qtr & 1)) {
- GC->p.y = y+b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y+b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g); // C2C
}
P += 5 + 2*(a++ - b--);
}
} while(a < b);
- GC->p.y = y-a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y-a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
if (a <= ey) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = NONFIXED(exa); hline_clip(); // C2E
- GC->p.y = y+a; GC->p.x = NONFIXED(sxa); GC->p.x1 = x+b; hline_clip(); // S2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = NONFIXED(exa); hline_clip(g); // C2E
+ g->p.y = y+a; g->p.x = NONFIXED(sxa); g->p.x1 = x+b; hline_clip(g); // S2C
} else if (a <= sy) {
- GC->p.y = y+a; GC->p.x = NONFIXED(sxa); GC->p.x1 = x+b; hline_clip(); // S2C
+ g->p.y = y+a; g->p.x = NONFIXED(sxa); g->p.x1 = x+b; hline_clip(g); // S2C
} else if (!(qtr & 4)) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
break;
@@ -1594,52 +1641,52 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
case 31: // S4E4 sy > ey
do {
if (a <= ey) {
- GC->p.y = y+a; GC->p.x = NONFIXED(sxa); GC->p.x1 = NONFIXED(exa); hline_clip(); // S2E
+ g->p.y = y+a; g->p.x = NONFIXED(sxa); g->p.x1 = NONFIXED(exa); hline_clip(g); // S2E
sxa += sxd; exa += exd;
} else if (a <= sy) {
- GC->p.y = y+a; GC->p.x = NONFIXED(sxa); GC->p.x1 = x+b; hline_clip(); // S2C
+ g->p.y = y+a; g->p.x = NONFIXED(sxa); g->p.x1 = x+b; hline_clip(g); // S2C
sxa += sxd;
} else if (!(qtr & 1)) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
if (P < 0) {
P += 3 + 2*a++;
} else {
if (b <= ey) {
- GC->p.y = y+b; GC->p.x = NONFIXED(sxb); GC->p.x1 = NONFIXED(exb); hline_clip(); // S2E
+ g->p.y = y+b; g->p.x = NONFIXED(sxb); g->p.x1 = NONFIXED(exb); hline_clip(g); // S2E
sxb -= sxd; exb -= exd;
} else if (b <= sy) {
- GC->p.y = y+b; GC->p.x = NONFIXED(sxb); GC->p.x1 = x+a; hline_clip(); // S2C
+ g->p.y = y+b; g->p.x = NONFIXED(sxb); g->p.x1 = x+a; hline_clip(g); // S2C
sxb -= sxd;
} else if (!(qtr & 1)) {
- GC->p.y = y+b; GC->p.x = x-a; GC->p.x1 = x+a; hline_clip(); // C2C
+ g->p.y = y+b; g->p.x = x-a; g->p.x1 = x+a; hline_clip(g); // C2C
}
P += 5 + 2*(a++ - b--);
}
} while(a < b);
if (a <= ey) {
- GC->p.y = y+a; GC->p.x = NONFIXED(sxa); GC->p.x1 = x+b; hline_clip(); // S2C
+ g->p.y = y+a; g->p.x = NONFIXED(sxa); g->p.x1 = x+b; hline_clip(g); // S2C
} else if (a <= sy) {
- GC->p.y = y+a; GC->p.x = NONFIXED(sxa); GC->p.x1 = x+b; hline_clip(); // S2C
+ g->p.y = y+a; g->p.x = NONFIXED(sxa); g->p.x1 = x+b; hline_clip(g); // S2C
} else if (!(qtr & 4)) {
- GC->p.y = y+a; GC->p.x = x-b; GC->p.x1 = x+b; hline_clip(); // C2C
+ g->p.y = y+a; g->p.x = x-b; g->p.x1 = x+b; hline_clip(g); // C2C
}
break;
}
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
#endif
#if GDISP_NEED_ARC
- void gdispDrawRoundedBox(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t radius, color_t color) {
+ void gdispGDrawRoundedBox(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t radius, color_t color) {
if (2*radius > cx || 2*radius > cy) {
gdispDrawBox(x, y, cx, cy, color);
return;
@@ -1656,7 +1703,7 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
#endif
#if GDISP_NEED_ARC
- 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) {
coord_t radius2;
radius2 = radius*2;
@@ -1675,49 +1722,49 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
#endif
#if GDISP_NEED_PIXELREAD
- color_t gdispGetPixelColor(coord_t x, coord_t y) {
+ color_t gdispGGetPixelColor(GDisplay *g, coord_t x, coord_t y) {
color_t c;
/* Always synchronous as it must return a value */
- MUTEX_ENTER();
+ MUTEX_ENTER(g);
#if GDISP_HARDWARE_PIXELREAD
// Best is direct pixel read
- GC->p.x = x;
- GC->p.y = y;
- c = gdisp_lld_get_pixel_color(GC);
+ g->p.x = x;
+ g->p.y = y;
+ c = gdisp_lld_get_pixel_color(g);
#elif GDISP_HARDWARE_STREAM_READ
// Next best is hardware streaming
- GC->p.x = x;
- GC->p.y = y;
- GC->p.cx = 1;
- GC->p.cy = 1;
- gdisp_lld_read_start(GC);
- c = gdisp_lld_read_color(GC);
- gdisp_lld_read_stop(GC);
+ g->p.x = x;
+ g->p.y = y;
+ g->p.cx = 1;
+ g->p.cy = 1;
+ gdisp_lld_read_start(g);
+ c = gdisp_lld_read_color(g);
+ gdisp_lld_read_stop(g);
#else
// Worst is "not possible"
#error "GDISP: GDISP_NEED_PIXELREAD has been set but there is no hardware support for reading the display"
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
return c;
}
#endif
#if GDISP_NEED_SCROLL
- 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) {
coord_t abslines;
#if !GDISP_HARDWARE_SCROLL
coord_t fy, dy, ix, fx, i, j;
#endif
- MUTEX_ENTER();
+ MUTEX_ENTER(g);
#if NEED_CLIPPING
- if (x < GC->clipx0) { cx -= GC->clipx0 - x; x = GC->clipx0; }
- if (y < GC->clipy0) { cy -= GC->clipy0 - y; y = GC->clipy0; }
- if (!lines || cx <= 0 || cy <= 0 || x >= GC->clipx1 || y >= GC->clipy1) { MUTEX_EXIT(); return; }
- if (x+cx > GC->clipx1) cx = GC->clipx1 - x;
- if (y+cy > GC->clipy1) cy = GC->clipy1 - y;
+ if (x < g->clipx0) { cx -= g->clipx0 - x; x = g->clipx0; }
+ if (y < g->clipy0) { cy -= g->clipy0 - y; y = g->clipy0; }
+ if (!lines || cx <= 0 || cy <= 0 || x >= g->clipx1 || y >= g->clipy1) { MUTEX_EXIT(g); return; }
+ if (x+cx > g->clipx1) cx = g->clipx1 - x;
+ if (y+cy > g->clipy1) cy = g->clipy1 - y;
#endif
abslines = lines < 0 ? -lines : lines;
@@ -1726,13 +1773,13 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
cy = 0;
} else {
#if GDISP_HARDWARE_SCROLL
- GC->p.x = x;
- GC->p.y = y;
- GC->p.cx = cx;
- GC->p.cy = cy;
- GC->p.y1 = lines;
- GC->p.color = bgcolor;
- gdisp_lld_vertical_scroll(GC);
+ g->p.x = x;
+ g->p.y = y;
+ g->p.cx = cx;
+ g->p.cy = cy;
+ g->p.y1 = lines;
+ g->p.color = bgcolor;
+ gdisp_lld_vertical_scroll(g);
cy -= abslines;
#elif GDISP_LINEBUF_SIZE == 0
#error "GDISP: GDISP_NEED_SCROLL is set but there is no hardware support and GDISP_LINEBUF_SIZE is zero."
@@ -1759,20 +1806,20 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
// Read one line of data from the screen
#if GDISP_HARDWARE_STREAM_READ
// Best is hardware streaming
- GC->p.x = x+ix;
- GC->p.y = fy+lines;
- GC->p.cx = fx;
- GC->p.cy = 1;
- gdisp_lld_read_start(GC);
+ g->p.x = x+ix;
+ g->p.y = fy+lines;
+ g->p.cx = fx;
+ g->p.cy = 1;
+ gdisp_lld_read_start(g);
for(j=0; j < fx; j++)
- GC->linebuf[j] = gdisp_lld_read_color(GC);
- gdisp_lld_read_stop(GC);
+ g->linebuf[j] = gdisp_lld_read_color(g);
+ gdisp_lld_read_stop(g);
#elif GDISP_HARDWARE_PIXELREAD
// Next best is single pixel reads
for(j=0; j < fx; j++) {
- GC->p.x = x+ix+j;
- GC->p.y = fy+lines;
- GC->linebuf[j] = gdisp_lld_get_pixel_color(GC);
+ g->p.x = x+ix+j;
+ g->p.y = fy+lines;
+ g->linebuf[j] = gdisp_lld_get_pixel_color(g);
}
#else
// Worst is "not possible"
@@ -1782,36 +1829,36 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
// Write that line to the new location
#if GDISP_HARDWARE_BITFILLS
// Best is hardware bitfills
- GC->p.x = x+ix;
- GC->p.y = fy;
- GC->p.cx = fx;
- GC->p.cy = 1;
- GC->p.x1 = 0;
- GC->p.y1 = 0;
- GC->p.x2 = fx;
- GC->p.ptr = (void *)GC->linebuf;
- gdisp_lld_blit_area(GC);
+ g->p.x = x+ix;
+ g->p.y = fy;
+ g->p.cx = fx;
+ g->p.cy = 1;
+ g->p.x1 = 0;
+ g->p.y1 = 0;
+ g->p.x2 = fx;
+ g->p.ptr = (void *)g->linebuf;
+ gdisp_lld_blit_area(g);
#elif GDISP_HARDWARE_STREAM_WRITE
// Next best is hardware streaming
- GC->p.x = x+ix;
- GC->p.y = fy;
- GC->p.cx = fx;
- GC->p.cy = 1;
- gdisp_lld_write_start(GC);
+ g->p.x = x+ix;
+ g->p.y = fy;
+ g->p.cx = fx;
+ g->p.cy = 1;
+ gdisp_lld_write_start(g);
#if GDISP_HARDWARE_STREAM_POS
- gdisp_lld_write_pos(GC);
+ gdisp_lld_write_pos(g);
#endif
for(j = 0; j < fx; j++) {
- GC->p.color = GC->linebuf[j];
- gdisp_lld_write_color(GC);
+ g->p.color = g->linebuf[j];
+ gdisp_lld_write_color(g);
}
- gdisp_lld_write_stop(GC);
+ gdisp_lld_write_stop(g);
#else
// Worst is drawing pixels
- GC->p.y = fy;
- for(GC->p.x = x+ix, j = 0; j < fx; GC->p.x++, j++) {
- GC->p.color = GC->linebuf[j];
- gdisp_lld_draw_pixel(GC);
+ g->p.y = fy;
+ for(g->p.x = x+ix, j = 0; j < fx; g->p.x++, j++) {
+ g->p.color = g->linebuf[j];
+ gdisp_lld_draw_pixel(g);
}
#endif
}
@@ -1820,45 +1867,45 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
}
/* fill the remaining gap */
- GC->p.x = x;
- GC->p.y = lines > 0 ? (y+cy) : y;
- GC->p.cx = cx;
- GC->p.cy = abslines;
- GC->p.color = bgcolor;
- fillarea();
- MUTEX_EXIT();
+ g->p.x = x;
+ g->p.y = lines > 0 ? (y+cy) : y;
+ g->p.cx = cx;
+ g->p.cy = abslines;
+ g->p.color = bgcolor;
+ fillarea(g);
+ MUTEX_EXIT(g);
}
#endif
#if GDISP_NEED_CONTROL
#if GDISP_HARDWARE_CONTROL
- void gdispControl(unsigned what, void *value) {
- MUTEX_ENTER();
- GC->p.x = what;
- GC->p.ptr = value;
- gdisp_lld_control(GC);
+ void gdispGControl(GDisplay *g, unsigned what, void *value) {
+ MUTEX_ENTER(g);
+ g->p.x = what;
+ g->p.ptr = value;
+ gdisp_lld_control(g);
#if GDISP_NEED_CLIP || GDISP_NEED_VALIDATION
if (what == GDISP_CONTROL_ORIENTATION) {
#if GDISP_HARDWARE_CLIP
// Best is hardware clipping
- GC->p.x = 0;
- GC->p.y = 0;
- GC->p.cx = GC->g.Width;
- GC->p.cy = GC->g.Height;
- gdisp_lld_set_clip(GC);
+ 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);
#else
// Worst is software clipping
- GC->clipx0 = 0;
- GC->clipy0 = 0;
- GC->clipx1 = GC->g.Width;
- GC->clipy1 = GC->g.Height;
+ g->clipx0 = 0;
+ g->clipy0 = 0;
+ g->clipx1 = g->g.Width;
+ g->clipy1 = g->g.Height;
#endif
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
#else
- void gdispControl(unsigned what, void *value) {
+ void gdispGControl(GDisplay *g, unsigned what, void *value) {
(void)what;
(void)value;
/* Ignore everything */
@@ -1868,17 +1915,17 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
#if GDISP_NEED_QUERY
#if GDISP_HARDWARE_QUERY
- void *gdispQuery(unsigned what) {
+ void *gdispGQuery(GDisplay *g, unsigned what) {
void *res;
- MUTEX_ENTER();
- GC->p.x = (coord_t)what;
- res = gdisp_lld_query(GC);
- MUTEX_EXIT();
+ MUTEX_ENTER(g);
+ g->p.x = (coord_t)what;
+ res = gdisp_lld_query(g);
+ MUTEX_EXIT(g);
return res;
}
#else
- void *gdispQuery(unsigned what) {
+ void *gdispGQuery(GDisplay *g, unsigned what) {
(void) what;
return (void *)-1;
}
@@ -1889,63 +1936,63 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
/* High Level Driver Routines. */
/*===========================================================================*/
-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) {
if (cx <= 0 || cy <= 0) return;
cx = x+cx-1; cy = y+cy-1; // cx, cy are now the end point.
- MUTEX_ENTER();
+ MUTEX_ENTER(g);
- GC->p.color = color;
+ g->p.color = color;
if (cx - x > 2) {
- GC->p.x = x; GC->p.y = y; GC->p.x1 = cx; hline_clip();
+ g->p.x = x; g->p.y = y; g->p.x1 = cx; hline_clip(g);
if (y != cy) {
- GC->p.x = x; GC->p.y = cy; GC->p.x1 = cx; hline_clip();
+ g->p.x = x; g->p.y = cy; g->p.x1 = cx; hline_clip(g);
if (cy - y > 2) {
y++; cy--;
- GC->p.x = x; GC->p.y = y; GC->p.y1 = cy; vline_clip();
- GC->p.x = cx; GC->p.y = y; GC->p.y1 = cy; vline_clip();
+ g->p.x = x; g->p.y = y; g->p.y1 = cy; vline_clip(g);
+ g->p.x = cx; g->p.y = y; g->p.y1 = cy; vline_clip(g);
}
}
} else {
- GC->p.x = x; GC->p.y = y; GC->p.y1 = cy; vline_clip();
+ g->p.x = x; g->p.y = y; g->p.y1 = cy; vline_clip(g);
if (x != cx) {
- GC->p.x = cx; GC->p.y = y; GC->p.y1 = cy; vline_clip();
+ g->p.x = cx; g->p.y = y; g->p.y1 = cy; vline_clip(g);
}
}
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
#if GDISP_NEED_CONVEX_POLYGON
- 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) {
const point *epnt, *p;
epnt = &pntarray[cnt-1];
- MUTEX_ENTER();
- GC->p.color = color;
+ MUTEX_ENTER(g);
+ g->p.color = color;
for(p = pntarray; p < epnt; p++) {
- GC->p.x=tx+p->x; GC->p.y=ty+p->y; GC->p.x1=tx+p[1].x; GC->p.y1=ty+p[1].y; line_clip();
+ g->p.x=tx+p->x; g->p.y=ty+p->y; g->p.x1=tx+p[1].x; g->p.y1=ty+p[1].y; line_clip(g);
}
- GC->p.x=tx+p->x; GC->p.y=ty+p->y; GC->p.x1=tx+pntarray->x; GC->p.y1=ty+pntarray->y; line_clip();
+ g->p.x=tx+p->x; g->p.y=ty+p->y; g->p.x1=tx+pntarray->x; g->p.y1=ty+pntarray->y; line_clip(g);
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
- 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) {
const point *lpnt, *rpnt, *epnts;
fixed lx, rx, lk, rk;
coord_t y, ymax, lxc, rxc;
@@ -1975,8 +2022,8 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
lk = (FIXED(lpnt->x) - lx) / (lpnt->y - y);
rk = (FIXED(rpnt->x) - rx) / (rpnt->y - y);
- MUTEX_ENTER();
- GC->p.color = color;
+ MUTEX_ENTER(g);
+ g->p.color = color;
while(1) {
/* Determine our boundary */
ymax = rpnt->y < lpnt->y ? rpnt->y : lpnt->y;
@@ -1991,9 +2038,9 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
* of pixels.
*/
if (lxc < rxc) {
- GC->p.x=tx+lxc; GC->p.y=ty+y; GC->p.x1=tx+rxc-1; hline_clip();
+ g->p.x=tx+lxc; g->p.y=ty+y; g->p.x1=tx+rxc-1; hline_clip(g);
} else if (lxc > rxc) {
- GC->p.x=tx+rxc; GC->p.y=ty+y; GC->p.x1=tx+lxc-1; hline_clip();
+ g->p.x=tx+rxc; g->p.y=ty+y; g->p.x1=tx+lxc-1; hline_clip(g);
}
lx += lk;
@@ -2002,12 +2049,12 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
if (!cnt) {
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
return;
}
cnt--;
@@ -2017,12 +2064,12 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
for (lpnt = lpnt <= pntarray ? epnts : lpnt-1; lpnt->y == y; cnt--) {
if (!cnt) {
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
return;
}
lx = FIXED(lpnt->x);
@@ -2033,12 +2080,12 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
for (rpnt = rpnt >= epnts ? pntarray : rpnt+1; rpnt->y == y; cnt--) {
if (!cnt) {
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
return;
}
rx = FIXED(rpnt->x);
@@ -2055,27 +2102,27 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
#if GDISP_NEED_ANTIALIAS && GDISP_HARDWARE_PIXELREAD
static void drawcharline(int16_t x, int16_t y, uint8_t count, uint8_t alpha, void *state) {
- #define GD ((GDISPDriver *)state)
+ #define GD ((GDisplay *)state)
if (y < GD->t.clipy0 || y >= GD->t.clipy1 || x < GD->t.clipx0 || x+count > GD->t.clipx1) return;
if (alpha == 255) {
GD->p.x = x; GD->p.y = y; GD->p.x1 = x+count-1; GD->p.color = GD->t.color;
- hline_clip();
+ hline_clip(g);
} else {
for (; count; count--, x++) {
GD->p.x = x; GD->p.y = y;
GD->p.color = gdispBlendColor(GD->t.color, gdisp_lld_get_pixel_color(GD), alpha);
- drawpixel_clip();
+ drawpixel_clip(g);
}
}
#undef GD
}
#else
static void drawcharline(int16_t x, int16_t y, uint8_t count, uint8_t alpha, void *state) {
- #define GD ((GDISPDriver *)state)
+ #define GD ((GDisplay *)state)
if (y < GD->t.clipy0 || y >= GD->t.clipy1 || x < GD->t.clipx0 || x+count > GD->t.clipx1) return;
if (alpha > 0x80) { // A best approximation when using anti-aliased fonts but we can't actually draw them anti-aliased
GD->p.x = x; GD->p.y = y; GD->p.x1 = x+count-1; GD->p.color = GD->t.color;
- hline_clip();
+ hline_clip(g);
}
#undef GD
}
@@ -2083,7 +2130,7 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
#if GDISP_NEED_ANTIALIAS
static void fillcharline(int16_t x, int16_t y, uint8_t count, uint8_t alpha, void *state) {
- #define GD ((GDISPDriver *)state)
+ #define GD ((GDisplay *)state)
if (y < GD->t.clipy0 || y >= GD->t.clipy1 || x < GD->t.clipx0 || x+count > GD->t.clipx1) return;
if (alpha == 255) {
GD->p.color = GD->t.color;
@@ -2091,7 +2138,7 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
GD->p.color = gdispBlendColor(GD->t.color, GD->t.bgcolor, alpha);
}
GD->p.x = x; GD->p.y = y; GD->p.x1 = x+count-1;
- hline_clip();
+ hline_clip(g);
#undef GD
}
#else
@@ -2100,110 +2147,110 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
/* Callback to render characters. */
static uint8_t drawcharglyph(int16_t x, int16_t y, mf_char ch, void *state) {
- return mf_render_character(GC->t.font, x, y, ch, drawcharline, state);
+ return mf_render_character(g->t.font, x, y, ch, drawcharline, state);
}
/* Callback to render characters. */
static uint8_t fillcharglyph(int16_t x, int16_t y, mf_char ch, void *state) {
- return mf_render_character(GC->t.font, x, y, ch, fillcharline, state);
+ return mf_render_character(g->t.font, x, y, ch, fillcharline, state);
}
- void gdispDrawChar(coord_t x, coord_t y, uint16_t c, font_t font, color_t color) {
- MUTEX_ENTER();
- GC->t.font = font;
- GC->t.clipx0 = x;
- GC->t.clipy0 = y;
- GC->t.clipx1 = x + mf_character_width(font, c) + font->baseline_x;
- GC->t.clipy1 = y + font->height;
- GC->t.color = color;
- mf_render_character(font, x, y, c, drawcharline, GC);
+ void gdispGDrawChar(GDisplay *g, coord_t x, coord_t y, uint16_t c, font_t font, color_t color) {
+ MUTEX_ENTER(g);
+ g->t.font = font;
+ g->t.clipx0 = x;
+ g->t.clipy0 = y;
+ g->t.clipx1 = x + mf_character_width(font, c) + font->baseline_x;
+ g->t.clipy1 = y + font->height;
+ g->t.color = color;
+ mf_render_character(font, x, y, c, drawcharline, g);
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
- void gdispFillChar(coord_t x, coord_t y, uint16_t c, font_t font, color_t color, color_t bgcolor) {
- MUTEX_ENTER();
- GC->p.cx = mf_character_width(font, c) + font->baseline_x;
- GC->p.cy = font->height;
- GC->t.font = font;
- GC->t.clipx0 = GC->p.x = x;
- GC->t.clipy0 = GC->p.y = y;
- GC->t.clipx1 = GC->p.x+GC->p.cx;
- GC->t.clipy1 = GC->p.y+GC->p.cy;
- GC->t.color = color;
- GC->t.bgcolor = GC->p.color = bgcolor;
-
- TEST_CLIP_AREA(GC->p.x, GC->p.y, GC->p.cx, GC->p.cy) {
- fillarea();
- mf_render_character(font, x, y, c, fillcharline, GC);
+ void gdispGFillChar(GDisplay *g, coord_t x, coord_t y, uint16_t c, font_t font, color_t color, color_t bgcolor) {
+ MUTEX_ENTER(g);
+ g->p.cx = mf_character_width(font, c) + font->baseline_x;
+ g->p.cy = font->height;
+ g->t.font = font;
+ g->t.clipx0 = g->p.x = x;
+ g->t.clipy0 = g->p.y = y;
+ g->t.clipx1 = g->p.x+g->p.cx;
+ g->t.clipy1 = g->p.y+g->p.cy;
+ g->t.color = color;
+ g->t.bgcolor = g->p.color = bgcolor;
+
+ TEST_CLIP_AREA(g) {
+ fillarea(g);
+ mf_render_character(font, x, y, c, fillcharline, g);
}
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
- void gdispDrawString(coord_t x, coord_t y, const char *str, font_t font, color_t color) {
- MUTEX_ENTER();
- GC->t.font = font;
- GC->t.clipx0 = x;
- GC->t.clipy0 = y;
- GC->t.clipx1 = x + mf_get_string_width(font, str, 0, 0);
- GC->t.clipy1 = y + font->height;
- GC->t.color = color;
+ void gdispGDrawString(GDisplay *g, coord_t x, coord_t y, const char *str, font_t font, color_t color) {
+ MUTEX_ENTER(g);
+ g->t.font = font;
+ g->t.clipx0 = x;
+ g->t.clipy0 = y;
+ g->t.clipx1 = x + mf_get_string_width(font, str, 0, 0);
+ g->t.clipy1 = y + font->height;
+ g->t.color = color;
- mf_render_aligned(font, x+font->baseline_x, y, MF_ALIGN_LEFT, str, 0, drawcharglyph, GC);
+ mf_render_aligned(font, x+font->baseline_x, y, MF_ALIGN_LEFT, str, 0, drawcharglyph, g);
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
- void gdispFillString(coord_t x, coord_t y, const char *str, font_t font, color_t color, color_t bgcolor) {
- MUTEX_ENTER();
- GC->p.cx = mf_get_string_width(font, str, 0, 0);
- GC->p.cy = font->height;
- GC->t.font = font;
- GC->t.clipx0 = GC->p.x = x;
- GC->t.clipy0 = GC->p.y = y;
- GC->t.clipx1 = GC->p.x+GC->p.cx;
- GC->t.clipy1 = GC->p.y+GC->p.cy;
- GC->t.color = color;
- GC->t.bgcolor = GC->p.color = bgcolor;
-
- TEST_CLIP_AREA(GC->p.x, GC->p.y, GC->p.cx, GC->p.cy) {
- fillarea();
- mf_render_aligned(font, x+font->baseline_x, y, MF_ALIGN_LEFT, str, 0, fillcharglyph, GC);
+ void gdispGFillString(GDisplay *g, coord_t x, coord_t y, const char *str, font_t font, color_t color, color_t bgcolor) {
+ MUTEX_ENTER(g);
+ g->p.cx = mf_get_string_width(font, str, 0, 0);
+ g->p.cy = font->height;
+ g->t.font = font;
+ g->t.clipx0 = g->p.x = x;
+ g->t.clipy0 = g->p.y = y;
+ g->t.clipx1 = g->p.x+g->p.cx;
+ g->t.clipy1 = g->p.y+g->p.cy;
+ g->t.color = color;
+ g->t.bgcolor = g->p.color = bgcolor;
+
+ TEST_CLIP_AREA(g) {
+ fillarea(g);
+ mf_render_aligned(font, x+font->baseline_x, y, MF_ALIGN_LEFT, str, 0, fillcharglyph, g);
}
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
- 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) {
- MUTEX_ENTER();
- GC->t.font = font;
- GC->t.clipx0 = x;
- GC->t.clipy0 = y;
- GC->t.clipx1 = x+cx;
- GC->t.clipy1 = y+cy;
- GC->t.color = color;
+ 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) {
+ MUTEX_ENTER(g);
+ g->t.font = font;
+ g->t.clipx0 = x;
+ g->t.clipy0 = y;
+ g->t.clipx1 = x+cx;
+ g->t.clipy1 = y+cy;
+ g->t.color = color;
/* Select the anchor position */
switch(justify) {
@@ -2219,33 +2266,33 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
}
y += (cy+1 - font->height)/2;
- mf_render_aligned(font, x, y, justify, str, 0, drawcharglyph, GC);
+ mf_render_aligned(font, x, y, justify, str, 0, drawcharglyph, g);
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
- 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) {
- MUTEX_ENTER();
- GC->p.cx = cx;
- GC->p.cy = cy;
- GC->t.font = font;
- GC->t.clipx0 = GC->p.x = x;
- GC->t.clipy0 = GC->p.y = y;
- GC->t.clipx1 = x+cx;
- GC->t.clipy1 = y+cy;
- GC->t.color = color;
- GC->t.bgcolor = GC->p.color = bgcolor;
+ 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) {
+ MUTEX_ENTER(g);
+ g->p.cx = cx;
+ g->p.cy = cy;
+ g->t.font = font;
+ g->t.clipx0 = g->p.x = x;
+ g->t.clipy0 = g->p.y = y;
+ g->t.clipx1 = x+cx;
+ g->t.clipy1 = y+cy;
+ g->t.color = color;
+ g->t.bgcolor = g->p.color = bgcolor;
- TEST_CLIP_AREA(GC->p.x, GC->p.y, GC->p.cx, GC->p.cy) {
+ TEST_CLIP_AREA(g) {
// background fill
- fillarea();
+ fillarea(g);
/* Select the anchor position */
switch(justify) {
@@ -2262,16 +2309,16 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
y += (cy+1 - font->height)/2;
/* Render */
- mf_render_aligned(font, x, y, justify, str, 0, fillcharglyph, GC);
+ mf_render_aligned(font, x, y, justify, str, 0, fillcharglyph, g);
}
#if GDISP_HARDWARE_STREAM_POS && GDISP_HARDWARE_STREAM_WRITE
- if ((GC->flags & GDISP_FLG_SCRSTREAM)) {
- gdisp_lld_write_stop(GC);
- GC->flags &= ~GDISP_FLG_SCRSTREAM;
+ if ((g->flags & GDISP_FLG_SCRSTREAM)) {
+ gdisp_lld_write_stop(g);
+ g->flags &= ~GDISP_FLG_SCRSTREAM;
}
#endif
- MUTEX_EXIT();
+ MUTEX_EXIT(g);
}
coord_t gdispGetFontMetric(font_t font, fontmetric_t metric) {