xref: /plan9/sys/src/cmd/unix/drawterm/libmemdraw/string.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include <u.h>
2*8ccd4a63SDavid du Colombier #include <libc.h>
3*8ccd4a63SDavid du Colombier #include <draw.h>
4*8ccd4a63SDavid du Colombier #include <memdraw.h>
5*8ccd4a63SDavid du Colombier #include <memlayer.h>
67dd7cddfSDavid du Colombier 
77dd7cddfSDavid du Colombier Point
memimagestring(Memimage * b,Point p,Memimage * color,Point cp,Memsubfont * f,char * cs)8*8ccd4a63SDavid du Colombier memimagestring(Memimage *b, Point p, Memimage *color, Point cp, Memsubfont *f, char *cs)
97dd7cddfSDavid du Colombier {
107dd7cddfSDavid du Colombier 	int w, width;
117dd7cddfSDavid du Colombier 	uchar *s;
127dd7cddfSDavid du Colombier 	Rune c;
137dd7cddfSDavid du Colombier 	Fontchar *i;
147dd7cddfSDavid du Colombier 
157dd7cddfSDavid du Colombier 	s = (uchar*)cs;
16*8ccd4a63SDavid du Colombier 	for(; (c=*s); p.x+=width, cp.x+=width){
177dd7cddfSDavid du Colombier 		width = 0;
187dd7cddfSDavid du Colombier 		if(c < Runeself)
197dd7cddfSDavid du Colombier 			s++;
207dd7cddfSDavid du Colombier 		else{
217dd7cddfSDavid du Colombier 			w = chartorune(&c, (char*)s);
227dd7cddfSDavid du Colombier 			if(w == 0){
237dd7cddfSDavid du Colombier 				s++;
247dd7cddfSDavid du Colombier 				continue;
257dd7cddfSDavid du Colombier 			}
267dd7cddfSDavid du Colombier 			s += w;
277dd7cddfSDavid du Colombier 		}
287dd7cddfSDavid du Colombier 		if(c >= f->n)
297dd7cddfSDavid du Colombier 			continue;
30*8ccd4a63SDavid du Colombier //		i = f->info+c;
31*8ccd4a63SDavid du Colombier 		i = &(f->info[c]);
327dd7cddfSDavid du Colombier 		width = i->width;
337dd7cddfSDavid du Colombier 		memdraw(b, Rect(p.x+i->left, p.y+i->top, p.x+i->left+(i[1].x-i[0].x), p.y+i->bottom),
34*8ccd4a63SDavid du Colombier 			color, cp, f->bits, Pt(i->x, i->top), SoverD);
357dd7cddfSDavid du Colombier 	}
367dd7cddfSDavid du Colombier 	return p;
377dd7cddfSDavid du Colombier }
387dd7cddfSDavid du Colombier 
397dd7cddfSDavid du Colombier Point
memsubfontwidth(Memsubfont * f,char * cs)407dd7cddfSDavid du Colombier memsubfontwidth(Memsubfont *f, char *cs)
417dd7cddfSDavid du Colombier {
427dd7cddfSDavid du Colombier 	Rune c;
437dd7cddfSDavid du Colombier 	Point p;
447dd7cddfSDavid du Colombier 	uchar *s;
457dd7cddfSDavid du Colombier 	Fontchar *i;
467dd7cddfSDavid du Colombier 	int w, width;
477dd7cddfSDavid du Colombier 
487dd7cddfSDavid du Colombier 	p = Pt(0, f->height);
497dd7cddfSDavid du Colombier 	s = (uchar*)cs;
50*8ccd4a63SDavid du Colombier 	for(; (c=*s); p.x+=width){
517dd7cddfSDavid du Colombier 		width = 0;
527dd7cddfSDavid du Colombier 		if(c < Runeself)
537dd7cddfSDavid du Colombier 			s++;
547dd7cddfSDavid du Colombier 		else{
557dd7cddfSDavid du Colombier 			w = chartorune(&c, (char*)s);
567dd7cddfSDavid du Colombier 			if(w == 0){
577dd7cddfSDavid du Colombier 				s++;
587dd7cddfSDavid du Colombier 				continue;
597dd7cddfSDavid du Colombier 			}
607dd7cddfSDavid du Colombier 			s += w;
617dd7cddfSDavid du Colombier 		}
627dd7cddfSDavid du Colombier 		if(c >= f->n)
637dd7cddfSDavid du Colombier 			continue;
647dd7cddfSDavid du Colombier 		i = f->info+c;
657dd7cddfSDavid du Colombier 		width = i->width;
667dd7cddfSDavid du Colombier 	}
677dd7cddfSDavid du Colombier 	return p;
687dd7cddfSDavid du Colombier }
69