font2.c (2662B)
1 int 2 xloadsparefont(FcPattern *pattern, int flags) 3 { 4 FcPattern *match; 5 FcResult result; 6 7 #if USE_XFTFONTMATCH_PATCH 8 match = XftFontMatch(xw.dpy, xw.scr, pattern, &result); 9 #else 10 match = FcFontMatch(NULL, pattern, &result); 11 #endif // USE_XFTFONTMATCH_PATCH 12 if (!match) { 13 return 1; 14 } 15 16 if (!(frc[frclen].font = XftFontOpenPattern(xw.dpy, match))) { 17 FcPatternDestroy(match); 18 return 1; 19 } 20 21 frc[frclen].flags = flags; 22 /* Believe U+0000 glyph will present in each default font */ 23 frc[frclen].unicodep = 0; 24 frclen++; 25 26 return 0; 27 } 28 29 void 30 xloadsparefonts(void) 31 { 32 FcPattern *pattern; 33 double fontval; 34 int fc; 35 char **fp; 36 37 if (frclen != 0) 38 die("can't embed spare fonts. cache isn't empty"); 39 40 /* Calculate count of spare fonts */ 41 fc = sizeof(font2) / sizeof(*font2); 42 if (fc == 0) 43 return; 44 45 /* Allocate memory for cache entries. */ 46 if (frccap < 4 * fc) { 47 frccap += 4 * fc - frccap; 48 frc = xrealloc(frc, frccap * sizeof(Fontcache)); 49 } 50 51 for (fp = font2; fp - font2 < fc; ++fp) { 52 53 if (**fp == '-') 54 pattern = XftXlfdParse(*fp, False, False); 55 else 56 pattern = FcNameParse((FcChar8 *)*fp); 57 58 if (!pattern) 59 die("can't open spare font %s\n", *fp); 60 61 if (defaultfontsize > 0 && defaultfontsize != usedfontsize) { 62 if (FcPatternGetDouble(pattern, FC_PIXEL_SIZE, 0, &fontval) == 63 FcResultMatch) { 64 fontval *= usedfontsize / defaultfontsize; 65 FcPatternDel(pattern, FC_PIXEL_SIZE); 66 FcPatternDel(pattern, FC_SIZE); 67 FcPatternAddDouble(pattern, FC_PIXEL_SIZE, fontval); 68 } else if (FcPatternGetDouble(pattern, FC_SIZE, 0, &fontval) == 69 FcResultMatch) { 70 fontval *= usedfontsize / defaultfontsize; 71 FcPatternDel(pattern, FC_PIXEL_SIZE); 72 FcPatternDel(pattern, FC_SIZE); 73 FcPatternAddDouble(pattern, FC_SIZE, fontval); 74 } 75 } 76 77 FcPatternAddBool(pattern, FC_SCALABLE, 1); 78 79 #if !USE_XFTFONTMATCH_PATCH 80 FcConfigSubstitute(NULL, pattern, FcMatchPattern); 81 XftDefaultSubstitute(xw.dpy, xw.scr, pattern); 82 #endif // USE_XFTFONTMATCH_PATCH 83 84 if (xloadsparefont(pattern, FRC_NORMAL)) 85 die("can't open spare font %s\n", *fp); 86 87 FcPatternDel(pattern, FC_SLANT); 88 FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); 89 if (xloadsparefont(pattern, FRC_ITALIC)) 90 die("can't open spare font %s\n", *fp); 91 92 FcPatternDel(pattern, FC_WEIGHT); 93 FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); 94 if (xloadsparefont(pattern, FRC_ITALICBOLD)) 95 die("can't open spare font %s\n", *fp); 96 97 FcPatternDel(pattern, FC_SLANT); 98 FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN); 99 if (xloadsparefont(pattern, FRC_BOLD)) 100 die("can't open spare font %s\n", *fp); 101 102 FcPatternDestroy(pattern); 103 } 104 }