From b848164a1c13830eb354154161c8948c8fb92ef8 Mon Sep 17 00:00:00 2001 From: mrsu Date: Mon, 26 Jun 2023 10:16:41 +0100 Subject: [PATCH] wide glyphs --- patches/st-font2-0.8.5.diff | 163 ++++++++++++++ ...t-glyph-wide-support-20220411-ef05519.diff | 206 ++++++++++++++++++ st | Bin 110368 -> 110248 bytes st.h | 6 + x.c | 126 +++++------ x.o | Bin 75288 -> 75008 bytes 6 files changed, 438 insertions(+), 63 deletions(-) create mode 100644 patches/st-font2-0.8.5.diff create mode 100644 patches/st-glyph-wide-support-20220411-ef05519.diff diff --git a/patches/st-font2-0.8.5.diff b/patches/st-font2-0.8.5.diff new file mode 100644 index 0000000..9b22b8a --- /dev/null +++ b/patches/st-font2-0.8.5.diff @@ -0,0 +1,163 @@ +From 1635e04d3643dd4caa0c7c2043b585c6d7e4705f Mon Sep 17 00:00:00 2001 +From: Rizqi Nur Assyaufi +Date: Mon, 18 Jul 2022 01:15:45 +0800 +Subject: [PATCH] [st][patch][font2] Add patch for st-0.8.5 + +--- + config.def.h | 6 +++ + x.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 107 insertions(+) + +diff --git a/config.def.h b/config.def.h +index 91ab8ca..717b2f0 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -6,6 +6,12 @@ + * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html + */ + static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; ++/* Spare fonts */ ++static char *font2[] = { ++/* "Inconsolata for Powerline:pixelsize=12:antialias=true:autohint=true", */ ++/* "Hack Nerd Font Mono:pixelsize=11:antialias=true:autohint=true", */ ++}; ++ + static int borderpx = 2; + + /* +diff --git a/x.c b/x.c +index 8a16faa..220fc4f 100644 +--- a/x.c ++++ b/x.c +@@ -157,6 +157,8 @@ static void xhints(void); + static int xloadcolor(int, const char *, Color *); + static int xloadfont(Font *, FcPattern *); + static void xloadfonts(const char *, double); ++static int xloadsparefont(FcPattern *, int); ++static void xloadsparefonts(void); + static void xunloadfont(Font *); + static void xunloadfonts(void); + static void xsetenv(void); +@@ -306,6 +308,7 @@ zoomabs(const Arg *arg) + { + xunloadfonts(); + xloadfonts(usedfont, arg->f); ++ xloadsparefonts(); + cresize(0, 0); + redraw(); + xhints(); +@@ -1034,6 +1037,101 @@ xloadfonts(const char *fontstr, double fontsize) + FcPatternDestroy(pattern); + } + ++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); ++ } ++} ++ + void + xunloadfont(Font *f) + { +@@ -1131,6 +1229,9 @@ xinit(int cols, int rows) + usedfont = (opt_font == NULL)? font : opt_font; + xloadfonts(usedfont, 0); + ++ /* spare fonts */ ++ xloadsparefonts(); ++ + /* colors */ + xw.cmap = XDefaultColormap(xw.dpy, xw.scr); + xloadcols(); +-- +2.37.1 + diff --git a/patches/st-glyph-wide-support-20220411-ef05519.diff b/patches/st-glyph-wide-support-20220411-ef05519.diff new file mode 100644 index 0000000..f88c5ee --- /dev/null +++ b/patches/st-glyph-wide-support-20220411-ef05519.diff @@ -0,0 +1,206 @@ +From 68de38fadd04f2f454bceccea0fccc8276b635cb Mon Sep 17 00:00:00 2001 +From: wael <40663@protonmail.com> +Date: Mon, 11 Apr 2022 16:45:49 +0300 +Subject: [PATCH] add glyph wide support patch + +--- + st.h | 6 +++ + x.c | 134 +++++++++++++++++++++++++++++------------------------------ + 2 files changed, 73 insertions(+), 67 deletions(-) + +diff --git a/st.h b/st.h +index 519b9bd..4f74621 100644 +--- a/st.h ++++ b/st.h +@@ -36,6 +36,12 @@ enum glyph_attribute { + ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT, + }; + ++enum drawing_mode { ++ DRAW_NONE = 0, ++ DRAW_BG = 1 << 0, ++ DRAW_FG = 1 << 1, ++}; ++ + enum selection_mode { + SEL_IDLE = 0, + SEL_EMPTY = 1, +diff --git a/x.c b/x.c +index 2a3bd38..d60df52 100644 +--- a/x.c ++++ b/x.c +@@ -142,7 +142,7 @@ typedef struct { + + static inline ushort sixd_to_16bit(int); + static int xmakeglyphfontspecs(XftGlyphFontSpec *, const Glyph *, int, int, int); +-static void xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int); ++static void xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int, int); + static void xdrawglyph(Glyph, int, int); + static void xclear(int, int, int, int); + static int xgeommasktogravity(int); +@@ -1372,7 +1372,7 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x + } + + void +-xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y) ++xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y, int dmode) + { + int charlen = len * ((base.mode & ATTR_WIDE) ? 2 : 1); + int winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, +@@ -1463,47 +1463,40 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i + if (base.mode & ATTR_INVISIBLE) + fg = bg; + +- /* Intelligent cleaning up of the borders. */ +- if (x == 0) { +- xclear(0, (y == 0)? 0 : winy, borderpx, +- winy + win.ch + +- ((winy + win.ch >= borderpx + win.th)? win.h : 0)); +- } +- if (winx + width >= borderpx + win.tw) { +- xclear(winx + width, (y == 0)? 0 : winy, win.w, +- ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch))); +- } +- if (y == 0) +- xclear(winx, 0, winx + width, borderpx); +- if (winy + win.ch >= borderpx + win.th) +- xclear(winx, winy + win.ch, winx + width, win.h); +- +- /* Clean up the region we want to draw to. */ +- XftDrawRect(xw.draw, bg, winx, winy, width, win.ch); +- +- /* Set the clip region because Xft is sometimes dirty. */ +- r.x = 0; +- r.y = 0; +- r.height = win.ch; +- r.width = width; +- XftDrawSetClipRectangles(xw.draw, winx, winy, &r, 1); +- +- /* Render the glyphs. */ +- XftDrawGlyphFontSpec(xw.draw, fg, specs, len); +- +- /* Render underline and strikethrough. */ +- if (base.mode & ATTR_UNDERLINE) { +- XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent * chscale + 1, +- width, 1); +- } +- +- if (base.mode & ATTR_STRUCK) { +- XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent * chscale / 3, +- width, 1); +- } +- +- /* Reset clip to none. */ +- XftDrawSetClip(xw.draw, 0); ++ if (dmode & DRAW_BG) { ++ /* Intelligent cleaning up of the borders. */ ++ if (x == 0) { ++ xclear(0, (y == 0)? 0 : winy, borderpx, ++ winy + win.ch + ++ ((winy + win.ch >= borderpx + win.th)? win.h : 0)); ++ } ++ if (winx + width >= borderpx + win.tw) { ++ xclear(winx + width, (y == 0)? 0 : winy, win.w, ++ ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch))); ++ } ++ if (y == 0) ++ xclear(winx, 0, winx + width, borderpx); ++ if (winy + win.ch >= borderpx + win.th) ++ xclear(winx, winy + win.ch, winx + width, win.h); ++ /* Fill the background */ ++ XftDrawRect(xw.draw, bg, winx, winy, width, win.ch); ++ } ++ ++ if (dmode & DRAW_FG) { ++ /* Render the glyphs. */ ++ XftDrawGlyphFontSpec(xw.draw, fg, specs, len); ++ ++ /* Render underline and strikethrough. */ ++ if (base.mode & ATTR_UNDERLINE) { ++ XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent + 1, ++ width, 1); ++ } ++ ++ if (base.mode & ATTR_STRUCK) { ++ XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent / 3, ++ width, 1); ++ } ++ } + } + + void +@@ -1513,7 +1506,7 @@ xdrawglyph(Glyph g, int x, int y) + XftGlyphFontSpec spec; + + numspecs = xmakeglyphfontspecs(&spec, &g, 1, x, y); +- xdrawglyphfontspecs(&spec, g, numspecs, x, y); ++ xdrawglyphfontspecs(&spec, g, numspecs, x, y, DRAW_BG | DRAW_FG); + } + + void +@@ -1648,32 +1641,39 @@ xstartdraw(void) + void + xdrawline(Line line, int x1, int y1, int x2) + { +- int i, x, ox, numspecs; ++ int i, x, ox, numspecs, numspecs_cached; + Glyph base, new; +- XftGlyphFontSpec *specs = xw.specbuf; +- +- numspecs = xmakeglyphfontspecs(specs, &line[x1], x2 - x1, x1, y1); +- i = ox = 0; +- for (x = x1; x < x2 && i < numspecs; x++) { +- new = line[x]; +- if (new.mode == ATTR_WDUMMY) +- continue; +- if (selected(x, y1)) +- new.mode ^= ATTR_REVERSE; +- if (i > 0 && ATTRCMP(base, new)) { +- xdrawglyphfontspecs(specs, base, i, ox, y1); +- specs += i; +- numspecs -= i; +- i = 0; +- } +- if (i == 0) { +- ox = x; +- base = new; ++ XftGlyphFontSpec *specs; ++ ++ numspecs_cached = xmakeglyphfontspecs(xw.specbuf, &line[x1], x2 - x1, x1, y1); ++ ++ /* Draw line in 2 passes: background and foreground. This way wide glyphs ++ won't get truncated (#223) */ ++ for (int dmode = DRAW_BG; dmode <= DRAW_FG; dmode <<= 1) { ++ specs = xw.specbuf; ++ numspecs = numspecs_cached; ++ i = ox = 0; ++ for (x = x1; x < x2 && i < numspecs; x++) { ++ new = line[x]; ++ if (new.mode == ATTR_WDUMMY) ++ continue; ++ if (selected(x, y1)) ++ new.mode ^= ATTR_REVERSE; ++ if (i > 0 && ATTRCMP(base, new)) { ++ xdrawglyphfontspecs(specs, base, i, ox, y1, dmode); ++ specs += i; ++ numspecs -= i; ++ i = 0; ++ } ++ if (i == 0) { ++ ox = x; ++ base = new; ++ } ++ i++; + } +- i++; ++ if (i > 0) ++ xdrawglyphfontspecs(specs, base, i, ox, y1, dmode); + } +- if (i > 0) +- xdrawglyphfontspecs(specs, base, i, ox, y1); + } + + void +-- +2.35.1 + diff --git a/st b/st index 7d1fc907aee8d3872957071a317661611847deb6..4f1378946f2aa458a9c28df64f36f2b25887fb55 100755 GIT binary patch delta 28044 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 Z`$9bqTgARe*6sAM;v= borderpx + win.th)? win.h : 0)); - } - if (winx + width >= borderpx + win.tw) { - xclear(winx + width, (y == 0)? 0 : winy, win.w, - ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch))); - } - if (y == 0) - xclear(winx, 0, winx + width, borderpx); - if (winy + win.ch >= borderpx + win.th) - xclear(winx, winy + win.ch, winx + width, win.h); + if (dmode & DRAW_BG) { + /* Intelligent cleaning up of the borders. */ + if (x == 0) { + xclear(0, (y == 0)? 0 : winy, borderpx, + winy + win.ch + + ((winy + win.ch >= borderpx + win.th)? win.h : 0)); + } + if (winx + width >= borderpx + win.tw) { + xclear(winx + width, (y == 0)? 0 : winy, win.w, + ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch))); + } + if (y == 0) + xclear(winx, 0, winx + width, borderpx); + if (winy + win.ch >= borderpx + win.th) + xclear(winx, winy + win.ch, winx + width, win.h); + /* Fill the background */ + XftDrawRect(xw.draw, bg, winx, winy, width, win.ch); + } - /* Clean up the region we want to draw to. */ - XftDrawRect(xw.draw, bg, winx, winy, width, win.ch); + if (dmode & DRAW_FG) { + /* Render the glyphs. */ + XftDrawGlyphFontSpec(xw.draw, fg, specs, len); - /* Set the clip region because Xft is sometimes dirty. */ - r.x = 0; - r.y = 0; - r.height = win.ch; - r.width = width; - XftDrawSetClipRectangles(xw.draw, winx, winy, &r, 1); + /* Render underline and strikethrough. */ + if (base.mode & ATTR_UNDERLINE) { + XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent + 1, + width, 1); + } - /* Render the glyphs. */ - XftDrawGlyphFontSpec(xw.draw, fg, specs, len); - - /* Render underline and strikethrough. */ - if (base.mode & ATTR_UNDERLINE) { - XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent * chscale + 1, - width, 1); - } - - if (base.mode & ATTR_STRUCK) { - XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent * chscale / 3, - width, 1); - } - - /* Reset clip to none. */ - XftDrawSetClip(xw.draw, 0); + if (base.mode & ATTR_STRUCK) { + XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent / 3, + width, 1); + } + } } void @@ -1513,7 +1506,7 @@ xdrawglyph(Glyph g, int x, int y) XftGlyphFontSpec spec; numspecs = xmakeglyphfontspecs(&spec, &g, 1, x, y); - xdrawglyphfontspecs(&spec, g, numspecs, x, y); + xdrawglyphfontspecs(&spec, g, numspecs, x, y, DRAW_BG | DRAW_FG); } void @@ -1648,32 +1641,39 @@ xstartdraw(void) void xdrawline(Line line, int x1, int y1, int x2) { - int i, x, ox, numspecs; + int i, x, ox, numspecs, numspecs_cached; Glyph base, new; - XftGlyphFontSpec *specs = xw.specbuf; + XftGlyphFontSpec *specs; - numspecs = xmakeglyphfontspecs(specs, &line[x1], x2 - x1, x1, y1); - i = ox = 0; - for (x = x1; x < x2 && i < numspecs; x++) { - new = line[x]; - if (new.mode == ATTR_WDUMMY) - continue; - if (selected(x, y1)) - new.mode ^= ATTR_REVERSE; - if (i > 0 && ATTRCMP(base, new)) { - xdrawglyphfontspecs(specs, base, i, ox, y1); - specs += i; - numspecs -= i; - i = 0; + numspecs_cached = xmakeglyphfontspecs(xw.specbuf, &line[x1], x2 - x1, x1, y1); + + /* Draw line in 2 passes: background and foreground. This way wide glyphs + won't get truncated (#223) */ + for (int dmode = DRAW_BG; dmode <= DRAW_FG; dmode <<= 1) { + specs = xw.specbuf; + numspecs = numspecs_cached; + i = ox = 0; + for (x = x1; x < x2 && i < numspecs; x++) { + new = line[x]; + if (new.mode == ATTR_WDUMMY) + continue; + if (selected(x, y1)) + new.mode ^= ATTR_REVERSE; + if (i > 0 && ATTRCMP(base, new)) { + xdrawglyphfontspecs(specs, base, i, ox, y1, dmode); + specs += i; + numspecs -= i; + i = 0; + } + if (i == 0) { + ox = x; + base = new; + } + i++; } - if (i == 0) { - ox = x; - base = new; - } - i++; + if (i > 0) + xdrawglyphfontspecs(specs, base, i, ox, y1, dmode); } - if (i > 0) - xdrawglyphfontspecs(specs, base, i, ox, y1); } void diff --git a/x.o b/x.o index 76f5cf3262acdfa7d8e8d6c8161b025107608b4b..9e7c08e52b7eae95605a0ab61c95fc4fb8f1cf3d 100644 GIT binary patch delta 23220 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 delta 23399 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 Ay#N3J