]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libdraw/string.c
remove debug print
[plan9front.git] / sys / src / libdraw / string.c
1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4
5 enum
6 {
7         Max = 100
8 };
9
10 Point
11 string(Image *dst, Point pt, Image *src, Point sp, Font *f, char *s)
12 {
13         return _string(dst, pt, src, sp, f, s, nil, 1<<24, dst->clipr, nil, ZP, SoverD);
14 }
15
16 Point
17 stringop(Image *dst, Point pt, Image *src, Point sp, Font *f, char *s, Drawop op)
18 {
19         return _string(dst, pt, src, sp, f, s, nil, 1<<24, dst->clipr, nil, ZP, op);
20 }
21
22 Point
23 stringn(Image *dst, Point pt, Image *src, Point sp, Font *f, char *s, int len)
24 {
25         return _string(dst, pt, src, sp, f, s, nil, len, dst->clipr, nil, ZP, SoverD);
26 }
27
28 Point
29 stringnop(Image *dst, Point pt, Image *src, Point sp, Font *f, char *s, int len, Drawop op)
30 {
31         return _string(dst, pt, src, sp, f, s, nil, len, dst->clipr, nil, ZP, op);
32 }
33
34 Point
35 runestring(Image *dst, Point pt, Image *src, Point sp, Font *f, Rune *r)
36 {
37         return _string(dst, pt, src, sp, f, nil, r, 1<<24, dst->clipr, nil, ZP, SoverD);
38 }
39
40 Point
41 runestringop(Image *dst, Point pt, Image *src, Point sp, Font *f, Rune *r, Drawop op)
42 {
43         return _string(dst, pt, src, sp, f, nil, r, 1<<24, dst->clipr, nil, ZP, op);
44 }
45
46 Point
47 runestringn(Image *dst, Point pt, Image *src, Point sp, Font *f, Rune *r, int len)
48 {
49         return _string(dst, pt, src, sp, f, nil, r, len, dst->clipr, nil, ZP, SoverD);
50 }
51
52 Point
53 runestringnop(Image *dst, Point pt, Image *src, Point sp, Font *f, Rune *r, int len, Drawop op)
54 {
55         return _string(dst, pt, src, sp, f, nil, r, len, dst->clipr, nil, ZP, op);
56 }
57
58 Point
59 _string(Image *dst, Point pt, Image *src, Point sp, Font *f, char *s, Rune *r, int len, Rectangle clipr, Image *bg, Point bgp, Drawop op)
60 {
61         int m, n, wid, max, try;
62         ushort cbuf[Max], *c, *ec;
63         uchar *b;
64         char *subfontname;
65         char **sptr;
66         Rune **rptr, rune;
67         Subfont *sf;
68
69         if(s == nil){
70                 s = "";
71                 sptr = nil;
72         }else
73                 sptr = &s;
74         if(r == nil){
75                 r = (Rune*) L"";
76                 rptr = nil;
77         }else
78                 rptr = &r;
79         subfontname = nil;
80         sf = nil;
81         try = 0;
82         while((*s || *r) && len > 0){
83                 max = Max;
84                 if(len < max)
85                         max = len;
86                 if(subfontname){
87                         freesubfont(sf);
88                         if((sf=_getsubfont(f->display, subfontname)) == nil){
89                                 if(f->display->defaultfont == nil || f->display->defaultfont == f)
90                                         break;
91                                 f = f->display->defaultfont;
92                         }
93                 }
94                 if((n = cachechars(f, sptr, rptr, cbuf, max, &wid, &subfontname)) <= 0){
95                         if(n == 0){
96                                 if(++try > 10)
97                                         break;
98                                 continue;
99                         }
100                         if(*r)
101                                 r++;
102                         else
103                                 s += chartorune(&rune, s);
104                         len--;
105                         continue;
106                 }
107                 try = 0;
108
109                 _setdrawop(dst->display, op);
110
111                 m = 47+2*n;
112                 if(bg)
113                         m += 4+2*4;
114                 b = bufimage(dst->display, m);
115                 if(b == nil){
116                         fprint(2, "string: %r\n");
117                         break;
118                 }
119                 if(bg)
120                         b[0] = 'x';
121                 else
122                         b[0] = 's';
123                 BPLONG(b+1, dst->id);
124                 BPLONG(b+5, src->id);
125                 BPLONG(b+9, f->cacheimage->id);
126                 BPLONG(b+13, pt.x);
127                 BPLONG(b+17, pt.y+f->ascent);
128                 BPLONG(b+21, clipr.min.x);
129                 BPLONG(b+25, clipr.min.y);
130                 BPLONG(b+29, clipr.max.x);
131                 BPLONG(b+33, clipr.max.y);
132                 BPLONG(b+37, sp.x);
133                 BPLONG(b+41, sp.y);
134                 BPSHORT(b+45, n);
135                 b += 47;
136                 if(bg){
137                         BPLONG(b, bg->id);
138                         BPLONG(b+4, bgp.x);
139                         BPLONG(b+8, bgp.y);
140                         b += 12;
141                 }
142                 ec = &cbuf[n];
143                 for(c=cbuf; c<ec; c++, b+=2)
144                         BPSHORT(b, *c);
145                 pt.x += wid;
146                 bgp.x += wid;
147                 agefont(f);
148                 len -= n;
149         }
150         freesubfont(sf);
151         return pt;
152 }