plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

string.c (1032B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <draw.h>
      4 #include <memdraw.h>
      5 
      6 Point
      7 memimagestring(Memimage *b, Point p, Memimage *color, Point cp, Memsubfont *f, char *cs)
      8 {
      9 	int w, width;
     10 	uchar *s;
     11 	Rune c;
     12 	Fontchar *i;
     13 
     14 	s = (uchar*)cs;
     15 	for(; c=*s; p.x+=width, cp.x+=width){
     16 		width = 0;
     17 		if(c < Runeself)
     18 			s++;
     19 		else{
     20 			w = chartorune(&c, (char*)s);
     21 			if(w == 0){
     22 				s++;
     23 				continue;
     24 			}
     25 			s += w;
     26 		}
     27 		if(c >= f->n)
     28 			continue;
     29 		i = f->info+c;
     30 		width = i->width;
     31 		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),
     32 			color, cp, f->bits, Pt(i->x, i->top), SoverD);
     33 	}
     34 	return p;
     35 }
     36 
     37 Point
     38 memsubfontwidth(Memsubfont *f, char *cs)
     39 {
     40 	Rune c;
     41 	Point p;
     42 	uchar *s;
     43 	Fontchar *i;
     44 	int w, width;
     45 
     46 	p = Pt(0, f->height);
     47 	s = (uchar*)cs;
     48 	for(; c=*s; p.x+=width){
     49 		width = 0;
     50 		if(c < Runeself)
     51 			s++;
     52 		else{
     53 			w = chartorune(&c, (char*)s);
     54 			if(w == 0){
     55 				s++;
     56 				continue;
     57 			}
     58 			s += w;
     59 		}
     60 		if(c >= f->n)
     61 			continue;
     62 		i = f->info+c;
     63 		width = i->width;
     64 	}
     65 	return p;
     66 }