URI: 
       tfrptofchar.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tfrptofchar.c (1975B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <draw.h>
            4 #include <mouse.h>
            5 #include <frame.h>
            6 
            7 Point
            8 _frptofcharptb(Frame *f, ulong p, Point pt, int bn)
            9 {
           10         uchar *s;
           11         Frbox *b;
           12         int w, l;
           13         Rune r;
           14 
           15         for(b = &f->box[bn]; bn<f->nbox; bn++,b++){
           16                 _frcklinewrap(f, &pt, b);
           17                 if(p < (l=NRUNE(b))){
           18                         if(b->nrune > 0)
           19                                 for(s=b->ptr; p>0; s+=w, p--){
           20                                         if((r = *s) < Runeself)
           21                                                 w = 1;
           22                                         else
           23                                                 w = chartorune(&r, (char*)s);
           24                                         pt.x += stringnwidth(f->font, (char*)s, 1);
           25                                         if(r==0 || pt.x>f->r.max.x)
           26                                                 drawerror(f->display, "frptofchar");
           27                                 }
           28                         break;
           29                 }
           30                 p -= l;
           31                 _fradvance(f, &pt, b);
           32         }
           33         return pt;
           34 }
           35 
           36 Point
           37 frptofchar(Frame *f, ulong p)
           38 {
           39         return _frptofcharptb(f, p, f->r.min, 0);
           40 }
           41 
           42 Point
           43 _frptofcharnb(Frame *f, ulong p, int nb)        /* doesn't do final _fradvance to next line */
           44 {
           45         Point pt;
           46         int nbox;
           47 
           48         nbox = f->nbox;
           49         f->nbox = nb;
           50         pt = _frptofcharptb(f, p, f->r.min, 0);
           51         f->nbox = nbox;
           52         return pt;
           53 }
           54 
           55 static
           56 Point
           57 _frgrid(Frame *f, Point p)
           58 {
           59         p.y -= f->r.min.y;
           60         p.y -= p.y%f->font->height;
           61         p.y += f->r.min.y;
           62         if(p.x > f->r.max.x)
           63                 p.x = f->r.max.x;
           64         return p;
           65 }
           66 
           67 ulong
           68 frcharofpt(Frame *f, Point pt)
           69 {
           70         Point qt;
           71         int w, bn;
           72         uchar *s;
           73         Frbox *b;
           74         ulong p;
           75         Rune r;
           76 
           77         pt = _frgrid(f, pt);
           78         qt = f->r.min;
           79         for(b=f->box,bn=0,p=0; bn<f->nbox && qt.y<pt.y; bn++,b++){
           80                 _frcklinewrap(f, &qt, b);
           81                 if(qt.y >= pt.y)
           82                         break;
           83                 _fradvance(f, &qt, b);
           84                 p += NRUNE(b);
           85         }
           86         for(; bn<f->nbox && qt.x<=pt.x; bn++,b++){
           87                 _frcklinewrap(f, &qt, b);
           88                 if(qt.y > pt.y)
           89                         break;
           90                 if(qt.x+b->wid > pt.x){
           91                         if(b->nrune < 0)
           92                                 _fradvance(f, &qt, b);
           93                         else{
           94                                 s = b->ptr;
           95                                 for(;;){
           96                                         if((r = *s) < Runeself)
           97                                                 w = 1;
           98                                         else
           99                                                 w = chartorune(&r, (char*)s);
          100                                         if(r == 0)
          101                                                 drawerror(f->display, "end of string in frcharofpt");
          102                                         qt.x += stringnwidth(f->font, (char*)s, 1);
          103                                         s += w;
          104                                         if(qt.x > pt.x)
          105                                                 break;
          106                                         p++;
          107                                 }
          108                         }
          109                 }else{
          110                         p += NRUNE(b);
          111                         _fradvance(f, &qt, b);
          112                 }
          113         }
          114         return p;
          115 }