correct for narrow chars on fonts

This commit is contained in:
Adolfo Reyna
2026-01-18 23:30:11 -05:00
parent 3491de4650
commit 8170799f01
4 changed files with 47 additions and 19 deletions

BIN
app

Binary file not shown.

View File

@@ -525,22 +525,34 @@ void LowLevelRenderer::draw_filled_circle(int x, int y, int radius, bool on)
}
}
void LowLevelRenderer::draw_char_vcol(int x, int y, char c)
int LowLevelRenderer::draw_char_vcol(int x, int y, char c)
{
if (!current_font) return;
if (!current_font) return 0;
// The font table starts at space (ASCII 32)
if (c < 32 || c > 127)
return;
return 0;
int font_idx = c - 32;
const unsigned char* char_data = current_font->get_char_data(font_idx);
if (!char_data) return;
if (!char_data) return 0;
int bytes_per_char = current_font->get_bytes_per_char();
int char_height = current_font->get_char_height();
for (int col = 0; col < bytes_per_char; col++)
// Find the actual width by skipping trailing empty columns
int actual_width = 0;
for (int col = bytes_per_char - 1; col >= 0; col--)
{
if (char_data[col] != 0)
{
actual_width = col + 1;
break;
}
}
// Draw only up to the actual width
for (int col = 0; col < actual_width; col++)
{
unsigned char column_byte = char_data[col];
@@ -553,35 +565,50 @@ void LowLevelRenderer::draw_char_vcol(int x, int y, char c)
}
}
}
return actual_width;
}
void LowLevelRenderer::draw_string(int x, int y, const std::string &text, int spacing)
{
if (!current_font) return;
int char_width = current_font->get_bytes_per_char();
int current_x = x;
for (size_t i = 0; i < text.length(); i++)
{
draw_char_vcol(x + (i * (char_width + spacing)), y, text[i]);
int char_width = draw_char_vcol(current_x, y, text[i]);
current_x += char_width + spacing;
}
}
void LowLevelRenderer::draw_char_scaled(int x, int y, char c, int scale)
int LowLevelRenderer::draw_char_scaled(int x, int y, char c, int scale)
{
if (!current_font) return;
if (!current_font) return 0;
if (c < 32 || c > 127)
return;
return 0;
if (scale < 1)
scale = 1; // Safety check
int font_idx = c - 32;
const unsigned char* char_data = current_font->get_char_data(font_idx);
if (!char_data) return;
if (!char_data) return 0;
int bytes_per_char = current_font->get_bytes_per_char();
int char_height = current_font->get_char_height();
for (int col = 0; col < bytes_per_char; col++)
// Find the actual width by skipping trailing empty columns
int actual_width = 0;
for (int col = bytes_per_char - 1; col >= 0; col--)
{
if (char_data[col] != 0)
{
actual_width = col + 1;
break;
}
}
// Draw only up to the actual width, scaled
for (int col = 0; col < actual_width; col++)
{
unsigned char column_byte = char_data[col];
@@ -602,18 +629,19 @@ void LowLevelRenderer::draw_char_scaled(int x, int y, char c, int scale)
}
}
}
return actual_width * scale;
}
void LowLevelRenderer::draw_string_scaled(int x, int y, const char* text, int scale, int spacing)
{
if (!current_font) return;
int char_width = current_font->get_bytes_per_char();
int current_x = x;
int i = 0;
while(text[i] != '\0')
{
// We multiply the character width and spacing by the scale
int next_x = x + (i * (char_width + spacing) * scale);
draw_char_scaled(next_x, y, text[i], scale);
int char_width = draw_char_scaled(current_x, y, text[i], scale);
current_x += char_width + (spacing * scale);
i++;
}
}

View File

@@ -140,9 +140,9 @@ public:
void draw_circle(int x, int y, int radius, bool on);
void draw_filled_circle(int x, int y, int radius, bool on);
void draw_char_vcol(int x, int y, char c);
int draw_char_vcol(int x, int y, char c);
void draw_string(int x, int y, const std::string &text, int spacing = 1);
void draw_char_scaled(int x, int y, char c, int scale);
int draw_char_scaled(int x, int y, char c, int scale);
void draw_string_scaled(int x, int y, const char* text, int scale, int spacing = 1);
};

View File

@@ -149,7 +149,7 @@ int main()
*/
// Text with different fonts
renderer.set_font(&font_HISKYF21_obj);
renderer.set_font(&font_acme_5_outlines_obj);
renderer.draw_string_scaled(10, 10, "Drawing Demo", 2);