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.50 by pcg, Sun Mar 28 02:07:08 2004 UTC vs.
Revision 1.59 by root, Wed Aug 11 15:55:35 2004 UTC

1/*--------------------------------*-C-*---------------------------------*; 1/*--------------------------------*-C-*---------------------------------*
2 * File: defaultfont.C 2 * File: defaultfont.C
3 *----------------------------------------------------------------------* 3 *----------------------------------------------------------------------*
4 * Copyright (c) 2003-2004 Marc Lehmann <pcg@goof.com> 4 * Copyright (c) 2003-2004 Marc Lehmann <pcg@goof.com>
5 * - original version. 5 * - original version.
6 * 6 *
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[] = {
35 { CS_ISO8859_1, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-1" }, 35 { CS_ISO8859_1, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-1" },
36 { CS_ISO8859_15, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-15" }, 36 { CS_ISO8859_15, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-15" },
37 { CS_ISO8859_15, "-*-*-*-r-*--*-*-*-*-c-*-fcd8859-15" }, 37 { CS_ISO8859_15, "-*-*-*-r-*--*-*-*-*-c-*-fcd8859-15" },
38 38
39#if ENCODING_EU 39#if ENCODING_EU
40 // cyrillic 40 // cyrillic
41 { CS_KOI8_R, "-*-*-*-r-*--*-*-*-*-c-*-koi8-r" }, 41 { CS_KOI8_R, "-*-*-*-r-*--*-*-*-*-c-*-koi8-r" },
42 { CS_KOI8_U, "-*-*-*-r-*--*-*-*-*-c-*-koi8-u" }, 42 { CS_KOI8_U, "-*-*-*-r-*--*-*-*-*-c-*-koi8-u" },
43 43
44 { CS_ISO8859_2, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-2" }, 44 { CS_ISO8859_2, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-2" },
45 { CS_ISO8859_3, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-3" }, 45 { CS_ISO8859_3, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-3" },
46 { CS_ISO8859_4, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-4" }, 46 { CS_ISO8859_4, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-4" },
47 { CS_ISO8859_5, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-5" }, 47 { CS_ISO8859_5, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-5" },
48 { CS_ISO8859_6, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-6" }, 48 { CS_ISO8859_6, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-6" },
49 { CS_ISO8859_7, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-7" }, 49 { CS_ISO8859_7, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-7" },
50 { CS_ISO8859_8, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-8" }, 50 { CS_ISO8859_8, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-8" },
51 { CS_ISO8859_9, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-9" }, 51 { CS_ISO8859_9, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-9" },
52 { CS_ISO8859_10, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-10" }, 52 { CS_ISO8859_10, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-10" },
53 { CS_ISO8859_11, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-11" }, 53 { CS_ISO8859_11, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-11" },
54 { CS_ISO8859_13, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-13" }, 54 { CS_ISO8859_13, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-13" },
55 { CS_ISO8859_14, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-14" }, 55 { CS_ISO8859_14, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-14" },
56 { CS_ISO8859_16, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-16" }, 56 { CS_ISO8859_16, "-*-*-*-r-*--*-*-*-*-c-*-iso8859-16" },
57#endif 57#endif
58 58
59 // japanese 59 // japanese
60#if ENCODING_JP || ENCODING_JP_EXT 60#if ENCODING_JP || ENCODING_JP_EXT
61# if XFT 61# if XFT
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_1990_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 { CS_JIS0201_1976_0, "-*-*-*-r-*--*-*-*-*-c-*-jisx0201*-0" },
69 { CS_JIS0208_1990_0, "-*-*-*-r-*--*-*-*-*-c-*-jisx0208*-0" },
70 { CS_JIS0212_1990_0, "-*-*-*-r-*--*-*-*-*-c-*-jisx0212*-0" },
68#endif 71#endif
69 72
70#if ENCODING_CN || ENCODING_CN_EXT 73#if ENCODING_CN || ENCODING_CN_EXT
71# if XFT 74# if XFT
72 { CS_BIG5_EXT, "xft:AR PL Mingti2L Big5" }, 75 { CS_BIG5_EXT, "xft:AR PL Mingti2L Big5" },
91#if XFT 94#if XFT
92 { CS_UNICODE, "xft:Andale Mono" }, 95 { CS_UNICODE, "xft:Andale Mono" },
93 { CS_UNICODE, "xft:Arial Unicode MS" }, 96 { CS_UNICODE, "xft:Arial Unicode MS" },
94#endif 97#endif
95 { CS_UNICODE, "-*-lucidatypewriter-*-*-*-*-*-*-*-*-m-*-iso10646-1" }, 98 { CS_UNICODE, "-*-lucidatypewriter-*-*-*-*-*-*-*-*-m-*-iso10646-1" },
96 { CS_UNICODE, "xft:FreeMono" },
97 { CS_UNICODE, "-*-unifont-*-*-*-*-*-*-*-*-c-*-iso10646-1" }, 99 { CS_UNICODE, "-*-unifont-*-*-*-*-*-*-*-*-c-*-iso10646-1" },
98 { CS_UNICODE, "-*-*-*-r-*-*-*-*-*-*-c-*-iso10646-1" }, 100 { CS_UNICODE, "-*-*-*-r-*-*-*-*-*-*-c-*-iso10646-1" },
99 { CS_UNICODE, "-*-*-*-r-*-*-*-*-*-*-m-*-iso10646-1" }, 101 { CS_UNICODE, "-*-*-*-r-*-*-*-*-*-*-m-*-iso10646-1" },
100 102#if XFT
101#if UNICODE_3 && XFT 103 // FreeMono is usually uglier than x fonts, so try last only.
102 { CS_UNICODE, "xft:Code2001" }, // contains many plane-1 characters 104 //{ CS_UNICODE, "xft:FreeMono" },
103#endif 105#endif
104 106
105 { CS_UNKNOWN, 0 } 107 { CS_UNKNOWN, 0 }
106}; 108};
107 109
133{ 135{
134 if (len > enc_len) 136 if (len > enc_len)
135 { 137 {
136 free (enc_buf); 138 free (enc_buf);
137 enc_buf = malloc (len); 139 enc_buf = malloc (len);
140 enc_len = len;
138 } 141 }
139 142
140 return enc_buf; 143 return enc_buf;
141} 144}
142 145
539{ 542{
540 clear (); 543 clear ();
541 544
542 char **list; 545 char **list;
543 int count; 546 int count;
544 list = XListFonts (DISPLAY, name, 512, &count); 547 list = XListFonts (DISPLAY, name, 1024, &count);
545 set_name (0); 548 set_name (0);
546 549
547 if (!list) 550 if (!list)
548 return false; 551 return false;
549 552
842{ 845{
843 rxvt_fontprop p; 846 rxvt_fontprop p;
844 847
845 FT_Face face = XftLockFace (f); 848 FT_Face face = XftLockFace (f);
846 849
847 p.width = width; p.height = height; 850 p.width = width;
848 p.weight = face->style_flags & FT_STYLE_FLAG_BOLD ? rxvt_fontprop::bold : rxvt_fontprop::medium; 851 p.height = height;
849 p.slant = face->style_flags & FT_STYLE_FLAG_ITALIC ? rxvt_fontprop::italic : rxvt_fontprop::roman; 852 p.weight = face->style_flags & FT_STYLE_FLAG_BOLD
853 ? rxvt_fontprop::bold : rxvt_fontprop::medium;
854 p.slant = face->style_flags & FT_STYLE_FLAG_ITALIC
855 ? rxvt_fontprop::italic : rxvt_fontprop::roman;
850 856
851 XftUnlockFace (f); 857 XftUnlockFace (f);
852 858
853 return p; 859 return p;
854} 860}
868 if (!p) 874 if (!p)
869 return false; 875 return false;
870 876
871 FcValue v; 877 FcValue v;
872 878
879 if (FcPatternGet (p, FC_PIXEL_SIZE, 0, &v) != FcResultMatch)
880 FcPatternAddInteger (p, FC_PIXEL_SIZE, prop.height);
881
873 if (FcPatternGet (p, FC_WEIGHT, 0, &v) != FcResultMatch) 882 if (FcPatternGet (p, FC_WEIGHT, 0, &v) != FcResultMatch)
874 FcPatternAddInteger (p, FC_WEIGHT, prop.weight); 883 FcPatternAddInteger (p, FC_WEIGHT, prop.weight);
875 884
876 if (FcPatternGet (p, FC_SLANT, 0, &v) != FcResultMatch) 885 if (FcPatternGet (p, FC_SLANT, 0, &v) != FcResultMatch)
877 FcPatternAddInteger (p, FC_SLANT, prop.slant); 886 FcPatternAddInteger (p, FC_SLANT, prop.slant);
887
888 if (FcPatternGet (p, FC_MINSPACE, 0, &v) != FcResultMatch)
889 FcPatternAddBool (p, FC_MINSPACE, 1);
878 890
879#if 0 // clipping unfortunately destroys our precious double-width-characters 891#if 0 // clipping unfortunately destroys our precious double-width-characters
880 // clip width, we can't do better, or can we? 892 // clip width, we can't do better, or can we?
881 if (FcPatternGet (p, FC_CHAR_WIDTH, 0, &v) != FcResultMatch) 893 if (FcPatternGet (p, FC_CHAR_WIDTH, 0, &v) != FcResultMatch)
882 FcPatternAddInteger (p, FC_CHAR_WIDTH, prop.width); 894 FcPatternAddInteger (p, FC_CHAR_WIDTH, prop.width);
883#endif 895#endif
884
885 //FcPatternAddBool (p, FC_MINSPACE, 1);
886 896
887 XftResult result; 897 XftResult result;
888 FcPattern *match = XftFontMatch (DISPLAY, DefaultScreen (DISPLAY), p, &result); 898 FcPattern *match = XftFontMatch (DISPLAY, DefaultScreen (DISPLAY), p, &result);
889 899
890 FcPatternDestroy (p); 900 FcPatternDestroy (p);
998#endif 1008#endif
999 1009
1000///////////////////////////////////////////////////////////////////////////// 1010/////////////////////////////////////////////////////////////////////////////
1001 1011
1002rxvt_fontset::rxvt_fontset (rxvt_t r) 1012rxvt_fontset::rxvt_fontset (rxvt_t r)
1003: r (r) 1013: r (r), fontdesc (0)
1004{ 1014{
1005 clear (); 1015 clear ();
1006} 1016}
1007 1017
1008rxvt_fontset::~rxvt_fontset () 1018rxvt_fontset::~rxvt_fontset ()
1013void 1023void
1014rxvt_fontset::clear () 1024rxvt_fontset::clear ()
1015{ 1025{
1016 for (rxvt_font **i = fonts.begin (); i != fonts.end (); i++) 1026 for (rxvt_font **i = fonts.begin (); i != fonts.end (); i++)
1017 FONT_UNREF (*i); 1027 FONT_UNREF (*i);
1028
1029 free (fontdesc); fontdesc = 0;
1018 1030
1019 fonts.clear (); 1031 fonts.clear ();
1020 base_id = 0; 1032 base_id = 0;
1021 base_prop.height = 0x7fffffff; 1033 base_prop.height = 0x7fffffff;
1022 base_prop.weight = rxvt_fontprop::medium; 1034 base_prop.weight = rxvt_fontprop::medium;
1130bool 1142bool
1131rxvt_fontset::populate (const char *desc) 1143rxvt_fontset::populate (const char *desc)
1132{ 1144{
1133 clear (); 1145 clear ();
1134 1146
1147 fontdesc = strdup (desc);
1148
1135 fonts.push_back (new_font (0, CS_UNICODE)); 1149 fonts.push_back (new_font (0, CS_UNICODE));
1136 realize_font (0); 1150 realize_font (0);
1137 1151
1138 add_fonts (desc); 1152 add_fonts (desc);
1139 1153
1155 1169
1156 return true; 1170 return true;
1157} 1171}
1158 1172
1159int 1173int
1174rxvt_fontset::find_font (const char *name) const
1175{
1176 for (rxvt_font *const *f = fonts.begin (); f < fonts.end (); f++)
1177 if ((*f)->name && !strcmp ((*f)->name, name))
1178 return f - fonts.begin ();
1179
1180 return -1;
1181}
1182
1183int
1160rxvt_fontset::find_font (unicode_t unicode) 1184rxvt_fontset::find_font (unicode_t unicode, bool bold)
1161{ 1185{
1186
1162 for (unsigned int i = !!(0x20 <= unicode && unicode <= 0x7f); // skip pseudo-font for ascii 1187 for (unsigned int i = !!(0x20 <= unicode && unicode <= 0x7f); // skip pseudo-font for ascii
1163 i < fonts.size (); 1188 i < fonts.size ();
1164 i++) 1189 i++)
1165 { 1190 {
1166 rxvt_font *f = fonts[i]; 1191 rxvt_font *f = fonts[i];
1172 1197
1173 if (!realize_font (i)) 1198 if (!realize_font (i))
1174 goto next_font; 1199 goto next_font;
1175 } 1200 }
1176 1201
1202 if (f->cs == CS_UNKNOWN)
1203 goto next_font;
1204
1205 if (bold && f->properties ().weight < rxvt_fontprop::bold)
1206 goto next_font;
1207
1177 if (f->cs != CS_UNKNOWN && f->has_codepoint (unicode)) 1208 if (f->has_codepoint (unicode))
1178 return i; 1209 return i;
1179 1210
1180 next_font: 1211 next_font:
1181 if (i == fonts.size () - 1 && fallback->name) 1212 if (i == fonts.size () - 1)
1213 {
1214 if (fallback->name)
1182 { 1215 {
1216 // search through the fallback list
1183 fonts.push_back (new_font (fallback->name, fallback->cs)); 1217 fonts.push_back (new_font (fallback->name, fallback->cs));
1184 fallback++; 1218 fallback++;
1185 i = 0;
1186 } 1219 }
1220 else
1221 {
1222 // try to find a new font.
1223 // only xft currently supported, as there is no
1224 // way to configure this and xft is easier to hack in,
1225 // while x11 has more framework in place already.
1226#if XFT
1227 // grab the first xft font that seems suitable
1228 FcPattern *p = FcPatternCreate ();
1229
1230 FcCharSet *s = FcCharSetCreate ();
1231 FcCharSetAddChar (s, unicode);
1232 FcPatternAddCharSet (p, FC_CHARSET, s);
1233 // charsets don't help that much, as xft might return
1234 // a non-matching font even if a better font is available :/
1235
1236 FcPatternAddInteger (p, FC_PIXEL_SIZE, base_prop.height);
1237 FcPatternAddInteger (p, FC_WEIGHT, base_prop.weight);
1238 FcPatternAddInteger (p, FC_SLANT, base_prop.slant);
1239 FcPatternAddBool (p, FC_MINSPACE, 1);
1240 //FcPatternAddBool (p, FC_ANTIALIAS, 1);
1241
1242 XftResult result;
1243 FcPattern *match = XftFontMatch (DISPLAY, DefaultScreen (DISPLAY), p, &result);
1244
1245 FcPatternDestroy (p);
1246
1247 if (match)
1248 {
1249 FcPatternDel (match, FC_CHARSET);
1250 char *font = (char *)FcNameUnparse (match);
1251 FcPatternDestroy (match);
1252
1253 if (find_font (font) < 0)
1254 {
1255 char fontname[4096];
1256 sprintf (fontname, "xft:%-.4090s", font);
1257
1258 fonts.push_back (new_font (fontname, CS_UNICODE));
1259 }
1260
1261 free (font);
1262 }
1263#endif
1264 }
1265 }
1187 } 1266 }
1267
1268 // if no bold font found, use a regular one
1269 if (bold)
1270 return find_font (unicode);
1188 1271
1189 return 0; /* we must return SOME font */ 1272 return 0; /* we must return SOME font */
1190} 1273}
1191 1274
1192 1275

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines