--- rxvt-unicode/src/rxvtfont.C 2010/03/31 23:01:51 1.163 +++ rxvt-unicode/src/rxvtfont.C 2011/01/10 10:36:16 1.174 @@ -28,6 +28,10 @@ #include +#if XFT +# include +#endif + #define MAX_OVERLAP_ROMAN (8 + 2) // max. character width in 8ths of the base width #define MAX_OVERLAP_ITALIC (8 + 3) // max. overlap for italic fonts @@ -37,7 +41,7 @@ : ((prop)->width * (wcw) * MAX_OVERLAP_ROMAN + 7) >> 3 \ )) -const struct rxvt_fallback_font { +static const struct rxvt_fallback_font { codeset cs; const char *name; } fallback_fonts[] = { @@ -157,8 +161,6 @@ 0x304c, 0x672c, // が本 }; -#define NUM_EXTENT_TEST_CHARS (sizeof (extent_test_chars) / sizeof (extent_test_chars[0])) - #define dTermDisplay Display *disp = term->dpy #define dTermGC GC gc = term->gc @@ -450,7 +452,7 @@ chrs [1] = NOCHAR; *chrs = cc->c1; - rxvt_font *f1 = (*fs)[fs->find_font (cc->c1)]; + rxvt_font *f1 = (*fs)[fs->find_font_idx (cc->c1)]; f1->draw (d, x, y, chrs, width, fg, bg); if (cc->c2 != NOCHAR) @@ -461,7 +463,7 @@ *chrs = cc->c2; rxvt_font *f2 = (f1->has_char (cc->c2, 0, careful) && !careful) ? f1 - : (*fs)[fs->find_font (cc->c2)]; + : (*fs)[fs->find_font_idx (cc->c2)]; f2->draw (d, x, y, chrs, width, fg, Color_none); } @@ -718,12 +720,12 @@ if (!f) return false; - char *new_name = get_property (f, XA_FONT, name); + char *new_name = get_property (f, XA_FONT, 0); if (new_name) set_name (new_name); else - rxvt_warn ("font '%s' has no FONT property, continuing without.", name); + rxvt_warn ("font '%s' has no FONT property, continuing without.\n", name); XFreeFont (disp, f); f = 0; @@ -790,12 +792,14 @@ diff += 300; // more heavily penalize what looks like scaled bitmap fonts } - if (!set_properties (p, fname)) - continue; - - if (prop.height != rxvt_fontprop::unset - && p.height > prop.height) // weed out too large fonts - continue; + if (!set_properties (p, fname) + // also weed out too large fonts + || (prop.height != rxvt_fontprop::unset + && p.height > prop.height)) + { + free (fname); + continue; + } if (prop.height != rxvt_fontprop::unset) diff += (prop.height - p.height) * 128; if (prop.weight != rxvt_fontprop::unset) diff += abs (prop.weight - p.weight); @@ -862,7 +866,8 @@ if (cs == CS_UNKNOWN) { - const char *charset = get_property (f, XA_FONT, 0); + char *value = get_property (f, XA_FONT, 0); + const char *charset = value; if (!charset) charset = name; @@ -875,6 +880,8 @@ cs = codeset_from_name (charset); if (cs == CS_UNKNOWN) rxvt_warn ("%s: cannot deduce encoding from font name property \"%s\", ignoring font.\n", name, charset); + + free (value); } if (cs == CS_UNKNOWN) @@ -916,7 +923,7 @@ width = 1; - for (uint16_t *t = extent_test_chars + NUM_EXTENT_TEST_CHARS; t-- > extent_test_chars; ) + for (uint16_t *t = extent_test_chars + ARRAY_LENGTH(extent_test_chars); t-- > extent_test_chars; ) { if (FROM_UNICODE (cs, *t) == NOCHAR) continue; @@ -1213,10 +1220,12 @@ for (;;) { - f = XftFontOpenPattern (disp, FcPatternDuplicate (match)); + p = FcPatternDuplicate (match); + f = XftFontOpenPattern (disp, p); if (!f) { + FcPatternDestroy (p); success = false; break; } @@ -1234,7 +1243,7 @@ int glheight = height; - for (uint16_t *t = extent_test_chars + NUM_EXTENT_TEST_CHARS; t-- > extent_test_chars; ) + for (uint16_t *t = extent_test_chars + ARRAY_LENGTH(extent_test_chars); t-- > extent_test_chars; ) { FcChar16 ch = *t; @@ -1405,7 +1414,7 @@ { int src_x = x, src_y = y; - if (term->bgPixmap.is_parentOrigin ()) + if (term->bgPixmap.flags & bgPixmap_t::isTransparent) { src_x += term->window_vt_x; src_y += term->window_vt_y; @@ -1484,7 +1493,7 @@ force_prop = false; for (rxvt_font **i = fonts.begin (); i != fonts.end (); i++) - FONT_UNREF (*i); + (*i)->unref (); for (pagemap **p = fmap.begin (); p != fmap.end (); p++) delete *p; @@ -1607,7 +1616,7 @@ push_font (new_font (buf, cs)); } else - rxvt_warn ("fontset element too long (>511 bytes), ignored."); + rxvt_warn ("fontset element too long (>511 bytes), ignored.\n"); desc = end + 1; }