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.27 by pcg, Wed Mar 3 00:20:33 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_EXT, "-*-*-*-*-*-*-*-*-*-*-c-*-big5*-0" }, 77 { CS_BIG5, "-*-*-*-*-*-*-*-*-*-*-c-*-big5-0" },
78 { CS_BIG5_PLUS, "-*-*-*-*-*-*-*-*-*-*-c-*-big5p-0" },
79 { CS_BIG5_EXT, "-*-*-*-*-*-*-*-*-*-*-c-*-big5.eten-0" },
78 { CS_CNS11643_1992_1, "-*-*-*-*-*-*-*-*-*-*-c-*-gb2312*-0" }, 80 { CS_CNS11643_1992_1, "-*-*-*-*-*-*-*-*-*-*-c-*-gb2312*-0" },
79 { CS_CNS11643_1992_1, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-1" }, 81 { CS_CNS11643_1992_1, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-1" },
80 { CS_CNS11643_1992_2, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-2" }, 82 { CS_CNS11643_1992_2, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-2" },
81 { CS_CNS11643_1992_3, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-3" }, 83 { CS_CNS11643_1992_3, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-3" },
82 { CS_CNS11643_1992_4, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-4" }, 84 { CS_CNS11643_1992_4, "-*-*-*-*-*-*-*-*-*-*-c-*-cns11643*-4" },
94 { CS_UNICODE, "xft:FreeMono" }, 96 { CS_UNICODE, "xft:FreeMono" },
95 { CS_UNICODE, "-*-unifont-*-*-*-*-*-*-*-*-c-*-iso10646-1" }, 97 { CS_UNICODE, "-*-unifont-*-*-*-*-*-*-*-*-c-*-iso10646-1" },
96 { CS_UNICODE, "-*-*-*-r-*-*-*-*-*-*-c-*-iso10646-1" }, 98 { CS_UNICODE, "-*-*-*-r-*-*-*-*-*-*-c-*-iso10646-1" },
97 { CS_UNICODE, "-*-*-*-r-*-*-*-*-*-*-m-*-iso10646-1" }, 99 { CS_UNICODE, "-*-*-*-r-*-*-*-*-*-*-m-*-iso10646-1" },
98 100
101#if UNICODE_3 && XFT
102 { CS_UNICODE, "xft:Code2001" }, // contains many plane-1 characters
103#endif
104
99 { CS_UNKNOWN, 0 } 105 { CS_UNKNOWN, 0 }
100}; 106};
101 107
102///////////////////////////////////////////////////////////////////////////// 108/////////////////////////////////////////////////////////////////////////////
103 109
195#endif 201#endif
196 } 202 }
197} 203}
198 204
199static const char *linedraw_cmds[128] = { 205static const char *linedraw_cmds[128] = {
200 "1hH", "2hH", "1vV", "2vV", 206 "1-", "2-", "1|", "2|",
201 0, 0, 0, 0, 207 0, 0, 0, 0,
202 0, 0, 0, 0, 208 0, 0, 0, 0,
203 "1HV", "2H1V", "1H2V", "2HV", 209 "1HV", "2H1V", "1H2V", "2HV",
204 210
205 // 2510 211 // 2510
206 "1hV", "2h1V", "1h2V", "2hV", 212 "1hV", "2h1V", "1h2V", "2hV",
207 "1Hv", "2H1v", "1H2v", "2Hv", 213 "1Hv", "2H1v", "1H2v", "2Hv",
208 "1hv", "2h1v", "1h2v", "2hv", 214 "1hv", "2h1v", "1h2v", "2hv",
209 "1HvV", "2H1vV", "1HV2v", "1Hv2V", 215 "1H|", "2H1|", "1HV2v", "1Hv2V",
210 216
211 // 2520 217 // 2520
212 "1H2vV", "2Hv1V", "2HV1v", "2HvV", 218 "1H2|", "2Hv1V", "2HV1v", "2H|",
213 "1hvV", "2h1vV", "1hV2v", "1hv2V", 219 "1h|", "2h1|", "1hV2v", "1hv2V",
214 "1h2vV", "2hv1V", "1v2hV", "2hvV", 220 "1h2|", "2hv1V", "1v2hV", "2h|",
215 "1hHV", "2h1HV", "2H1hV", "2hH1V", 221 "1-V", "2h1HV", "2H1hV", "2-1V",
216 222
217 // 2530 223 // 2530
218 "1hH2V", "2hV1H", "1h2HV", "2hHV", 224 "1-2V", "2hV1H", "1h2HV", "2-V",
219 "1hHv", "1vH2h", "1hv2H", "1v2hH", 225 "1-v", "1vH2h", "1hv2H", "1v2-",
220 "1hH2v", "1H2hv", "1h2Hv", "2hHv", 226 "1-2v", "1H2hv", "1h2Hv", "2-v",
221 "1hHvV", "1vVH2h", "1hvV2H", "1vV2hH", 227 "1-|", "1|H2h", "1h|2H", "1|2-",
222 228
223 // 2540 229 // 2540
224 "1hHV2v", "1hHv2V", "1hH2vV", "1HV2hv", 230 "1-V2v", "1-v2V", "1-2|", "1HV2hv",
225 "1hV2Hv", "1Hv2hV", "1hv2HV", "1V2hHv", 231 "1hV2Hv", "1Hv2hV", "1hv2HV", "1V2-v",
226 "1v2hHV", "1H2hvV", "1h2HvV", "2hHvV", 232 "1v2-V", "1H2h|", "1h2H|", "2-|",
227 0, 0, 0, 0, 233 0, 0, 0, 0,
228 234
229 // 2550 235 // 2550
230 0, 0, 0, 0, 236 0, 0, 0, 0,
231 0, 0, 0, 0, 237 0, 0, 0, 0,
234 240
235 // 2560 241 // 2560
236 0, 0, 0, 0, 242 0, 0, 0, 0,
237 0, 0, 0, 0, 243 0, 0, 0, 0,
238 0, 0, 0, 0, 244 0, 0, 0, 0,
239 0, 0, 0, 0, 245 0, "A", "B", "C",
240 246
241 // 2570 247 // 2570
242 0, "1a", "1b", "1ab", 248 "D", "1/", "1\\", "1/\\",
243 "1h", "1v", "1H", "1V", 249 "1h", "1v", "1H", "1V",
244 "2h", "2v", "2H", "2V", 250 "2h", "2v", "2H", "2V",
245 "1h2H", "1v2V", "1H2h", "1V2v" 251 "1h2H", "1v2V", "1H2h", "1V2v"
246 252
247 // to be done 253 // to be done
262 bool load (const rxvt_fontprop &prop) 268 bool load (const rxvt_fontprop &prop)
263 { 269 {
264 width = 1; height = 1; 270 width = 1; height = 1;
265 ascent = 1; descent = 0; 271 ascent = 1; descent = 0;
266 272
273 set_name ("built-in pseudofont");
274
267 return true; 275 return true;
268 } 276 }
269 277
270 bool has_codepoint (uint32_t unicode) 278 bool has_codepoint (unicode_t unicode)
271 { 279 {
272 if (unicode <= 0x001f) 280 if (unicode <= 0x001f)
273 return true; 281 return true;
282
274 if (unicode >= 0x0080 && unicode <= 0x009f) 283 if (unicode >= 0x0080 && unicode <= 0x009f)
275 return true; 284 return true;
276 285
277 if (unicode >= 0x2500 && unicode <= 0x257f 286 if (unicode >= 0x2500 && unicode <= 0x257f
278 && linedraw_cmds[unicode - 0x2500]) 287 && linedraw_cmds[unicode - 0x2500])
288 return true;
289
290 if (IS_COMPOSE (unicode))
279 return true; 291 return true;
280 292
281 switch (unicode) 293 switch (unicode)
282 { 294 {
283 case ZERO_WIDTH_CHAR: 295 case ZERO_WIDTH_CHAR:
301 313
302 XSetForeground (d.display->display, GC, r->PixColors[fg]); 314 XSetForeground (d.display->display, GC, r->PixColors[fg]);
303 315
304 while (len--) 316 while (len--)
305 { 317 {
318#if ENABLE_COMBINING
319 compose_char *cc;
320#endif
306 text_t t = *text++; 321 text_t t = *text++;
307 322
308 // is it in our linedrawing table? 323 // is it in our linedrawing table?
309 if (t >= 0x2500 & t <= 0x2580 && linedraw_cmds[t - 0x2500]) 324 if (t >= 0x2500 & t <= 0x2580 && linedraw_cmds[t - 0x2500])
310 { 325 {
311 const char *p = linedraw_cmds[t - 0x2500]; 326 const char *p = linedraw_cmds[t - 0x2500];
312 327
313 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;
314 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;
315 332
316 XGCValues gcv; 333 XGCValues gcv;
334
335 gcv.cap_style = CapNotLast;
336 XChangeGC (d.display->display, GC, GCCapStyle, &gcv);
317 337
318 while (*p) 338 while (*p)
319 { 339 {
320 switch (*p++) 340 switch (*p++)
321 { 341 {
323 gcv.line_width = 0; 343 gcv.line_width = 0;
324 XChangeGC (d.display->display, GC, GCLineWidth, &gcv); 344 XChangeGC (d.display->display, GC, GCLineWidth, &gcv);
325 break; 345 break;
326 346
327 case '2': 347 case '2':
328 gcv.line_width = 2; 348 gcv.line_width = 3;
329 XChangeGC (d.display->display, GC, GCLineWidth, &gcv); 349 XChangeGC (d.display->display, GC, GCLineWidth, &gcv);
330 break; 350 break;
331 351
332 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;
333 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;
334 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;
335 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
336 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;
337 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;
338 } 366 }
339 } 367 }
340 368
341 gcv.line_width = 0; 369 gcv.line_width = 0;
342 XChangeGC (d.display->display, GC, GCLineWidth, &gcv); 370 XChangeGC (d.display->display, GC, GCLineWidth, &gcv);
343 } 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
344 else 389 else
345 switch (t) 390 switch (t)
346 { 391 {
347 case ZERO_WIDTH_CHAR: 392 case ZERO_WIDTH_CHAR:
348 break; 393 break;
373 418
374 rxvt_fontprop properties (); 419 rxvt_fontprop properties ();
375 420
376 bool load (const rxvt_fontprop &prop); 421 bool load (const rxvt_fontprop &prop);
377 422
378 bool has_codepoint (uint32_t unicode); 423 bool has_codepoint (unicode_t unicode);
379 424
380 void draw (rxvt_drawable &d, int x, int y, 425 void draw (rxvt_drawable &d, int x, int y,
381 const text_t *text, int len, 426 const text_t *text, int len,
382 int fg, int bg); 427 int fg, int bg);
383 428
440 485
441bool 486bool
442rxvt_font_x11::set_properties (rxvt_fontprop &p, const char *name) 487rxvt_font_x11::set_properties (rxvt_fontprop &p, const char *name)
443{ 488{
444 int slashes = 0; 489 int slashes = 0;
445 const char *comp[12]; 490 const char *comp[13];
446 491
447 for (const char *c = name; *c; c++) 492 for (const char *c = name; *c; c++)
448 if (*c == '-') 493 if (*c == '-')
449 { 494 {
450 comp[slashes++] = c + 1; 495 comp[slashes++] = c + 1;
630 f = 0; 675 f = 0;
631 } 676 }
632} 677}
633 678
634bool 679bool
635rxvt_font_x11::has_codepoint (uint32_t unicode) 680rxvt_font_x11::has_codepoint (unicode_t unicode)
636{ 681{
637 uint32_t ch = FROM_UNICODE (cs, unicode); 682 uint32_t ch = FROM_UNICODE (cs, unicode);
638 683
639 if (ch == NOCHAR) 684 if (ch == NOCHAR)
640 return false; 685 return false;
782 827
783 void draw (rxvt_drawable &d, int x, int y, 828 void draw (rxvt_drawable &d, int x, int y,
784 const text_t *text, int len, 829 const text_t *text, int len,
785 int fg, int bg); 830 int fg, int bg);
786 831
787 bool has_codepoint (uint32_t unicode); 832 bool has_codepoint (unicode_t unicode);
788 833
789protected: 834protected:
790 XftFont *f; 835 XftFont *f;
791}; 836};
792 837
905 950
906 return true; 951 return true;
907} 952}
908 953
909bool 954bool
910rxvt_font_xft::has_codepoint (uint32_t unicode) 955rxvt_font_xft::has_codepoint (unicode_t unicode)
911{ 956{
912 return XftCharExists (DISPLAY, f, unicode); 957 return XftCharExists (DISPLAY, f, unicode);
913} 958}
914 959
915void 960void
1011 f = new rxvt_font_x11; 1056 f = new rxvt_font_x11;
1012 } 1057 }
1013 else 1058 else
1014 f = new rxvt_font_x11; 1059 f = new rxvt_font_x11;
1015 1060
1061 f->fs = this;
1016 f->set_term (r); 1062 f->set_term (r);
1017 f->set_name (strdup (name)); 1063 f->set_name (strdup (name));
1018 1064
1019 f->cs = cs; 1065 f->cs = cs;
1020 f->loaded = false; 1066 f->loaded = false;
1117 1163
1118 return true; 1164 return true;
1119} 1165}
1120 1166
1121int 1167int
1122rxvt_fontset::find_font (uint32_t unicode) 1168rxvt_fontset::find_font (unicode_t unicode)
1123{ 1169{
1124 for (unsigned int i = 0; i < fonts.size (); i++) 1170 for (unsigned int i = 0; i < fonts.size (); i++)
1125 { 1171 {
1126 rxvt_font *f = fonts[i]; 1172 rxvt_font *f = fonts[i];
1127 1173

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines