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.42 by pcg, Mon Mar 15 06:13:35 2004 UTC

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
194#endif 201#endif
195 } 202 }
196} 203}
197 204
198static const char *linedraw_cmds[128] = { 205static const char *linedraw_cmds[128] = {
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"
245 252
246 // to be done 253 // to be done
261 bool load (const rxvt_fontprop &prop) 268 bool load (const rxvt_fontprop &prop)
262 { 269 {
263 width = 1; height = 1; 270 width = 1; height = 1;
264 ascent = 1; descent = 0; 271 ascent = 1; descent = 0;
265 272
273 set_name ("built-in pseudofont");
274
266 return true; 275 return true;
267 } 276 }
268 277
269 bool has_codepoint (uint32_t unicode) 278 bool has_codepoint (unicode_t unicode)
270 { 279 {
271 if (unicode <= 0x001f) 280 if (unicode <= 0x001f)
272 return true; 281 return true;
282
273 if (unicode >= 0x0080 && unicode <= 0x009f) 283 if (unicode >= 0x0080 && unicode <= 0x009f)
274 return true; 284 return true;
275 285
276 if (unicode >= 0x2500 && unicode <= 0x257f 286 if (unicode >= 0x2500 && unicode <= 0x257f
277 && linedraw_cmds[unicode - 0x2500]) 287 && linedraw_cmds[unicode - 0x2500])
288 return true;
289
290 if (IS_COMPOSE (unicode))
278 return true; 291 return true;
279 292
280 switch (unicode) 293 switch (unicode)
281 { 294 {
282 case ZERO_WIDTH_CHAR: 295 case ZERO_WIDTH_CHAR:
300 313
301 XSetForeground (d.display->display, GC, r->PixColors[fg]); 314 XSetForeground (d.display->display, GC, r->PixColors[fg]);
302 315
303 while (len--) 316 while (len--)
304 { 317 {
318#if ENABLE_COMBINING
319 compose_char *cc;
320#endif
305 text_t t = *text++; 321 text_t t = *text++;
306 322
323 // is it in our linedrawing table?
307 if (t >= 0x2500 & t <= 0x2580 && linedraw_cmds[t - 0x2500]) 324 if (t >= 0x2500 & t <= 0x2580 && linedraw_cmds[t - 0x2500])
308 { 325 {
309 const char *p = linedraw_cmds[t - 0x2500]; 326 const char *p = linedraw_cmds[t - 0x2500];
310 327
311 int x0 = x, x1 = x + r->TermWin.fwidth / 2, x2 = x + r->TermWin.fwidth - 1; 328 int W = r->TermWin.fwidth , w = (W - 1) / 2;
312 int y0 = y, y1 = y + r->TermWin.fheight / 2, y2 = y + r->TermWin.fheight - 1; 329 int H = r->TermWin.fheight, h = (H - 1) / 2;
330 int x0 = x, x1 = x + w, x2 = x + r->TermWin.fwidth ;
331 int y0 = y, y1 = y + h, y2 = y + r->TermWin.fheight;
313 332
314 XGCValues gcv; 333 XGCValues gcv;
334
335 gcv.cap_style = CapNotLast;
336 XChangeGC (d.display->display, GC, GCCapStyle, &gcv);
315 337
316 while (*p) 338 while (*p)
317 { 339 {
318 switch (*p++) 340 switch (*p++)
319 { 341 {
321 gcv.line_width = 0; 343 gcv.line_width = 0;
322 XChangeGC (d.display->display, GC, GCLineWidth, &gcv); 344 XChangeGC (d.display->display, GC, GCLineWidth, &gcv);
323 break; 345 break;
324 346
325 case '2': 347 case '2':
326 gcv.line_width = 2; 348 gcv.line_width = 3;
327 XChangeGC (d.display->display, GC, GCLineWidth, &gcv); 349 XChangeGC (d.display->display, GC, GCLineWidth, &gcv);
328 break; 350 break;
329 351
330 case 'h': XDrawLine (d.display->display, d, GC, x0, y1, x1, y1); break; 352 case 'h': XDrawLine (d.display->display, d, GC, x0, y1, x1+1, y1 ); break;
331 case 'H': XDrawLine (d.display->display, d, GC, x1, y1, x2, y1); break; 353 case 'H': XDrawLine (d.display->display, d, GC, x2, y1, x1-1, y1 ); break;
354 case '-': XDrawLine (d.display->display, d, GC, x0, y1, x2 , y1 ); break;
332 case 'v': XDrawLine (d.display->display, d, GC, x1, y0, x1, y1); break; 355 case 'v': XDrawLine (d.display->display, d, GC, x1, y0, x1 , y1+1); break;
356 case 'V': XDrawLine (d.display->display, d, GC, x1, y2, x1 , y1-1); break;
333 case 'V': XDrawLine (d.display->display, d, GC, x1, y1, x1, y2); break; 357 case '|': XDrawLine (d.display->display, d, GC, x1, y0, x1 , y2 ); break;
358
334 case 'a': XDrawLine (d.display->display, d, GC, x0, y2, x2, y0); break; 359 case '/' : XDrawLine (d.display->display, d, GC, x0, y2, x2 , y0 ); break;
335 case 'b': XDrawLine (d.display->display, d, GC, x0, y0, x2, y2); break; 360 case '\\': XDrawLine (d.display->display, d, GC, x0, y0, x2 , y2 ); break;
361
362 case 'A': XDrawArc (d.display->display, d, GC, x1 , y1 , W-1, H-1, 90*64, 90*64); break;
363 case 'B': XDrawArc (d.display->display, d, GC, x1-W+1, y1 , W-1, H-1, 0*64, 90*64); break;
364 case 'C': XDrawArc (d.display->display, d, GC, x1-W+1, y1-H+1, W-1, H-1, 0*64, -90*64); break;
365 case 'D': XDrawArc (d.display->display, d, GC, x1 , y1-H+1, W-1, H-1, -90*64, -90*64); break;
336 } 366 }
337 } 367 }
338 368
339 gcv.line_width = 0; 369 gcv.line_width = 0;
340 XChangeGC (d.display->display, GC, GCLineWidth, &gcv); 370 XChangeGC (d.display->display, GC, GCLineWidth, &gcv);
341 } 371 }
372
373#if ENABLE_COMBINING
374 else if (IS_COMPOSE (t) && (cc = rxvt_composite[t]))
375 {
376 rxvt_font *f1 = (*fs)[fs->find_font (cc->c1)];
377 f1->draw (d, x, y, &(t = cc->c1), 1, fg, bg);
378 if (cc->c2 != NOCHAR)
379 {
380 // prefer font of first character, for no good reasons
381 rxvt_font *f2 = f1->has_codepoint (cc->c2)
382 ? f1
383 : (*fs)[fs->find_font (cc->c2)];
384
385 f2->draw (d, x, y, &(t = cc->c2), 1, fg, -1);
386 }
387 }
388#endif
342 else 389 else
343 switch (*text++) 390 switch (t)
344 { 391 {
345 case NOCHAR:
346 case ZERO_WIDTH_CHAR: 392 case ZERO_WIDTH_CHAR:
347 break; 393 break;
348 default: 394 default:
349 XDrawRectangle (d.display->display, d, GC, x + 2, y + 2, r->TermWin.fwidth - 5, r->TermWin.fheight - 5); 395 int w = 0;
396 while (len > 0 && *text == NOCHAR)
397 {
398 ++text;
399 --len;
400 w += r->TermWin.fwidth;
401 }
402
403 XDrawRectangle (d.display->display, d, GC, x + 2, y + 2,
404 w + r->TermWin.fwidth - 5, r->TermWin.fheight - 5);
405 x += w;
350 } 406 }
351 407
352 x += r->TermWin.fwidth; 408 x += r->TermWin.fwidth;
353 } 409 }
354} 410}
362 418
363 rxvt_fontprop properties (); 419 rxvt_fontprop properties ();
364 420
365 bool load (const rxvt_fontprop &prop); 421 bool load (const rxvt_fontprop &prop);
366 422
367 bool has_codepoint (uint32_t unicode); 423 bool has_codepoint (unicode_t unicode);
368 424
369 void draw (rxvt_drawable &d, int x, int y, 425 void draw (rxvt_drawable &d, int x, int y,
370 const text_t *text, int len, 426 const text_t *text, int len,
371 int fg, int bg); 427 int fg, int bg);
372 428
429 485
430bool 486bool
431rxvt_font_x11::set_properties (rxvt_fontprop &p, const char *name) 487rxvt_font_x11::set_properties (rxvt_fontprop &p, const char *name)
432{ 488{
433 int slashes = 0; 489 int slashes = 0;
434 const char *comp[12]; 490 const char *comp[13];
435 491
436 for (const char *c = name; *c; c++) 492 for (const char *c = name; *c; c++)
437 if (*c == '-') 493 if (*c == '-')
438 { 494 {
439 comp[slashes++] = c + 1; 495 comp[slashes++] = c + 1;
619 f = 0; 675 f = 0;
620 } 676 }
621} 677}
622 678
623bool 679bool
624rxvt_font_x11::has_codepoint (uint32_t unicode) 680rxvt_font_x11::has_codepoint (unicode_t unicode)
625{ 681{
626 uint32_t ch = FROM_UNICODE (cs, unicode); 682 uint32_t ch = FROM_UNICODE (cs, unicode);
627 683
628 if (ch == NOCHAR) 684 if (ch == NOCHAR)
629 return false; 685 return false;
771 827
772 void draw (rxvt_drawable &d, int x, int y, 828 void draw (rxvt_drawable &d, int x, int y,
773 const text_t *text, int len, 829 const text_t *text, int len,
774 int fg, int bg); 830 int fg, int bg);
775 831
776 bool has_codepoint (uint32_t unicode); 832 bool has_codepoint (unicode_t unicode);
777 833
778protected: 834protected:
779 XftFont *f; 835 XftFont *f;
780}; 836};
781 837
894 950
895 return true; 951 return true;
896} 952}
897 953
898bool 954bool
899rxvt_font_xft::has_codepoint (uint32_t unicode) 955rxvt_font_xft::has_codepoint (unicode_t unicode)
900{ 956{
901 return XftCharExists (DISPLAY, f, unicode); 957 return XftCharExists (DISPLAY, f, unicode);
902} 958}
903 959
904void 960void
1000 f = new rxvt_font_x11; 1056 f = new rxvt_font_x11;
1001 } 1057 }
1002 else 1058 else
1003 f = new rxvt_font_x11; 1059 f = new rxvt_font_x11;
1004 1060
1061 f->fs = this;
1005 f->set_term (r); 1062 f->set_term (r);
1006 f->set_name (strdup (name)); 1063 f->set_name (strdup (name));
1007 1064
1008 f->cs = cs; 1065 f->cs = cs;
1009 f->loaded = false; 1066 f->loaded = false;
1106 1163
1107 return true; 1164 return true;
1108} 1165}
1109 1166
1110int 1167int
1111rxvt_fontset::find_font (uint32_t unicode) 1168rxvt_fontset::find_font (unicode_t unicode)
1112{ 1169{
1113 for (unsigned int i = 0; i < fonts.size (); i++) 1170 for (unsigned int i = 0; i < fonts.size (); i++)
1114 { 1171 {
1115 rxvt_font *f = fonts[i]; 1172 rxvt_font *f = fonts[i];
1116 1173

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines