summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/libdraw/font.c22
-rw-r--r--sys/src/libdraw/string.c2
-rw-r--r--sys/src/libdraw/stringwidth.c2
3 files changed, 14 insertions, 12 deletions
diff --git a/sys/src/libdraw/font.c b/sys/src/libdraw/font.c
index 4eaeb9e8d..7247c9a92 100644
--- a/sys/src/libdraw/font.c
+++ b/sys/src/libdraw/font.c
@@ -7,10 +7,11 @@ static int freeup(Font*);
#define PJW 0 /* use NUL==pjw for invisible characters */
+/* return number of translated cache indices, 0 must retry, -1 on error */
int
cachechars(Font *f, char **ss, Rune **rr, ushort *cp, int max, int *wp, char **subfontname)
{
- int i, th, sh, h, w, rw, wid, nc;
+ int i, j, th, sh, h, w, rw, wid, nc;
char *sp;
Rune r, *rp, vr;
ulong a;
@@ -78,14 +79,16 @@ cachechars(Font *f, char **ss, Rune **rr, ushort *cp, int max, int *wp, char **s
}
}
- if(c->age == f->age) /* flush pending string output */
+ if(i > 0 && c->age == f->age) /* flush pending string output */
break;
- if(loadchar(f, r, c, h, i, subfontname) <= 0)
- break;
+ j = loadchar(f, r, c, h, i, subfontname);
+ if(j <= 0){
+ if(j < 0 || i > 0) /* flush output or retry */
+ break;
+ return -1; /* stop retrying */
+ }
- c = &f->cache[h]; /* may have reallocated f->cache */
-
Found:
wid += c->width;
c->age = f->age;
@@ -282,9 +285,8 @@ loadchar(Font *f, Rune r, Cacheinfo *c, int h, int noflush, char **subfontname)
f->width = wid;
if(f->maxdepth < subf->f->bits->depth)
f->maxdepth = subf->f->bits->depth;
- i = fontresize(f, f->width, f->ncache, f->maxdepth);
- if(i <= 0)
- return i;
+ if(fontresize(f, f->width, f->ncache, f->maxdepth) <= 0)
+ return -1;
/* c is still valid as didn't reallocate f->cache */
}
c->value = r;
@@ -340,7 +342,7 @@ freeup(Font *f)
return nf;
}
-/* return whether resize succeeded && f->cache is unchanged */
+/* returns whether resize succeeded && f->cache is unchanged */
static int
fontresize(Font *f, int wid, int ncache, int depth)
{
diff --git a/sys/src/libdraw/string.c b/sys/src/libdraw/string.c
index 2dc2a63e7..c15bf2777 100644
--- a/sys/src/libdraw/string.c
+++ b/sys/src/libdraw/string.c
@@ -92,7 +92,7 @@ _string(Image *dst, Point pt, Image *src, Point sp, Font *f, char *s, Rune *r, i
}
}
if((n = cachechars(f, sptr, rptr, cbuf, max, &wid, &subfontname)) <= 0){
- if(subfontname){
+ if(n == 0){
if(++try > 10)
break;
continue;
diff --git a/sys/src/libdraw/stringwidth.c b/sys/src/libdraw/stringwidth.c
index f0757a095..3548aba0b 100644
--- a/sys/src/libdraw/stringwidth.c
+++ b/sys/src/libdraw/stringwidth.c
@@ -39,7 +39,7 @@ _stringnwidth(Font *f, char *s, Rune *r, int len)
}
}
if((n = cachechars(f, sptr, rptr, cbuf, max, &wid, &subfontname)) <= 0){
- if(subfontname){
+ if(n == 0){
if(++try > 10)
break;
continue;