Measure the single advance width with a heuristic method
This fix is needed to use dual-width fonts, which have double-width glyphs (e.g. CJK unified ideographs). Signed-off-by: Ryusei Yamaguchi <mandel59@gmail.com> Signed-off-by: Christoph Lohmann <20h@r-36.net>
This commit is contained in:
parent
30440295bc
commit
034a5c8a09
|
@ -417,3 +417,11 @@ static uint selmasks[] = {
|
||||||
[SEL_RECTANGULAR] = Mod1Mask,
|
[SEL_RECTANGULAR] = Mod1Mask,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Printable characters in ASCII, used to estimate the advance width
|
||||||
|
* of single wide characters.
|
||||||
|
*/
|
||||||
|
static char ascii_printable[] =
|
||||||
|
" !\"#$%&'()*+,-./0123456789:;<=>?"
|
||||||
|
"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
|
||||||
|
"`abcdefghijklmnopqrstuvwxyz{|}~";
|
||||||
|
|
8
st.c
8
st.c
|
@ -68,6 +68,7 @@ char *argv0;
|
||||||
#define LEN(a) (sizeof(a) / sizeof(a)[0])
|
#define LEN(a) (sizeof(a) / sizeof(a)[0])
|
||||||
#define DEFAULT(a, b) (a) = (a) ? (a) : (b)
|
#define DEFAULT(a, b) (a) = (a) ? (a) : (b)
|
||||||
#define BETWEEN(x, a, b) ((a) <= (x) && (x) <= (b))
|
#define BETWEEN(x, a, b) ((a) <= (x) && (x) <= (b))
|
||||||
|
#define DIVCEIL(n, d) (((n) + ((d) - 1)) / (d))
|
||||||
#define ISCONTROLC0(c) (BETWEEN(c, 0, 0x1f) || (c) == '\177')
|
#define ISCONTROLC0(c) (BETWEEN(c, 0, 0x1f) || (c) == '\177')
|
||||||
#define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f))
|
#define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f))
|
||||||
#define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c))
|
#define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c))
|
||||||
|
@ -3277,6 +3278,7 @@ xloadfont(Font *f, FcPattern *pattern)
|
||||||
{
|
{
|
||||||
FcPattern *match;
|
FcPattern *match;
|
||||||
FcResult result;
|
FcResult result;
|
||||||
|
XGlyphInfo extents;
|
||||||
|
|
||||||
match = FcFontMatch(NULL, pattern, &result);
|
match = FcFontMatch(NULL, pattern, &result);
|
||||||
if (!match)
|
if (!match)
|
||||||
|
@ -3287,6 +3289,10 @@ xloadfont(Font *f, FcPattern *pattern)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
XftTextExtentsUtf8(xw.dpy, f->match,
|
||||||
|
(const FcChar8 *) ascii_printable,
|
||||||
|
LEN(ascii_printable), &extents);
|
||||||
|
|
||||||
f->set = NULL;
|
f->set = NULL;
|
||||||
f->pattern = FcPatternDuplicate(pattern);
|
f->pattern = FcPatternDuplicate(pattern);
|
||||||
|
|
||||||
|
@ -3296,7 +3302,7 @@ xloadfont(Font *f, FcPattern *pattern)
|
||||||
f->rbearing = f->match->max_advance_width;
|
f->rbearing = f->match->max_advance_width;
|
||||||
|
|
||||||
f->height = f->ascent + f->descent;
|
f->height = f->ascent + f->descent;
|
||||||
f->width = f->lbearing + f->rbearing;
|
f->width = DIVCEIL(extents.xOff, LEN(ascii_printable));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user