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 }