Rev 6864 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6864 | serge | 1 | #include |
2 | #include |
||
3 | #include |
||
4 | #include FT_FREETYPE_H |
||
5 | #include FT_GLYPH_H |
||
6 | #include "winlib.h" |
||
7 | |||
8 | int init_fontlib(); |
||
9 | font_t *create_font(FT_Face face, int size); |
||
10 | int get_font_height(font_t *font); |
||
11 | int get_font_width(font_t *font); |
||
12 | |||
13 | int draw_text_ext(ctx_t *ctx, font_t *font, char *text, int len, rect_t *rc, color_t color); |
||
14 | |||
15 | typedef struct |
||
16 | { |
||
17 | ctx_t *ctx; |
||
18 | font_t *font; |
||
19 | |||
20 | char *text; |
||
21 | char **line; |
||
22 | int lines; |
||
23 | |||
24 | int startline; |
||
25 | int endline; |
||
26 | int pagesize; |
||
27 | int tail; |
||
28 | |||
29 | rect_t margins; |
||
30 | int leading; |
||
31 | int line_height; |
||
32 | int w; |
||
33 | int h; |
||
34 | |||
35 | }tview_t; |
||
36 | |||
37 | |||
38 | |||
39 | tview_t *create_tview(ctx_t *ctx, int width, int height) |
||
40 | { |
||
41 | tview_t *txv; |
||
42 | |||
43 | txv = malloc(sizeof(*txv)); |
||
44 | if(txv == NULL) |
||
45 | { |
||
46 | return NULL; |
||
47 | }; |
||
48 | |||
49 | memset(txv, 0, sizeof(*txv)); |
||
50 | |||
51 | txv->ctx = ctx; |
||
52 | txv->w = width; |
||
53 | txv->h = height; |
||
54 | txv->font = create_font(NULL, 18); |
||
55 | txv->leading = 4; |
||
56 | txv->line_height = txv->leading + get_font_height(txv->font); |
||
57 | return txv; |
||
58 | }; |
||
59 | |||
60 | void txv_get_margins(const tview_t *txv, rect_t *margins) |
||
61 | { |
||
62 | *margins = txv->margins; |
||
63 | }; |
||
64 | |||
65 | void txv_set_margins(tview_t *txv, const rect_t *margins) |
||
66 | { |
||
67 | txv->margins = *margins; |
||
68 | }; |
||
69 | |||
70 | static void txv_recalc(tview_t *txv) |
||
71 | { |
||
72 | int full_height; |
||
73 | int endline; |
||
74 | |||
75 | full_height = txv->h - (txv->margins.t + txv->margins.b); |
||
76 | txv->pagesize = full_height / txv->line_height; |
||
77 | txv->tail = full_height % txv->line_height; |
||
78 | endline = txv->startline + txv->pagesize; |
||
79 | txv->endline = endline < txv->lines ? endline : txv->lines; |
||
80 | |||
81 | // printf("pagesize %d visible %d endline %d\n",txv->pagesize, txv->pagesize+!!txv->tail, txv->endline ); |
||
82 | }; |
||
83 | |||
84 | static void txv_redraw(tview_t *txv) |
||
85 | { |
||
86 | rect_t rc; |
||
87 | int i; |
||
88 | |||
6865 | serge | 89 | rc.l = 0; |
90 | rc.t = 0; |
||
91 | rc.r = txv->w; |
||
92 | rc.b = txv->h; |
||
6864 | serge | 93 | |
6865 | serge | 94 | px_fill_rect(txv->ctx, &rc, 0xFFFFFFFF); |
95 | |||
6864 | serge | 96 | rc.l = txv->margins.l; |
97 | rc.t = txv->margins.t; |
||
98 | rc.r = txv->w - txv->margins.r; |
||
99 | rc.b = rc.t + txv->line_height; |
||
100 | |||
101 | for(i = txv->startline; i < txv->endline; i++) |
||
102 | { |
||
103 | draw_text_ext(txv->ctx, txv->font, txv->line[i], txv->line[i+1]-txv->line[i], &rc, 0xFF000000); |
||
104 | rc.t+= txv->line_height; |
||
105 | rc.b+= txv->line_height; |
||
106 | } |
||
107 | if(txv->tail && ( i < txv->lines)) |
||
108 | draw_text_ext(txv->ctx, txv->font, txv->line[i], txv->line[i+1]-txv->line[i], &rc, 0xFF000000); |
||
109 | }; |
||
110 | |||
111 | void txv_set_text(tview_t *txv, char *text, int size) |
||
112 | { |
||
113 | int i = 0; |
||
114 | char *p, *t; |
||
115 | |||
116 | p = text; |
||
117 | |||
118 | while(i < size) |
||
119 | { |
||
120 | switch(*p++) |
||
121 | { |
||
122 | case '\n': |
||
123 | txv->lines++; |
||
124 | break; |
||
125 | case '\r': |
||
126 | break; |
||
127 | } |
||
128 | i++; |
||
129 | }; |
||
130 | |||
131 | txv->line = user_alloc((txv->lines+1)*sizeof(char*)); |
||
132 | txv->text = text; |
||
133 | { |
||
134 | int l=0; |
||
135 | |||
136 | i = 0; |
||
137 | txv->line[0] = txv->text; |
||
138 | |||
139 | while(i < size) |
||
140 | { |
||
141 | switch(*text++) |
||
142 | { |
||
143 | case '\n': |
||
144 | l++; |
||
145 | txv->line[l] = text; |
||
146 | break; |
||
147 | case '\r': |
||
148 | txv->line[l] = text; |
||
149 | break; |
||
150 | } |
||
151 | i++; |
||
152 | }; |
||
153 | } |
||
154 | |||
155 | txv_recalc(txv); |
||
156 | txv_redraw(txv); |
||
157 | }; |
||
158 | |||
159 | int txv_scroll_down(tview_t *txv) |
||
160 | { |
||
161 | int dst, src, rows; |
||
162 | rect_t rc; |
||
163 | |||
164 | if(txv->endline < txv->lines) |
||
165 | { |
||
166 | dst = txv->margins.t; |
||
167 | src = dst + txv->line_height; |
||
168 | rows = txv->line_height * (txv->pagesize-1); |
||
6865 | serge | 169 | scroll_context(txv->ctx, dst, src, rows ); |
6864 | serge | 170 | |
171 | rc.l = txv->margins.l; |
||
172 | rc.t = txv->margins.t + rows; |
||
173 | rc.r = txv->w - txv->margins.r; |
||
174 | rc.b = rc.t + txv->line_height; |
||
175 | |||
6865 | serge | 176 | px_fill_rect(txv->ctx, &rc, 0xFFFFFFFF); |
6864 | serge | 177 | |
178 | draw_text_ext(txv->ctx, txv->font, txv->line[txv->endline], |
||
179 | txv->line[txv->endline+1]-txv->line[txv->endline], &rc, 0xFF000000); |
||
180 | |||
181 | txv->startline++; |
||
182 | txv->endline++; |
||
183 | |||
184 | if( txv->tail && (txv->endline < txv->lines)) |
||
185 | { |
||
186 | rc.t+= txv->line_height; |
||
187 | rc.b+= txv->line_height; |
||
6865 | serge | 188 | px_fill_rect(txv->ctx, &rc, 0xFFFFFFFF); |
6864 | serge | 189 | draw_text_ext(txv->ctx, txv->font, txv->line[txv->endline], |
190 | txv->line[txv->endline+1]-txv->line[txv->endline], &rc, 0xFF000000); |
||
191 | } |
||
192 | return 1; |
||
193 | }; |
||
194 | |||
195 | return 0; |
||
196 | }; |
||
197 | |||
198 | int txv_scroll_up(tview_t *txv) |
||
199 | { |
||
200 | int dst, src, rows; |
||
201 | rect_t rc; |
||
202 | |||
203 | if(txv->startline > 0) |
||
204 | { |
||
205 | rows = txv->tail + txv->line_height * (txv->pagesize-1); |
||
206 | src = txv->margins.t; |
||
207 | dst = src + txv->line_height; |
||
208 | |||
6865 | serge | 209 | scroll_context(txv->ctx, dst, src, rows); |
6864 | serge | 210 | |
211 | rc.l = txv->margins.l; |
||
212 | rc.t = txv->margins.t; |
||
213 | rc.r = txv->w - txv->margins.r; |
||
214 | rc.b = rc.t + txv->line_height; |
||
215 | |||
6865 | serge | 216 | px_fill_rect(txv->ctx, &rc, 0xFFFFFFFF); |
6864 | serge | 217 | |
218 | txv->startline--; |
||
219 | txv->endline--; |
||
220 | |||
221 | draw_text_ext(txv->ctx, txv->font, txv->line[txv->startline], |
||
222 | txv->line[txv->startline+1]-txv->line[txv->startline], &rc, 0xFF000000); |
||
223 | return 1; |
||
224 | }; |
||
225 | |||
226 | return 0; |
||
227 | }; |
||
228 | |||
229 | int txv_page_up(tview_t *txv) |
||
230 | { |
||
231 | int startline, endline; |
||
232 | |||
233 | startline = txv->startline - txv->pagesize; |
||
234 | txv->startline = startline >= 0 ? startline : 0; |
||
235 | |||
236 | endline = txv->startline + txv->pagesize; |
||
237 | txv->endline = endline < txv->lines ? endline : txv->lines; |
||
238 | txv_redraw(txv); |
||
239 | return 1; |
||
240 | }; |
||
241 | |||
242 | int txv_page_down(tview_t *txv) |
||
243 | { |
||
244 | int startline, endline; |
||
245 | |||
246 | endline = txv->endline + txv->pagesize; |
||
247 | txv->endline = endline < txv->lines ? endline : txv->lines; |
||
248 | startline = txv->endline - txv->pagesize; |
||
249 | txv->startline = startline >= 0 ? startline : 0; |
||
250 | txv_redraw(txv); |
||
251 | return 1; |
||
252 | }; |
||
253 | |||
254 | void txv_set_size(tview_t *txv, int txw, int txh) |
||
255 | { |
||
256 | txv->w = txw; |
||
257 | txv->h = txh; |
||
258 | |||
259 | txv_recalc(txv); |
||
260 | txv_redraw(txv); |
||
261 | }; |
||
262 | |||
263 | void txv_set_font_size(tview_t *txv, int size) |
||
264 | { |
||
265 | |||
266 | if(size > 72) |
||
267 | size = 72; |
||
268 | else if(size < 6) |
||
269 | size = 6; |
||
270 | |||
271 | txv->font = create_font(NULL, size); |
||
272 | if ( txv->font == NULL ) |
||
273 | { |
||
274 | printf("cannot create font\n"); |
||
275 | return; |
||
276 | } |
||
277 | |||
278 | txv->line_height = txv->leading + get_font_height(txv->font); |
||
279 | txv_recalc(txv); |
||
280 | txv_redraw(txv); |
||
281 | } |
||
282 | |||
283 | int txv_get_font_size(tview_t *txv) |
||
284 | { |
||
285 | return get_font_height(txv->font); |
||
286 | }>>>>>>>>>> |