From bddc947b99ca65031adb06dab2af5d978308fb7f Mon Sep 17 00:00:00 2001 From: Francesco Abbate Date: Mon, 8 Jun 2020 09:32:39 +0200 Subject: [PATCH] Fix pixel off-by-one error in subpixel font renderer hspan --- lib/font_renderer/font_renderer.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/lib/font_renderer/font_renderer.cpp b/lib/font_renderer/font_renderer.cpp index 4d236269..d87d038f 100644 --- a/lib/font_renderer/font_renderer.cpp +++ b/lib/font_renderer/font_renderer.cpp @@ -256,27 +256,23 @@ void blend_solid_hspan(agg::rendering_buffer& rbuf, blender_gamma_type& blender, } void blend_solid_hspan_rgb_subpixel(agg::rendering_buffer& rbuf, agg::gamma_lut<>& gamma, agg::lcd_distribution_lut& lcd_lut, - int x, int y, unsigned len, + const int x, const int y, unsigned len, const agg::rgba8& c, const agg::int8u* covers) { - const int x_min = x; - const int x_max = x + len / 3; - const int pixel_size = 4; const agg::int8u rgb[3] = { c.r, c.g, c.b }; - agg::int8u* p = rbuf.row_ptr(y) + x_min * pixel_size; + agg::int8u* p = rbuf.row_ptr(y) + x * pixel_size; // Indexes to adress RGB colors in a BGRA32 format. const int pixel_index[3] = {2, 1, 0}; - for (int xp = x_min; xp <= x_max; xp++) + for (unsigned cx = 0; cx < len; cx += 3) { for (int i = 0; i < 3; i++) { - int cx = xp * 3 - x + i; - unsigned cover_value = covers[cx]; - unsigned alpha = (cover_value + 1) * (c.a + 1); - unsigned dst_col = gamma.dir(rgb[i]); - unsigned src_col = gamma.dir(*(p + pixel_index[i])); + const unsigned cover_value = covers[cx + i]; + const unsigned alpha = (cover_value + 1) * (c.a + 1); + const unsigned dst_col = gamma.dir(rgb[i]); + const unsigned src_col = gamma.dir(*(p + pixel_index[i])); *(p + pixel_index[i]) = gamma.inv((((dst_col - src_col) * alpha) + (src_col << 16)) >> 16); } // Leave p[3], the alpha channel value unmodified.