Compile time fix to text rendering.

Updated gdisp Get/Set Display routines to a more logical API.
ugfx_release_2.6
inmarket 2013-10-14 08:55:15 +10:00
parent 769766aa4a
commit ea4af865f1
2 changed files with 38 additions and 13 deletions

View File

@ -366,16 +366,32 @@ extern "C" {
color_t gdispBlendColor(color_t fg, color_t bg, uint8_t alpha);
/**
* @brief Set the current default display to the specified display
* @note The default display is used for the gdispXxxx functions.
* @brief Get the specified display
* @return The pointer to the display or NULL if the display doesn't exist
* @note The GDISP variable contains the display used by the gdispXxxx routines
* as opposed to the gdispGXxxx routines which take an explicit display
* parameter.
* @note Displays are numbered from 0 to GDISP_TOTAL_DISPLAYS - 1
* @note If an invalid display number is specified the request is ignored.
*
* @param[in] display The display number (0..n)
*
* @api
*/
void gdispSetDisplay(unsigned display);
GDisplay *gdispGetDisplay(unsigned display);
/**
* @brief Set the current default display to the specified display
* @note The default display is used for the gdispXxxx functions.
* @note The default display is contained in the variable GDISP. Using
* this function to set it protects against it being set to a NULL
* value.
* @note If a NULL is passed for the dispay this call is ignored.
*
* @param[in] display The display number (0..n)
*
* @api
*/
void gdispSetDisplay(GDisplay *g);
/* Drawing Functions */

View File

@ -448,9 +448,14 @@ void _gdispInit(void) {
#endif
}
void gdispSetDisplay(unsigned display) {
if (display < GDISP_TOTAL_DISPLAYS)
GDISP = &GDisplayArray[display];
GDisplay *gdispGetDisplay(unsigned display) {
if (display >= GDISP_TOTAL_DISPLAYS)
return 0;
return &GDisplayArray[display];
}
void gdispSetDisplay(GDisplay *g) {
if (g) GDISP = g;
}
#if GDISP_NEED_STREAMING
@ -2106,12 +2111,12 @@ void gdispGDrawBox(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, co
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(g);
hline_clip(GD);
} 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(g);
drawpixel_clip(GD);
}
}
#undef GD
@ -2122,7 +2127,7 @@ void gdispGDrawBox(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, co
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(g);
hline_clip(GD);
}
#undef GD
}
@ -2138,7 +2143,7 @@ void gdispGDrawBox(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, co
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(g);
hline_clip(GD);
#undef GD
}
#else
@ -2147,12 +2152,16 @@ void gdispGDrawBox(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, co
/* Callback to render characters. */
static uint8_t drawcharglyph(int16_t x, int16_t y, mf_char ch, void *state) {
return mf_render_character(g->t.font, x, y, ch, drawcharline, state);
#define GD ((GDisplay *)state)
return mf_render_character(GD->t.font, x, y, ch, drawcharline, state);
#undef GD
}
/* Callback to render characters. */
static uint8_t fillcharglyph(int16_t x, int16_t y, mf_char ch, void *state) {
return mf_render_character(g->t.font, x, y, ch, fillcharline, state);
#define GD ((GDisplay *)state)
return mf_render_character(GD->t.font, x, y, ch, fillcharline, state);
#undef GD
}
void gdispGDrawChar(GDisplay *g, coord_t x, coord_t y, uint16_t c, font_t font, color_t color) {