From: Steinar H. Gunderson Date: Sun, 8 Mar 2015 22:02:53 +0000 (+0100) Subject: Clean up glyph rendering a bit. X-Git-Url: https://git.sesse.net/?p=ccbs;a=commitdiff_plain;h=e31944e3c1c8725a85f36153400d27ce99e01c46 Clean up glyph rendering a bit. --- diff --git a/bigscreen/fonts.cpp b/bigscreen/fonts.cpp index cac42d6..1a2c104 100644 --- a/bigscreen/fonts.cpp +++ b/bigscreen/fonts.cpp @@ -80,9 +80,48 @@ void set_screen_size(unsigned width, unsigned height) screen_height = height; } +void render_glyph(FT_GlyphSlot slot, int glyphx, int glyphy, unsigned char *buf, int r, int g, int b, bool use_lcd) +{ + FT_Bitmap *bm = &(slot->bitmap); + for (unsigned y = 0; y < bm->rows; y++) { + int xx; + int dsty = glyphy - slot->bitmap_top + y; + if (dsty < 0 || dsty > signed(screen_height-1)) continue; + + unsigned char *dst = buf + dsty * screen_width*4 + (glyphx + slot->bitmap_left)*4; + unsigned char *src = bm->buffer + y * bm->pitch; + if (use_lcd) { + int width = (glyphx + slot->bitmap_left + bm->width/3 >= signed(screen_width)) ? ((screen_width-1) - glyphx - slot->bitmap_left) : bm->width/3; + for (xx = 0; xx < width; xx++) { + *dst = (*dst * (256-src[2]) + b * src[2]) >> 8; + ++dst; + *dst = (*dst * (256-src[1]) + g * src[1]) >> 8; + ++dst; + *dst = (*dst * (256-src[0]) + r * src[0]) >> 8; + ++dst; + *dst++ = 0; + + src += 3; + } + } else { + int width = (glyphx + slot->bitmap_left + bm->width >= signed(screen_width)) ? ((screen_width-1) - glyphx - slot->bitmap_left) : bm->width; + for (xx = 0; xx < width; xx++) { + *dst = (*dst * (256-*src) + b * *src) >> 8; + ++dst; + *dst = (*dst * (256-*src) + g * *src) >> 8; + ++dst; + *dst = (*dst * (256-*src) + r * *src) >> 8; + ++dst; + *dst++ = 0; + ++src; + } + } + } +} + unsigned my_draw_text(const widestring &str, unsigned char *buf, double size, const std::string &theme_element, int xpos, int ypos) { - int x = 0; + int start_xpos = xpos; int r = atoi(get_theme_config(theme_element, "red").c_str()); int g = atoi(get_theme_config(theme_element, "green").c_str()); @@ -124,50 +163,15 @@ unsigned my_draw_text(const widestring &str, unsigned char *buf, double size, co throw std::runtime_error("Couldn't load glyph"); } - FT_GlyphSlot slot = face->glyph; if (buf != NULL) { - int y; - FT_Bitmap *bm = &(slot->bitmap); - for (y = 0; y < bm->rows; y++) { - int xx; - int dsty = ypos - slot->bitmap_top + y; - if (dsty < 0 || dsty > signed(screen_height-1)) continue; - - unsigned char *dst = buf + dsty * screen_width*4 + (x + xpos + slot->bitmap_left)*4; - unsigned char *src = bm->buffer + y * bm->pitch; - if (use_lcd) { - int width = (x + xpos + slot->bitmap_left + bm->width/3 >= signed(screen_width)) ? ((screen_width-1) - x - xpos - slot->bitmap_left) : bm->width/3; - for (xx = 0; xx < width; xx++) { - *dst = (*dst * (256-src[2]) + b * src[2]) >> 8; - ++dst; - *dst = (*dst * (256-src[1]) + g * src[1]) >> 8; - ++dst; - *dst = (*dst * (256-src[0]) + r * src[0]) >> 8; - ++dst; - *dst++ = 0; - - src += 3; - } - } else { - int width = (x + xpos + slot->bitmap_left + bm->width >= signed(screen_width)) ? ((screen_width-1) - x - xpos - slot->bitmap_left) : bm->width; - for (xx = 0; xx < width; xx++) { - *dst = (*dst * (256-*src) + b * *src) >> 8; - ++dst; - *dst = (*dst * (256-*src) + g * *src) >> 8; - ++dst; - *dst = (*dst * (256-*src) + r * *src) >> 8; - ++dst; - *dst++ = 0; - ++src; - } - } - } + render_glyph(face->glyph, xpos, ypos, buf, r, g, b, use_lcd); } - x += slot->advance.x >> 6; + xpos += face->glyph->advance.x / 64; + ypos -= face->glyph->advance.y / 64; } - return x * LOGICAL_SCREEN_WIDTH / screen_width; + return (xpos - start_xpos) * LOGICAL_SCREEN_WIDTH / screen_width; } void my_draw_text_deferred(std::vector &td, const widestring &str, double size, const std::string &theme_element, const std::string &fresh_theme_element, int xpos, int ypos)