|
|
1.1 ! root 1: #include "frame.h" ! 2: ! 3: Point ! 4: ptofcharptb(f, p, pt, bn) ! 5: register Frame *f; ! 6: Posn p; ! 7: Point pt; ! 8: register bn; ! 9: { ! 10: register uchar *s; ! 11: register Box *b; ! 12: register l; ! 13: for(b=&f->box[bn]; bn<f->nbox; bn++,b++){ ! 14: cklinewrap(f, &pt, b); ! 15: if(p<(l=LEN(b))){ ! 16: if(b->len>0) ! 17: for(s=b->ptr; p>0; s++, p--){ ! 18: pt.x+=f->font->info[*s].width; ! 19: if(*s==0 || pt.x>f->r.corner.x) ! 20: panic("ptofchar"); ! 21: } ! 22: break; ! 23: } ! 24: p-=l; ! 25: advance(f, &pt, b); ! 26: } ! 27: return pt; ! 28: } ! 29: Point ! 30: ptofchar(f, p) ! 31: Frame *f; ! 32: Posn p; ! 33: { ! 34: return ptofcharptb(f, p, Pt(f->left, f->r.origin.y), 0); ! 35: } ! 36: Point ! 37: ptofcharnb(f, p, nb) /* doesn't do final advance to next line */ ! 38: Frame *f; ! 39: Posn p; ! 40: { ! 41: Point pt; ! 42: int nbox; ! 43: nbox=f->nbox; ! 44: f->nbox=nb; ! 45: pt=ptofcharptb(f, p, Pt(f->left, f->r.origin.y), 0); ! 46: f->nbox=nbox; ! 47: return pt; ! 48: } ! 49: Point ! 50: grid(f, p) ! 51: register Frame *f; ! 52: Point p; ! 53: { ! 54: p.y-=f->r.origin.y; ! 55: p.y-=p.y%f->font->height; ! 56: p.y+=f->r.origin.y; ! 57: if(p.x>f->r.corner.x) ! 58: p.x=f->r.corner.x; ! 59: return p; ! 60: } ! 61: Posn ! 62: charofpt(f, pt) ! 63: register Frame *f; ! 64: Point pt; ! 65: { ! 66: Point qt; ! 67: register bn; ! 68: register uchar *s; ! 69: register Box *b; ! 70: Posn p; ! 71: pt=grid(f, pt); ! 72: qt.x=f->left, qt.y=f->r.origin.y; ! 73: for(b=f->box,bn=0,p=0; bn<f->nbox && qt.y<pt.y; bn++,b++){ ! 74: cklinewrap(f, &qt, b); ! 75: if(qt.y>=pt.y) ! 76: break; ! 77: advance(f, &qt, b); ! 78: p+=LEN(b); ! 79: } ! 80: for(; bn<f->nbox && qt.x<=pt.x; bn++,b++){ ! 81: cklinewrap(f, &qt, b); ! 82: if(qt.y>pt.y) ! 83: break; ! 84: if(qt.x+b->wid>pt.x){ ! 85: if(b->len<0) ! 86: advance(f, &qt, b); ! 87: else for(s=b->ptr; (qt.x+=f->font->info[*s++].width)<=pt.x; p++) ! 88: if(*s==0) ! 89: panic("end of string in charofpt"); ! 90: }else{ ! 91: p+=abs(b->len); ! 92: advance(f, &qt, b); ! 93: } ! 94: } ! 95: return p; ! 96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.