aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancesco Abbate <francesco.bbt@gmail.com>2021-03-18 13:54:33 +0100
committerFrancesco Abbate <francesco.bbt@gmail.com>2021-03-18 13:54:33 +0100
commit88bec172a17b549ad2f76bc7080327d62442b0f2 (patch)
treee9a0329732b80030d1d8b9172dd8bae334f9720e
parent27f3cb23d4ca5fef65477205e69e5b7a33b4e380 (diff)
downloadlite-xl-88bec172a17b549ad2f76bc7080327d62442b0f2.tar.gz
lite-xl-88bec172a17b549ad2f76bc7080327d62442b0f2.zip
Fix problem with tab size and subpixel positioning
Solve github issue https://github.com/franko/lite-xl/issues/109
-rw-r--r--data/core/docview.lua2
-rw-r--r--src/api/renderer_font.c6
-rw-r--r--src/rencache.c8
-rw-r--r--src/renderer.c12
-rw-r--r--src/renderer.h4
5 files changed, 18 insertions, 14 deletions
diff --git a/data/core/docview.lua b/data/core/docview.lua
index da34eeef..7faa18dd 100644
--- a/data/core/docview.lua
+++ b/data/core/docview.lua
@@ -370,7 +370,7 @@ function DocView:draw()
self:draw_background(style.background)
local font = self:get_font()
- font:set_tab_width(font:get_width(" ") * config.indent_size)
+ font:set_tab_size(config.indent_size)
local minline, maxline = self:get_visible_line_range()
local lh = self:get_line_height()
diff --git a/src/api/renderer_font.c b/src/api/renderer_font.c
index 744ea808..dd5069bc 100644
--- a/src/api/renderer_font.c
+++ b/src/api/renderer_font.c
@@ -48,10 +48,10 @@ static int f_load(lua_State *L) {
}
-static int f_set_tab_width(lua_State *L) {
+static int f_set_tab_size(lua_State *L) {
RenFont **self = luaL_checkudata(L, 1, API_TYPE_FONT);
int n = luaL_checknumber(L, 2);
- ren_set_font_tab_width(*self, n);
+ ren_set_font_tab_size(*self, n);
return 0;
}
@@ -98,7 +98,7 @@ static int f_get_height(lua_State *L) {
static const luaL_Reg lib[] = {
{ "__gc", f_gc },
{ "load", f_load },
- { "set_tab_width", f_set_tab_width },
+ { "set_tab_size", f_set_tab_size },
{ "get_width", f_get_width },
{ "get_width_subpixel", f_get_width_subpixel },
{ "get_height", f_get_height },
diff --git a/src/rencache.c b/src/rencache.c
index 8e18e3a6..98e80009 100644
--- a/src/rencache.c
+++ b/src/rencache.c
@@ -20,7 +20,7 @@ typedef struct {
RenFont *font;
short int subpixel_scale;
short int x_subpixel_offset;
- int tab_width;
+ int tab_size;
char text[0];
} Command;
@@ -149,7 +149,7 @@ int rencache_draw_text(RenFont *font, const char *text, int x, int y, RenColor c
cmd->rect = rect;
cmd->subpixel_scale = (draw_subpixel ? subpixel_scale : 1);
cmd->x_subpixel_offset = x - subpixel_scale * rect.x;
- cmd->tab_width = ren_get_font_tab_width(font);
+ cmd->tab_size = ren_get_font_tab_size(font);
}
}
@@ -261,11 +261,11 @@ void rencache_end_frame(void) {
ren_draw_rect(cmd->rect, cmd->color);
break;
case DRAW_TEXT:
- ren_set_font_tab_width(cmd->font, cmd->tab_width);
+ ren_set_font_tab_size(cmd->font, cmd->tab_size);
ren_draw_text(cmd->font, cmd->text, cmd->rect.x, cmd->rect.y, cmd->color);
break;
case DRAW_TEXT_SUBPIXEL:
- ren_set_font_tab_width(cmd->font, cmd->tab_width);
+ ren_set_font_tab_size(cmd->font, cmd->tab_size);
ren_draw_text_subpixel(cmd->font, cmd->text, cmd->subpixel_scale * cmd->rect.x + cmd->x_subpixel_offset, cmd->rect.y, cmd->color);
break;
}
diff --git a/src/renderer.c b/src/renderer.c
index b0be5bdd..d5e86d47 100644
--- a/src/renderer.c
+++ b/src/renderer.c
@@ -23,6 +23,7 @@ struct RenFont {
GlyphSet *sets[MAX_GLYPHSET];
float size;
int height;
+ int space_advance;
FR_Renderer *renderer;
};
@@ -145,6 +146,9 @@ RenFont* ren_load_font(const char *filename, float size, unsigned int renderer_f
}
font->height = FR_Get_Font_Height(font->renderer, size);
+ FR_Bitmap_Glyph_Metrics *gs = get_glyphset(font, ' ')->glyphs;
+ font->space_advance = gs[' '].xadvance;
+
/* make tab and newline glyphs invisible */
FR_Bitmap_Glyph_Metrics *g = get_glyphset(font, '\n')->glyphs;
g['\t'].x1 = g['\t'].x0;
@@ -167,15 +171,15 @@ void ren_free_font(RenFont *font) {
}
-void ren_set_font_tab_width(RenFont *font, int n) {
+void ren_set_font_tab_size(RenFont *font, int n) {
GlyphSet *set = get_glyphset(font, '\t');
- set->glyphs['\t'].xadvance = n;
+ set->glyphs['\t'].xadvance = font->space_advance * n;
}
-int ren_get_font_tab_width(RenFont *font) {
+int ren_get_font_tab_size(RenFont *font) {
GlyphSet *set = get_glyphset(font, '\t');
- return set->glyphs['\t'].xadvance;
+ return set->glyphs['\t'].xadvance / font->space_advance;
}
diff --git a/src/renderer.h b/src/renderer.h
index 50082073..cc1e4b23 100644
--- a/src/renderer.h
+++ b/src/renderer.h
@@ -32,8 +32,8 @@ void ren_free_image(RenImage *image);
RenFont* ren_load_font(const char *filename, float size, unsigned int renderer_flags);
void ren_free_font(RenFont *font);
-void ren_set_font_tab_width(RenFont *font, int n);
-int ren_get_font_tab_width(RenFont *font);
+void ren_set_font_tab_size(RenFont *font, int n);
+int ren_get_font_tab_size(RenFont *font);
int ren_get_font_width(RenFont *font, const char *text, int *subpixel_scale);
int ren_get_font_height(RenFont *font);
int ren_get_font_subpixel_scale(RenFont *font);