frptofchar.c - sam - An updated version of the sam text editor.
 (HTM) git clone git://vernunftzentrum.de/sam.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
       frptofchar.c (2456B)
       ---
            1 /* Copyright (c) 1998 Lucent Technologies - All rights reserved. */
            2 #include <u.h>
            3 #include <libg.h>
            4 #include <frame.h>
            5 
            6 Point
            7 _frptofcharptb(Frame *f, uint64_t p, Point pt, int bn)
            8 {
            9     uint8_t *s;
           10     Frbox *b;
           11     int w, l;
           12     wchar_t r;
           13 
           14     for(b = &f->box[bn]; bn<f->nbox; bn++,b++){
           15         _frcklinewrap(f, &pt, b);
           16         if(p < (l=NRUNE(b))){
           17             if(b->nrune > 0)
           18                 for(s=b->a.ptr; p>0; s+=w, p--){
           19                     w = chartorune(&r, (char*)s);
           20                     pt.x += charwidth(f->font, r);
           21                     if(r==0 || pt.x>f->r.max.x)
           22                         berror("frptofchar");
           23                 }
           24             break;
           25         }
           26         p -= l;
           27         _fradvance(f, &pt, b);
           28     }
           29     return pt;
           30 }
           31 
           32 Point
           33 frptofchar(Frame *f, uint64_t p)
           34 {
           35     return _frptofcharptb(f, p, Pt(f->left, f->r.min.y), 0);
           36 }
           37 
           38 Point
           39 _frptofcharnb(Frame *f, uint64_t p, int nb)    /* doesn't do final _fradvance to next line */
           40 {
           41     Point pt;
           42     int nbox;
           43 
           44     nbox = f->nbox;
           45     f->nbox = nb;
           46     pt = _frptofcharptb(f, p, Pt(f->left, f->r.min.y), 0);
           47     f->nbox = nbox;
           48     return pt;
           49 }
           50 
           51 static
           52 Point
           53 _frgrid(Frame *f, Point p)
           54 {
           55     p.y -= f->r.min.y;
           56     p.y -= p.y%f->fheight;
           57     p.y += f->r.min.y;
           58     if(p.x > f->r.max.x)
           59         p.x = f->r.max.x;
           60     return p;
           61 }
           62 
           63 uint64_t
           64 frcharofpt(Frame *f, Point pt)
           65 {
           66     Point qt;
           67     int w, bn;
           68     uint8_t *s;
           69     Frbox *b;
           70     uint64_t p;
           71     wchar_t r;
           72 
           73     pt = _frgrid(f, pt);
           74     qt.x = f->left;
           75     qt.y = f->r.min.y;
           76     for(b=f->box,bn=0,p=0; bn<f->nbox && qt.y<pt.y; bn++,b++){
           77         _frcklinewrap(f, &qt, b);
           78         if(qt.y >= pt.y)
           79             break;
           80         _fradvance(f, &qt, b);
           81         p += NRUNE(b);
           82     }
           83     for(; bn<f->nbox && qt.x<=pt.x; bn++,b++){
           84         _frcklinewrap(f, &qt, b);
           85         if(qt.y > pt.y)
           86             break;
           87         if(qt.x+b->wid > pt.x){
           88             if(b->nrune < 0)
           89                 _fradvance(f, &qt, b);
           90             else{
           91                 s = b->a.ptr;
           92                 for(;;){
           93                     w = chartorune(&r, (char*)s);
           94                     if(r == 0)
           95                         berror("end of string in frcharofpt");
           96                     s += w;
           97                     qt.x += charwidth(f->font, r);
           98                     if(qt.x > pt.x)
           99                         break;
          100                     p++;
          101                 }
          102             }
          103         }else{
          104             p += NRUNE(b);
          105             _fradvance(f, &qt, b);
          106         }
          107     }
          108     return p;
          109 }