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.31 by pcg, Thu Mar 4 00:40:06 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
201#endif 201#endif
202 } 202 }
203} 203}
204 204
205static const char *linedraw_cmds[128] = { 205static const char *linedraw_cmds[128] = {
206 "1hH", "2hH", "1vV", "2vV", 206 "1-", "2-", "1|", "2|",
207 0, 0, 0, 0, 207 0, 0, 0, 0,
208 0, 0, 0, 0, 208 0, 0, 0, 0,
209 "1HV", "2H1V", "1H2V", "2HV", 209 "1HV", "2H1V", "1H2V", "2HV",
210 210
211 // 2510 211 // 2510
212 "1hV", "2h1V", "1h2V", "2hV", 212 "1hV", "2h1V", "1h2V", "2hV",
213 "1Hv", "2H1v", "1H2v", "2Hv", 213 "1Hv", "2H1v", "1H2v", "2Hv",
214 "1hv", "2h1v", "1h2v", "2hv", 214 "1hv", "2h1v", "1h2v", "2hv",
215 "1HvV", "2H1vV", "1HV2v", "1Hv2V", 215 "1H|", "2H1|", "1HV2v", "1Hv2V",
216 216
217 // 2520 217 // 2520
218 "1H2vV", "2Hv1V", "2HV1v", "2HvV", 218 "1H2|", "2Hv1V", "2HV1v", "2H|",
219 "1hvV", "2h1vV", "1hV2v", "1hv2V", 219 "1h|", "2h1|", "1hV2v", "1hv2V",
220 "1h2vV", "2hv1V", "1v2hV", "2hvV", 220 "1h2|", "2hv1V", "1v2hV", "2h|",
221 "1hHV", "2h1HV", "2H1hV", "2hH1V", 221 "1-V", "2h1HV", "2H1hV", "2-1V",
222 222
223 // 2530 223 // 2530
224 "1hH2V", "2hV1H", "1h2HV", "2hHV", 224 "1-2V", "2hV1H", "1h2HV", "2-V",
225 "1hHv", "1vH2h", "1hv2H", "1v2hH", 225 "1-v", "1vH2h", "1hv2H", "1v2-",
226 "1hH2v", "1H2hv", "1h2Hv", "2hHv", 226 "1-2v", "1H2hv", "1h2Hv", "2-v",
227 "1hHvV", "1vVH2h", "1hvV2H", "1vV2hH", 227 "1-|", "1|H2h", "1h|2H", "1|2-",
228 228
229 // 2540 229 // 2540
230 "1hHV2v", "1hHv2V", "1hH2vV", "1HV2hv", 230 "1-V2v", "1-v2V", "1-2|", "1HV2hv",
231 "1hV2Hv", "1Hv2hV", "1hv2HV", "1V2hHv", 231 "1hV2Hv", "1Hv2hV", "1hv2HV", "1V2-v",
232 "1v2hHV", "1H2hvV", "1h2HvV", "2hHvV", 232 "1v2-V", "1H2h|", "1h2H|", "2-|",
233 0, 0, 0, 0, 233 0, 0, 0, 0,
234 234
235 // 2550 235 // 2550
236 0, 0, 0, 0, 236 0, 0, 0, 0,
237 0, 0, 0, 0, 237 0, 0, 0, 0,
240 240
241 // 2560 241 // 2560
242 0, 0, 0, 0, 242 0, 0, 0, 0,
243 0, 0, 0, 0, 243 0, 0, 0, 0,
244 0, 0, 0, 0, 244 0, 0, 0, 0,
245 0, 0, 0, 0, 245 0, "A", "B", "C",
246 246
247 // 2570 247 // 2570
248 0, "1a", "1b", "1ab", 248 "D", "1/", "1\\", "1/\\",
249 "1h", "1v", "1H", "1V", 249 "1h", "1v", "1H", "1V",
250 "2h", "2v", "2H", "2V", 250 "2h", "2v", "2H", "2V",
251 "1h2H", "1v2V", "1H2h", "1V2v" 251 "1h2H", "1v2V", "1H2h", "1V2v"
252 252
253 // to be done 253 // to be done
268 bool load (const rxvt_fontprop &prop) 268 bool load (const rxvt_fontprop &prop)
269 { 269 {
270 width = 1; height = 1; 270 width = 1; height = 1;
271 ascent = 1; descent = 0; 271 ascent = 1; descent = 0;
272 272
273 set_name ("built-in pseudofont");
274
273 return true; 275 return true;
274 } 276 }
275 277
276 bool has_codepoint (uint32_t unicode) 278 bool has_codepoint (unicode_t unicode)
277 { 279 {
278 if (unicode <= 0x001f) 280 if (unicode <= 0x001f)
279 return true; 281 return true;
282
280 if (unicode >= 0x0080 && unicode <= 0x009f) 283 if (unicode >= 0x0080 && unicode <= 0x009f)
281 return true; 284 return true;
282 285
283 if (unicode >= 0x2500 && unicode <= 0x257f 286 if (unicode >= 0x2500 && unicode <= 0x257f
284 && linedraw_cmds[unicode - 0x2500]) 287 && linedraw_cmds[unicode - 0x2500])
288 return true;
289
290 if (IS_COMPOSE (unicode))
285 return true; 291 return true;
286 292
287 switch (unicode) 293 switch (unicode)
288 { 294 {
289 case ZERO_WIDTH_CHAR: 295 case ZERO_WIDTH_CHAR:
307 313
308 XSetForeground (d.display->display, GC, r->PixColors[fg]); 314 XSetForeground (d.display->display, GC, r->PixColors[fg]);
309 315
310 while (len--) 316 while (len--)
311 { 317 {
318#if ENABLE_COMBINING
319 compose_char *cc;
320#endif
312 text_t t = *text++; 321 text_t t = *text++;
313 322
314 // is it in our linedrawing table? 323 // is it in our linedrawing table?
315 if (t >= 0x2500 & t <= 0x2580 && linedraw_cmds[t - 0x2500]) 324 if (t >= 0x2500 & t <= 0x2580 && linedraw_cmds[t - 0x2500])
316 { 325 {
317 const char *p = linedraw_cmds[t - 0x2500]; 326 const char *p = linedraw_cmds[t - 0x2500];
318 327
319 int x0 = x, x1 = x + (r->TermWin.fwidth - 1) / 2, x2 = x + r->TermWin.fwidth - 1; 328 int W = r->TermWin.fwidth , w = (W - 1) / 2;
320 int y0 = y, y1 = y + (r->TermWin.fheight - 1) / 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;
321 332
322 XGCValues gcv; 333 XGCValues gcv;
334
335 gcv.cap_style = CapNotLast;
336 XChangeGC (d.display->display, GC, GCCapStyle, &gcv);
323 337
324 while (*p) 338 while (*p)
325 { 339 {
326 switch (*p++) 340 switch (*p++)
327 { 341 {
329 gcv.line_width = 0; 343 gcv.line_width = 0;
330 XChangeGC (d.display->display, GC, GCLineWidth, &gcv); 344 XChangeGC (d.display->display, GC, GCLineWidth, &gcv);
331 break; 345 break;
332 346
333 case '2': 347 case '2':
334 gcv.line_width = 2; 348 gcv.line_width = 3;
335 XChangeGC (d.display->display, GC, GCLineWidth, &gcv); 349 XChangeGC (d.display->display, GC, GCLineWidth, &gcv);
336 break; 350 break;
337 351
338 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;
339 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;
340 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;
341 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
342 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;
343 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;
344 } 366 }
345 } 367 }
346 368
347 gcv.line_width = 0; 369 gcv.line_width = 0;
348 XChangeGC (d.display->display, GC, GCLineWidth, &gcv); 370 XChangeGC (d.display->display, GC, GCLineWidth, &gcv);
349 } 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
350 else 389 else
351 switch (t) 390 switch (t)
352 { 391 {
353 case ZERO_WIDTH_CHAR: 392 case ZERO_WIDTH_CHAR:
354 break; 393 break;
379 418
380 rxvt_fontprop properties (); 419 rxvt_fontprop properties ();
381 420
382 bool load (const rxvt_fontprop &prop); 421 bool load (const rxvt_fontprop &prop);
383 422
384 bool has_codepoint (uint32_t unicode); 423 bool has_codepoint (unicode_t unicode);
385 424
386 void draw (rxvt_drawable &d, int x, int y, 425 void draw (rxvt_drawable &d, int x, int y,
387 const text_t *text, int len, 426 const text_t *text, int len,
388 int fg, int bg); 427 int fg, int bg);
389 428
636 f = 0; 675 f = 0;
637 } 676 }
638} 677}
639 678
640bool 679bool
641rxvt_font_x11::has_codepoint (uint32_t unicode) 680rxvt_font_x11::has_codepoint (unicode_t unicode)
642{ 681{
643 uint32_t ch = FROM_UNICODE (cs, unicode); 682 uint32_t ch = FROM_UNICODE (cs, unicode);
644 683
645 if (ch == NOCHAR) 684 if (ch == NOCHAR)
646 return false; 685 return false;
788 827
789 void draw (rxvt_drawable &d, int x, int y, 828 void draw (rxvt_drawable &d, int x, int y,
790 const text_t *text, int len, 829 const text_t *text, int len,
791 int fg, int bg); 830 int fg, int bg);
792 831
793 bool has_codepoint (uint32_t unicode); 832 bool has_codepoint (unicode_t unicode);
794 833
795protected: 834protected:
796 XftFont *f; 835 XftFont *f;
797}; 836};
798 837
911 950
912 return true; 951 return true;
913} 952}
914 953
915bool 954bool
916rxvt_font_xft::has_codepoint (uint32_t unicode) 955rxvt_font_xft::has_codepoint (unicode_t unicode)
917{ 956{
918 return XftCharExists (DISPLAY, f, unicode); 957 return XftCharExists (DISPLAY, f, unicode);
919} 958}
920 959
921void 960void
1017 f = new rxvt_font_x11; 1056 f = new rxvt_font_x11;
1018 } 1057 }
1019 else 1058 else
1020 f = new rxvt_font_x11; 1059 f = new rxvt_font_x11;
1021 1060
1061 f->fs = this;
1022 f->set_term (r); 1062 f->set_term (r);
1023 f->set_name (strdup (name)); 1063 f->set_name (strdup (name));
1024 1064
1025 f->cs = cs; 1065 f->cs = cs;
1026 f->loaded = false; 1066 f->loaded = false;
1123 1163
1124 return true; 1164 return true;
1125} 1165}
1126 1166
1127int 1167int
1128rxvt_fontset::find_font (uint32_t unicode) 1168rxvt_fontset::find_font (unicode_t unicode)
1129{ 1169{
1130 for (unsigned int i = 0; i < fonts.size (); i++) 1170 for (unsigned int i = 0; i < fonts.size (); i++)
1131 { 1171 {
1132 rxvt_font *f = fonts[i]; 1172 rxvt_font *f = fonts[i];
1133 1173

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines