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