--- rxvt-unicode/src/rxvtfont.C 2010/03/28 22:02:52 1.154 +++ rxvt-unicode/src/rxvtfont.C 2010/03/31 22:46:40 1.162 @@ -484,6 +484,56 @@ } } +struct rxvt_font_overflow : rxvt_font { + struct rxvt_fontset *fs; + + rxvt_font_overflow (rxvt_fontset *fs) + : rxvt_font () + { + this->fs = fs; + } + + rxvt_fontprop properties () + { + rxvt_fontprop p; + + p.width = p.height = 1; + p.ascent = rxvt_fontprop::unset; + p.weight = rxvt_fontprop::medium; + p.slant = rxvt_fontprop::roman; + + return p; + } + + bool load (const rxvt_fontprop &prop, bool force_prop) + { + width = 1; height = 1; + ascent = 1; descent = 0; + + set_name (strdup ("built-in rendition overflow font")); + + return true; + } + + bool has_char (unicode_t unicode, const rxvt_fontprop *prop, bool &careful) const + { + return false; + } + + void draw (rxvt_drawable &d, int x, int y, + const text_t *text, int len, + int fg, int bg) + { + while (len--) + { + int fid = fs->find_font_idx (*text); + (*fs)[fid]->draw (d, x, y, text, 1, fg, bg); + ++text; + x += term->fwidth; + } + } +}; + ///////////////////////////////////////////////////////////////////////////// struct rxvt_font_x11 : rxvt_font { @@ -501,7 +551,7 @@ const text_t *text, int len, int fg, int bg); - bool slow; // wether this is a proportional font or has other funny characteristics + bool slow; // whether this is a proportional font or has other funny characteristics XFontStruct *f; bool enc2b, encm; @@ -917,7 +967,7 @@ if (ch == NOCHAR) return false; - /* check wether the character exists in _this_ font. horrible. */ + /* check whether the character exists in _this_ font. horrible. */ XCharStruct *xcs; if (encm) @@ -957,7 +1007,7 @@ if (!prop || prop->width == rxvt_fontprop::unset) return true; - // check wether character overlaps previous/next character + // check whether character overlaps previous/next character int w = xcs->rbearing - xcs->lbearing; int wcw = max (WCWIDTH (unicode), 1); @@ -1446,6 +1496,15 @@ fallback = fallback_fonts; } +void +rxvt_fontset::prepare_font (rxvt_font *font, codeset cs) +{ + font->set_term (term); + + font->cs = cs; + font->loaded = false; +} + rxvt_font * rxvt_fontset::new_font (const char *name, codeset cs) { @@ -1471,11 +1530,8 @@ else f = new rxvt_font_x11; - f->set_term (term); f->set_name (strdup (name)); - - f->cs = cs; - f->loaded = false; + prepare_font (f, cs); return f; } @@ -1483,6 +1539,20 @@ ///////////////////////////////////////////////////////////////////////////// void +rxvt_fontset::push_font (rxvt_font *font) +{ + if (fonts.size () == fontCount) + { + rxvt_font *f = new rxvt_font_overflow (this); + + prepare_font (f, CS_UNICODE); + fonts.push_back (f); + } + + fonts.push_back (font); +} + +void rxvt_fontset::add_fonts (const char *desc) { if (desc) @@ -1531,7 +1601,7 @@ memcpy (buf, desc, end - desc); buf[end - desc] = 0; - fonts.push_back (new_font (buf, cs)); + push_font (new_font (buf, cs)); } else rxvt_warn ("fontset element too long (>511 bytes), ignored."); @@ -1569,7 +1639,7 @@ fontdesc = strdup (desc); - fonts.push_back (new_font (0, CS_UNICODE)); + push_font (new_font (0, CS_UNICODE)); realize_font (0); add_fonts (desc); @@ -1588,7 +1658,7 @@ } int -rxvt_fontset::find_font (unicode_t unicode) +rxvt_fontset::find_font_idx (unicode_t unicode) { if (unicode >= 1<<20) return 0; @@ -1624,8 +1694,7 @@ bool careful; if (f->has_char (unicode, &prop, careful)) { - if (careful) - i |= 128; + i = (i << 1) | careful; goto found; } @@ -1636,7 +1705,7 @@ if (fallback->name) { // search through the fallback list - fonts.push_back (new_font (fallback->name, fallback->cs)); + push_font (new_font (fallback->name, fallback->cs)); fallback++; } else @@ -1679,7 +1748,7 @@ char fontname[4096]; snprintf (fontname, sizeof (fontname), "xft:%s", font); - fonts.push_back (new_font (fontname, CS_UNICODE)); + push_font (new_font (fontname, CS_UNICODE)); } free (font); @@ -1711,5 +1780,3 @@ return i; } - -