st-flexipatch

My st-flexipatch configuration
git clone git://git.ethandl.dev/st-flexipatch
Log | Files | Refs | README | LICENSE

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 }