9 elidenl(char **sp, int *np)
21 while(++s < e && isspace(*s));
33 readtext(char *fn, char **sp, int newline)
40 if(fd < 0) sysfatal("open: %r");
46 s = realloc(s, a += B);
47 if(s == nil) sysfatal("realloc: %r");
48 rc = read(fd, &s[n], B);
49 if(rc < 0) sysfatal("read: %r");
56 if(s == nil) sysfatal("realloc: %r");
64 fprint(2, "usage: %s [ -lrjn ] [ -s scale ] [ -w width ] [ -h height ] [ -p ppem ] font [ text ]\n", argv0);
75 if(p == s || *p != 0 || n <= 0)
81 scaledown(TTBitmap *b, int scale)
86 a = ttfnewbitmap(b->width / scale * 8, b->height / scale);
87 if(a == nil) sysfatal("ttfnewbitmap: %r");
88 for(j = 0; j < b->height; j++)
89 for(i = 0; i < b->width; i++){
90 if((b->bit[j * b->stride + (i>>3)] >> 7 - (i & 7) & 1) != 0)
91 a->bit[j/scale * a->stride + i/scale]++;
92 if(j % scale == scale - 1 && i % scale == scale - 1)
93 a->bit[j/scale * a->stride + i/scale] = ~((a->bit[j/scale * a->stride + i/scale] * 255 + scale * scale / 2) / (scale * scale));
99 cropwrite(TTBitmap *b)
108 for(i = u; i < d; i++)
109 if(b->bit[i * b->stride + l] != 0xff)
113 for(i = u; i < d; i++)
114 if(b->bit[i * b->stride + r - 1] != 0xff)
118 for(i = l; i < r; i++)
119 if(b->bit[u * b->stride + i] != 0xff)
123 for(i = l; i < r; i++)
124 if(b->bit[(d - 1) * b->stride + i] != 0xff)
127 print("%11s %11d %11d %11d %11d ", "k8", 0, 0, r - l, d - u);
128 for(i = u; i < d; i++)
129 write(1, b->bit + i * b->stride + l, r - l);
134 main(int argc, char **argv)
136 static int flags, scale, width, height, ppem, newline, crop;
137 char *font, *txtfn, *txt;
149 case 'r': flags |= TTFRALIGN; break;
150 case 'c': flags |= TTFCENTER; break;
151 case 'j': flags |= TTFJUSTIFY; break;
152 case 'p': ppem = number(EARGF(usage())); break;
153 case 's': scale = number(EARGF(usage())); break;
154 case 'w': width = number(EARGF(usage())); break;
155 case 'h': height = number(EARGF(usage())); break;
156 case 'n': newline++; break;
157 case 'C': crop++; break;
159 if((uint)(argc - 1) > 1) usage();
161 txtfn = argc > 1 ? argv[1] : "/fd/0";
162 txtn = readtext(txtfn, &txt, newline);
163 f = ttfopen(font, ppem * scale, 0);
164 if(f == nil) sysfatal("ttfopen: %r");
165 b = ttfrender(f, txt, txt + txtn, width * scale, height * scale, flags, nil);
166 if(b == nil) sysfatal("ttfrender: %r");
167 d = scaledown(b, scale);
168 if(crop) cropwrite(d);
170 print("%11s %11d %11d %11d %11d ", "k8", 0, 0, d->width/8, d->height);
171 write(1, d->bit, d->stride * d->height);