Fix problem with glyph spacing in subpixel mode

One more space is needed for subpixel positioning.

Otherwise some artifacts can be present
This commit is contained in:
Francesco Abbate 2021-03-07 18:38:47 +01:00
parent 6782533ad2
commit d0d6ad8d7d
1 changed files with 8 additions and 3 deletions

View File

@ -245,7 +245,7 @@ FR_Bitmap *FR_Bake_Font_Bitmap(FR_Renderer *font_renderer, int font_height,
} }
const int glyph_avg_width = glyph_count > 0 ? x_size_sum / (glyph_count * subpixel_scale) : font_height; const int glyph_avg_width = glyph_count > 0 ? x_size_sum / (glyph_count * subpixel_scale) : font_height;
const int pixels_width = glyph_avg_width * 20; const int pixels_width = glyph_avg_width * 28;
// dry run simulating pixel position to estimate required image's height // dry run simulating pixel position to estimate required image's height
int x = x_start, y = 0, y_bottom = y; int x = x_start, y = 0, y_bottom = y;
@ -255,7 +255,7 @@ FR_Bitmap *FR_Bake_Font_Bitmap(FR_Renderer *font_renderer, int font_height,
// 1. It is very important to ensure that the x's increment below (1) and in // 1. It is very important to ensure that the x's increment below (1) and in
// (2), (3) and (4) are perfectly the same. // (2), (3) and (4) are perfectly the same.
// Note that x_step below is always an integer multiple of subpixel_scale. // Note that x_step below is always an integer multiple of subpixel_scale.
const int x_step = gbounds.x2 + 2 * subpixel_scale; const int x_step = gbounds.x2 + 3 * subpixel_scale;
if (x + x_step >= pixels_width * subpixel_scale) { if (x + x_step >= pixels_width * subpixel_scale) {
x = x_start; x = x_start;
y = y_bottom; y = y_bottom;
@ -303,7 +303,12 @@ FR_Bitmap *FR_Bake_Font_Bitmap(FR_Renderer *font_renderer, int font_height,
// 3. Ensure x's increment is aligned with (1) // 3. Ensure x's increment is aligned with (1)
// Note that x_step below is always an integer multiple of subpixel_scale. // Note that x_step below is always an integer multiple of subpixel_scale.
const int x_step = gbounds.x2 + 2 * subpixel_scale; // We need 3 * subpixel_scale because:
// . +1 pixel on the left, because of RGB color filter
// . +1 pixel on the right, because of RGB color filter
// . +1 pixel on the right, because of subpixel positioning
// and each pixel requires "subpixel_scale" sub-pixels.
const int x_step = gbounds.x2 + 3 * subpixel_scale;
if (x + x_step >= pixels_width * subpixel_scale) { if (x + x_step >= pixels_width * subpixel_scale) {
// No more space along x, begin writing the row below. // No more space along x, begin writing the row below.
x = x_start; x = x_start;