xref: /plan9/sys/src/libmemdraw/string.c (revision 6a9fc400c33447ef5e1cda7185cb4de2c8e8010e)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier #include <memdraw.h>
57dd7cddfSDavid 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)87dd7cddfSDavid 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;
167dd7cddfSDavid 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;
307dd7cddfSDavid du Colombier 		i = f->info+c;
317dd7cddfSDavid du Colombier 		width = i->width;
327dd7cddfSDavid 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),
33*6a9fc400SDavid du Colombier 			color, cp, f->bits, Pt(i->x, i->top), SoverD);
347dd7cddfSDavid du Colombier 	}
357dd7cddfSDavid du Colombier 	return p;
367dd7cddfSDavid du Colombier }
377dd7cddfSDavid du Colombier 
387dd7cddfSDavid du Colombier Point
memsubfontwidth(Memsubfont * f,char * cs)397dd7cddfSDavid du Colombier memsubfontwidth(Memsubfont *f, char *cs)
407dd7cddfSDavid du Colombier {
417dd7cddfSDavid du Colombier 	Rune c;
427dd7cddfSDavid du Colombier 	Point p;
437dd7cddfSDavid du Colombier 	uchar *s;
447dd7cddfSDavid du Colombier 	Fontchar *i;
457dd7cddfSDavid du Colombier 	int w, width;
467dd7cddfSDavid du Colombier 
477dd7cddfSDavid du Colombier 	p = Pt(0, f->height);
487dd7cddfSDavid du Colombier 	s = (uchar*)cs;
497dd7cddfSDavid du Colombier 	for(; c=*s; p.x+=width){
507dd7cddfSDavid du Colombier 		width = 0;
517dd7cddfSDavid du Colombier 		if(c < Runeself)
527dd7cddfSDavid du Colombier 			s++;
537dd7cddfSDavid du Colombier 		else{
547dd7cddfSDavid du Colombier 			w = chartorune(&c, (char*)s);
557dd7cddfSDavid du Colombier 			if(w == 0){
567dd7cddfSDavid du Colombier 				s++;
577dd7cddfSDavid du Colombier 				continue;
587dd7cddfSDavid du Colombier 			}
597dd7cddfSDavid du Colombier 			s += w;
607dd7cddfSDavid du Colombier 		}
617dd7cddfSDavid du Colombier 		if(c >= f->n)
627dd7cddfSDavid du Colombier 			continue;
637dd7cddfSDavid du Colombier 		i = f->info+c;
647dd7cddfSDavid du Colombier 		width = i->width;
657dd7cddfSDavid du Colombier 	}
667dd7cddfSDavid du Colombier 	return p;
677dd7cddfSDavid du Colombier }
68