|
|
1.1 root 1: #include <jerq.h>
2: #include <layer.h>
3: #include <queue.h>
4: #include <jerqproc.h>
5: #include <font.h>
6: #include "frame.h"
7:
8: Point endpoint;
9: nexttab(t, x)
10: Frame *t;
11: {
12: int eightspaces=P->defaultfont->info[' '].width<<3;
13: register xx=x-t->rect.origin.x;
14: return(xx-(xx%eightspaces)+eightspaces+t->rect.origin.x);
15: }
16: void opshow();
17: int complete;
18: frameop(t, op, pt, cp, n)
19: register Frame *t;
20: register void (*op)();
21: Point pt;
22: register unsigned char *cp;
23: register n;
24: {
25: register i, j;
26: Point startpt;
27: register unsigned char *startcp;
28: complete=0;
29: endpoint=pt;
30: i=0; /* Not in for(;;) because of \t's */
31: Top_of_loop:
32: endpoint=pt;
33: for(j=0,startpt=pt,startcp=cp; ; i++,j++,cp++){
34: Continue:
35: if(i>=n)
36: break;
37: if(*cp=='\n'){
38: i++, j++, cp++;
39: Emit_newline:
40: pt.x=t->rect.corner.x;
41: endpoint=pt;
42: /* must do this even if j==0 */
43: (*op)(t, startpt, pt, startcp, j);
44: j=0;
45: startpt.x=t->rect.origin.x;
46: startpt.y+=newlnsz;
47: if(startpt.y >= t->rect.corner.y) /* off screen */
48: return;
49: pt=startpt;
50: startcp=cp;
51: goto Continue;
52: }else if(*cp == '\t'){
53: if(j > 0){
54: /* Emit what's saved up */
55: (*op)(t, startpt, pt, startcp, j);
56: goto Top_of_loop;
57: }
58: if((pt.x=nexttab(t, pt.x)) > t->rect.corner.x)
59: goto Emit_newline;
60: (*op)(t, startpt, pt, cp++, 1);
61: i++;
62: goto Top_of_loop;
63: }else if(*cp!='\r' && *cp<=P->defaultfont->n)
64: if((pt.x+=cwidth(*cp)) > t->rect.corner.x)
65: goto Emit_newline;
66: }
67: if(startpt.y < t->rect.corner.y){
68: endpoint=pt;
69: (*op)(t, startpt, pt, startcp, j);
70: complete=1;
71: }
72: }
73: char genbuf[100];
74: void
75: opdraw(t, p, q, cp, n)
76: Frame *t;
77: Point p, q;
78: register unsigned char *cp;
79: register n;
80: {
81: register char *gp=genbuf;
82: while(n--){
83: if(*cp!='\n' && *cp!='\t' && *cp!='\r')
84: *gp++=*cp;
85: cp++;
86: }
87: *gp=0;
88: p.x++;
89: string(P->defaultfont, genbuf, D, p, F_XOR);
90: }
91: draw(t, p, s, n)
92: Frame *t;
93: Point p;
94: char *s;
95: int n;
96: {
97: frameop(t, opdraw, p, s, n);
98: }
99:
100: int F_rectf;
101: /*ARGSUSED*/
102: void
103: oprectf(t, p, q, str, n)
104: register Frame *t;
105: Point p, q;
106: char *str;
107: short n;
108: {
109: Urectf(D, Rpt(p, Pt(q.x, q.y+newlnsz)), F_rectf);
110: }
111:
112: /*ARGSUSED*/
113: void
114: opclear(t, p, q, str, n)
115: register Frame *t;
116: Point p, q;
117: char *str;
118: short n;
119: {
120: clear(Rpt(p, Pt(q.x, q.y+newlnsz)), 1);
121: }
122:
123: selectf(t, f)
124: register Frame *t;
125: {
126: F_rectf=f;
127: frameop(t, oprectf, ptofchar(t, t->s1), t->str.s+t->s1, t->s2-t->s1);
128: }
129: void
130: opnull()
131: {}
132: rXOR(r) /* a space-saving routine */
133: Rectangle r;
134: {
135: lrectf(D, r, F_XOR);
136: }
137: Rectf(r, f)
138: Rectangle r;
139: Code f;
140: {
141: lrectf(D, r, f);
142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.