153 lines · 3.2 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <draw.h> enum{	Max = 100}; Pointstring(Image *dst, Point pt, Image *src, Point sp, Font *f, char *s){	return _string(dst, pt, src, sp, f, s, nil, 1<<24, dst->clipr, nil, ZP, SoverD);} Pointstringop(Image *dst, Point pt, Image *src, Point sp, Font *f, char *s, Drawop op){	return _string(dst, pt, src, sp, f, s, nil, 1<<24, dst->clipr, nil, ZP, op);} Pointstringn(Image *dst, Point pt, Image *src, Point sp, Font *f, char *s, int len){	return _string(dst, pt, src, sp, f, s, nil, len, dst->clipr, nil, ZP, SoverD);} Pointstringnop(Image *dst, Point pt, Image *src, Point sp, Font *f, char *s, int len, Drawop op){	return _string(dst, pt, src, sp, f, s, nil, len, dst->clipr, nil, ZP, op);} Pointrunestring(Image *dst, Point pt, Image *src, Point sp, Font *f, Rune *r){	return _string(dst, pt, src, sp, f, nil, r, 1<<24, dst->clipr, nil, ZP, SoverD);} Pointrunestringop(Image *dst, Point pt, Image *src, Point sp, Font *f, Rune *r, Drawop op){	return _string(dst, pt, src, sp, f, nil, r, 1<<24, dst->clipr, nil, ZP, op);} Pointrunestringn(Image *dst, Point pt, Image *src, Point sp, Font *f, Rune *r, int len){	return _string(dst, pt, src, sp, f, nil, r, len, dst->clipr, nil, ZP, SoverD);} Pointrunestringnop(Image *dst, Point pt, Image *src, Point sp, Font *f, Rune *r, int len, Drawop op){	return _string(dst, pt, src, sp, f, nil, r, len, dst->clipr, nil, ZP, op);} Point_string(Image *dst, Point pt, Image *src, Point sp, Font *f, char *s, Rune *r, int len, Rectangle clipr, Image *bg, Point bgp, Drawop op){	int m, n, wid, max, try;	ushort cbuf[Max], *c, *ec;	uchar *b;	char *subfontname;	char **sptr;	Rune **rptr, rune;	Subfont *sf; 	if(s == nil){		s = "";		sptr = nil;	}else		sptr = &s;	if(r == nil){		r = (Rune*) L"";		rptr = nil;	}else		rptr = &r;	subfontname = nil;	sf = nil;	try = 0;	while((*s || *r) && len > 0){		max = Max;		if(len < max)			max = len;		if(subfontname){			freesubfont(sf);			if((sf=_getsubfont(f->display, subfontname)) == nil){				if(f->display->defaultfont == nil || f->display->defaultfont == f)					break;				f = f->display->defaultfont;			}		}		if((n = cachechars(f, sptr, rptr, cbuf, max, &wid, &subfontname)) <= 0){			if(n == 0){				if(++try > 10)					break;				continue;			}			if(*r)				r++;			else				s += chartorune(&rune, s);			len--;			continue;		}		try = 0; 		m = 47+2*n;		if(bg)			m += 4+2*4;		_lockdisplay(dst->display);		b = _bufimageop(dst->display, m, op);		if(b == nil){			_unlockdisplay(dst->display);			fprint(2, "string: %r\n");			break;		}		if(bg)			b[0] = 'x';		else			b[0] = 's';		BPLONG(b+1, dst->id);		BPLONG(b+5, src->id);		BPLONG(b+9, f->cacheimage->id);		BPLONG(b+13, pt.x);		BPLONG(b+17, pt.y+f->ascent);		BPLONG(b+21, clipr.min.x);		BPLONG(b+25, clipr.min.y);		BPLONG(b+29, clipr.max.x);		BPLONG(b+33, clipr.max.y);		BPLONG(b+37, sp.x);		BPLONG(b+41, sp.y);		BPSHORT(b+45, n);		b += 47;		if(bg){			BPLONG(b, bg->id);			BPLONG(b+4, bgp.x);			BPLONG(b+8, bgp.y);			b += 12;		}		ec = &cbuf[n];		for(c=cbuf; c<ec; c++, b+=2)			BPSHORT(b, *c);		_unlockdisplay(dst->display);		pt.x += wid;		bgp.x += wid;		agefont(f);		len -= n;	}	freesubfont(sf);	return pt;}