diff options
author | eug-vs <eugene@eug-vs.xyz> | 2022-04-19 00:41:51 +0300 |
---|---|---|
committer | eug-vs <eugene@eug-vs.xyz> | 2022-04-19 00:41:51 +0300 |
commit | 3c7c2e7cfc29521d24d7f0368591950305f16cc3 (patch) | |
tree | 1402671ba2539287b07749ba165dea098531ed94 | |
parent | 0358795618e311eb7e97fe6757a7907913a7a437 (diff) | |
download | dotfiles-3c7c2e7cfc29521d24d7f0368591950305f16cc3.tar.gz |
feat(portage): use better version of libXft patch
-rw-r--r-- | portage/etc/portage/patches/x11-libs/libXft/bgra.patch (renamed from portage/etc/portage/patches/x11-libs/libXft/add-support-for-BGRA-glyphs-display-and-scaling.patch) | 565 |
1 files changed, 352 insertions, 213 deletions
diff --git a/portage/etc/portage/patches/x11-libs/libXft/add-support-for-BGRA-glyphs-display-and-scaling.patch b/portage/etc/portage/patches/x11-libs/libXft/bgra.patch index 6c3e49d..5c594cc 100644 --- a/portage/etc/portage/patches/x11-libs/libXft/add-support-for-BGRA-glyphs-display-and-scaling.patch +++ b/portage/etc/portage/patches/x11-libs/libXft/bgra.patch @@ -1,17 +1,249 @@ -From cfa4fb6b2a82a38d307bd69f3f39384513706597 Mon Sep 17 00:00:00 2001 +From 723092ece088559f1af299236305911f4ee4d450 Mon Sep 17 00:00:00 2001 From: Maxime Coste <mawww@kakoune.org> -Date: Fri, 7 Aug 2020 21:04:58 +0530 -Subject: [PATCH 1/2] [PATCH] Add support for BGRA glyphs display and scaling +Date: Thu, 28 Jan 2021 19:59:10 +1100 +Subject: [PATCH 1/3] Introduce a _XftCompositeString helper function +Dispatch to XRenderCompositeString{8,16,32} based off the given width. + +Signed-off-by: Maxime Coste <mawww@kakoune.org> +--- + src/xftrender.c | 61 ++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 43 insertions(+), 18 deletions(-) + +diff --git a/src/xftrender.c b/src/xftrender.c +index a352737..181c27a 100644 +--- a/src/xftrender.c ++++ b/src/xftrender.c +@@ -25,6 +25,47 @@ + #define NUM_LOCAL 1024 + #define NUM_ELT_LOCAL 128 + ++/* ++ * Dispatch glyph drawing to the correct XRenderCompositeString function ++ */ ++static void ++_XftCompositeString (Display *dpy, ++ int op, ++ Picture src, ++ Picture dst, ++ XRenderPictFormat *format, ++ GlyphSet glyphset, ++ int srcx, ++ int srcy, ++ int dstx, ++ int dsty, ++ int charwidth, ++ unsigned int *chars, ++ int nchars) ++{ ++ if (nchars == 0) ++ return; ++ ++ switch (charwidth) { ++ case 1: ++ default: ++ XRenderCompositeString8 (dpy, op, ++ src, dst, format, glyphset, ++ srcx, srcy, dstx, dsty, (char*)chars, nchars); ++ break; ++ case 2: ++ XRenderCompositeString16(dpy, op, ++ src, dst, format, glyphset, ++ srcx, srcy, dstx, dsty, (unsigned short*)chars, nchars); ++ break; ++ case 4: ++ XRenderCompositeString32(dpy, op, ++ src, dst, format, glyphset, ++ srcx, srcy, dstx, dsty, (unsigned int*)chars, nchars); ++ break; ++ } ++} ++ + /* + * Use the Render extension to draw the glyphs + */ +@@ -114,24 +155,8 @@ XftGlyphRender (Display *dpy, + case 4: char32[i] = (unsigned int) wire; break; + } + } +- switch (width) { +- case 1: +- default: +- XRenderCompositeString8 (dpy, op, +- src, dst, font->format, font->glyphset, +- srcx, srcy, x, y, char8, nglyphs); +- break; +- case 2: +- XRenderCompositeString16(dpy, op, +- src, dst, font->format, font->glyphset, +- srcx, srcy, x, y, char16, nglyphs); +- break; +- case 4: +- XRenderCompositeString32(dpy, op, +- src, dst, font->format, font->glyphset, +- srcx, srcy, x, y, char32, nglyphs); +- break; +- } ++ _XftCompositeString(dpy, op, src, dst, font->format, font->glyphset, ++ srcx, srcy, x, y, width, chars, nglyphs); + if (chars != char_local) + free (chars); + bail1: +-- +GitLab + + +From e0fc4ce7e87ab9c4b47e5c8e693f070dfd0d2f7b Mon Sep 17 00:00:00 2001 +From: Maxime Coste <mawww@kakoune.org> +Date: Thu, 28 Jan 2021 20:05:13 +1100 +Subject: [PATCH 2/3] Introduce a _XftCompositeText helper function + +Dispatch to XRenderCompositeText{8,16,32} based off the given width. + +Signed-off-by: Maxime Coste <mawww@kakoune.org> +--- + src/xftrender.c | 83 +++++++++++++++++++++++++++++-------------------- + 1 file changed, 49 insertions(+), 34 deletions(-) + +diff --git a/src/xftrender.c b/src/xftrender.c +index 181c27a..5852b2e 100644 +--- a/src/xftrender.c ++++ b/src/xftrender.c +@@ -164,6 +164,49 @@ bail1: + _XftFontManageMemory (dpy, pub); + } + ++/* ++ * Dispatch glyph drawing to the correct XRenderCompositeText function ++ */ ++static void ++_XftCompositeText (Display *dpy, ++ int op, ++ Picture src, ++ Picture dst, ++ XRenderPictFormat *format, ++ int srcx, ++ int srcy, ++ int dstx, ++ int dsty, ++ int eltwidth, ++ XGlyphElt8 *elts, ++ int nelt) ++{ ++ if (nelt == 0) ++ return; ++ ++ switch (eltwidth) { ++ case 1: ++ default: ++ XRenderCompositeText8 (dpy, op, ++ src, dst, format, ++ srcx, srcy, dstx, dsty, ++ (XGlyphElt8*)elts, nelt); ++ break; ++ case 2: ++ XRenderCompositeText16(dpy, op, ++ src, dst, format, ++ srcx, srcy, dstx, dsty, ++ (XGlyphElt16*)elts, nelt); ++ break; ++ case 4: ++ XRenderCompositeText32(dpy, op, ++ src, dst, format, ++ srcx, srcy, dstx, dsty, ++ (XGlyphElt32*)elts, nelt); ++ break; ++ } ++} ++ + _X_EXPORT void + XftGlyphSpecRender (Display *dpy, + int op, +@@ -345,23 +388,9 @@ XftGlyphSpecRender (Display *dpy, + elts[nelt].nchars = n; + nelt++; + } +- switch (width) { +- case 1: +- XRenderCompositeText8 (dpy, op, src, dst, font->format, +- srcx, srcy, glyphs[0].x, glyphs[0].y, +- elts, nelt); +- break; +- case 2: +- XRenderCompositeText16 (dpy, op, src, dst, font->format, +- srcx, srcy, glyphs[0].x, glyphs[0].y, +- (XGlyphElt16 *) elts, nelt); +- break; +- case 4: +- XRenderCompositeText32 (dpy, op, src, dst, font->format, +- srcx, srcy, glyphs[0].x, glyphs[0].y, +- (XGlyphElt32 *) elts, nelt); +- break; +- } ++ _XftCompositeText(dpy, op, src, dst, font->format, ++ srcx, srcy, glyphs[0].x, glyphs[0].y, ++ width, elts, nelt); + + if (elts != elts_local) + free (elts); +@@ -635,23 +664,9 @@ XftGlyphFontSpecRender (Display *dpy, + elts[nelt].nchars = n; + nelt++; + } +- switch (width) { +- case 1: +- XRenderCompositeText8 (dpy, op, src, dst, format, +- srcx, srcy, glyphs[0].x, glyphs[0].y, +- elts, nelt); +- break; +- case 2: +- XRenderCompositeText16 (dpy, op, src, dst, format, +- srcx, srcy, glyphs[0].x, glyphs[0].y, +- (XGlyphElt16 *) elts, nelt); +- break; +- case 4: +- XRenderCompositeText32 (dpy, op, src, dst, format, +- srcx, srcy, glyphs[0].x, glyphs[0].y, +- (XGlyphElt32 *) elts, nelt); +- break; +- } ++ _XftCompositeText(dpy, op, src, dst, format, ++ srcx, srcy, glyphs[0].x, glyphs[0].y, ++ width, elts, nelt); + + if (elts != elts_local) + free (elts); +-- +GitLab + + +From d385aa3e5320d18918413df0e8aef3a713a47e0b Mon Sep 17 00:00:00 2001 +From: Maxime Coste <mawww@kakoune.org> +Date: Tue, 22 Oct 2019 22:46:49 +1100 +Subject: [PATCH 3/3] Add support for BGRA glyphs display and scaling + +Display is done using an XRender Picture, as XRender +glyphs are incompatible with BGRA rendering due to +their use of the glyph bitmap as a mask. + +Scaling is done by averaging all relevant pixel, which gives +much better result than nearest pixel sampling while staying +simple enough and not too computationally expensive. + +This enables color emoji rendering support. + +Fixes: #6 + +Signed-off-by: Maxime Coste <mawww@kakoune.org> --- - src/xftfreetype.c | 18 ++++- - src/xftglyphs.c | 199 ++++++++++++++++++++++++++++++++++++++++++---- + src/xftfreetype.c | 18 +++- + src/xftglyphs.c | 234 +++++++++++++++++++++++++++++++++++++++++++--- src/xftint.h | 2 + - src/xftrender.c | 168 ++++++++++++++++++++++++-------------- - 4 files changed, 307 insertions(+), 80 deletions(-) + src/xftrender.c | 69 +++++++++++--- + 4 files changed, 293 insertions(+), 30 deletions(-) diff --git a/src/xftfreetype.c b/src/xftfreetype.c -index 1f79a81..18230a8 100644 +index 1f79a81..4325d65 100644 --- a/src/xftfreetype.c +++ b/src/xftfreetype.c @@ -523,7 +523,7 @@ XftFontInfoFill (Display *dpy, _Xconst FcPattern *pattern, XftFontInfo *fi) @@ -31,7 +263,7 @@ index 1f79a81..18230a8 100644 int max_glyph_memory; int alloc_size; int ascent, descent, height; -@@ -831,12 +832,16 @@ XftFontOpenInfo (Display *dpy, +@@ -831,12 +832,18 @@ XftFontOpenInfo (Display *dpy, if (!(face->face_flags & FT_FACE_FLAG_SCALABLE)) antialias = FcFalse; @@ -44,22 +276,14 @@ index 1f79a81..18230a8 100644 { - if (antialias) + if (color) ++ { + format = XRenderFindStandardFormat (dpy, PictStandardARGB32); ++ } + else if (antialias) { switch (fi->rgba) { case FC_RGBA_RGB: -@@ -851,9 +856,7 @@ XftFontOpenInfo (Display *dpy, - } - } - else -- { - format = XRenderFindStandardFormat (dpy, PictStandardA1); -- } - - if (!format) - goto bail2; -@@ -968,6 +971,13 @@ XftFontOpenInfo (Display *dpy, +@@ -968,6 +975,13 @@ XftFontOpenInfo (Display *dpy, * which doesn't happen in XftFontInfoFill */ font->info.antialias = antialias; @@ -74,7 +298,7 @@ index 1f79a81..18230a8 100644 * bump XftFile reference count */ diff --git a/src/xftglyphs.c b/src/xftglyphs.c -index b536df4..2fc45d4 100644 +index b536df4..e0bad10 100644 --- a/src/xftglyphs.c +++ b/src/xftglyphs.c @@ -26,6 +26,8 @@ @@ -163,7 +387,7 @@ index b536df4..2fc45d4 100644 + int sample_count; + + if ( src_pitch < 0 ) -+ src_buf -= src_pitch*(source->rows-1); ++ src_buf -= src_pitch * (source->rows - 1); + + FT_Matrix_Invert(&inverse); + @@ -245,7 +469,63 @@ index b536df4..2fc45d4 100644 case FT_PIXEL_MODE_LCD: if ( !bgr ) { -@@ -365,6 +487,8 @@ XftFontLoadGlyphs (Display *dpy, +@@ -339,6 +461,55 @@ _fill_xrender_bitmap( FT_Bitmap* target, + } + } + ++/* This function creates a Picture for the given glyph on the default root window ++ * It will only work in Xinerama mode ++ * ++ * dpy :: target display ++ * ++ * format :: target pixmap format ++ * ++ * width :: picture width ++ * ++ * width :: picture height ++ * ++ * data :: bitmap data ++ * ++ */ ++static Picture ++_create_glyph_bgra_picture (Display *dpy, ++ XRenderPictFormat *format, ++ int width, ++ int height, ++ unsigned char *data) ++{ ++ XImage image = { ++ width, height, 0, ZPixmap, (char *)data, ++ dpy->byte_order, dpy->bitmap_unit, dpy->bitmap_bit_order, 32, ++ 32, 0, 32, ++ 0, 0, 0 ++ }; ++ Picture picture; ++ Pixmap pixmap; ++ GC gc; ++ ++ pixmap = XCreatePixmap(dpy, DefaultRootWindow(dpy), width, height, 32); ++ if (!pixmap) ++ return None; ++ ++ gc = XCreateGC(dpy, pixmap, 0, NULL); ++ if (!gc) ++ return None; ++ ++ XInitImage(&image); ++ XPutImage(dpy, pixmap, gc, &image, 0, 0, 0, 0, width, height); ++ picture = XRenderCreatePicture(dpy, pixmap, format, 0, NULL); ++ ++ XFreeGC(dpy, gc); ++ XFreePixmap(dpy, pixmap); ++ ++ return picture; ++} ++ + _X_EXPORT void + XftFontLoadGlyphs (Display *dpy, + XftFont *pub, +@@ -365,6 +536,8 @@ XftFontLoadGlyphs (Display *dpy, FT_Vector vector; FT_Face face; FT_Render_Mode mode = FT_RENDER_MODE_MONO; @@ -254,7 +534,7 @@ index b536df4..2fc45d4 100644 if (!info) return; -@@ -374,6 +498,8 @@ XftFontLoadGlyphs (Display *dpy, +@@ -374,6 +547,8 @@ XftFontLoadGlyphs (Display *dpy, if (!face) return; @@ -263,7 +543,7 @@ index b536df4..2fc45d4 100644 if (font->info.antialias) { switch (font->info.rgba) { -@@ -390,6 +516,8 @@ XftFontLoadGlyphs (Display *dpy, +@@ -390,6 +565,8 @@ XftFontLoadGlyphs (Display *dpy, } } @@ -272,7 +552,7 @@ index b536df4..2fc45d4 100644 while (nglyph--) { glyphindex = *glyphs++; -@@ -440,7 +568,7 @@ XftFontLoadGlyphs (Display *dpy, +@@ -440,7 +617,7 @@ XftFontLoadGlyphs (Display *dpy, /* * Compute glyph metrics from FreeType information */ @@ -281,7 +561,7 @@ index b536df4..2fc45d4 100644 { /* * calculate the true width by transforming all four corners. -@@ -487,7 +615,7 @@ XftFontLoadGlyphs (Display *dpy, +@@ -487,7 +664,7 @@ XftFontLoadGlyphs (Display *dpy, * Clip charcell glyphs to the bounding box * XXX transformed? */ @@ -290,7 +570,7 @@ index b536df4..2fc45d4 100644 { if (font->info.load_flags & FT_LOAD_VERTICAL_LAYOUT) { -@@ -519,18 +647,20 @@ XftFontLoadGlyphs (Display *dpy, +@@ -519,18 +696,20 @@ XftFontLoadGlyphs (Display *dpy, } } @@ -312,7 +592,7 @@ index b536df4..2fc45d4 100644 { if (font->info.load_flags & FT_LOAD_VERTICAL_LAYOUT) { -@@ -613,14 +743,27 @@ XftFontLoadGlyphs (Display *dpy, +@@ -613,14 +792,27 @@ XftFontLoadGlyphs (Display *dpy, } } @@ -343,7 +623,7 @@ index b536df4..2fc45d4 100644 /* * If the glyph is relatively large (> 1% of server memory), -@@ -645,9 +788,12 @@ XftFontLoadGlyphs (Display *dpy, +@@ -645,9 +837,12 @@ XftFontLoadGlyphs (Display *dpy, local.buffer = bufBitmap; @@ -359,7 +639,7 @@ index b536df4..2fc45d4 100644 /* * Copy or convert into local buffer. -@@ -662,6 +808,7 @@ XftFontLoadGlyphs (Display *dpy, +@@ -662,6 +857,7 @@ XftFontLoadGlyphs (Display *dpy, */ glyph = (Glyph) glyphindex; @@ -367,7 +647,7 @@ index b536df4..2fc45d4 100644 xftg->glyph_memory = (size_t)size + sizeof (XftGlyph); if (font->format) { -@@ -685,15 +832,35 @@ XftFontLoadGlyphs (Display *dpy, +@@ -685,15 +881,21 @@ XftFontLoadGlyphs (Display *dpy, } } } @@ -383,23 +663,9 @@ index b536df4..2fc45d4 100644 - (char *) bufBitmap, size); + + if (glyphslot->bitmap.pixel_mode == FT_PIXEL_MODE_BGRA) -+ { -+ Pixmap pixmap = XCreatePixmap(dpy, DefaultRootWindow(dpy), local.width, local.rows, 32); -+ GC gc = XCreateGC(dpy, pixmap, 0, NULL); -+ XImage image = { -+ local.width, local.rows, 0, ZPixmap, (char *)bufBitmap, -+ dpy->byte_order, dpy->bitmap_unit, dpy->bitmap_bit_order, 32, -+ 32, local.width * 4 - local.pitch, 32, -+ 0, 0, 0 -+ }; -+ -+ XInitImage(&image); -+ XPutImage(dpy, pixmap, gc, &image, 0, 0, 0, 0, local.width, local.rows); -+ xftg->picture = XRenderCreatePicture(dpy, pixmap, font->format, 0, NULL); -+ -+ XFreeGC(dpy, gc); -+ XFreePixmap(dpy, pixmap); -+ } ++ xftg->picture = _create_glyph_bgra_picture(dpy, font->format, ++ local.width, local.rows, ++ bufBitmap); + else + XRenderAddGlyphs (dpy, font->glyphset, &glyph, + &xftg->metrics, 1, @@ -407,7 +673,7 @@ index b536df4..2fc45d4 100644 } else { -@@ -744,7 +911,9 @@ XftFontUnloadGlyphs (Display *dpy, +@@ -744,7 +946,9 @@ XftFontUnloadGlyphs (Display *dpy, { if (font->format) { @@ -439,46 +705,10 @@ index ced9a02..1af40fe 100644 int lcd_filter; /* lcd filter */ FT_Matrix matrix; /* glyph transformation matrix */ diff --git a/src/xftrender.c b/src/xftrender.c -index a352737..7937e98 100644 +index 5852b2e..bd001be 100644 --- a/src/xftrender.c +++ b/src/xftrender.c -@@ -25,6 +25,35 @@ - #define NUM_LOCAL 1024 - #define NUM_ELT_LOCAL 128 - -+/* -+ * Dispatch glyph drawing to the correct XRenderCompositeString function -+ */ -+static void -+_XftCompositeString (Display *dpy, int op, Picture src, Picture dst, XRenderPictFormat* format, GlyphSet glyphset, int srcx, int srcy, int dstx, int dsty, int charwidth, unsigned int* chars, int nchars) -+{ -+ if (nchars == 0) -+ return; -+ -+ switch (charwidth) { -+ case 1: -+ default: -+ XRenderCompositeString8 (dpy, op, -+ src, dst, format, glyphset, -+ srcx, srcy, dstx, dsty, (char*)chars, nchars); -+ break; -+ case 2: -+ XRenderCompositeString16(dpy, op, -+ src, dst, format, glyphset, -+ srcx, srcy, dstx, dsty, (unsigned short*)chars, nchars); -+ break; -+ case 4: -+ XRenderCompositeString32(dpy, op, -+ src, dst, format, glyphset, -+ srcx, srcy, dstx, dsty, (unsigned int*)chars, nchars); -+ break; -+ } -+} -+ - /* - * Use the Render extension to draw the glyphs - */ -@@ -43,12 +72,14 @@ XftGlyphRender (Display *dpy, +@@ -84,12 +84,14 @@ XftGlyphRender (Display *dpy, int nglyphs) { XftFontInt *font = (XftFontInt *) pub; @@ -494,7 +724,7 @@ index a352737..7937e98 100644 char *char8; unsigned short *char16; unsigned int *char32; -@@ -100,43 +131,75 @@ XftGlyphRender (Display *dpy, +@@ -141,22 +143,46 @@ XftGlyphRender (Display *dpy, if (!chars) goto bail1; } @@ -516,10 +746,17 @@ index a352737..7937e98 100644 + glyph = font->glyphs[wire]; + if (glyph->picture) + { -+ _XftCompositeString(dpy, op, src, dst, font->format, font->glyphset, srcx, srcy, x, y, width, chars, j); -+ XRenderComposite(dpy, PictOpOver, glyph->picture, None, dst, 0, 0, 0, 0, dstx, dsty - glyph->metrics.y, glyph->metrics.width, glyph->metrics.height); -+ x = dstx = dstx + glyph->metrics.xOff; -+ x = dsty = dsty + glyph->metrics.yOff; ++ _XftCompositeString(dpy, op, src, dst, font->format, font->glyphset, ++ srcx, srcy, x, y, width, chars, j); ++ XRenderComposite(dpy, PictOpOver, glyph->picture, None, ++ dst, 0, 0, 0, 0, dstx, dsty - glyph->metrics.y, ++ glyph->metrics.width, glyph->metrics.height); ++ ++ dstx += glyph->metrics.xOff; ++ dsty += glyph->metrics.yOff; ++ ++ x = dstx; ++ y = dsty; + j = 0; + } + else @@ -534,63 +771,13 @@ index a352737..7937e98 100644 + ++j; } } -- switch (width) { -+ _XftCompositeString(dpy, op, src, dst, font->format, font->glyphset, srcx, srcy, x, y, width, chars, j); -+ if (chars != char_local) -+ free (chars); -+bail1: -+ if (glyphs_loaded) -+ _XftFontManageMemory (dpy, pub); -+} -+ -+/* -+ * Dispatch glyph drawing to the correct XRenderCompositeText function -+ */ -+static void -+_XftCompositeText (Display *dpy, int op, Picture src, Picture dst, XRenderPictFormat* format, int srcx, int srcy, int dstx, int dsty, int eltwidth, XGlyphElt8* elts, int nelt) -+{ -+ if (nelt == 0) -+ return; -+ -+ switch (eltwidth) { - case 1: - default: -- XRenderCompositeString8 (dpy, op, -- src, dst, font->format, font->glyphset, -- srcx, srcy, x, y, char8, nglyphs); -+ XRenderCompositeText8 (dpy, op, -+ src, dst, format, -+ srcx, srcy, dstx, dsty, -+ (XGlyphElt8*)elts, nelt); - break; - case 2: -- XRenderCompositeString16(dpy, op, -- src, dst, font->format, font->glyphset, -- srcx, srcy, x, y, char16, nglyphs); -+ XRenderCompositeText16(dpy, op, -+ src, dst, format, -+ srcx, srcy, dstx, dsty, -+ (XGlyphElt16*)elts, nelt); - break; - case 4: -- XRenderCompositeString32(dpy, op, -- src, dst, font->format, font->glyphset, -- srcx, srcy, x, y, char32, nglyphs); -+ XRenderCompositeText32(dpy, op, -+ src, dst, format, -+ srcx, srcy, dstx, dsty, -+ (XGlyphElt32*)elts, nelt); - break; - } -- if (chars != char_local) -- free (chars); --bail1: -- if (glyphs_loaded) -- _XftFontManageMemory (dpy, pub); - } - - _X_EXPORT void -@@ -251,9 +314,10 @@ XftGlyphSpecRender (Display *dpy, + _XftCompositeString(dpy, op, src, dst, font->format, font->glyphset, +- srcx, srcy, x, y, width, chars, nglyphs); ++ srcx, srcy, x, y, width, chars, j); + if (chars != char_local) + free (chars); + bail1: +@@ -319,9 +345,10 @@ XftGlyphSpecRender (Display *dpy, g = 0; /* * check to see if the glyph is placed where it would @@ -603,7 +790,7 @@ index a352737..7937e98 100644 { if (x != glyphs[i].x || y != glyphs[i].y) { -@@ -267,7 +331,7 @@ XftGlyphSpecRender (Display *dpy, +@@ -335,7 +362,7 @@ XftGlyphSpecRender (Display *dpy, } elts = elts_local; @@ -612,7 +799,7 @@ index a352737..7937e98 100644 { elts = malloc ((size_t)nelt * sizeof (XGlyphElt8)); if (!elts) -@@ -275,7 +339,7 @@ XftGlyphSpecRender (Display *dpy, +@@ -343,7 +370,7 @@ XftGlyphSpecRender (Display *dpy, } /* @@ -621,46 +808,22 @@ index a352737..7937e98 100644 */ nelt = 0; x = y = 0; -@@ -289,6 +353,11 @@ XftGlyphSpecRender (Display *dpy, +@@ -357,6 +384,14 @@ XftGlyphSpecRender (Display *dpy, g = 0; if ((glyph = font->glyphs[g])) { + if (glyph->picture) + { -+ XRenderComposite(dpy, PictOpOver, glyph->picture, None, dst, 0, 0, 0, 0, glyphs[i].x, glyphs[i].y - glyph->metrics.y, glyph->metrics.width, glyph->metrics.height); ++ XRenderComposite(dpy, PictOpOver, glyph->picture, None, ++ dst, 0, 0, 0, 0, ++ glyphs[i].x, glyphs[i].y - glyph->metrics.y, ++ glyph->metrics.width, glyph->metrics.height); + continue; + } if (!i || x != glyphs[i].x || y != glyphs[i].y) { if (n) -@@ -320,23 +389,9 @@ XftGlyphSpecRender (Display *dpy, - elts[nelt].nchars = n; - nelt++; - } -- switch (width) { -- case 1: -- XRenderCompositeText8 (dpy, op, src, dst, font->format, -- srcx, srcy, glyphs[0].x, glyphs[0].y, -- elts, nelt); -- break; -- case 2: -- XRenderCompositeText16 (dpy, op, src, dst, font->format, -- srcx, srcy, glyphs[0].x, glyphs[0].y, -- (XGlyphElt16 *) elts, nelt); -- break; -- case 4: -- XRenderCompositeText32 (dpy, op, src, dst, font->format, -- srcx, srcy, glyphs[0].x, glyphs[0].y, -- (XGlyphElt32 *) elts, nelt); -- break; -- } -+ _XftCompositeText(dpy, op, src, dst, font->format, -+ srcx, srcy, glyphs[0].x, glyphs[0].y, -+ width, elts, nelt); - - if (elts != elts_local) - free (elts); -@@ -535,7 +590,7 @@ XftGlyphFontSpecRender (Display *dpy, +@@ -589,7 +624,7 @@ XftGlyphFontSpecRender (Display *dpy, * check to see if the glyph is placed where it would * fall using the normal spacing */ @@ -669,7 +832,7 @@ index a352737..7937e98 100644 { if (pub != prevPublic || x != glyphs[i].x || y != glyphs[i].y) { -@@ -560,7 +615,7 @@ XftGlyphFontSpecRender (Display *dpy, +@@ -614,7 +649,7 @@ XftGlyphFontSpecRender (Display *dpy, } /* @@ -678,45 +841,21 @@ index a352737..7937e98 100644 */ nelt = 0; x = y = 0; -@@ -578,6 +633,11 @@ XftGlyphFontSpecRender (Display *dpy, +@@ -632,6 +667,14 @@ XftGlyphFontSpecRender (Display *dpy, g = 0; if ((glyph = font->glyphs[g])) { + if (glyph->picture) + { -+ XRenderComposite(dpy, PictOpOver, glyph->picture, None, dst, 0, 0, 0, 0, glyphs[i].x, glyphs[i].y - glyph->metrics.y, glyph->metrics.width, glyph->metrics.height); ++ XRenderComposite(dpy, PictOpOver, glyph->picture, None, ++ dst, 0, 0, 0, 0, ++ glyphs[i].x, glyphs[i].y - glyph->metrics.y, ++ glyph->metrics.width, glyph->metrics.height); + continue; + } if (!i || pub != prevPublic || x != glyphs[i].x || y != glyphs[i].y) { if (n) -@@ -610,23 +670,9 @@ XftGlyphFontSpecRender (Display *dpy, - elts[nelt].nchars = n; - nelt++; - } -- switch (width) { -- case 1: -- XRenderCompositeText8 (dpy, op, src, dst, format, -- srcx, srcy, glyphs[0].x, glyphs[0].y, -- elts, nelt); -- break; -- case 2: -- XRenderCompositeText16 (dpy, op, src, dst, format, -- srcx, srcy, glyphs[0].x, glyphs[0].y, -- (XGlyphElt16 *) elts, nelt); -- break; -- case 4: -- XRenderCompositeText32 (dpy, op, src, dst, format, -- srcx, srcy, glyphs[0].x, glyphs[0].y, -- (XGlyphElt32 *) elts, nelt); -- break; -- } -+ _XftCompositeText(dpy, op, src, dst, format, -+ srcx, srcy, glyphs[0].x, glyphs[0].y, -+ width, elts, nelt); - - if (elts != elts_local) - free (elts); -- -2.35.1 +GitLab |