aboutsummaryrefslogtreecommitdiff
path: root/src/libdraw/getsubfont.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libdraw/getsubfont.c')
-rw-r--r--src/libdraw/getsubfont.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/src/libdraw/getsubfont.c b/src/libdraw/getsubfont.c
index 1a5006b4..ba675390 100644
--- a/src/libdraw/getsubfont.c
+++ b/src/libdraw/getsubfont.c
@@ -1,12 +1,14 @@
#include <u.h>
#include <libc.h>
#include <draw.h>
+#include "defont.h"
/*
* Default version: treat as file name
*/
int _fontpipe(char*);
+static int defaultpipe(void);
static void scalesubfont(Subfont*, int);
@@ -17,12 +19,14 @@ _getsubfont(Display *d, char *name)
Subfont *f;
int scale;
char *fname;
-
+
scale = parsefontscale(name, &fname);
- fd = open(fname, OREAD);
+ if(strcmp(fname, "*default*") == 0)
+ fd = defaultpipe();
+ else
+ fd = open(fname, OREAD);
if(fd < 0 && strncmp(fname, "/mnt/font/", 10) == 0)
fd = _fontpipe(fname+10);
-
if(fd < 0){
fprint(2, "getsubfont: can't open %s: %r\n", fname);
return 0;
@@ -46,6 +50,21 @@ _getsubfont(Display *d, char *name)
return f;
}
+static int
+defaultpipe(void)
+{
+ int p[2];
+
+ // assuming defontdata (<5k) fits in pipe buffer.
+ // especially reasonable since p9pipe is actually
+ // a socket pair.
+ if(pipe(p) < 0)
+ return -1;
+ write(p[1], defontdata, sizeof defontdata);
+ close(p[1]);
+ return p[0];
+}
+
static void
scalesubfont(Subfont *f, int scale)
{
@@ -69,8 +88,10 @@ scalesubfont(Subfont *f, int scale)
i = allocimage(f->bits->display, r2, f->bits->chan, 0, DBlack);
for(y=r.min.y; y < r.max.y; y++) {
n = unloadimage(f->bits, Rect(r.min.x, y, r.max.x, y+1), src, srcn);
- if(n != srcn)
- sysfatal("scalesubfont: bad unload: %d < %d: %r", n, srcn);
+ if(n != srcn) {
+ abort();
+ sysfatal("scalesubfont: bad unload %R %R: %d < %d: %r", f->bits->r, Rect(r.min.x, y, r.max.x, y+1), n, srcn);
+ }
memset(dst, 0, dstn+1);
pack = 8 / f->bits->depth;
mask = (1<<f->bits->depth) - 1;