1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
/* Copyright (c) 1992 AT&T - All rights reserved. */
#include <libc.h>
#include <libg.h>
#include "libgint.h"
enum { Max = 128 };
Point
string(Bitmap *b, Point p, Font *ft, char *s, Fcode f)
{
int x, y, wid, i, j, n, nti, cf;
XChar2b cbuf[Max];
unsigned short fbuf[Max];
XTextItem16 ti[Max];
Rune r;
GC g;
x = p.x;
y = p.y;
if (b->flag&SHIFT){
x -= b->r.min.x;
y -= b->r.min.y;
}
y += ft->ascent;
g = _getfillgc(f, b, ~0);
while (*s) {
n = cachechars(ft, &s, cbuf, Max, &wid, fbuf);
if (n <= 0) {
s += chartorune(&r, s);
continue;
}
nti = 0;
cf = fbuf[0]; /* first font */
ti[0].chars = cbuf;
ti[0].delta = 0;
ti[0].font = (xFont)ft->subf[cf].f->id;
for (i = 1, j = 1; i < n; i++, j++) {
if (fbuf[i] != cf) { /* font change */
cf = fbuf[i];
ti[nti++].nchars = j;
ti[nti].chars = &cbuf[i];
ti[nti].delta = 0;
ti[nti].font = (xFont)ft->subf[cf].f->id;
j = 0;
}
}
ti[nti++].nchars = j;
XDrawText16(_dpy, (Drawable)b->id, g, x, y, ti, nti);
x += wid;
}
p.x = (b->flag&SHIFT) ? x + b->r.min.x : x;
return p;
}
|