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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines