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