You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.2 KiB
94 lines
2.2 KiB
int |
|
xloadsparefont(FcPattern *pattern, int flags) |
|
{ |
|
FcPattern *match; |
|
FcResult result; |
|
|
|
match = FcFontMatch(NULL, pattern, &result); |
|
if (!match) { |
|
return 1; |
|
} |
|
|
|
if (!(frc[frclen].font = XftFontOpenPattern(xw.dpy, match))) { |
|
FcPatternDestroy(match); |
|
return 1; |
|
} |
|
|
|
frc[frclen].flags = flags; |
|
/* Believe U+0000 glyph will present in each default font */ |
|
frc[frclen].unicodep = 0; |
|
frclen++; |
|
|
|
return 0; |
|
} |
|
|
|
void |
|
xloadsparefonts(void) |
|
{ |
|
FcPattern *pattern; |
|
double sizeshift, fontval; |
|
int fc; |
|
char **fp; |
|
|
|
if (frclen != 0) |
|
die("can't embed spare fonts. cache isn't empty"); |
|
|
|
/* Calculate count of spare fonts */ |
|
fc = sizeof(font2) / sizeof(*font2); |
|
if (fc == 0) |
|
return; |
|
|
|
/* Allocate memory for cache entries. */ |
|
if (frccap < 4 * fc) { |
|
frccap += 4 * fc - frccap; |
|
frc = xrealloc(frc, frccap * sizeof(Fontcache)); |
|
} |
|
|
|
for (fp = font2; fp - font2 < fc; ++fp) { |
|
|
|
if (**fp == '-') |
|
pattern = XftXlfdParse(*fp, False, False); |
|
else |
|
pattern = FcNameParse((FcChar8 *)*fp); |
|
|
|
if (!pattern) |
|
die("can't open spare font %s\n", *fp); |
|
|
|
if (defaultfontsize > 0) { |
|
sizeshift = usedfontsize - defaultfontsize; |
|
if (sizeshift != 0 && |
|
FcPatternGetDouble(pattern, FC_PIXEL_SIZE, 0, &fontval) == |
|
FcResultMatch) { |
|
fontval += sizeshift; |
|
FcPatternDel(pattern, FC_PIXEL_SIZE); |
|
FcPatternDel(pattern, FC_SIZE); |
|
FcPatternAddDouble(pattern, FC_PIXEL_SIZE, fontval); |
|
} |
|
} |
|
|
|
FcPatternAddBool(pattern, FC_SCALABLE, 1); |
|
|
|
FcConfigSubstitute(NULL, pattern, FcMatchPattern); |
|
XftDefaultSubstitute(xw.dpy, xw.scr, pattern); |
|
|
|
if (xloadsparefont(pattern, FRC_NORMAL)) |
|
die("can't open spare font %s\n", *fp); |
|
|
|
FcPatternDel(pattern, FC_SLANT); |
|
FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); |
|
if (xloadsparefont(pattern, FRC_ITALIC)) |
|
die("can't open spare font %s\n", *fp); |
|
|
|
FcPatternDel(pattern, FC_WEIGHT); |
|
FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); |
|
if (xloadsparefont(pattern, FRC_ITALICBOLD)) |
|
die("can't open spare font %s\n", *fp); |
|
|
|
FcPatternDel(pattern, FC_SLANT); |
|
FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN); |
|
if (xloadsparefont(pattern, FRC_BOLD)) |
|
die("can't open spare font %s\n", *fp); |
|
|
|
FcPatternDestroy(pattern); |
|
} |
|
} |