Fontrenderer: Fix RenderString() for better drawing fonts

Origin commit data
------------------
Commit: 9ab1f62cf0
Author: Michael Liebmann <tuxcode.bbg@gmail.com>
Date: 2014-09-20 (Sat, 20 Sep 2014)
This commit is contained in:
Michael Liebmann
2014-09-20 21:34:34 +02:00
committed by [CST] Focus
parent 68e23a1720
commit 8c927dcee4
2 changed files with 13 additions and 32 deletions

View File

@@ -382,14 +382,17 @@ int UTF8ToUnicode(const char * &text, const bool utf8_encoded) // returns -1 on
#define F_MUL 0x7FFF #define F_MUL 0x7FFF
void Font::paintFontPixel(fb_pixel_t *td, uint8_t fg_trans, uint8_t fg_red, uint8_t fg_green, uint8_t fg_blue, fb_pixel_t bg_col, int faktor, uint8_t index) void Font::paintFontPixel(fb_pixel_t *td, uint8_t fg_red, uint8_t fg_green, uint8_t fg_blue, int faktor, uint8_t index)
{ {
int korr_t = ((bg_col & 0xFF000000) >> 24) - fg_trans; fb_pixel_t bg_col = *td;
if (bg_col == (fb_pixel_t)0)
bg_col = 0xE0808080;
uint8_t bg_trans = (bg_col & 0xFF000000) >> 24;
int korr_r = ((bg_col & 0x00FF0000) >> 16) - fg_red; int korr_r = ((bg_col & 0x00FF0000) >> 16) - fg_red;
int korr_g = ((bg_col & 0x0000FF00) >> 8) - fg_green; int korr_g = ((bg_col & 0x0000FF00) >> 8) - fg_green;
int korr_b = (bg_col & 0x000000FF) - fg_blue; int korr_b = (bg_col & 0x000000FF) - fg_blue;
*td = ((g_settings.contrast_fonts && (index > 128)) ? 0xFF000000 : (((fg_trans + ((korr_t*faktor)/F_MUL)) << 24) & 0xFF000000)) | *td = ((g_settings.contrast_fonts && (index > 128)) ? 0xFF000000 : (((bg_trans == 0) ? 0xFF : bg_trans) << 24) & 0xFF000000) |
(((fg_red + ((korr_r*faktor)/F_MUL)) << 16) & 0x00FF0000) | (((fg_red + ((korr_r*faktor)/F_MUL)) << 16) & 0x00FF0000) |
(((fg_green + ((korr_g*faktor)/F_MUL)) << 8) & 0x0000FF00) | (((fg_green + ((korr_g*faktor)/F_MUL)) << 8) & 0x0000FF00) |
((fg_blue + ((korr_b*faktor)/F_MUL)) & 0x000000FF); ((fg_blue + ((korr_b*faktor)/F_MUL)) & 0x000000FF);
@@ -473,7 +476,7 @@ void Font::RenderString(int x, int y, const int width, const char *text, const f
FT_Vector kerning; FT_Vector kerning;
int pen1=-1; // "pen" positions for kerning, pen2 is "x" int pen1=-1; // "pen" positions for kerning, pen2 is "x"
static fb_pixel_t old_bgcolor = 0, old_fgcolor = 0; static fb_pixel_t old_bgcolor = 0, old_fgcolor = 0;
static uint8_t fg_trans = 0, fg_red = 0, fg_green = 0, fg_blue = 0; static uint8_t bg_trans = 0, fg_red = 0, fg_green = 0, fg_blue = 0;
static bool olduseFullBg = false; static bool olduseFullBg = false;
static fb_pixel_t colors[256] = {0}; static fb_pixel_t colors[256] = {0};
static int faktor[256] = {0}; static int faktor[256] = {0};
@@ -499,14 +502,13 @@ void Font::RenderString(int x, int y, const int width, const char *text, const f
olduseFullBg = useFullBg; olduseFullBg = useFullBg;
fontRecsInit = true; fontRecsInit = true;
fg_trans = (fg_color & 0xFF000000) >> 24; bg_trans = (bg_color & 0xFF000000) >> 24;
fg_red = (fg_color & 0x00FF0000) >> 16; fg_red = (fg_color & 0x00FF0000) >> 16;
fg_green = (fg_color & 0x0000FF00) >> 8; fg_green = (fg_color & 0x0000FF00) >> 8;
fg_blue = fg_color & 0x000000FF; fg_blue = fg_color & 0x000000FF;
int korr_t=0, korr_r=0, korr_g=0, korr_b=0; int korr_r=0, korr_g=0, korr_b=0;
if (!useFullBg) { if (!useFullBg) {
korr_t = ((bg_color & 0xFF000000) >> 24) - fg_trans;
korr_r = ((bg_color & 0x00FF0000) >> 16) - fg_red; korr_r = ((bg_color & 0x00FF0000) >> 16) - fg_red;
korr_g = ((bg_color & 0x0000FF00) >> 8) - fg_green; korr_g = ((bg_color & 0x0000FF00) >> 8) - fg_green;
korr_b = (bg_color & 0x000000FF) - fg_blue; korr_b = (bg_color & 0x000000FF) - fg_blue;
@@ -518,7 +520,7 @@ void Font::RenderString(int x, int y, const int width, const char *text, const f
if (useFullBg) if (useFullBg)
faktor[i] = _faktor; faktor[i] = _faktor;
else else
colors[i] = ((g_settings.contrast_fonts && (i > 128)) ? 0xFF000000 : (((fg_trans + ((korr_t*_faktor)/F_MUL)) << 24) & 0xFF000000)) | colors[i] = ((g_settings.contrast_fonts && (i > 128)) ? 0xFF000000 : (((bg_trans == 0) ? 0xFF : bg_trans) << 24) & 0xFF000000) |
(((fg_red + ((korr_r*_faktor)/F_MUL)) << 16) & 0x00FF0000) | (((fg_red + ((korr_r*_faktor)/F_MUL)) << 16) & 0x00FF0000) |
(((fg_green + ((korr_g*_faktor)/F_MUL)) << 8) & 0x0000FF00) | (((fg_green + ((korr_g*_faktor)/F_MUL)) << 8) & 0x0000FF00) |
((fg_blue + ((korr_b*_faktor)/F_MUL)) & 0x000000FF); ((fg_blue + ((korr_b*_faktor)/F_MUL)) & 0x000000FF);
@@ -585,24 +587,6 @@ void Font::RenderString(int x, int y, const int width, const char *text, const f
int h = glyph->height; int h = glyph->height;
int pitch = glyph->pitch; int pitch = glyph->pitch;
if (ap>-1) { if (ap>-1) {
fb_pixel_t *bg_buf = NULL;
if (useFullBg) {
// save background of the char
bg_buf = new fb_pixel_t[h * (w+spread_by)];
uint8_t *pos = d;
fb_pixel_t *bkpos = bg_buf;
/* the GXA seems to do it's job asynchonously, so we need to wait until
it's ready, otherwise the font will sometimes "be overwritten" with
background color or bgcolor will be wrong */
frameBuffer->waitForIdle("Font::RenderString 2");
for (int j = 0; j < h; j++) {
fb_pixel_t *dest = (fb_pixel_t*)pos;
for (int i = 0; i < (w + spread_by); i++)
*(bkpos++) = *(dest++);
pos += stride;
}
}
for (int ay = 0; ay < h; ay++) { for (int ay = 0; ay < h; ay++) {
fb_pixel_t * td = (fb_pixel_t *)d; fb_pixel_t * td = (fb_pixel_t *)d;
int ax; int ax;
@@ -611,7 +595,7 @@ void Font::RenderString(int x, int y, const int width, const char *text, const f
/* do not paint the backgroundcolor (*s = 0) */ /* do not paint the backgroundcolor (*s = 0) */
if(*s != 0) { if(*s != 0) {
if (useFullBg) if (useFullBg)
paintFontPixel(td, fg_trans, fg_red, fg_green, fg_blue, bg_buf[ax*ay], faktor[*s], *s); paintFontPixel(td, fg_red, fg_green, fg_blue, faktor[*s], *s);
else else
*td = colors[*s]; *td = colors[*s];
} }
@@ -626,7 +610,7 @@ void Font::RenderString(int x, int y, const int width, const char *text, const f
/* do not paint the backgroundcolor (lcolor = 0) */ /* do not paint the backgroundcolor (lcolor = 0) */
if(lcolor != 0) { if(lcolor != 0) {
if (useFullBg) if (useFullBg)
paintFontPixel(td, fg_trans, fg_red, fg_green, fg_blue, bg_buf[ax*ay], faktor[lcolor], (uint8_t)lcolor); paintFontPixel(td, fg_red, fg_green, fg_blue, faktor[lcolor], (uint8_t)lcolor);
else else
*td = colors[lcolor]; *td = colors[lcolor];
} }
@@ -636,9 +620,6 @@ void Font::RenderString(int x, int y, const int width, const char *text, const f
s += pitch - ax; s += pitch - ax;
d += stride; d += stride;
} }
if (bg_buf != NULL)
delete[] bg_buf;
bg_buf = NULL;
} }
x += glyph->xadvance + 1; x += glyph->xadvance + 1;
if (pen1 > x) if (pen1 > x)

View File

@@ -55,7 +55,7 @@ class Font
int fontwidth; int fontwidth;
int maxdigitwidth; int maxdigitwidth;
inline void paintFontPixel(fb_pixel_t *td, uint8_t fg_trans, uint8_t fg_red, uint8_t fg_green, uint8_t fg_blue, fb_pixel_t bg_col, int faktor, uint8_t index); inline void paintFontPixel(fb_pixel_t *td, uint8_t fg_red, uint8_t fg_green, uint8_t fg_blue, int faktor, uint8_t index);
public: public:
enum fontmodifier enum fontmodifier