ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/defaultfont.C
(Generate patch)

Comparing rxvt-unicode/src/defaultfont.C (file contents):
Revision 1.26 by pcg, Fri Feb 27 02:52:51 2004 UTC vs.
Revision 1.43 by pcg, Mon Mar 15 07:10:47 2004 UTC

24#include "defaultfont.h" 24#include "defaultfont.h"
25 25
26#include <cstdlib> 26#include <cstdlib>
27 27
28#define DISPLAY r->display->display 28#define DISPLAY r->display->display
29#define GC r->TermWin.gc 29#define TGC r->TermWin.gc
30 30
31const struct rxvt_fallback_font { 31const struct rxvt_fallback_font {
32 codeset cs; 32 codeset cs;
33 const char *name; 33 const char *name;
34} fallback_fonts[] = { 34} fallback_fonts[] = {
61# if XFT 61# if XFT
62 // prefer xft for complex scripts 62 // prefer xft for complex scripts
63 { CS_UNICODE, "xft:Kochi Gothic:antialias=false" }, 63 { CS_UNICODE, "xft:Kochi Gothic:antialias=false" },
64# endif 64# endif
65 { CS_JIS0201_1976_0, "-*-mincho-*-r-*--*-*-*-*-c-*-jisx0201*-0" }, 65 { CS_JIS0201_1976_0, "-*-mincho-*-r-*--*-*-*-*-c-*-jisx0201*-0" },
66 { CS_JIS0208_1983_0, "-*-mincho-*-r-*--*-*-*-*-c-*-jisx0208*-0" }, 66 { CS_JIS0208_1990_0, "-*-mincho-*-r-*--*-*-*-*-c-*-jisx0208*-0" },
67 { CS_JIS0212_1990_0, "-*-mincho-*-r-*--*-*-*-*-c-*-jisx0212*-0" }, 67 { CS_JIS0212_1990_0, "-*-mincho-*-r-*--*-*-*-*-c-*-jisx0212*-0" },
68#endif 68#endif
69 69
70#if ENCODING_CN || ENCODING_CN_EXT 70#if ENCODING_CN || ENCODING_CN_EXT
71# if XFT 71# if XFT
72 { CS_BIG5_EXT, "xft:AR PL Mingti2L Big5" }, 72 { CS_BIG5_EXT, "xft:AR PL Mingti2L Big5" },
73 { CS_BIG5_EXT, "xft:AR PL KaitiM Big5" }, 73 { CS_BIG5_EXT, "xft:AR PL KaitiM Big5" },
74 { CS_GB2312_1980_0, "xft:AR PL KaitiM GB" }, 74 { CS_GB2312_1980_0, "xft:AR PL KaitiM GB" },
75 { CS_GB2312_1980_0, "xft:AR PL SungtiL GB" }, 75 { CS_GB2312_1980_0, "xft:AR PL SungtiL GB" },
76# endif 76# endif
77 { CS_BIG5, "-*-*-*-*-*-*-*-*-*-*-c-*-big5-0" },
78 { CS_BIG5_PLUS, "-*-*-*-*-*-*-*-*-*-*-c-*-big5p-0" },
79 { CS_BIG5_EXT, "-*-*-*-*-*-*-*-*-*-*-c-*-big5.eten-0" },
77 { CS_CNS11643_1992_1, "-*-*-*-*-*-*-*-*-*-*-c-*-gb2312*-0" }, 80 { CS_CNS11643_1992_1, "-*-*-*-*-*-*-*-*-*-*-c-*-gb2312*-0" },
78 { CS_CNS11643_1992_1, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-1" }, 81 { CS_CNS11643_1992_1, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-1" },
79 { CS_CNS11643_1992_2, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-2" }, 82 { CS_CNS11643_1992_2, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-2" },
80 { CS_CNS11643_1992_3, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-3" }, 83 { CS_CNS11643_1992_3, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-3" },
81 { CS_CNS11643_1992_4, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-4" }, 84 { CS_CNS11643_1992_4, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-4" },
82 { CS_CNS11643_1992_5, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-5" }, 85 { CS_CNS11643_1992_5, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-5" },
83 { CS_CNS11643_1992_6, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-6" }, 86 { CS_CNS11643_1992_6, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-6" },
84 { CS_CNS11643_1992_7, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-7" }, 87 { CS_CNS11643_1992_7, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-7" },
85 { CS_CNS11643_1992_F, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-f" }, 88 { CS_CNS11643_1992_F, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-f" },
86#endif 89#endif
87 90
88#if XFT 91#if XFT
89 { CS_UNICODE, "xft:Andale Mono" }, 92 { CS_UNICODE, "xft:Andale Mono" },
90 { CS_UNICODE, "xft:Arial Unicode MS" }, 93 { CS_UNICODE, "xft:Arial Unicode MS" },
93 { CS_UNICODE, "xft:FreeMono" }, 96 { CS_UNICODE, "xft:FreeMono" },
94 { CS_UNICODE, "-*-unifont-*-*-*-*-*-*-*-*-c-*-iso10646-1" }, 97 { CS_UNICODE, "-*-unifont-*-*-*-*-*-*-*-*-c-*-iso10646-1" },
95 { CS_UNICODE, "-*-*-*-r-*-*-*-*-*-*-c-*-iso10646-1" }, 98 { CS_UNICODE, "-*-*-*-r-*-*-*-*-*-*-c-*-iso10646-1" },
96 { CS_UNICODE, "-*-*-*-r-*-*-*-*-*-*-m-*-iso10646-1" }, 99 { CS_UNICODE, "-*-*-*-r-*-*-*-*-*-*-m-*-iso10646-1" },
97 100
101#if UNICODE_3 && XFT
102 { CS_UNICODE, "xft:Code2001" }, // contains many plane-1 characters
103#endif
104
98 { CS_UNKNOWN, 0 } 105 { CS_UNKNOWN, 0 }
99}; 106};
100 107
101///////////////////////////////////////////////////////////////////////////// 108/////////////////////////////////////////////////////////////////////////////
102 109
187 else if (color >= 0) 194 else if (color >= 0)
188 { 195 {
189#if XFT 196#if XFT
190 XftDrawRect (d, &r->PixColors[color].c, x, y, w, h); 197 XftDrawRect (d, &r->PixColors[color].c, x, y, w, h);
191#else 198#else
192 XSetForeground (d.display->display, GC, r->PixColors[color]); 199 XSetForeground (d.display->display, TGC, r->PixColors[color]);
193 XFillRectangle (d.display->display, d, GC, x, y, w, h); 200 XFillRectangle (d.display->display, d, TGC, x, y, w, h);
194#endif 201#endif
195 } 202 }
196} 203}
197 204
198static const char *linedraw_cmds[128] = { 205static const char *linedraw_cmds[128 + 32] = {
199 "1hH", "2hH", "1vV", "2vV", 206 "1-", "2-", "1|", "2|",
200 0, 0, 0, 0, 207 0, 0, 0, 0,
201 0, 0, 0, 0, 208 0, 0, 0, 0,
202 "1HV", "2H1V", "1H2V", "2HV", 209 "1HV", "2H1V", "1H2V", "2HV",
203 210
204 // 2510 211 // 2510
205 "1hV", "2h1V", "1h2V", "2hV", 212 "1hV", "2h1V", "1h2V", "2hV",
206 "1Hv", "2H1v", "1H2v", "2Hv", 213 "1Hv", "2H1v", "1H2v", "2Hv",
207 "1hv", "2h1v", "1h2v", "2hv", 214 "1hv", "2h1v", "1h2v", "2hv",
208 "1HvV", "2H1vV", "1HV2v", "1Hv2V", 215 "1H|", "2H1|", "1HV2v", "1Hv2V",
209 216
210 // 2520 217 // 2520
211 "1H2vV", "2Hv1V", "2HV1v", "2HvV", 218 "1H2|", "2Hv1V", "2HV1v", "2H|",
212 "1hvV", "2h1vV", "1hV2v", "1hv2V", 219 "1h|", "2h1|", "1hV2v", "1hv2V",
213 "1h2vV", "2hv1V", "1v2hV", "2hvV", 220 "1h2|", "2hv1V", "1v2hV", "2h|",
214 "1hHV", "2h1HV", "2H1hV", "2hH1V", 221 "1-V", "2h1HV", "2H1hV", "2-1V",
215 222
216 // 2530 223 // 2530
217 "1hH2V", "2hV1H", "1h2HV", "2hHV", 224 "1-2V", "2hV1H", "1h2HV", "2-V",
218 "1hHv", "1vH2h", "1hv2H", "1v2hH", 225 "1-v", "1vH2h", "1hv2H", "1v2-",
219 "1hH2v", "1H2hv", "1h2Hv", "2hHv", 226 "1-2v", "1H2hv", "1h2Hv", "2-v",
220 "1hHvV", "1vVH2h", "1hvV2H", "1vV2hH", 227 "1-|", "1|H2h", "1h|2H", "1|2-",
221 228
222 // 2540 229 // 2540
223 "1hHV2v", "1hHv2V", "1hH2vV", "1HV2hv", 230 "1-V2v", "1-v2V", "1-2|", "1HV2hv",
224 "1hV2Hv", "1Hv2hV", "1hv2HV", "1V2hHv", 231 "1hV2Hv", "1Hv2hV", "1hv2HV", "1V2-v",
225 "1v2hHV", "1H2hvV", "1h2HvV", "2hHvV", 232 "1v2-V", "1H2h|", "1h2H|", "2-|",
226 0, 0, 0, 0, 233 0, 0, 0, 0,
227 234
228 // 2550 235 // 2550
229 0, 0, 0, 0, 236 0, 0, 0, 0,
230 0, 0, 0, 0, 237 0, 0, 0, 0,
233 240
234 // 2560 241 // 2560
235 0, 0, 0, 0, 242 0, 0, 0, 0,
236 0, 0, 0, 0, 243 0, 0, 0, 0,
237 0, 0, 0, 0, 244 0, 0, 0, 0,
238 0, 0, 0, 0, 245 0, "A", "B", "C",
239 246
240 // 2570 247 // 2570
241 0, "1a", "1b", "1ab", 248 "D", "1/", "1\\", "1/\\",
242 "1h", "1v", "1H", "1V", 249 "1h", "1v", "1H", "1V",
243 "2h", "2v", "2H", "2V", 250 "2h", "2v", "2H", "2V",
244 "1h2H", "1v2V", "1H2h", "1V2v" 251 "1h2H", "1v2V", "1H2h", "1V2v",
252
253 // 2580
254 0, 0, 0, 0,
255 0, 0, 0, 0,
256 0, 0, 0, 0,
257 0, 0, 0, 0,
258
259 // 2590
260 0, 0, 0, 0,
261 0, 0, "k", "l",
262 "i", "ikl", "il", "ijk",
263 "ijl", "j", "jk", "jkl",
245 264
246 // to be done 265 // to be done
247}; 266};
248 267
249struct rxvt_font_default : rxvt_font { 268struct rxvt_font_default : rxvt_font {
261 bool load (const rxvt_fontprop &prop) 280 bool load (const rxvt_fontprop &prop)
262 { 281 {
263 width = 1; height = 1; 282 width = 1; height = 1;
264 ascent = 1; descent = 0; 283 ascent = 1; descent = 0;
265 284
285 set_name ("built-in pseudofont");
286
266 return true; 287 return true;
267 } 288 }
268 289
269 bool has_codepoint (uint32_t unicode) 290 bool has_codepoint (unicode_t unicode)
270 { 291 {
271 if (unicode <= 0x001f) 292 if (unicode <= 0x001f)
272 return true; 293 return true;
294
273 if (unicode >= 0x0080 && unicode <= 0x009f) 295 if (unicode >= 0x0080 && unicode <= 0x009f)
274 return true; 296 return true;
275 297
276 if (unicode >= 0x2500 && unicode <= 0x257f 298 if (unicode >= 0x2500 && unicode <= 0x257f
277 && linedraw_cmds[unicode - 0x2500]) 299 && linedraw_cmds[unicode - 0x2500])
300 return true;
301
302 if (unicode >= 0x2580 && unicode <= 0x259f)
303 return true;
304
305 if (IS_COMPOSE (unicode))
278 return true; 306 return true;
279 307
280 switch (unicode) 308 switch (unicode)
281 { 309 {
282 case ZERO_WIDTH_CHAR: 310 case ZERO_WIDTH_CHAR:
289 void draw (rxvt_drawable &d, int x, int y, 317 void draw (rxvt_drawable &d, int x, int y,
290 const text_t *text, int len, 318 const text_t *text, int len,
291 int fg, int bg); 319 int fg, int bg);
292}; 320};
293 321
322static void rect_stipple (Display *display, Drawable d, GC gc, int s1, int s2, int x, int y, int w, int h)
323{
324 XGCValues gcv;
325 char bm[2] = { s1, s2 };
326
327 gcv.fill_style = FillStippled;
328 gcv.stipple = XCreateBitmapFromData (display, d, bm, 2, 2);
329 gcv.ts_x_origin = x;
330 gcv.ts_y_origin = y;
331
332 if (!gcv.stipple)
333 return;
334
335 XChangeGC (display, gc, GCFillStyle | GCStipple | GCTileStipXOrigin | GCTileStipYOrigin, &gcv);
336 XFillRectangle (display, d, gc, x, y, w, h);
337
338 XFreePixmap (display, gcv.stipple);
339
340 gcv.fill_style = FillSolid;
341 XChangeGC (display, gc, GCFillStyle, &gcv);
342}
343
294void 344void
295rxvt_font_default::draw (rxvt_drawable &d, int x, int y, 345rxvt_font_default::draw (rxvt_drawable &d, int x, int y,
296 const text_t *text, int len, 346 const text_t *text, int len,
297 int fg, int bg) 347 int fg, int bg)
298{ 348{
299 clear_rect (d, x, y, r->TermWin.fwidth * len, r->TermWin.fheight, bg); 349 clear_rect (d, x, y, r->TermWin.fwidth * len, r->TermWin.fheight, bg);
300 350
301 XSetForeground (d.display->display, GC, r->PixColors[fg]); 351 XSetForeground (d.display->display, TGC, r->PixColors[fg]);
302 352
303 while (len--) 353 while (len--)
304 { 354 {
355#if ENABLE_COMBINING
356 compose_char *cc;
357#endif
305 text_t t = *text++; 358 text_t t = *text++;
306 359
360 int W = r->TermWin.fwidth , w = (W - 1) / 2;
361 int H = r->TermWin.fheight, h = (H - 1) / 2;
362 int x0 = x, x1 = x + w, x2 = x + r->TermWin.fwidth ;
363 int y0 = y, y1 = y + h, y2 = y + r->TermWin.fheight;
364
365 // is it in our linedrawing table?
307 if (t >= 0x2500 & t <= 0x2580 && linedraw_cmds[t - 0x2500]) 366 if (t >= 0x2500 & t <= 0x259f && linedraw_cmds[t - 0x2500])
308 { 367 {
309 const char *p = linedraw_cmds[t - 0x2500]; 368 const char *p = linedraw_cmds[t - 0x2500];
310 369
311 int x0 = x, x1 = x + r->TermWin.fwidth / 2, x2 = x + r->TermWin.fwidth - 1;
312 int y0 = y, y1 = y + r->TermWin.fheight / 2, y2 = y + r->TermWin.fheight - 1;
313
314 XGCValues gcv; 370 XGCValues gcv;
371
372 gcv.cap_style = CapNotLast;
373 XChangeGC (d.display->display, TGC, GCCapStyle, &gcv);
315 374
316 while (*p) 375 while (*p)
317 { 376 {
318 switch (*p++) 377 switch (*p++)
319 { 378 {
320 case '1': 379 case '1':
321 gcv.line_width = 0; 380 gcv.line_width = 0;
322 XChangeGC (d.display->display, GC, GCLineWidth, &gcv); 381 XChangeGC (d.display->display, TGC, GCLineWidth, &gcv);
323 break; 382 break;
324 383
325 case '2': 384 case '2':
326 gcv.line_width = 2; 385 gcv.line_width = 3;
327 XChangeGC (d.display->display, GC, GCLineWidth, &gcv); 386 XChangeGC (d.display->display, TGC, GCLineWidth, &gcv);
328 break; 387 break;
329 388
330 case 'h': XDrawLine (d.display->display, d, GC, x0, y1, x1, y1); break; 389 case 'h': XDrawLine (d.display->display, d, TGC, x0, y1, x1+1, y1 ); break;
331 case 'H': XDrawLine (d.display->display, d, GC, x1, y1, x2, y1); break; 390 case 'H': XDrawLine (d.display->display, d, TGC, x1, y1, x2 , y1 ); break;
391 case '-': XDrawLine (d.display->display, d, TGC, x0, y1, x2 , y1 ); break;
332 case 'v': XDrawLine (d.display->display, d, GC, x1, y0, x1, y1); break; 392 case 'v': XDrawLine (d.display->display, d, TGC, x1, y0, x1 , y1+1); break;
333 case 'V': XDrawLine (d.display->display, d, GC, x1, y1, x1, y2); break; 393 case 'V': XDrawLine (d.display->display, d, TGC, x1, y1, x1 , y2 ); break;
394 case '|': XDrawLine (d.display->display, d, TGC, x1, y0, x1 , y2 ); break;
395
334 case 'a': XDrawLine (d.display->display, d, GC, x0, y2, x2, y0); break; 396 case '/' : XDrawLine (d.display->display, d, TGC, x0, y2, x2 , y0 ); break;
335 case 'b': XDrawLine (d.display->display, d, GC, x0, y0, x2, y2); break; 397 case '\\': XDrawLine (d.display->display, d, TGC, x0, y0, x2 , y2 ); break;
398
399 case 'A': XDrawArc (d.display->display, d, TGC, x1 , y1 , W-1, H-1, 90*64, 90*64); break;
400 case 'B': XDrawArc (d.display->display, d, TGC, x1-W+1, y1 , W-1, H-1, 0*64, 90*64); break;
401 case 'C': XDrawArc (d.display->display, d, TGC, x1-W+1, y1-H+1, W-1, H-1, 0*64, -90*64); break;
402 case 'D': XDrawArc (d.display->display, d, TGC, x1 , y1-H+1, W-1, H-1, -90*64, -90*64); break;
403
404 case 'i': XFillRectangle (d.display->display, d, TGC, x0, y0, x1 - x0 + 1, y1 - y0 + 1); break;
405 case 'j': XFillRectangle (d.display->display, d, TGC, x1, y0, x2 - x1, y1 - y0 + 1); break;
406 case 'k': XFillRectangle (d.display->display, d, TGC, x0, y1, x1 - x0 + 1, y2 - y1); break;
407 case 'l': XFillRectangle (d.display->display, d, TGC, x1, y1, x2 - x1, y2 - y1); break;
336 } 408 }
337 } 409 }
338 410
339 gcv.line_width = 0; 411 gcv.line_width = 0;
340 XChangeGC (d.display->display, GC, GCLineWidth, &gcv); 412 XChangeGC (d.display->display, TGC, GCLineWidth, &gcv);
413 }
414
415#if ENABLE_COMBINING
416 else if (IS_COMPOSE (t) && (cc = rxvt_composite[t]))
341 } 417 {
418 rxvt_font *f1 = (*fs)[fs->find_font (cc->c1)];
419 f1->draw (d, x, y, &(t = cc->c1), 1, fg, bg);
420 if (cc->c2 != NOCHAR)
421 {
422 // prefer font of first character, for no good reasons
423 rxvt_font *f2 = f1->has_codepoint (cc->c2)
424 ? f1
425 : (*fs)[fs->find_font (cc->c2)];
426
427 f2->draw (d, x, y, &(t = cc->c2), 1, fg, -1);
428 }
429 }
430#endif
342 else 431 else
343 switch (*text++) 432 switch (t)
344 { 433 {
345 case NOCHAR:
346 case ZERO_WIDTH_CHAR: 434 case ZERO_WIDTH_CHAR:
347 break; 435 break;
436
437 case 0x2580: XFillRectangle (d.display->display, d, TGC, x0, y0, W, y1 - y0 + 1); break;
438 case 0x2581: XFillRectangle (d.display->display, d, TGC, x0, y0 + (H * 7 - 1) / 8, W, H - (H * 7 - 1) / 8); break;
439 case 0x2582: XFillRectangle (d.display->display, d, TGC, x0, y0 + (H * 6 - 2) / 8, W, H - (H * 6 - 2) / 8); break;
440 case 0x2583: XFillRectangle (d.display->display, d, TGC, x0, y0 + (H * 5 - 3) / 8, W, H - (H * 5 - 3) / 8); break;
441 case 0x2584: XFillRectangle (d.display->display, d, TGC, x0, y0 + (H * 4 - 4) / 8, W, H - (H * 4 - 4) / 8); break;
442 case 0x2585: XFillRectangle (d.display->display, d, TGC, x0, y0 + (H * 3 - 5) / 8, W, H - (H * 3 - 5) / 8); break;
443 case 0x2586: XFillRectangle (d.display->display, d, TGC, x0, y0 + (H * 2 - 6) / 8, W, H - (H * 2 - 6) / 8); break;
444 case 0x2587: XFillRectangle (d.display->display, d, TGC, x0, y0 + (H * 1 - 7) / 8, W, H - (H * 1 - 7) / 8); break;
445 case 0x2588: XFillRectangle (d.display->display, d, TGC, x0, y0, W, H); break;
446 case 0x2589: XFillRectangle (d.display->display, d, TGC, x0, y0, (W * 7 - 1) / 8, H); break;
447 case 0x258a: XFillRectangle (d.display->display, d, TGC, x0, y0, (W * 6 - 2) / 8, H); break;
448 case 0x258b: XFillRectangle (d.display->display, d, TGC, x0, y0, (W * 5 - 3) / 8, H); break;
449 case 0x258c: XFillRectangle (d.display->display, d, TGC, x0, y0, (W * 4 - 4) / 8, H); break;
450 case 0x258d: XFillRectangle (d.display->display, d, TGC, x0, y0, (W * 3 - 5) / 8, H); break;
451 case 0x258e: XFillRectangle (d.display->display, d, TGC, x0, y0, (W * 2 - 6) / 8, H); break;
452 case 0x258f: XFillRectangle (d.display->display, d, TGC, x0, y0, (W * 1 - 7) / 8, H); break;
453 case 0x2590: XFillRectangle (d.display->display, d, TGC, x1, y0, x2 - x1, H); break;
454
455 case 0x2591: rect_stipple (d.display->display, d, TGC, 0x00, 0x01, x0, y0, W, H); break;
456 case 0x2592: rect_stipple (d.display->display, d, TGC, 0x02, 0x01, x0, y0, W, H); break;
457 case 0x2593: rect_stipple (d.display->display, d, TGC, 0x01, 0x03, x0, y0, W, H); break;
458
459 case 0x2594: XFillRectangle (d.display->display, d, TGC, x0, y0, W, (H * 1 - 7) / 8); break;
460 case 0x2595: XFillRectangle (d.display->display, d, TGC, x0 + (W * 7 - 1) / 8, y0, W - (W * 7 - 1) / 8, H); break;
461
348 default: 462 default:
349 XDrawRectangle (d.display->display, d, GC, x + 2, y + 2, r->TermWin.fwidth - 5, r->TermWin.fheight - 5); 463 int w = 0;
464 while (len > 0 && *text == NOCHAR)
465 {
466 ++text;
467 --len;
468 w += r->TermWin.fwidth;
469 }
470
471 XDrawRectangle (d.display->display, d, TGC, x + 2, y + 2,
472 w + r->TermWin.fwidth - 4, r->TermWin.fheight - 4);
473 x += w;
350 } 474 }
351 475
352 x += r->TermWin.fwidth; 476 x += r->TermWin.fwidth;
353 } 477 }
354} 478}
362 486
363 rxvt_fontprop properties (); 487 rxvt_fontprop properties ();
364 488
365 bool load (const rxvt_fontprop &prop); 489 bool load (const rxvt_fontprop &prop);
366 490
367 bool has_codepoint (uint32_t unicode); 491 bool has_codepoint (unicode_t unicode);
368 492
369 void draw (rxvt_drawable &d, int x, int y, 493 void draw (rxvt_drawable &d, int x, int y,
370 const text_t *text, int len, 494 const text_t *text, int len,
371 int fg, int bg); 495 int fg, int bg);
372 496
429 553
430bool 554bool
431rxvt_font_x11::set_properties (rxvt_fontprop &p, const char *name) 555rxvt_font_x11::set_properties (rxvt_fontprop &p, const char *name)
432{ 556{
433 int slashes = 0; 557 int slashes = 0;
434 const char *comp[12]; 558 const char *comp[13];
435 559
436 for (const char *c = name; *c; c++) 560 for (const char *c = name; *c; c++)
437 if (*c == '-') 561 if (*c == '-')
438 { 562 {
439 comp[slashes++] = c + 1; 563 comp[slashes++] = c + 1;
619 f = 0; 743 f = 0;
620 } 744 }
621} 745}
622 746
623bool 747bool
624rxvt_font_x11::has_codepoint (uint32_t unicode) 748rxvt_font_x11::has_codepoint (unicode_t unicode)
625{ 749{
626 uint32_t ch = FROM_UNICODE (cs, unicode); 750 uint32_t ch = FROM_UNICODE (cs, unicode);
627 751
628 if (ch == NOCHAR) 752 if (ch == NOCHAR)
629 return false; 753 return false;
691 { 815 {
692 const XChar2b *xc = enc_xchar2b (text, len, cs, slow); 816 const XChar2b *xc = enc_xchar2b (text, len, cs, slow);
693 817
694 if (bg == Color_bg && !slow) 818 if (bg == Color_bg && !slow)
695 { 819 {
696 XChangeGC (d.display->display, GC, GCForeground | GCBackground | GCFont, &v); 820 XChangeGC (d.display->display, TGC, GCForeground | GCBackground | GCFont, &v);
697 XDrawImageString16 (d.display->display, d, GC, x, y + base, xc, len); 821 XDrawImageString16 (d.display->display, d, TGC, x, y + base, xc, len);
698 } 822 }
699 else 823 else
700 { 824 {
701 clear_rect (d, x, y, r->TermWin.fwidth * len, r->TermWin.fheight, bg); 825 clear_rect (d, x, y, r->TermWin.fwidth * len, r->TermWin.fheight, bg);
702 826
703 XChangeGC (d.display->display, GC, GCForeground | GCFont, &v); 827 XChangeGC (d.display->display, TGC, GCForeground | GCFont, &v);
704 828
705 if (slow) 829 if (slow)
706 { 830 {
707 do 831 do
708 { 832 {
709 if (xc->byte1 || xc->byte2) 833 if (xc->byte1 || xc->byte2)
710 XDrawString16 (d.display->display, d, GC, x, y + base, xc, 1); 834 XDrawString16 (d.display->display, d, TGC, x, y + base, xc, 1);
711 835
712 x += r->TermWin.fwidth; 836 x += r->TermWin.fwidth;
713 xc++; len--; 837 xc++; len--;
714 } 838 }
715 while (len); 839 while (len);
716 } 840 }
717 else 841 else
718 XDrawString16 (d.display->display, d, GC, x, y + base, xc, len); 842 XDrawString16 (d.display->display, d, TGC, x, y + base, xc, len);
719 } 843 }
720 } 844 }
721 else 845 else
722 { 846 {
723 const char *xc = enc_char (text, len, cs, slow); 847 const char *xc = enc_char (text, len, cs, slow);
724 848
725 if (bg == Color_bg && !slow) 849 if (bg == Color_bg && !slow)
726 { 850 {
727 XChangeGC (d.display->display, GC, GCForeground | GCBackground | GCFont, &v); 851 XChangeGC (d.display->display, TGC, GCForeground | GCBackground | GCFont, &v);
728 XDrawImageString (d.display->display, d, GC, x, y + base, xc, len); 852 XDrawImageString (d.display->display, d, TGC, x, y + base, xc, len);
729 } 853 }
730 else 854 else
731 { 855 {
732 clear_rect (d, x, y, r->TermWin.fwidth * len, r->TermWin.fheight, bg); 856 clear_rect (d, x, y, r->TermWin.fwidth * len, r->TermWin.fheight, bg);
733 857
734 XChangeGC (d.display->display, GC, GCForeground | GCFont, &v); 858 XChangeGC (d.display->display, TGC, GCForeground | GCFont, &v);
735 859
736 if (slow) 860 if (slow)
737 { 861 {
738 do 862 do
739 { 863 {
740 if (*xc) 864 if (*xc)
741 XDrawString (d.display->display, d, GC, x, y + base, xc, 1); 865 XDrawString (d.display->display, d, TGC, x, y + base, xc, 1);
742 866
743 x += r->TermWin.fwidth; 867 x += r->TermWin.fwidth;
744 xc++; len--; 868 xc++; len--;
745 } 869 }
746 while (len); 870 while (len);
747 } 871 }
748 else 872 else
749 XDrawString (d.display->display, d, GC, x, y + base, xc, len); 873 XDrawString (d.display->display, d, TGC, x, y + base, xc, len);
750 } 874 }
751 } 875 }
752} 876}
753 877
754///////////////////////////////////////////////////////////////////////////// 878/////////////////////////////////////////////////////////////////////////////
771 895
772 void draw (rxvt_drawable &d, int x, int y, 896 void draw (rxvt_drawable &d, int x, int y,
773 const text_t *text, int len, 897 const text_t *text, int len,
774 int fg, int bg); 898 int fg, int bg);
775 899
776 bool has_codepoint (uint32_t unicode); 900 bool has_codepoint (unicode_t unicode);
777 901
778protected: 902protected:
779 XftFont *f; 903 XftFont *f;
780}; 904};
781 905
894 1018
895 return true; 1019 return true;
896} 1020}
897 1021
898bool 1022bool
899rxvt_font_xft::has_codepoint (uint32_t unicode) 1023rxvt_font_xft::has_codepoint (unicode_t unicode)
900{ 1024{
901 return XftCharExists (DISPLAY, f, unicode); 1025 return XftCharExists (DISPLAY, f, unicode);
902} 1026}
903 1027
904void 1028void
1000 f = new rxvt_font_x11; 1124 f = new rxvt_font_x11;
1001 } 1125 }
1002 else 1126 else
1003 f = new rxvt_font_x11; 1127 f = new rxvt_font_x11;
1004 1128
1129 f->fs = this;
1005 f->set_term (r); 1130 f->set_term (r);
1006 f->set_name (strdup (name)); 1131 f->set_name (strdup (name));
1007 1132
1008 f->cs = cs; 1133 f->cs = cs;
1009 f->loaded = false; 1134 f->loaded = false;
1106 1231
1107 return true; 1232 return true;
1108} 1233}
1109 1234
1110int 1235int
1111rxvt_fontset::find_font (uint32_t unicode) 1236rxvt_fontset::find_font (unicode_t unicode)
1112{ 1237{
1113 for (unsigned int i = 0; i < fonts.size (); i++) 1238 for (unsigned int i = 0; i < fonts.size (); i++)
1114 { 1239 {
1115 rxvt_font *f = fonts[i]; 1240 rxvt_font *f = fonts[i];
1116 1241

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines