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.29 by pcg, Wed Mar 3 20:15:18 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
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
190 else if (color >= 0) 194 else if (color >= 0)
191 { 195 {
192#if XFT 196#if XFT
193 XftDrawRect (d, &r->PixColors[color].c, x, y, w, h); 197 XftDrawRect (d, &r->PixColors[color].c, x, y, w, h);
194#else 198#else
195 XSetForeground (d.display->display, GC, r->PixColors[color]); 199 XSetForeground (d.display->display, TGC, r->PixColors[color]);
196 XFillRectangle (d.display->display, d, GC, x, y, w, h); 200 XFillRectangle (d.display->display, d, TGC, x, y, w, h);
197#endif 201#endif
198 } 202 }
199} 203}
200 204
201static const char *linedraw_cmds[128] = { 205static const char *linedraw_cmds[128 + 32] = {
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",
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",
248 264
249 // to be done 265 // to be done
250}; 266};
251 267
252struct rxvt_font_default : rxvt_font { 268struct rxvt_font_default : rxvt_font {
264 bool load (const rxvt_fontprop &prop) 280 bool load (const rxvt_fontprop &prop)
265 { 281 {
266 width = 1; height = 1; 282 width = 1; height = 1;
267 ascent = 1; descent = 0; 283 ascent = 1; descent = 0;
268 284
285 set_name ("built-in pseudofont");
286
269 return true; 287 return true;
270 } 288 }
271 289
272 bool has_codepoint (uint32_t unicode) 290 bool has_codepoint (unicode_t unicode)
273 { 291 {
274 if (unicode <= 0x001f) 292 if (unicode <= 0x001f)
275 return true; 293 return true;
294
276 if (unicode >= 0x0080 && unicode <= 0x009f) 295 if (unicode >= 0x0080 && unicode <= 0x009f)
277 return true; 296 return true;
278 297
279 if (unicode >= 0x2500 && unicode <= 0x257f 298 if (unicode >= 0x2500 && unicode <= 0x257f
280 && 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))
281 return true; 306 return true;
282 307
283 switch (unicode) 308 switch (unicode)
284 { 309 {
285 case ZERO_WIDTH_CHAR: 310 case ZERO_WIDTH_CHAR:
292 void draw (rxvt_drawable &d, int x, int y, 317 void draw (rxvt_drawable &d, int x, int y,
293 const text_t *text, int len, 318 const text_t *text, int len,
294 int fg, int bg); 319 int fg, int bg);
295}; 320};
296 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
297void 344void
298rxvt_font_default::draw (rxvt_drawable &d, int x, int y, 345rxvt_font_default::draw (rxvt_drawable &d, int x, int y,
299 const text_t *text, int len, 346 const text_t *text, int len,
300 int fg, int bg) 347 int fg, int bg)
301{ 348{
302 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);
303 350
304 XSetForeground (d.display->display, GC, r->PixColors[fg]); 351 XSetForeground (d.display->display, TGC, r->PixColors[fg]);
305 352
306 while (len--) 353 while (len--)
307 { 354 {
355#if ENABLE_COMBINING
356 compose_char *cc;
357#endif
308 text_t t = *text++; 358 text_t t = *text++;
309 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
310 // is it in our linedrawing table? 365 // is it in our linedrawing table?
311 if (t >= 0x2500 & t <= 0x2580 && linedraw_cmds[t - 0x2500]) 366 if (t >= 0x2500 & t <= 0x259f && linedraw_cmds[t - 0x2500])
312 { 367 {
313 const char *p = linedraw_cmds[t - 0x2500]; 368 const char *p = linedraw_cmds[t - 0x2500];
314 369
315 int x0 = x, x1 = x + r->TermWin.fwidth / 2, x2 = x + r->TermWin.fwidth - 1;
316 int y0 = y, y1 = y + r->TermWin.fheight / 2, y2 = y + r->TermWin.fheight - 1;
317
318 XGCValues gcv; 370 XGCValues gcv;
371
372 gcv.cap_style = CapNotLast;
373 XChangeGC (d.display->display, TGC, GCCapStyle, &gcv);
319 374
320 while (*p) 375 while (*p)
321 { 376 {
322 switch (*p++) 377 switch (*p++)
323 { 378 {
324 case '1': 379 case '1':
325 gcv.line_width = 0; 380 gcv.line_width = 0;
326 XChangeGC (d.display->display, GC, GCLineWidth, &gcv); 381 XChangeGC (d.display->display, TGC, GCLineWidth, &gcv);
327 break; 382 break;
328 383
329 case '2': 384 case '2':
330 gcv.line_width = 2; 385 gcv.line_width = 3;
331 XChangeGC (d.display->display, GC, GCLineWidth, &gcv); 386 XChangeGC (d.display->display, TGC, GCLineWidth, &gcv);
332 break; 387 break;
333 388
334 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;
335 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;
336 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;
337 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
338 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;
339 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;
340 } 408 }
341 } 409 }
342 410
343 gcv.line_width = 0; 411 gcv.line_width = 0;
344 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]))
345 } 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
346 else 431 else
347 switch (t) 432 switch (t)
348 { 433 {
349 case ZERO_WIDTH_CHAR: 434 case ZERO_WIDTH_CHAR:
350 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
351 default: 462 default:
352 int w = 0; 463 int w = 0;
353 while (len > 0 && *text == NOCHAR) 464 while (len > 0 && *text == NOCHAR)
354 { 465 {
355 ++text; 466 ++text;
356 --len; 467 --len;
357 w += r->TermWin.fwidth; 468 w += r->TermWin.fwidth;
358 } 469 }
359 470
360 XDrawRectangle (d.display->display, d, GC, x + 2, y + 2, 471 XDrawRectangle (d.display->display, d, TGC, x + 2, y + 2,
361 w + r->TermWin.fwidth - 5, r->TermWin.fheight - 5); 472 w + r->TermWin.fwidth - 4, r->TermWin.fheight - 4);
362 x += w; 473 x += w;
363 } 474 }
364 475
365 x += r->TermWin.fwidth; 476 x += r->TermWin.fwidth;
366 } 477 }
375 486
376 rxvt_fontprop properties (); 487 rxvt_fontprop properties ();
377 488
378 bool load (const rxvt_fontprop &prop); 489 bool load (const rxvt_fontprop &prop);
379 490
380 bool has_codepoint (uint32_t unicode); 491 bool has_codepoint (unicode_t unicode);
381 492
382 void draw (rxvt_drawable &d, int x, int y, 493 void draw (rxvt_drawable &d, int x, int y,
383 const text_t *text, int len, 494 const text_t *text, int len,
384 int fg, int bg); 495 int fg, int bg);
385 496
632 f = 0; 743 f = 0;
633 } 744 }
634} 745}
635 746
636bool 747bool
637rxvt_font_x11::has_codepoint (uint32_t unicode) 748rxvt_font_x11::has_codepoint (unicode_t unicode)
638{ 749{
639 uint32_t ch = FROM_UNICODE (cs, unicode); 750 uint32_t ch = FROM_UNICODE (cs, unicode);
640 751
641 if (ch == NOCHAR) 752 if (ch == NOCHAR)
642 return false; 753 return false;
704 { 815 {
705 const XChar2b *xc = enc_xchar2b (text, len, cs, slow); 816 const XChar2b *xc = enc_xchar2b (text, len, cs, slow);
706 817
707 if (bg == Color_bg && !slow) 818 if (bg == Color_bg && !slow)
708 { 819 {
709 XChangeGC (d.display->display, GC, GCForeground | GCBackground | GCFont, &v); 820 XChangeGC (d.display->display, TGC, GCForeground | GCBackground | GCFont, &v);
710 XDrawImageString16 (d.display->display, d, GC, x, y + base, xc, len); 821 XDrawImageString16 (d.display->display, d, TGC, x, y + base, xc, len);
711 } 822 }
712 else 823 else
713 { 824 {
714 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);
715 826
716 XChangeGC (d.display->display, GC, GCForeground | GCFont, &v); 827 XChangeGC (d.display->display, TGC, GCForeground | GCFont, &v);
717 828
718 if (slow) 829 if (slow)
719 { 830 {
720 do 831 do
721 { 832 {
722 if (xc->byte1 || xc->byte2) 833 if (xc->byte1 || xc->byte2)
723 XDrawString16 (d.display->display, d, GC, x, y + base, xc, 1); 834 XDrawString16 (d.display->display, d, TGC, x, y + base, xc, 1);
724 835
725 x += r->TermWin.fwidth; 836 x += r->TermWin.fwidth;
726 xc++; len--; 837 xc++; len--;
727 } 838 }
728 while (len); 839 while (len);
729 } 840 }
730 else 841 else
731 XDrawString16 (d.display->display, d, GC, x, y + base, xc, len); 842 XDrawString16 (d.display->display, d, TGC, x, y + base, xc, len);
732 } 843 }
733 } 844 }
734 else 845 else
735 { 846 {
736 const char *xc = enc_char (text, len, cs, slow); 847 const char *xc = enc_char (text, len, cs, slow);
737 848
738 if (bg == Color_bg && !slow) 849 if (bg == Color_bg && !slow)
739 { 850 {
740 XChangeGC (d.display->display, GC, GCForeground | GCBackground | GCFont, &v); 851 XChangeGC (d.display->display, TGC, GCForeground | GCBackground | GCFont, &v);
741 XDrawImageString (d.display->display, d, GC, x, y + base, xc, len); 852 XDrawImageString (d.display->display, d, TGC, x, y + base, xc, len);
742 } 853 }
743 else 854 else
744 { 855 {
745 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);
746 857
747 XChangeGC (d.display->display, GC, GCForeground | GCFont, &v); 858 XChangeGC (d.display->display, TGC, GCForeground | GCFont, &v);
748 859
749 if (slow) 860 if (slow)
750 { 861 {
751 do 862 do
752 { 863 {
753 if (*xc) 864 if (*xc)
754 XDrawString (d.display->display, d, GC, x, y + base, xc, 1); 865 XDrawString (d.display->display, d, TGC, x, y + base, xc, 1);
755 866
756 x += r->TermWin.fwidth; 867 x += r->TermWin.fwidth;
757 xc++; len--; 868 xc++; len--;
758 } 869 }
759 while (len); 870 while (len);
760 } 871 }
761 else 872 else
762 XDrawString (d.display->display, d, GC, x, y + base, xc, len); 873 XDrawString (d.display->display, d, TGC, x, y + base, xc, len);
763 } 874 }
764 } 875 }
765} 876}
766 877
767///////////////////////////////////////////////////////////////////////////// 878/////////////////////////////////////////////////////////////////////////////
784 895
785 void draw (rxvt_drawable &d, int x, int y, 896 void draw (rxvt_drawable &d, int x, int y,
786 const text_t *text, int len, 897 const text_t *text, int len,
787 int fg, int bg); 898 int fg, int bg);
788 899
789 bool has_codepoint (uint32_t unicode); 900 bool has_codepoint (unicode_t unicode);
790 901
791protected: 902protected:
792 XftFont *f; 903 XftFont *f;
793}; 904};
794 905
907 1018
908 return true; 1019 return true;
909} 1020}
910 1021
911bool 1022bool
912rxvt_font_xft::has_codepoint (uint32_t unicode) 1023rxvt_font_xft::has_codepoint (unicode_t unicode)
913{ 1024{
914 return XftCharExists (DISPLAY, f, unicode); 1025 return XftCharExists (DISPLAY, f, unicode);
915} 1026}
916 1027
917void 1028void
1013 f = new rxvt_font_x11; 1124 f = new rxvt_font_x11;
1014 } 1125 }
1015 else 1126 else
1016 f = new rxvt_font_x11; 1127 f = new rxvt_font_x11;
1017 1128
1129 f->fs = this;
1018 f->set_term (r); 1130 f->set_term (r);
1019 f->set_name (strdup (name)); 1131 f->set_name (strdup (name));
1020 1132
1021 f->cs = cs; 1133 f->cs = cs;
1022 f->loaded = false; 1134 f->loaded = false;
1119 1231
1120 return true; 1232 return true;
1121} 1233}
1122 1234
1123int 1235int
1124rxvt_fontset::find_font (uint32_t unicode) 1236rxvt_fontset::find_font (unicode_t unicode)
1125{ 1237{
1126 for (unsigned int i = 0; i < fonts.size (); i++) 1238 for (unsigned int i = 0; i < fonts.size (); i++)
1127 { 1239 {
1128 rxvt_font *f = fonts[i]; 1240 rxvt_font *f = fonts[i];
1129 1241

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines