diff --git a/lib/font_renderer/font_renderer.cpp b/lib/font_renderer/font_renderer.cpp index 353c630d..7aae492c 100644 --- a/lib/font_renderer/font_renderer.cpp +++ b/lib/font_renderer/font_renderer.cpp @@ -14,8 +14,8 @@ public: // Conventional LUT values: (1./3., 2./9., 1./9.) // The values below are fine tuned as in the Elementary Plot library. - FontRendererImpl(bool hinting, bool kerning, float gamma_value) : - m_renderer(hinting, kerning), + FontRendererImpl(bool hinting, bool kerning, bool subpixel, float gamma_value) : + m_renderer(hinting, kerning, subpixel), m_gamma_lut(double(gamma_value)), m_blender(), m_lcd_lut(0.448, 0.184, 0.092) @@ -38,7 +38,8 @@ private: FontRenderer *FontRendererNew(unsigned int flags, float gamma) { bool hinting = ((flags & FONT_RENDERER_HINTING) != 0); bool kerning = ((flags & FONT_RENDERER_KERNING) != 0); - return new FontRendererImpl(hinting, kerning, gamma); + bool subpixel = ((flags & FONT_RENDERER_SUBPIXEL) != 0); + return new FontRendererImpl(hinting, kerning, subpixel, gamma); } void FontRendererFree(FontRenderer *font_renderer) { @@ -180,6 +181,7 @@ int FontRendererBakeFontBitmap(FontRenderer *font_renderer, int font_height, #else const int font_height_reduced = font_height; #endif + renderer_alpha.set_font_height(font_height_reduced); agg::int8u *cover_swap_buffer = new agg::int8u[pixels_width * subpixel_scale]; for (int i = 0; i < num_chars; i++) { int codepoint = first_char + i; @@ -194,7 +196,7 @@ int FontRendererBakeFontBitmap(FontRenderer *font_renderer, int font_height, const int y_baseline = y - pad_y - ascender_px; double x_next = x, y_next = y_baseline; - renderer_alpha.render_codepoint(ren_buf, font_height_reduced, text_color, x_next, y_next, codepoint, subpixel_scale); + renderer_alpha.render_codepoint(ren_buf, text_color, x_next, y_next, codepoint, subpixel_scale); int x_next_i = (subpixel_scale == 1 ? int(x_next + 1.0) : ceil_to_multiple(x_next + 0.5, subpixel_scale)); // Below x and x_next_i will always be integer multiples of subpixel_scale. diff --git a/lib/font_renderer/font_renderer.h b/lib/font_renderer/font_renderer.h index e4a0166c..0d03bad9 100644 --- a/lib/font_renderer/font_renderer.h +++ b/lib/font_renderer/font_renderer.h @@ -19,6 +19,7 @@ typedef struct FontRendererImpl FontRenderer; enum { FONT_RENDERER_HINTING = 1 << 0, FONT_RENDERER_KERNING = 1 << 1, + FONT_RENDERER_SUBPIXEL = 1 << 2, }; typedef struct { diff --git a/lib/font_renderer/font_renderer_alpha.h b/lib/font_renderer/font_renderer_alpha.h index 2fc6c6ab..03676d88 100644 --- a/lib/font_renderer/font_renderer_alpha.h +++ b/lib/font_renderer/font_renderer_alpha.h @@ -26,6 +26,7 @@ class font_renderer_alpha // Font rendering options. bool m_hinting; bool m_kerning; + bool m_subpixel; bool m_font_loaded; @@ -36,11 +37,12 @@ class font_renderer_alpha public: typedef agg::pixfmt_alpha8::color_type color_type; - font_renderer_alpha(bool hinting, bool kerning): + font_renderer_alpha(bool hinting, bool kerning, bool subpixel): m_feng(), m_fman(m_feng), m_hinting(hinting), m_kerning(kerning), + m_subpixel(subpixel), m_font_loaded(false), m_curves(m_fman.path_adaptor()), m_trans(m_curves, m_mtx) @@ -74,21 +76,29 @@ public: bool load_font(const char *font_filename) { if(m_feng.load_font(font_filename, 0, agg::glyph_ren_outline)) { m_font_loaded = true; + m_feng.hinting(m_hinting); } return m_font_loaded; } + void set_font_height(double height) { + const double scale_x = 100.0; + m_feng.height(height); + if (m_subpixel) { + const int subpixel_scale = 3; + m_feng.width(height * scale_x * subpixel_scale); + } else { + m_feng.width(height * scale_x); + } + } + template void draw_codepoint(Rasterizer& ras, Scanline& sl, RenSolid& ren_solid, const color_type color, - int codepoint, double& x, double& y, double height, int subpixel_scale) + int codepoint, double& x, double& y, int subpixel_scale) { const double scale_x = 100; - m_feng.height(height); - m_feng.width(height * scale_x * subpixel_scale); - m_feng.hinting(m_hinting); - // Represent the delta in x scaled by scale_x. double x_delta = 0; double start_x = x; @@ -126,7 +136,6 @@ public: } void render_codepoint(agg::rendering_buffer& ren_buf, - const double text_size, const color_type text_color, double& x, double& y, int codepoint, int subpixel_scale) @@ -141,6 +150,6 @@ public: agg::pixfmt_alpha8 pf(ren_buf); base_ren_type ren_base(pf); renderer_solid ren_solid(ren_base); - draw_codepoint(ras, sl, ren_solid, text_color, codepoint, x, y, text_size, subpixel_scale); + draw_codepoint(ras, sl, ren_solid, text_color, codepoint, x, y, subpixel_scale); } }; diff --git a/src/renderer.c b/src/renderer.c index f8786edf..58ea0156 100644 --- a/src/renderer.c +++ b/src/renderer.c @@ -232,7 +232,7 @@ RenFont* ren_load_font(const char *filename, float size) { font->size = size; const float gamma = 1.5; - font->renderer = FontRendererNew(FONT_RENDERER_HINTING, gamma); + font->renderer = FontRendererNew(FONT_RENDERER_HINTING|FONT_RENDERER_SUBPIXEL, gamma); if (FontRendererLoadFont(font->renderer, filename)) { free(font); return NULL;