Skip to content

Instantly share code, notes, and snippets.

@qstrahl
Created September 4, 2019 06:28
Show Gist options
  • Save qstrahl/51ddfb29c842c6f88a79471900bc1507 to your computer and use it in GitHub Desktop.
Save qstrahl/51ddfb29c842c6f88a79471900bc1507 to your computer and use it in GitHub Desktop.
diff --git a/cachedGCs.c b/cachedGCs.c
index 8393478..f0088b1 100644
--- a/cachedGCs.c
+++ b/cachedGCs.c
@@ -500,7 +500,7 @@ setCgsCSet(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, unsigned cset)
#endif
void
-setCgsFont(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, XTermFonts * font)
+setCgsFont2(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, XTermFonts * font, VTFontEnum which)
{
CgsCache *me;
@@ -514,7 +514,7 @@ setCgsFont(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, XTermFonts * font)
font = getIconicFont(screen);
else
#endif
- font = GetNormalFont(screen, fNorm);
+ font = GetNormalFont(screen, which);
}
if (HaveFont(font) && okFont(font->fs)) {
TRACE2(("setCgsFont next: %s for %s slot %p, gc %p\n",
@@ -531,6 +531,12 @@ setCgsFont(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, XTermFonts * font)
}
}
+void
+setCgsFont(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, XTermFonts * font)
+{
+ setCgsFont2(xw, cgsWin, cgsId, font, fNorm);
+}
+
/*
* Discard all of the font information, e.g., we are resizing the font.
* Keep the GC's so we can simply change them rather than creating new ones.
diff --git a/fontutils.c b/fontutils.c
index 50eb7d8..31f5f91 100644
--- a/fontutils.c
+++ b/fontutils.c
@@ -1132,14 +1132,14 @@ xtermUpdateFontGCs(XtermWidget xw, Bool italic)
setCgsFont(xw, win, gcNorm, myfunc(screen, fNorm));
copyCgs(xw, win, gcBold, gcNorm);
- setCgsFont(xw, win, gcBold, myfunc(screen, fBold));
+ setCgsFont2(xw, win, gcBold, myfunc(screen, fBold), fBold);
setCgsFore(xw, win, gcNormReverse, new_revers);
setCgsBack(xw, win, gcNormReverse, new_normal);
setCgsFont(xw, win, gcNormReverse, myfunc(screen, fNorm));
copyCgs(xw, win, gcBoldReverse, gcNormReverse);
- setCgsFont(xw, win, gcBoldReverse, myfunc(screen, fBold));
+ setCgsFont2(xw, win, gcBoldReverse, myfunc(screen, fBold), fBold);
if_OPT_WIDE_CHARS(screen, {
XTermFonts *wide_xx = myfunc(screen, fWide);
@@ -1856,6 +1856,7 @@ xtermCopyFontLists(XtermWidget xw, VTFontList * target, VTFontList * source)
COPY_IT(fontBold, list_b);
#if OPT_WIDE_ATTRS || OPT_RENDERWIDE
COPY_IT(fontItal, list_i);
+ COPY_IT(fontBtal, list_bi);
#endif
#if OPT_WIDE_CHARS
COPY_IT(wideFont, list_w);
@@ -2990,6 +2991,7 @@ xtermComputeFontInfo(XtermWidget xw,
XTermXftFonts norm = screen->renderFontNorm[fontnum];
XTermXftFonts bold = screen->renderFontBold[fontnum];
XTermXftFonts ital = screen->renderFontItal[fontnum];
+ XTermXftFonts btal = screen->renderFontBtal[fontnum];
#if OPT_RENDERWIDE
XTermXftFonts wnorm = screen->renderWideNorm[fontnum];
XTermXftFonts wbold = screen->renderWideBold[fontnum];
@@ -3035,6 +3037,11 @@ xtermComputeFontInfo(XtermWidget xw,
XFT_SLANT, XftTypeInteger, XFT_SLANT_ITALIC, \
XFT_CHAR_WIDTH, XftTypeInteger, norm.font->max_advance_width
+#define BtalXftPattern(norm) \
+ XFT_WEIGHT, XftTypeInteger, XFT_WEIGHT_BOLD, \
+ XFT_SLANT, XftTypeInteger, XFT_SLANT_ITALIC, \
+ XFT_CHAR_WIDTH, XftTypeInteger, norm.font->max_advance_width
+
#if OPT_WIDE_ATTRS
#define HAVE_ITALICS 1
#define FIND_ITALICS ((pat = XftNameParse(face_name)) != 0)
@@ -3069,6 +3076,12 @@ xtermComputeFontInfo(XtermWidget xw,
ItalXftPattern(norm),
(void *) 0);
OPEN_XFT(ital, "italic");
+ btal.pattern = XftPatternDuplicate(pat);
+ XftPatternBuild(btal.pattern,
+ NormXftPattern,
+ BtalXftPattern(norm),
+ (void *) 0);
+ OPEN_XFT(btal, "bold-italic");
}
#endif
@@ -3110,6 +3123,18 @@ xtermComputeFontInfo(XtermWidget xw,
failed = 0;
CACHE_XFT(screen->renderFontItal, ital);
}
+ CACHE_XFT(screen->renderFontBtal, btal);
+ if (norm.font != 0 && !btal.font) {
+ xtermWarning("did not find a usable bold italic TrueType font\n");
+ XftPatternDestroy(btal.pattern);
+ btal.pattern = XftPatternDuplicate(pat);
+ XftPatternBuild(btal.pattern,
+ NormXftPattern,
+ (void *) 0);
+ OPEN_XFT(btal, "bold-italics");
+ failed = 0;
+ CACHE_XFT(screen->renderFontBtal, btal);
+ }
#endif
XftPatternDestroy(pat);
} else {
@@ -3214,6 +3239,7 @@ xtermComputeFontInfo(XtermWidget xw,
setRenderFontsize(xw, win, norm.font, NULL);
setRenderFontsize(xw, win, bold.font, "bold");
setRenderFontsize(xw, win, ital.font, "ital");
+ setRenderFontsize(xw, win, btal.font, "btal");
#if OPT_BOX_CHARS
setupPackedFonts(xw);
@@ -3810,6 +3836,7 @@ findXftGlyph(XtermWidget xw, XftFont *given, unsigned wc)
offsetof(TScreen, renderFontNorm),
offsetof(TScreen, renderFontBold),
offsetof(TScreen, renderFontItal),
+ offsetof(TScreen, renderFontBtal),
#if OPT_RENDERWIDE
offsetof(TScreen, renderWideNorm),
offsetof(TScreen, renderWideBold),
@@ -4751,6 +4778,9 @@ save2FontList(XtermWidget xw,
case fItal:
list = &(target->list_i);
break;
+ case fBtal:
+ list = &(target->list_bi);
+ break;
#endif
#if OPT_WIDE_CHARS
case fWide:
@@ -4988,6 +5018,9 @@ freeFontLists(VTFontList * lists)
case fItal:
target = &(lists->list_i);
break;
+ case fBtal:
+ target = &(lists->list_bi);
+ break;
#endif
#if OPT_WIDE_CHARS
case fWide:
@@ -5070,6 +5103,9 @@ getMyXftFont(XtermWidget xw, int which, int fontnum)
case fItal:
result = &(screen->renderFontItal[fontnum]);
break;
+ case fBtal:
+ result = &(screen->renderFontBtal[fontnum]);
+ break;
#endif
#if OPT_WIDE_CHARS
case fWide:
@@ -5110,6 +5146,7 @@ whichFontEnum(VTFontEnum value)
DATA(fBold);
#if OPT_WIDE_ATTRS || OPT_RENDERWIDE
DATA(fItal);
+ DATA(fBtal);
#endif
#if OPT_WIDE_CHARS
DATA(fWide);
@@ -5148,6 +5185,7 @@ whichFontList2s(VTFontList * list, char **value)
DATA(list_b);
#if OPT_WIDE_ATTRS || OPT_RENDERWIDE
DATA(list_i);
+ DATA(list_bi);
#endif
#if OPT_WIDE_CHARS
DATA(list_w);
diff --git a/ptyx.h b/ptyx.h
index fc4cda9..ca2287b 100644
--- a/ptyx.h
+++ b/ptyx.h
@@ -885,6 +885,7 @@ typedef enum {
, fBold /* bold font */
#if OPT_WIDE_ATTRS || OPT_RENDERWIDE
, fItal /* italic font */
+ , fBtal /* bold-italic font */
#endif
#if OPT_WIDE_CHARS
, fWide /* double-width font */
@@ -2121,6 +2122,7 @@ typedef struct {
char *f_b; /* the bold font */
#if OPT_WIDE_ATTRS
char *f_i; /* italic font (Xft only) */
+ char *f_bi; /* bold-italic font (Xft only) */
#endif
#if OPT_WIDE_CHARS
char *f_w; /* the normal wide font */
@@ -2134,6 +2136,7 @@ typedef struct {
char **list_b; /* the bold font */
#if OPT_WIDE_ATTRS || OPT_RENDERWIDE
char **list_i; /* italic font (Xft only) */
+ char **list_bi; /* bold-italic font (Xft only) */
#endif
#if OPT_WIDE_CHARS
char **list_w; /* the normal wide font */
@@ -2735,6 +2738,7 @@ typedef struct {
XTermXftFonts renderFontNorm[NMENUFONTS];
XTermXftFonts renderFontBold[NMENUFONTS];
XTermXftFonts renderFontItal[NMENUFONTS];
+ XTermXftFonts renderFontBtal[NMENUFONTS];
#if OPT_RENDERWIDE
XTermXftFonts renderWideNorm[NMENUFONTS];
XTermXftFonts renderWideBold[NMENUFONTS];
diff --git a/util.c b/util.c
index 7623efa..da53d14 100644
--- a/util.c
+++ b/util.c
@@ -2944,8 +2944,14 @@ getNormXftFont(XtermWidget xw,
#if OPT_ISO_COLORS
&& !screen->colorITMode
#endif
- && XFT_FONT(fItal)) {
- font = XFT_FONT(fItal);
+ ) {
+ if ((attr_flags & BOLDATTR(screen))
+ && UseBoldFont(screen)
+ && XFT_FONT(fBtal)) {
+ font = XFT_FONT(fBtal);
+ } else if (XFT_FONT(fItal)) {
+ font = XFT_FONT(fItal);
+ }
} else
#endif
#if OPT_ISO_COLORS
diff --git a/xterm.h b/xterm.h
index 89a4482..5e3d29a 100644
--- a/xterm.h
+++ b/xterm.h
@@ -930,6 +930,7 @@ extern void redoCgs(XtermWidget /*xw*/, Pixel /*fg*/, Pixel /*bg*/, CgsEnum /*cg
extern void setCgsBack(XtermWidget /*xw*/, VTwin * /*cgsWin*/, CgsEnum /*cgsId*/, Pixel /*bg*/);
extern void setCgsCSet(XtermWidget /*xw*/, VTwin * /*cgsWin*/, CgsEnum /*cgsId*/, unsigned /*cset*/);
extern void setCgsFont(XtermWidget /*xw*/, VTwin * /*cgsWin*/, CgsEnum /*cgsId*/, XTermFonts * /*font*/);
+extern void setCgsFont2(XtermWidget /*xw*/, VTwin * /*cgsWin*/, CgsEnum /*cgsId*/, XTermFonts * /*font*/, unsigned /*which*/);
extern void setCgsFore(XtermWidget /*xw*/, VTwin * /*cgsWin*/, CgsEnum /*cgsId*/, Pixel /*fg*/);
extern void swapCgs(XtermWidget /*xw*/, VTwin * /*cgsWin*/, CgsEnum /*dstCgsId*/, CgsEnum /*srcCgsId*/);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment