aboutsummarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Lohmann2012-10-04 22:59:45 +0200
committerChristoph Lohmann2012-10-04 22:59:45 +0200
commit926206cdb0602c860963080a5db8959dc37788ff (patch)
treed745a81e2170738ce22436db2aa00db328362e99
parent682e8c75212332920a1abed22fa441e1a33dc9ca (diff)
downloadaur-926206cdb0602c860963080a5db8959dc37788ff.tar.gz
This adds the fontcache dependency to try something out. Additionally the
invert mode now works as expected. In the config.def.h autohint is set to false, so the fonts are drawn correctly, without any overlapping.
-rw-r--r--config.def.h2
-rw-r--r--config.mk2
-rw-r--r--st.c96
3 files changed, 69 insertions, 31 deletions
diff --git a/config.def.h b/config.def.h
index 3e6667a8dd7e..9c6494885539 100644
--- a/config.def.h
+++ b/config.def.h
@@ -1,5 +1,5 @@
-#define FONT "Liberation Mono:pixelsize=12:antialias=true:autohint=true"
+#define FONT "Liberation Mono:pixelsize=12:antialias=true:autohint=false"
/* Space in pixels around the terminal buffer */
#define BORDER 2
diff --git a/config.mk b/config.mk
index f57afa20e37b..3cd714fc7691 100644
--- a/config.mk
+++ b/config.mk
@@ -12,7 +12,7 @@ X11LIB = /usr/X11R6/lib
# includes and libs
INCS = -I. -I/usr/include -I${X11INC} -I/usr/include/freetype2
-LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lutil -lXext -lXft
+LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lutil -lXext -lXft -lfontconfig
# flags
CPPFLAGS = -DVERSION=\"${VERSION}\"
diff --git a/st.c b/st.c
index 4fbe05c9ef76..b4dc5912b371 100644
--- a/st.c
+++ b/st.c
@@ -26,6 +26,7 @@
#include <X11/keysym.h>
#include <X11/extensions/Xdbe.h>
#include <X11/Xft/Xft.h>
+#include <fontconfig/fontconfig.h>
#define Glyph Glyph_
#define Font Font_
@@ -235,6 +236,8 @@ typedef struct {
/* Font structure */
typedef struct {
+ int height;
+ int width;
int ascent;
int descent;
short lbearing;
@@ -1345,7 +1348,7 @@ tsetmode(bool priv, bool set, int *args, int narg) {
case 1: /* DECCKM -- Cursor key */
MODBIT(term.mode, set, MODE_APPKEYPAD);
break;
- case 5: /* DECSCNM -- Reverve video */
+ case 5: /* DECSCNM -- Reverse video */
mode = term.mode;
MODBIT(term.mode, set, MODE_REVERSE);
if(mode != term.mode)
@@ -1965,8 +1968,8 @@ xloadcols(void) {
}
/* load colors [16-255] ; same colors as xterm */
- for(i = 16, r = 0; r < 6; r++)
- for(g = 0; g < 6; g++)
+ for(i = 16, r = 0; r < 6; r++) {
+ for(g = 0; g < 6; g++) {
for(b = 0; b < 6; b++) {
xft_color.red = r == 0 ? 0 : 0x3737 + 0x2828 * r;
xft_color.green = g == 0 ? 0 : 0x3737 + 0x2828 * g;
@@ -1976,12 +1979,13 @@ xloadcols(void) {
}
i++;
}
+ }
+ }
for(r = 0; r < 24; r++, i++) {
xft_color.red = xft_color.green = xft_color.blue = 0x0808 + 0x0a0a * r;
if(!XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &xft_color, &dc.xft_col[i])) {
- dc.xft_col[i] = dc.xft_col[256];
- fprintf(stderr, "Could not allocate color %d\n", i);
+ die("Could not allocate color %d\n", i);
}
}
}
@@ -2045,15 +2049,29 @@ xhints(void) {
void
xinitfont(Font *f, char *fontstr) {
- f->xft_set = XftFontOpenName(xw.dpy, xw.scr, fontstr);
-
- if(!f->xft_set)
+ FcPattern *pattern, *match;
+ FcResult result;
+
+ pattern = FcNameParse((FcChar8 *)fontstr);
+ if(!pattern)
+ die("st: can't open font %s\n", fontstr);
+
+ match = XftFontMatch(xw.dpy, xw.scr, pattern, &result);
+ FcPatternDestroy(pattern);
+ if(!match)
+ die("st: can't open font %s\n", fontstr);
+ if(!(f->xft_set = XftFontOpenPattern(xw.dpy, match))) {
+ FcPatternDestroy(match);
die("st: can't open font %s.\n", fontstr);
+ }
f->ascent = f->xft_set->ascent;
f->descent = f->xft_set->descent;
f->lbearing = 0;
f->rbearing = f->xft_set->max_advance_width;
+
+ f->height = f->xft_set->height;
+ f->width = f->lbearing + f->rbearing;
}
void
@@ -2061,6 +2079,8 @@ initfonts(char *fontstr) {
char *fstr;
xinitfont(&dc.font, fontstr);
+ xw.cw = dc.font.width;
+ xw.ch = dc.font.height;
fstr = smstrcat(fontstr, ":weight=bold", NULL);
xinitfont(&dc.bfont, fstr);
@@ -2090,10 +2110,6 @@ xinit(void) {
/* font */
initfonts((opt_font != NULL)? opt_font : FONT);
- /* XXX: Assuming same size for bold font */
- xw.cw = dc.font.rbearing - dc.font.lbearing;
- xw.ch = dc.font.ascent + dc.font.descent;
-
/* colors */
xw.cmap = XDefaultColormap(xw.dpy, xw.scr);
xloadcols();
@@ -2166,37 +2182,59 @@ xinit(void) {
void
xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
- int fg = base.fg, bg = base.bg, temp;
- int winx = BORDER+x*xw.cw, winy = BORDER+y*xw.ch + dc.font.ascent, width = charlen*xw.cw;
+ int winx = BORDER+x*xw.cw, winy = BORDER+y*xw.ch,
+ width = charlen*xw.cw;
Font *font = &dc.font;
XGlyphInfo extents;
-
- /* only switch default fg/bg if term is in RV mode */
- if(IS_SET(MODE_REVERSE)) {
- if(fg == DefaultFG)
- fg = DefaultBG;
- if(bg == DefaultBG)
- bg = DefaultFG;
- }
+ XftColor *fg = &dc.xft_col[base.fg], *bg = &dc.xft_col[base.bg],
+ *temp, revfg, revbg;
+ XRenderColor colfg, colbg;
if(base.mode & ATTR_REVERSE)
temp = fg, fg = bg, bg = temp;
-
- if(base.mode & ATTR_BOLD)
+ if(base.mode & ATTR_BOLD) {
+ fg = &dc.xft_col[base.fg + 8];
font = &dc.bfont;
-
+ }
if(base.mode & ATTR_ITALIC)
font = &dc.ifont;
if(base.mode & (ATTR_ITALIC|ATTR_ITALIC))
font = &dc.ibfont;
- XftTextExtentsUtf8(xw.dpy, font->xft_set, (FcChar8 *)s, bytelen, &extents);
+ if(IS_SET(MODE_REVERSE)) {
+ if(fg == &dc.xft_col[DefaultFG]) {
+ fg = &dc.xft_col[DefaultBG];
+ } else {
+ colfg.red = ~fg->color.red;
+ colfg.green = ~fg->color.green;
+ colfg.blue = ~fg->color.blue;
+ colfg.alpha = fg->color.alpha;
+ XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, &revfg);
+ fg = &revfg;
+ }
+
+ if(bg == &dc.xft_col[DefaultBG]) {
+ bg = &dc.xft_col[DefaultFG];
+ } else {
+ colbg.red = ~bg->color.red;
+ colbg.green = ~bg->color.green;
+ colbg.blue = ~bg->color.blue;
+ colbg.alpha = bg->color.alpha;
+ XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colbg, &revbg);
+ bg = &revbg;
+ }
+ }
+
+ XftTextExtentsUtf8(xw.dpy, font->xft_set, (FcChar8 *)s, bytelen,
+ &extents);
width = extents.xOff;
- XftDrawRect(xw.xft_draw, &dc.xft_col[bg], winx, winy - font->ascent, width, xw.ch);
- XftDrawStringUtf8(xw.xft_draw, &dc.xft_col[fg], font->xft_set, winx, winy, (FcChar8 *)s, bytelen);
+
+ XftDrawRect(xw.xft_draw, bg, winx, winy, width, xw.ch);
+ XftDrawStringUtf8(xw.xft_draw, fg, font->xft_set, winx,
+ winy + font->ascent, (FcChar8 *)s, bytelen);
if(base.mode & ATTR_UNDERLINE) {
- XftDrawRect(xw.xft_draw, &dc.xft_col[fg], winx, winy+1,
+ XftDrawRect(xw.xft_draw, fg, winx, winy+1,
width, 1);
}
}