aboutsummaryrefslogtreecommitdiff
path: root/src/libdraw/stringwidth.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-07-13 03:57:24 +0000
committerrsc <devnull@localhost>2005-07-13 03:57:24 +0000
commitb2f9ee0de55f3c59c83f479d12cfe8c894935bd7 (patch)
tree9c7e107d71bdda7bec76aba10b4485c023a99f65 /src/libdraw/stringwidth.c
parent3b634dc7e4ab32a6854c8ec93107b2750bf906e8 (diff)
downloadplan9port-b2f9ee0de55f3c59c83f479d12cfe8c894935bd7.tar.gz
plan9port-b2f9ee0de55f3c59c83f479d12cfe8c894935bd7.tar.bz2
plan9port-b2f9ee0de55f3c59c83f479d12cfe8c894935bd7.zip
free subfonts correctly
Diffstat (limited to 'src/libdraw/stringwidth.c')
-rw-r--r--src/libdraw/stringwidth.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/libdraw/stringwidth.c b/src/libdraw/stringwidth.c
index 8d8c6d08..522fbc01 100644
--- a/src/libdraw/stringwidth.c
+++ b/src/libdraw/stringwidth.c
@@ -13,6 +13,7 @@ _stringnwidth(Font *f, char *s, Rune *r, int len)
Rune rune, **rptr;
char *subfontname, **sptr;
Font *def;
+ Subfont *sf;
if(s == nil){
s = "";
@@ -30,6 +31,7 @@ _stringnwidth(Font *f, char *s, Rune *r, int len)
if(len < max)
max = len;
n = 0;
+ sf = nil;
while((l = cachechars(f, sptr, rptr, cbuf, max, &wid, &subfontname)) <= 0){
if(++n > 10){
if(*r)
@@ -40,19 +42,26 @@ _stringnwidth(Font *f, char *s, Rune *r, int len)
name = f->name;
else
name = "unnamed font";
+ freesubfont(sf);
fprint(2, "stringwidth: bad character set for rune 0x%.4ux in %s\n", rune, name);
return twid;
}
if(subfontname){
- if(_getsubfont(f->display, subfontname) == 0){
- def = f->display->defaultfont;
+ freesubfont(sf);
+ if((sf=_getsubfont(f->display, subfontname)) == 0){
+ def = f->display ? f->display->defaultfont : nil;
if(def && f!=def)
f = def;
else
break;
}
+ /*
+ * must not free sf until cachechars has found it in the cache
+ * and picked up its own reference.
+ */
}
}
+ freesubfont(sf);
agefont(f);
twid += wid;
len -= l;