use new font system from drw

This commit is contained in:
Markus Teich 2015-04-20 22:20:16 +02:00
parent 76d3b0bb95
commit 85d25716b0
2 changed files with 40 additions and 34 deletions

View File

@ -2,8 +2,12 @@
/* The three fields set to 0 have to stay that way for a scalable font */ /* The three fields set to 0 have to stay that way for a scalable font */
static char *font = "-*-dejavu sans condensed-bold-r-*-*-0-0-*-*-*-0-*-*"; static char *font = "-*-dejavu sans condensed-bold-r-*-*-0-0-*-*-*-0-*-*";
#define NUMFONTS 30 static char *fontfallbacks[] = {
#define FONTSZ(x) ((int)(100.0 * powf(1.1288, (x)))) /* x in [0, NUMFONTS-1] */ "dejavu",
"trollolo",
};
#define NUMFONTSCALES 30
#define FONTSZ(x) ((int)(10.0 * powf(1.1288, (x)))) /* x in [0, NUMFONTSCALES-1] */
/* how much screen estate is to be used at max for the content */ /* how much screen estate is to be used at max for the content */
static float usablewidth = 0.75; static float usablewidth = 0.75;

66
sent.c
View File

@ -93,7 +93,7 @@ static void pngdraw(struct image *img);
static Bool xfontisscalable(char *name); static Bool xfontisscalable(char *name);
static XFontStruct *xloadqueryscalablefont(char *name, int size); static XFontStruct *xloadqueryscalablefont(char *name, int size);
static struct DC *getfontsize(char *str, size_t len, int *width, int *height); static void getfontsize(char *str, int *width, int *height);
static void cleanup(struct DC *cur); static void cleanup(struct DC *cur);
static void eprintf(const char *, ...); static void eprintf(const char *, ...);
static void die(const char *, ...); static void die(const char *, ...);
@ -125,7 +125,7 @@ static XWindow xw;
static struct DC dc; static struct DC dc;
static Drw *d = NULL; static Drw *d = NULL;
static Scm *sc; static Scm *sc;
static Fnt *fonts[NUMFONTS]; static Fnt *fonts[NUMFONTSCALES];
static int running = 1; static int running = 1;
static void (*handler[LASTEvent])(XEvent *) = { static void (*handler[LASTEvent])(XEvent *) = {
@ -381,24 +381,17 @@ XFontStruct *xloadqueryscalablefont(char *name, int size)
return (field != 14) ? NULL : XLoadQueryFont(xw.dpy, newname); return (field != 14) ? NULL : XLoadQueryFont(xw.dpy, newname);
} }
struct DC *getfontsize(char *str, size_t len, int *width, int *height) void getfontsize(char *str, int *width, int *height)
{ {
XCharStruct info; size_t i;
int unused;
struct DC *pre = &dc;
struct DC *cur = &dc;
do { for (i = 0; i < NUMFONTSCALES; i++) {
XTextExtents(cur->font, str, len, &unused, &unused, &unused, &info); drw_setfontset(d, fonts[i]);
if (info.width > xw.uw || info.ascent + info.descent > xw.uh) if ((*width = drw_fontset_getwidth(d, str)) > xw.uw || (*height = d->fonts->h) > xw.uh)
break; break;
pre = cur; }
} while ((cur = cur->next)); if (i > 0)
drw_setfontset(d, fonts[i-1]);
XTextExtents(pre->font, "o", 1, &unused, &unused, &unused, &info);
*height = info.ascent;
*width = XTextWidth(pre->font, str, len);
return pre;
} }
void cleanup(struct DC *cur) void cleanup(struct DC *cur)
@ -545,18 +538,15 @@ void usage()
void xdraw() void xdraw()
{ {
int line_len = strlen(slides[idx].text); int height;
// int height; int width;
// int width;
// struct DC *dc = getfontsize(slides[idx].text, line_len, &width, &height);
struct image *im = slides[idx].img; struct image *im = slides[idx].img;
getfontsize(slides[idx].text, &width, &height);
XClearWindow(xw.dpy, xw.win); XClearWindow(xw.dpy, xw.win);
if (!im) { if (!im) {
// XDrawString(xw.dpy, xw.win, dc->gc, (xw.w - width)/2, (xw.h + height)/2, drw_text(d, (xw.w - width) / 2, (xw.h - height) / 2, width, height, slides[idx].text, 0);
// slides[idx].text, line_len);
drw_text(d, xw.w/2, xw.h/2, 1000, 200, slides[idx].text, 0);
drw_map(d, xw.win, 0, 0, xw.w, xw.h); drw_map(d, xw.win, 0, 0, xw.w, xw.h);
} else if (!(im->state & LOADED) && !pngread(im)) } else if (!(im->state & LOADED) && !pngread(im))
eprintf("could not read image %s", slides[idx].text + 1); eprintf("could not read image %s", slides[idx].text + 1);
@ -626,29 +616,41 @@ void xinit()
void xloadfonts(char *fontstr) void xloadfonts(char *fontstr)
{ {
int count = 0; int count = 0;
int i = 0; int i, j;
XFontStruct *fnt; XFontStruct *fnt;
XGCValues gcvalues; XGCValues gcvalues;
struct DC *cur = &dc; struct DC *cur = &dc;
// char **fstr = XListFonts(xw.dpy, fontstr, 42, &count); char *fstrs[LEN(fontfallbacks)];
char *fstrs;
const char **fonts;
if (!(fstrs = malloc(NUMFONTS * MAXFONTSTRLEN))) for (j = 0; j < LEN(fontfallbacks); j++) {
if (!(fstrs[j] = malloc(MAXFONTSTRLEN)))
die("could not malloc fstrs");
}
for (i = 0; i < NUMFONTSCALES; i++) {
for (j = 0; j < LEN(fontfallbacks); j++) {
if (MAXFONTSTRLEN < snprintf(fstrs[j], MAXFONTSTRLEN, "%s:size=%d", fontfallbacks[j], FONTSZ(i)))
die("font string too long");
}
fonts[i] = drw_fontset_create(d, (const char**)fstrs, LEN(fstrs));
}
drw_setfontset(d, fonts[19]);
/* if (!(fstrs = malloc(NUMFONTS * MAXFONTSTRLEN)))
die("could not malloc fontstrings"); die("could not malloc fontstrings");
if (!(fonts = malloc(NUMFONTS * sizeof(char*)))) { if (!(fonts = malloc(NUMFONTS * sizeof(char*)))) {
free(fstrs); free(fstrs);
die("could not malloc fontarray"); die("could not malloc fontarray");
} }
/* const char *fonts[] = { const char *fonts[] = {
"Sans:size=80:size=10.5", "Sans:size=80:size=10.5",
"VL Gothic:size=10.5", "VL Gothic:size=10.5",
"WenQuanYi Micro Hei:size=10.5", "WenQuanYi Micro Hei:size=10.5",
}; */ }; */
// drw_load_fonts(d, fonts, LEN(fonts)); // drw_load_fonts(d, fonts, LEN(fonts));
for (i = 0; i < NUMFONTS; i++) { /* for (i = 0; i < NUMFONTS; i++) {
snprintf(&fstrs[i*MAXFONTSTRLEN], MAXFONTSTRLEN, "%s:size=%d", fontstr, FONTSZ(i)); snprintf(&fstrs[i*MAXFONTSTRLEN], MAXFONTSTRLEN, "%s:size=%d", fontstr, FONTSZ(i));
puts(&fstrs[i*MAXFONTSTRLEN]); puts(&fstrs[i*MAXFONTSTRLEN]);
fonts[i] = &fstrs[i*MAXFONTSTRLEN]; fonts[i] = &fstrs[i*MAXFONTSTRLEN];
@ -658,7 +660,7 @@ void xloadfonts(char *fontstr)
free(fstrs); free(fstrs);
free(fonts); free(fonts);
*/
// while (count-- && !xfontisscalable(fstr[count])) // while (count-- && !xfontisscalable(fstr[count]))
// ; /* nothing, just get first scalable font result */ // ; /* nothing, just get first scalable font result */
// //