FreeBSD Bugzilla – Attachment 212645 Details for
Bug 239167
[exp-run] upgrade x11-fonts/fontconfig: update to 2.13.92 (remove libuuid dependency)
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch for 2.13.92 version (since 528919 revision)
fontconfig_2.13.92_unified.diff (text/plain), 71.79 KB, created by
lightside
on 2020-03-23 14:55:57 UTC
(
hide
)
Description:
Patch for 2.13.92 version (since 528919 revision)
Filename:
MIME Type:
Creator:
lightside
Created:
2020-03-23 14:55:57 UTC
Size:
71.79 KB
patch
obsolete
>Index: UPDATING >=================================================================== >--- UPDATING (revision 528919) >+++ UPDATING (working copy) >@@ -5,6 +5,16 @@ > You should get into the habit of checking this file for changes each time > you update your ports collection, before attempting any port upgrades. > >+20200330 >+ AFFECTS: users of x11-fonts/fontconfig >+ AUTHOR: desktop@FreeBSD.org >+ >+ Fontconfig 2.13.1 generated .uuid files in the fonts directory which where >+ not properly registered to the packages. To clean them up, please execute the >+ following command: >+ >+ find %%LOCALBASE%%/share/fonts -type f -name .uuid -delete >+ > 20200320 > AFFECTS: users of devel/qca > AUTHOR: kde@FreeBSD.org >Index: x11-fonts/fontconfig/Makefile >=================================================================== >--- x11-fonts/fontconfig/Makefile (revision 528919) >+++ x11-fonts/fontconfig/Makefile (working copy) >@@ -2,11 +2,10 @@ > # $FreeBSD$ > > PORTNAME= fontconfig >-PORTVERSION= 2.13.1 >-PORTREVISION?= 1 >+PORTVERSION= 2.13.92 > PORTEPOCH?= 1 > CATEGORIES= x11-fonts >-MASTER_SITES= http://www.freedesktop.org/software/fontconfig/release/ >+MASTER_SITES= https://www.freedesktop.org/software/fontconfig/release/ > > MAINTAINER= desktop@FreeBSD.org > COMMENT= XML-based font configuration API for X Windows >@@ -14,13 +13,12 @@ > LICENSE= MIT > LICENSE_FILE= ${WRKSRC}/COPYING > >-USES= gperf tar:bzip2 >+USES= gperf tar:xz > > .if !defined(REFERENCE_PORT) > > LIB_DEPENDS= libfreetype.so:print/freetype2 \ >- libexpat.so:textproc/expat2 \ >- libuuid.so:misc/e2fsprogs-libuuid >+ libexpat.so:textproc/expat2 > > USES+= cpe gmake libtool pathfix pkgconfig > CPE_VENDOR= fontconfig_project >Index: x11-fonts/fontconfig/distinfo >=================================================================== >--- x11-fonts/fontconfig/distinfo (revision 528919) >+++ x11-fonts/fontconfig/distinfo (working copy) >@@ -1,3 +1,3 @@ >-TIMESTAMP = 1550745725 >-SHA256 (fontconfig-2.13.1.tar.bz2) = f655dd2a986d7aa97e052261b36aa67b0a64989496361eca8d604e6414006741 >-SIZE (fontconfig-2.13.1.tar.bz2) = 1723639 >+TIMESTAMP = 1565349179 >+SHA256 (fontconfig-2.13.92.tar.xz) = 506e61283878c1726550bc94f2af26168f1e9f2106eac77eaaf0b2cdfad66e4e >+SIZE (fontconfig-2.13.92.tar.xz) = 1413128 >Index: x11-fonts/fontconfig/files/patch-2.13.1.diff >=================================================================== >--- x11-fonts/fontconfig/files/patch-2.13.1.diff (revision 528919) >+++ x11-fonts/fontconfig/files/patch-2.13.1.diff (nonexistent) >@@ -1,592 +0,0 @@ >-# Fix the build issue with --enable-static >-# https://cgit.freedesktop.org/fontconfig/commit/?id=8208f99fa1676c42bfd8d74de3e9dac5366c150c >-# Fix the issue that '~' wasn't extracted to the proper homedir >-# https://cgit.freedesktop.org/fontconfig/commit/?id=806fd4c2c5164d66d978b0a4c579c157e5cbe766 >-# Add more prefix support in <dir> element >-# https://cgit.freedesktop.org/fontconfig/commit/?id=1aa8b700c3f09a31c78e7834e0db373f80b5e226 >-# Update fonts.dtd for last commit >-# https://cgit.freedesktop.org/fontconfig/commit/?id=67b4090321c0ec3cf3dc96f6d3cd7b9d03af0f25 >-# add missing the case of prefix="default" as documented >-# https://cgit.freedesktop.org/fontconfig/commit/?id=e4788c5a96e0f384ad5702ad8096b0e144613895 >-# Do not update mtime when removing .uuid file >-# https://cgit.freedesktop.org/fontconfig/commit/?id=ff5b49be2be0922f0fb6b9daf08f64a88d2fae6b >-# Do not try updating mtime when unlink was failed >-# https://cgit.freedesktop.org/fontconfig/commit/?id=5f5ec5676c61b9773026a9335c9b0dfa73a73353 >-# Do not remove UUID file when a scanned directory is empty >-# https://cgit.freedesktop.org/fontconfig/commit/?id=5f12f564f8748deaa603adb7a4b8f616b6390ad4 >-# Fix name-table language code mapping for Mongolian >-# https://cgit.freedesktop.org/fontconfig/commit/?id=f7036d589bffe353c1982b881afae6ec0a2ef200 >-# Use FC_PATH_MAX instead of PATH_MAX >-# https://cgit.freedesktop.org/fontconfig/commit/?id=648e0cf3d5a53efeab93b24ae37490427d05229d >-# Fix FcFontList doesn't return a font with FC_COLOR=true >-# https://cgit.freedesktop.org/fontconfig/commit/?id=9d5149ac41e18ab67404ddba41d7ef7e71839ebc >-# Fix a dereference of a null pointer >-# https://cgit.freedesktop.org/fontconfig/commit/?id=b047e299546ac3abb79cf0bac3c67f5c2dfc7fb6 >-# Fix a crash with invalid matrix element >-# https://cgit.freedesktop.org/fontconfig/commit/?id=699d6e4d8415a5d94483ea81fdf277964a33b8f1 >-# src/fccache.c: Fix define for HAVE_POSIX_FADVISE >-# https://cgit.freedesktop.org/fontconfig/commit/?id=586e35450e9ca7c1dc647ceb9d75ac8ed08c5c16 >-# Reset errno to do error handling properly >-# https://cgit.freedesktop.org/fontconfig/commit/?id=97fa77d27facc6a31486fdca5b3b853c591f792c >-# fc-validate: returns an error code when missing some glyphs >-# https://cgit.freedesktop.org/fontconfig/commit/?id=c336b8471877371f0190ba06f7547c54e2b890ba >-# Fix endianness on generating MD5 cache name >-# https://cgit.freedesktop.org/fontconfig/commit/?id=66b0af41b81c5f0db1a8f952beaaada95e221d14 >-# Fix a typo on masking face id >-# https://cgit.freedesktop.org/fontconfig/commit/?id=c0dc76268bb278c4bd123afbfb3409be64d0ed75 >-# Fix the linear interpolation during weight mapping >-# https://cgit.freedesktop.org/fontconfig/commit/?id=f2d4291d12ca1a2146d90da32a399fffff3e8227 >-# Fix a crash when running with FC_DEBUG=256 >-# https://cgit.freedesktop.org/fontconfig/commit/?id=322131f4330f972820fd903959999af9360120c0 >-# Fix a typo >-# https://cgit.freedesktop.org/fontconfig/commit/?id=a57f22bf6d93ad4079a6ae01fa00456921dc73e1 >-# Improve the performance a bit >-# https://cgit.freedesktop.org/fontconfig/commit/?id=cb3e6ff4d7628b6eb1dd8f78737de5c387aaf2e1 >-# Add English name first into a cache >-# https://cgit.freedesktop.org/fontconfig/commit/?id=2960391699ab3b417a17a0a2ac29e97e9c3d3c99 >-# Fix a memory leak in FcFreeTypeQuery*() >-# https://cgit.freedesktop.org/fontconfig/commit/?id=e2f9f28aed1470a07c33a57940d68b6a3cbe235b >- >-Excluding changes for the following files: .gitlab-ci.yml, doc/fcstring.fncs, >-test/Makefile.am, test/test-bz106632.c, test/test-issue107.c, test/test-issue110.c >- >---- fc-validate/fc-validate.c.orig 2018-06-05 10:36:38 UTC >-+++ fc-validate/fc-validate.c >-@@ -197,6 +197,7 @@ main (int argc, char **argv) >- { >- FcChar32 ucs4, pos, map[FC_CHARSET_MAP_SIZE]; >- >-+ err = 1; >- printf (_("%s:%d Missing %d glyph(s) to satisfy the coverage for %s language\n"), >- argv[i], index, count, lang); >- >---- fontconfig/fontconfig.h.orig 2018-08-30 08:20:15 UTC >-+++ fontconfig/fontconfig.h >-@@ -1077,6 +1077,10 @@ FcUtf16Len (const FcChar8 *string, >- int *wchar); >- >- FcPublic FcChar8 * >-+FcStrBuildFilename (const FcChar8 *path, >-+ ...); >-+ >-+FcPublic FcChar8 * >- FcStrDirname (const FcChar8 *file); >- >- FcPublic FcChar8 * >---- fonts.dtd.orig 2016-12-02 03:22:19 UTC >-+++ fonts.dtd >-@@ -13,14 +13,18 @@ >- --> >- <!ELEMENT dir (#PCDATA)> >- <!ATTLIST dir >-- prefix CDATA "default" >-- xml:space (default|preserve) 'preserve'> >-+ prefix (default|xdg|relative|cwd) "default" >-+ xml:space (default|preserve) 'preserve'> >- >- <!-- >- Define the per-user file that holds cache font information. >- >- If the filename begins with '~', it is replaced with the users >- home directory path. >-+ >-+ If 'prefix' is 'default' or 'cwd', then the current working directory will be added prior to the value. >-+ If 'prefix' is 'xdg', then the value in the $XDG_DATA_HOME will be added prior to the value. >-+ If 'prefix' is 'relative', then the path of curent file will be added prior to the value. >- --> >- <!ELEMENT cache (#PCDATA)> >- <!ATTLIST cache xml:space (default|preserve) 'preserve'> >---- src/fccache.c.orig 2018-07-19 07:05:17 UTC >-+++ src/fccache.c >-@@ -155,17 +155,42 @@ FcDirCacheDeleteUUID (const FcChar8 *di >- FcConfig *config) >- { >- const FcChar8 *sysroot = FcConfigGetSysRoot (config); >-- FcChar8 *target; >-+ FcChar8 *target, *d; >- FcBool ret = FcTrue; >-+ struct stat statb; >-+ struct timeval times[2]; >- >- if (sysroot) >-- target = FcStrBuildFilename (sysroot, dir, ".uuid", NULL); >-+ d = FcStrBuildFilename (sysroot, dir, NULL); >- else >-- target = FcStrBuildFilename (dir, ".uuid", NULL); >-- >-+ d = FcStrBuildFilename (dir, NULL); >-+ if (FcStat (d, &statb) != 0) >-+ { >-+ ret = FcFalse; >-+ goto bail; >-+ } >-+ target = FcStrBuildFilename (d, ".uuid", NULL); >- ret = unlink ((char *) target) == 0; >-- FcHashTableRemove (config->uuid_table, target); >-- FcStrFree(target); >-+ if (ret) >-+ { >-+ times[0].tv_sec = statb.st_atime; >-+ times[1].tv_sec = statb.st_mtime; >-+#ifdef HAVE_STRUCT_STAT_ST_MTIM >-+ times[0].tv_usec = statb.st_atim.tv_nsec / 1000; >-+ times[1].tv_usec = statb.st_mtim.tv_nsec / 1000; >-+#else >-+ times[0].tv_usec = 0; >-+ times[1].tv_usec = 0; >-+#endif >-+ if (utimes ((const char *) d, times) != 0) >-+ { >-+ fprintf (stderr, "Unable to revert mtime: %s\n", d); >-+ } >-+ FcHashTableRemove (config->uuid_table, target); >-+ } >-+ FcStrFree (target); >-+bail: >-+ FcStrFree (d); >- >- return ret; >- } >-@@ -685,15 +710,18 @@ FcCacheRemoveUnlocked (FcCache *cache) >- while (fcCacheMaxLevel > 0 && fcCacheChains[fcCacheMaxLevel - 1] == NULL) >- fcCacheMaxLevel--; >- >-- allocated = s->allocated; >-- while (allocated) >-+ if (s) >- { >-- /* First element in allocated chunk is the free list */ >-- next = *(void **)allocated; >-- free (allocated); >-- allocated = next; >-+ allocated = s->allocated; >-+ while (allocated) >-+ { >-+ /* First element in allocated chunk is the free list */ >-+ next = *(void **)allocated; >-+ free (allocated); >-+ allocated = next; >-+ } >-+ free (s); >- } >-- free (s); >- } >- >- static FcCache * >-@@ -948,7 +976,7 @@ FcDirCacheMapFd (FcConfig *config, int f >- { >- #if defined(HAVE_MMAP) || defined(__CYGWIN__) >- cache = mmap (0, fd_stat->st_size, PROT_READ, MAP_SHARED, fd, 0); >--#if (HAVE_POSIX_FADVISE) && defined(POSIX_FADV_WILLNEED) >-+#if defined(HAVE_POSIX_FADVISE) && defined(POSIX_FADV_WILLNEED) >- posix_fadvise (fd, 0, fd_stat->st_size, POSIX_FADV_WILLNEED); >- #endif >- if (cache == MAP_FAILED) >-@@ -1079,6 +1107,7 @@ FcDirChecksum (struct stat *statb) >- source_date_epoch = getenv("SOURCE_DATE_EPOCH"); >- if (source_date_epoch) >- { >-+ errno = 0; >- epoch = strtoull(source_date_epoch, &endptr, 10); >- >- if (endptr == source_date_epoch) >-@@ -1685,7 +1714,7 @@ FcCacheNumFont args1(const FcCache *c) >- * will fill a supplied 16-byte array with the digest. >- */ >- >--#ifndef HIGHFIRST >-+#ifndef WORDS_BIGENDIAN >- #define byteReverse(buf, len) /* Nothing */ >- #else >- /* >---- src/fccfg.c.orig 2018-07-19 07:53:00 UTC >-+++ src/fccfg.c >-@@ -821,25 +821,25 @@ FcConfigCompareValue (const FcValue *lef >- break; >- case FcOpContains: >- case FcOpListing: >-- ret = left.u.b == right.u.b || left.u.b == FcDontCare; >-+ ret = left.u.b == right.u.b || left.u.b >= FcDontCare; >- break; >- case FcOpNotEqual: >- ret = left.u.b != right.u.b; >- break; >- case FcOpNotContains: >-- ret = !(left.u.b == right.u.b || left.u.b == FcDontCare); >-+ ret = !(left.u.b == right.u.b || left.u.b >= FcDontCare); >- break; >- case FcOpLess: >-- ret = left.u.b != right.u.b && right.u.b == FcDontCare; >-+ ret = left.u.b != right.u.b && right.u.b >= FcDontCare; >- break; >- case FcOpLessEqual: >-- ret = left.u.b == right.u.b || right.u.b == FcDontCare; >-+ ret = left.u.b == right.u.b || right.u.b >= FcDontCare; >- break; >- case FcOpMore: >-- ret = left.u.b != right.u.b && left.u.b == FcDontCare; >-+ ret = left.u.b != right.u.b && left.u.b >= FcDontCare; >- break; >- case FcOpMoreEqual: >-- ret = left.u.b == right.u.b || left.u.b == FcDontCare; >-+ ret = left.u.b == right.u.b || left.u.b >= FcDontCare; >- break; >- default: >- break; >-@@ -2207,17 +2207,19 @@ FcConfigFilename (const FcChar8 *url) >- else >- file = 0; >- } >-- >-- path = FcConfigGetPath (); >-- if (!path) >-- return NULL; >-- for (p = path; *p; p++) >-+ else >- { >-- file = FcConfigFileExists (*p, url); >-- if (file) >-- break; >-+ path = FcConfigGetPath (); >-+ if (!path) >-+ return NULL; >-+ for (p = path; *p; p++) >-+ { >-+ file = FcConfigFileExists (*p, url); >-+ if (file) >-+ break; >-+ } >-+ FcConfigFreePath (path); >- } >-- FcConfigFreePath (path); >- return file; >- } >- >-@@ -2231,7 +2233,7 @@ FcConfigRealFilename (FcConfig *config, >- >- if (n) >- { >-- FcChar8 buf[PATH_MAX]; >-+ FcChar8 buf[FC_PATH_MAX]; >- ssize_t len; >- >- if (sysroot) >---- src/fcdir.c.orig 2018-07-19 03:14:39 UTC >-+++ src/fcdir.c >-@@ -421,13 +421,6 @@ FcDirCacheRead (const FcChar8 *dir, FcBo >- /* Not using existing cache file, construct new cache */ >- if (!cache) >- cache = FcDirCacheScan (dir, config); >-- if (cache) >-- { >-- FcFontSet *fs = FcCacheSet (cache); >-- >-- if (cache->dirs_count == 0 && (!fs || fs->nfont == 0)) >-- FcDirCacheDeleteUUID (dir, config); >-- } >- >- return cache; >- } >---- src/fcfreetype.c.orig 2018-08-01 06:41:28 UTC >-+++ src/fcfreetype.c >-@@ -193,9 +193,9 @@ static const FcFtLanguage fcFtLanguage >- { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_KIRGHIZ, "ky" }, >- { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_TAJIKI, "tg" }, >- { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_TURKMEN, "tk" }, >-- { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MONGOLIAN, "mo" }, >-- { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT,"mo" }, >-- { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT, "mo" }, >-+ { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MONGOLIAN, "mn" }, >-+ { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT,"mn" }, >-+ { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT, "mn" }, >- { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_PASHTO, "ps" }, >- { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_KURDISH, "ku" }, >- { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_KASHMIRI, "ks" }, >-@@ -1101,15 +1101,22 @@ FcGetPixelSize (FT_Face face, int i) >- } >- >- static FcBool >--FcStringInPatternElement (FcPattern *pat, const char *elt, FcChar8 *string) >-+FcStringInPatternElement (FcPattern *pat, FcObject obj, const FcChar8 *string) >- { >-- int e; >-- FcChar8 *old; >-- for (e = 0; FcPatternGetString (pat, elt, e, &old) == FcResultMatch; e++) >-- if (!FcStrCmpIgnoreBlanksAndCase (old, string)) >-- { >-+ FcPatternIter iter; >-+ FcValueListPtr l; >-+ >-+ FcPatternIterStart (pat, &iter); >-+ if (!FcPatternFindObjectIter (pat, &iter, obj)) >-+ return FcFalse; >-+ for (l = FcPatternIterGetValues (pat, &iter); l; l = FcValueListNext (l)) >-+ { >-+ FcValue v = FcValueCanonicalize (&l->value); >-+ if (v.type != FcTypeString) >-+ break; >-+ if (!FcStrCmpIgnoreBlanksAndCase (v.u.s, string)) >- return FcTrue; >-- } >-+ } >- return FcFalse; >- } >- >-@@ -1145,6 +1152,23 @@ typedef struct >- unsigned int idx; >- } FcNameMapping; >- >-+static FcBool >-+_is_english(int platform, int language) >-+{ >-+ FcBool ret = FcFalse; >-+ >-+ switch (platform) >-+ { >-+ case TT_PLATFORM_MACINTOSH: >-+ ret = language == TT_MAC_LANGID_ENGLISH; >-+ break; >-+ case TT_PLATFORM_MICROSOFT: >-+ ret = language == TT_MS_LANGID_ENGLISH_UNITED_STATES; >-+ break; >-+ } >-+ return ret; >-+} >-+ >- static int >- name_mapping_cmp (const void *pa, const void *pb) >- { >-@@ -1154,7 +1178,7 @@ name_mapping_cmp (const void *pa, const >- if (a->platform_id != b->platform_id) return (int) a->platform_id - (int) b->platform_id; >- if (a->name_id != b->name_id) return (int) a->name_id - (int) b->name_id; >- if (a->encoding_id != b->encoding_id) return (int) a->encoding_id - (int) b->encoding_id; >-- if (a->language_id != b->language_id) return (int) a->language_id - (int) b->language_id; >-+ if (a->language_id != b->language_id) return _is_english(a->platform_id, a->language_id) ? -1 : _is_english(b->platform_id, b->language_id) ? 1 : (int) a->language_id - (int) b->language_id; >- if (a->idx != b->idx) return (int) a->idx - (int) b->idx; >- >- return 0; >-@@ -1455,10 +1479,10 @@ FcFreeTypeQueryFaceInternal (const FT_Fa >- FT_SfntName sname; >- int nameidx; >- const FcChar8 *lang; >-- const char *elt = 0, *eltlang = 0; >- int *np = 0, *nlangp = 0; >- size_t len; >- int nameid, lookupid; >-+ FcObject obj = FC_INVALID_OBJECT, objlang = FC_INVALID_OBJECT; >- >- nameid = lookupid = nameid_order[n]; >- >-@@ -1494,8 +1518,8 @@ FcFreeTypeQueryFaceInternal (const FT_Fa >- sname.name_id, sname.platform_id, >- sname.encoding_id, sname.language_id); >- >-- elt = FC_FAMILY; >-- eltlang = FC_FAMILYLANG; >-+ obj = FC_FAMILY_OBJECT; >-+ objlang = FC_FAMILYLANG_OBJECT; >- np = &nfamily; >- nlangp = &nfamily_lang; >- break; >-@@ -1506,8 +1530,8 @@ FcFreeTypeQueryFaceInternal (const FT_Fa >- sname.name_id, sname.platform_id, >- sname.encoding_id, sname.language_id); >- >-- elt = FC_FULLNAME; >-- eltlang = FC_FULLNAMELANG; >-+ obj = FC_FULLNAME_OBJECT; >-+ objlang = FC_FULLNAMELANG_OBJECT; >- np = &nfullname; >- nlangp = &nfullname_lang; >- break; >-@@ -1521,8 +1545,8 @@ FcFreeTypeQueryFaceInternal (const FT_Fa >- sname.name_id, sname.platform_id, >- sname.encoding_id, sname.language_id); >- >-- elt = FC_STYLE; >-- eltlang = FC_STYLELANG; >-+ obj = FC_STYLE_OBJECT; >-+ objlang = FC_STYLELANG_OBJECT; >- np = &nstyle; >- nlangp = &nstyle_lang; >- break; >-@@ -1538,7 +1562,7 @@ FcFreeTypeQueryFaceInternal (const FT_Fa >- } >- break; >- } >-- if (elt) >-+ if (obj != FC_INVALID_OBJECT) >- { >- FcChar8 *utf8, *pp; >- >-@@ -1546,7 +1570,7 @@ FcFreeTypeQueryFaceInternal (const FT_Fa >- lang = FcSfntNameLanguage (&sname); >- >- if (FcDebug () & FC_DBG_SCANV) >-- printf ("%s\n", utf8); >-+ printf ("%s\n", utf8 ? (char *)utf8 : "(null)"); >- >- if (!utf8) >- continue; >-@@ -1562,14 +1586,14 @@ FcFreeTypeQueryFaceInternal (const FT_Fa >- pp--; >- *pp = 0; >- >-- if (FcStringInPatternElement (pat, elt, utf8)) >-+ if (FcStringInPatternElement (pat, obj, utf8)) >- { >- free (utf8); >- continue; >- } >- >- /* add new element */ >-- if (!FcPatternAddString (pat, elt, utf8)) >-+ if (!FcPatternObjectAddString (pat, obj, utf8)) >- { >- free (utf8); >- goto bail1; >-@@ -1580,11 +1604,11 @@ FcFreeTypeQueryFaceInternal (const FT_Fa >- /* pad lang list with 'und' to line up with elt */ >- while (*nlangp < *np) >- { >-- if (!FcPatternAddString (pat, eltlang, (FcChar8 *) "und")) >-+ if (!FcPatternObjectAddString (pat, objlang, (FcChar8 *) "und")) >- goto bail1; >- ++*nlangp; >- } >-- if (!FcPatternAddString (pat, eltlang, lang)) >-+ if (!FcPatternObjectAddString (pat, objlang, lang)) >- goto bail1; >- ++*nlangp; >- } >-@@ -1606,7 +1630,7 @@ FcFreeTypeQueryFaceInternal (const FT_Fa >- printf ("using FreeType family \"%s\"\n", face->family_name); >- if (!FcPatternAddString (pat, FC_FAMILY, (FcChar8 *) face->family_name)) >- goto bail1; >-- if (!FcPatternAddString (pat, FC_STYLELANG, (FcChar8 *) "en")) >-+ if (!FcPatternAddString (pat, FC_FAMILYLANG, (FcChar8 *) "en")) >- goto bail1; >- ++nfamily; >- } >-@@ -2097,9 +2121,14 @@ FcFreeTypeQueryFaceInternal (const FT_Fa >- free (foundry_); >- >- if (master) >-- { >-- /* TODO: How to free master?! */ >-- } >-+ { >-+#ifdef HAVE_FT_DONE_MM_VAR >-+ if (face->glyph) >-+ FT_Done_MM_Var (face->glyph->library, master); >-+#else >-+ free (master); >-+#endif >-+ } >- >- return pat; >- >-@@ -2135,7 +2164,7 @@ FcFreeTypeQuery(const FcChar8 *file, >- if (FT_Init_FreeType (&ftLibrary)) >- return NULL; >- >-- if (FT_New_Face (ftLibrary, (char *) file, id & 0x7FFFFFFFF, &face)) >-+ if (FT_New_Face (ftLibrary, (char *) file, id & 0x7FFFFFFF, &face)) >- goto bail; >- >- if (count) >---- src/fcint.h.orig 2018-07-19 03:14:39 UTC >-+++ src/fcint.h >-@@ -1283,10 +1283,6 @@ FcPrivate FcBool >- FcStrIsAbsoluteFilename (const FcChar8 *s); >- >- FcPrivate FcChar8 * >--FcStrBuildFilename (const FcChar8 *path, >-- ...); >-- >--FcPrivate FcChar8 * >- FcStrLastSlash (const FcChar8 *path); >- >- FcPrivate FcChar32 >---- src/fcweight.c.orig 2018-06-05 10:36:38 UTC >-+++ src/fcweight.c >-@@ -46,7 +46,7 @@ static double lerp(double x, int x1, int >- int dx = x2 - x1; >- int dy = y2 - y1; >- assert (dx > 0 && dy >= 0 && x1 <= x && x <= x2); >-- return y1 + (dy*(x-x1) + dx/2) / dx; >-+ return y1 + (x-x1) * dy / dx; >- } >- >- double >---- src/fcxml.c.orig 2018-07-26 02:57:07 UTC >-+++ src/fcxml.c >-@@ -1480,6 +1480,11 @@ FcParseMatrix (FcConfigParse *parse) >- m.xy = FcPopExpr (parse); >- m.xx = FcPopExpr (parse); >- >-+ if (!m.yy || !m.yx || !m.xy || !m.xx) >-+ { >-+ FcConfigMessage (parse, FcSevereWarning, "Missing values in matrix element"); >-+ return; >-+ } >- if (FcPopExpr (parse)) >- FcConfigMessage (parse, FcSevereError, "wrong number of matrix elements"); >- else >-@@ -2073,16 +2078,36 @@ FcParseDir (FcConfigParse *parse) >- #endif >- >- attr = FcConfigGetAttribute (parse, "prefix"); >-- if (attr && FcStrCmp (attr, (const FcChar8 *)"xdg") == 0) >-+ data = FcStrBufDoneStatic (&parse->pstack->str); >-+ if (attr) >- { >-- prefix = FcConfigXdgDataHome (); >-- /* home directory might be disabled. >-- * simply ignore this element. >-- */ >-- if (!prefix) >-- goto bail; >-+ if (FcStrCmp (attr, (const FcChar8 *)"xdg") == 0) >-+ { >-+ prefix = FcConfigXdgDataHome (); >-+ /* home directory might be disabled. >-+ * simply ignore this element. >-+ */ >-+ if (!prefix) >-+ goto bail; >-+ } >-+ else if (FcStrCmp (attr, (const FcChar8 *)"default") == 0 || FcStrCmp (attr, (const FcChar8 *)"cwd") == 0) >-+ { >-+ } >-+ else if (FcStrCmp (attr, (const FcChar8 *)"relative") == 0) >-+ { >-+ prefix = FcStrDirname (parse->name); >-+ if (!prefix) >-+ goto bail; >-+ } >- } >-- data = FcStrBufDoneStatic (&parse->pstack->str); >-+#ifndef _WIN32 >-+ /* For Win32, check this later for dealing with special cases */ >-+ else >-+ { >-+ if (!FcStrIsAbsoluteFilename (data) && data[0] != '~') >-+ FcConfigMessage (parse, FcSevereWarning, "Use of ambiguous <dir> element. please add prefix=\"cwd\" if current behavior is desired."); >-+ } >-+#endif >- if (!data) >- { >- FcConfigMessage (parse, FcSevereError, "out of memory"); >-@@ -2153,6 +2178,11 @@ FcParseDir (FcConfigParse *parse) >- strcat ((char *) data, "\\"); >- strcat ((char *) data, "fonts"); >- } >-+ else if (!attr) >-+ { >-+ if (!FcStrIsAbsoluteFilename (data) && data[0] != '~') >-+ FcConfigMessage (parse, FcSevereWarning, "Use of ambiguous <dir> element. please add prefix=\"cwd\" if current behavior is desired."); >-+ } >- #endif >- if (strlen ((char *) data) == 0) >- FcConfigMessage (parse, FcSevereWarning, "empty font directory name ignored"); >Index: x11-fonts/fontconfig/files/patch-2.13.92.diff >=================================================================== >--- x11-fonts/fontconfig/files/patch-2.13.92.diff (nonexistent) >+++ x11-fonts/fontconfig/files/patch-2.13.92.diff (working copy) >@@ -0,0 +1,1782 @@ >+# Affect FC_FONT_HAS_HINT property to score on matcher >+# https://cgit.freedesktop.org/fontconfig/commit/?id=cb1036a7c7f1cb79fa799b1db368c86b018ec368 >+# Add missing return type for FcFontSet* functions >+# https://cgit.freedesktop.org/fontconfig/commit/?id=7172f08d4231c59cf14dab9ebab714df37e352ac >+# Do not return FcFalse from FcConfigParseAndLoad*() if complain is set to false >+# https://cgit.freedesktop.org/fontconfig/commit/?id=fcada522913e5e07efa6367eff87ace9f06d24c8 >+# conf: Add JoyPixels emoji font >+# https://cgit.freedesktop.org/fontconfig/commit/?id=65087ac7ce4cc5f2109967c1380b474955dcb590 >+# Warn as well if no directory name for cachedir provided >+# https://cgit.freedesktop.org/fontconfig/commit/?id=75eadca26648abf69497691ff0f4c7803b9ff23c >+# Take effect sysroot functionality to the default config file >+# https://cgit.freedesktop.org/fontconfig/commit/?id=cd51cb241aad7b362b793200ca7d42595c14f52b >+# Read latest cache in paths >+# https://cgit.freedesktop.org/fontconfig/commit/?id=c9862b6ea7c3234b29f6500c7d07359847e55ed7 >+# Fix a memory leak caused by the previous commit >+# https://cgit.freedesktop.org/fontconfig/commit/?id=a45fc8a33256d9d3ea0ea7947f33c8e5e3cc7238 >+# Use FcConfigReference/Destroy appropriately instead of FcConfigGetCurrent >+# https://cgit.freedesktop.org/fontconfig/commit/?id=b5bcf61fe789e66df2de609ec246cb7e4d326180 >+# Fix potential race condition in FcConfigSetCurrent and FcConfigReference >+# https://cgit.freedesktop.org/fontconfig/commit/?id=aa8c8cfa9fb2563482336249e3f56459099fcf6e >+# Correct reset-dirs in DTD >+# https://cgit.freedesktop.org/fontconfig/commit/?id=a4aa66a858f1ecd375c5efe5916398281f73f794 >+# Don't add a value for FC_FULLNAME in meta face >+# https://cgit.freedesktop.org/fontconfig/commit/?id=8249f871b373db5c6559f8c48242beed612b23a0 >+# Add proper fullname for named-instances >+# https://cgit.freedesktop.org/fontconfig/commit/?id=452be8125f0e2a18a7dfef469e05d19374d36307 >+# Fix the process substitution doesn't work with FONTCONFIG_FILE >+# https://cgit.freedesktop.org/fontconfig/commit/?id=71d6866d381a0ab3585eb9ee760aeec98e722359 >+# Fix memory leaks >+# https://cgit.freedesktop.org/fontconfig/commit/?id=61573ad5f7c4dd0860d613d99d0086433240eb75 >+# Fix assertion in FcFini() >+# https://cgit.freedesktop.org/fontconfig/commit/?id=fbc05949ef52c8a8d69233eed77f6636dffec280 >+# Set exact boolean value to color property >+# https://cgit.freedesktop.org/fontconfig/commit/?id=d3bfbea7dc53aa7fa52aa9616235a23d4507da1b >+# Fix assertion in FcCacheFini() again >+# https://cgit.freedesktop.org/fontconfig/commit/?id=6f6b39780215714386606ca1c5457a7106639ff4 >+ >+Excluding changes for the following files: test/Makefile.am, test/run-test.sh, >+test/test-bz1744377.c, test/test-crbug1004254.c, test/test-issue180.c. >+ >+--- conf.d/45-generic.conf.orig 2018-06-05 10:36:38 UTC >++++ conf.d/45-generic.conf >+@@ -38,6 +38,10 @@ >+ <default><family>emoji</family></default> >+ </alias> >+ <alias binding="same"> >++ <family>JoyPixels</family> >++ <default><family>emoji</family></default> >++ </alias> >++ <alias binding="same"> >+ <family>Emoji One</family> >+ <default><family>emoji</family></default> >+ </alias> >+--- conf.d/60-generic.conf.orig 2018-06-05 10:36:38 UTC >++++ conf.d/60-generic.conf >+@@ -42,6 +42,7 @@ >+ <family>EmojiOne Mozilla</family> <!-- Mozilla --> >+ <!-- Third-Party fonts --> >+ <family>Emoji Two</family> >++ <family>JoyPixels</family> >+ <family>Emoji One</family> >+ <!-- Non-color --> >+ <family>Noto Emoji</family> <!-- Google --> >+--- doc/fcconfig.fncs.orig 2019-05-08 08:22:25 UTC >++++ doc/fcconfig.fncs >+@@ -174,6 +174,10 @@ Returns one of the two sets of fonts fro >+ by <parameter>set</parameter>. This font set is owned by the library and must >+ not be modified or freed. >+ If <parameter>config</parameter> is NULL, the current configuration is used. >++ </para><para> >++This function isn't MT-safe. <function>FcConfigReference</function> must be called >++before using this and then <function>FcConfigDestroy</function> when >++the return value is no longer referenced. >+ @@ >+ >+ @RET@ FcBlanks * >+@@ -344,6 +348,15 @@ to be up to date, and used. >+ @TYPE1@ const FcChar8 * @ARG1@ name >+ @PURPOSE@ Find a config file >+ @DESC@ >++This function is deprecated and is replaced by <function>FcConfigGetFilename</function>. >++@@ >++ >++@RET@ FcChar8 * >++@FUNC@ FcConfigGetFilename >++@TYPE1@ FcConfig * @ARG1@ config >++@TYPE2@ const FcChar8 * @ARG2@ name >++@PURPOSE@ Find a config file >++@DESC@ >+ Given the specified external entity name, return the associated filename. >+ This provides applications a way to convert various configuration file >+ references into filename form. >+@@ -355,6 +368,8 @@ refers to a file in the current users ho >+ doesn't start with '/', it refers to a file in the default configuration >+ directory; the built-in default directory can be overridden with the >+ FONTCONFIG_PATH environment variable. >++ </para><para> >++The result of this function is affected by the FONTCONFIG_SYSROOT environment variable or equivalent functionality. >+ @@ >+ >+ @RET@ FcBool >+@@ -396,6 +411,10 @@ parse error, semantic error or allocatio >+ Obtains the system root directory in 'config' if available. All files >+ (including file properties in patterns) obtained from this 'config' are >+ relative to this system root directory. >++ </para><para> >++This function isn't MT-safe. <function>FcConfigReference</function> must be called >++before using this and then <function>FcConfigDestroy</function> when >++the return value is no longer referenced. >+ @SINCE@ 2.10.92 >+ @@ >+ >+@@ -422,6 +441,10 @@ When setting this on the current config >+ @PURPOSE@ Initialize the iterator >+ @DESC@ >+ Initialize 'iter' with the first iterator in the config file information list. >++ </para><para> >++This function isn't MT-safe. <function>FcConfigReference</function> must be called >++before using this and then <function>FcConfigDestroy</function> when the relevant >++values are no longer referenced. >+ @SINCE@ 2.12.91 >+ @@ >+ >+@@ -433,6 +456,10 @@ Initialize 'iter' with the first iterato >+ @DESC@ >+ Set 'iter' to point to the next node in the config file information list. >+ If there is no next node, FcFalse is returned. >++ </para><para> >++This function isn't MT-safe. <function>FcConfigReference</function> must be called >++before using <function>FcConfigFileInfoIterInit</function> and then >++<function>FcConfigDestroy</function> when the relevant values are no longer referenced. >+ @SINCE@ 2.12.91 >+ @@ >+ >+@@ -448,5 +475,9 @@ If there is no next node, FcFalse is ret >+ Obtain the filename, the description and the flag whether it is enabled or not >+ for 'iter' where points to current configuration file information. >+ If the iterator is invalid, FcFalse is returned. >++ </para><para> >++This function isn't MT-safe. <function>FcConfigReference</function> must be called >++before using <function>FcConfigFileInfoIterInit</function> and then >++<function>FcConfigDestroy</function> when the relevant values are no longer referenced. >+ @SINCE@ 2.12.91 >+ @@ >+--- doc/fcfontset.fncs.orig 2016-07-11 02:41:05 UTC >++++ doc/fcfontset.fncs >+@@ -97,7 +97,7 @@ of the output is designed to be of help >+ change at any time. >+ @@ >+ >+-@RET@ >++@RET@ FcFontSet * >+ @FUNC@ FcFontSetSort >+ @TYPE1@ FcConfig * @ARG1@ config >+ @TYPE2@ FcFontSet ** @ARG2@ sets >+@@ -128,7 +128,7 @@ modify these patterns. Instead, they sh >+ The FcFontSet returned by FcFontSetSort is destroyed by calling FcFontSetDestroy. >+ @@ >+ >+-@RET@ >++@RET@ void >+ @FUNC@ FcFontSetSortDestroy >+ @TYPE1@ FcFontSet * @ARG1@ set >+ @PURPOSE@ DEPRECATED destroy a font set >+--- fontconfig/fontconfig.h.orig 2019-08-09 11:09:32 UTC >++++ fontconfig/fontconfig.h >+@@ -375,7 +375,7 @@ FcPublic FcBool >+ FcDirCacheClean (const FcChar8 *cache_dir, FcBool verbose); >+ >+ FcPublic void >+-FcCacheCreateTagFile (const FcConfig *config); >++FcCacheCreateTagFile (FcConfig *config); >+ >+ FcPublic FcBool >+ FcDirCacheCreateUUID (FcChar8 *dir, >+@@ -394,6 +394,10 @@ FcPublic FcBool >+ FcConfigEnableHome (FcBool enable); >+ >+ FcPublic FcChar8 * >++FcConfigGetFilename (FcConfig *config, >++ const FcChar8 *url); >++ >++FcPublic FcChar8 * >+ FcConfigFilename (const FcChar8 *url); >+ >+ FcPublic FcConfig * >+@@ -433,7 +437,7 @@ FcPublic FcBlanks * >+ FcConfigGetBlanks (FcConfig *config); >+ >+ FcPublic FcStrList * >+-FcConfigGetCacheDirs (const FcConfig *config); >++FcConfigGetCacheDirs (FcConfig *config); >+ >+ FcPublic int >+ FcConfigGetRescanInterval (FcConfig *config); >+--- fonts.dtd.orig 2019-05-08 08:22:25 UTC >++++ fonts.dtd >+@@ -124,7 +124,7 @@ >+ <!-- >+ Reset the list of fonts directories >+ --> >+-<!ELEMENT reset-dirs > >++<!ELEMENT reset-dirs EMPTY> >+ >+ <!-- >+ Periodically rescan the font configuration and >+--- src/fccache.c.orig 2019-07-29 05:17:34 UTC >++++ src/fccache.c >+@@ -58,11 +58,15 @@ FcDirCacheDeleteUUID (const FcChar8 *di >+ { >+ FcBool ret = FcTrue; >+ #ifndef _WIN32 >+- const FcChar8 *sysroot = FcConfigGetSysRoot (config); >++ const FcChar8 *sysroot; >+ FcChar8 *target, *d; >+ struct stat statb; >+ struct timeval times[2]; >+ >++ config = FcConfigReference (config); >++ if (!config) >++ return FcFalse; >++ sysroot = FcConfigGetSysRoot (config); >+ if (sysroot) >+ d = FcStrBuildFilename (sysroot, dir, NULL); >+ else >+@@ -94,6 +98,7 @@ FcDirCacheDeleteUUID (const FcChar8 *di >+ bail: >+ FcStrFree (d); >+ #endif >++ FcConfigDestroy (config); >+ >+ return ret; >+ } >+@@ -265,7 +270,13 @@ FcDirCacheUnlink (const FcChar8 *dir, Fc >+ #endif >+ FcStrList *list; >+ FcChar8 *cache_dir; >+- const FcChar8 *sysroot = FcConfigGetSysRoot (config); >++ const FcChar8 *sysroot; >++ FcBool ret = FcTrue; >++ >++ config = FcConfigReference (config); >++ if (!config) >++ return FcFalse; >++ sysroot = FcConfigGetSysRoot (config); >+ >+ FcDirCacheBasenameMD5 (config, dir, cache_base); >+ #ifndef _WIN32 >+@@ -274,7 +285,10 @@ FcDirCacheUnlink (const FcChar8 *dir, Fc >+ >+ list = FcStrListCreate (config->cacheDirs); >+ if (!list) >+- return FcFalse; >++ { >++ ret = FcFalse; >++ goto bail; >++ } >+ >+ while ((cache_dir = FcStrListNext (list))) >+ { >+@@ -304,8 +318,11 @@ FcDirCacheUnlink (const FcChar8 *dir, Fc >+ FcDirCacheDeleteUUID (dir, config); >+ /* return FcFalse if something went wrong */ >+ if (cache_dir) >+- return FcFalse; >+- return FcTrue; >++ ret = FcFalse; >++bail: >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ >+ static int >+@@ -338,7 +355,7 @@ FcDirCacheOpenFile (const FcChar8 *cache >+ static FcBool >+ FcDirCacheProcess (FcConfig *config, const FcChar8 *dir, >+ FcBool (*callback) (FcConfig *config, int fd, struct stat *fd_stat, >+- struct stat *dir_stat, void *closure), >++ struct stat *dir_stat, struct timeval *cache_mtime, void *closure), >+ void *closure, FcChar8 **cache_file_ret) >+ { >+ int fd = -1; >+@@ -348,6 +365,7 @@ FcDirCacheProcess (FcConfig *config, con >+ struct stat file_stat, dir_stat; >+ FcBool ret = FcFalse; >+ const FcChar8 *sysroot = FcConfigGetSysRoot (config); >++ struct timeval latest_mtime = (struct timeval){ 0 }; >+ >+ if (sysroot) >+ d = FcStrBuildFilename (sysroot, dir, NULL); >+@@ -372,6 +390,7 @@ FcDirCacheProcess (FcConfig *config, con >+ #ifndef _WIN32 >+ FcBool retried = FcFalse; >+ #endif >++ >+ if (sysroot) >+ cache_hashed = FcStrBuildFilename (sysroot, cache_dir, cache_base, NULL); >+ else >+@@ -383,16 +402,21 @@ FcDirCacheProcess (FcConfig *config, con >+ #endif >+ fd = FcDirCacheOpenFile (cache_hashed, &file_stat); >+ if (fd >= 0) { >+- ret = (*callback) (config, fd, &file_stat, &dir_stat, closure); >++ ret = (*callback) (config, fd, &file_stat, &dir_stat, &latest_mtime, closure); >+ close (fd); >+ if (ret) >+ { >+ if (cache_file_ret) >++ { >++ if (*cache_file_ret) >++ FcStrFree (*cache_file_ret); >+ *cache_file_ret = cache_hashed; >++ } >+ else >+ FcStrFree (cache_hashed); >+- break; >+ } >++ else >++ FcStrFree (cache_hashed); >+ } >+ #ifndef _WIN32 >+ else if (!retried) >+@@ -412,12 +436,17 @@ FcDirCacheProcess (FcConfig *config, con >+ break; >+ goto retry; >+ } >++ else >++ FcStrFree (cache_hashed); >+ } >+ #endif >+- FcStrFree (cache_hashed); >++ else >++ FcStrFree (cache_hashed); >+ } >+ FcStrListDone (list); >+ >++ if (closure) >++ return !!(*((FcCache **)closure) != NULL); >+ return ret; >+ } >+ >+@@ -765,7 +794,18 @@ FcCacheFini (void) >+ int i; >+ >+ for (i = 0; i < FC_CACHE_MAX_LEVEL; i++) >+- assert (fcCacheChains[i] == NULL); >++ { >++ if (FcDebug() & FC_DBG_CACHE) >++ { >++ if (fcCacheChains[i] != NULL) >++ { >++ FcCacheSkip *s = fcCacheChains[i]; >++ printf("Fontconfig error: not freed %p (dir: %s, refcount %d)\n", s->cache, FcCacheDir(s->cache), s->ref.count); >++ } >++ } >++ else >++ assert (fcCacheChains[i] == NULL); >++ } >+ assert (fcCacheMaxLevel == 0); >+ >+ free_lock (); >+@@ -998,12 +1038,31 @@ FcDirCacheUnload (FcCache *cache) >+ } >+ >+ static FcBool >+-FcDirCacheMapHelper (FcConfig *config, int fd, struct stat *fd_stat, struct stat *dir_stat, void *closure) >++FcDirCacheMapHelper (FcConfig *config, int fd, struct stat *fd_stat, struct stat *dir_stat, struct timeval *latest_cache_mtime, void *closure) >+ { >+ FcCache *cache = FcDirCacheMapFd (config, fd, fd_stat, dir_stat); >++ struct timeval cache_mtime; >+ >+ if (!cache) >+ return FcFalse; >++ cache_mtime.tv_sec = fd_stat->st_mtime; >++#ifdef HAVE_STRUCT_STAT_ST_MTIM >++ cache_mtime.tv_usec = fd_stat->st_mtim.tv_nsec / 1000; >++#else >++ cache_mtime.tv_usec = 0; >++#endif >++ if (timercmp (latest_cache_mtime, &cache_mtime, <)) >++ { >++ if (*((FcCache **) closure)) >++ FcDirCacheUnload (*((FcCache **) closure)); >++ } >++ else >++ { >++ FcDirCacheUnload (cache); >++ return FcFalse; >++ } >++ latest_cache_mtime->tv_sec = cache_mtime.tv_sec; >++ latest_cache_mtime->tv_usec = cache_mtime.tv_usec; >+ *((FcCache **) closure) = cache; >+ return FcTrue; >+ } >+@@ -1013,10 +1072,15 @@ FcDirCacheLoad (const FcChar8 *dir, FcCo >+ { >+ FcCache *cache = NULL; >+ >++ config = FcConfigReference (config); >++ if (!config) >++ return NULL; >+ if (!FcDirCacheProcess (config, dir, >+ FcDirCacheMapHelper, >+ &cache, cache_file)) >+- return NULL; >++ cache = NULL; >++ >++ FcConfigDestroy (config); >+ >+ return cache; >+ } >+@@ -1027,13 +1091,18 @@ FcDirCacheLoadFile (const FcChar8 *cache >+ int fd; >+ FcCache *cache; >+ struct stat my_file_stat; >++ FcConfig *config; >+ >+ if (!file_stat) >+ file_stat = &my_file_stat; >++ config = FcConfigReference (NULL); >++ if (!config) >++ return NULL; >+ fd = FcDirCacheOpenFile (cache_file, file_stat); >+ if (fd < 0) >+ return NULL; >+- cache = FcDirCacheMapFd (FcConfigGetCurrent (), fd, file_stat, NULL); >++ cache = FcDirCacheMapFd (config, fd, file_stat, NULL); >++ FcConfigDestroy (config); >+ close (fd); >+ return cache; >+ } >+@@ -1093,7 +1162,7 @@ FcDirChecksumNano (struct stat *statb) >+ * the magic number and the size field >+ */ >+ static FcBool >+-FcDirCacheValidateHelper (FcConfig *config, int fd, struct stat *fd_stat, struct stat *dir_stat, void *closure FC_UNUSED) >++FcDirCacheValidateHelper (FcConfig *config, int fd, struct stat *fd_stat, struct stat *dir_stat, struct timeval *latest_cache_mtime, void *closure FC_UNUSED) >+ { >+ FcBool ret = FcTrue; >+ FcCache c; >+@@ -1127,12 +1196,16 @@ FcBool >+ FcDirCacheValid (const FcChar8 *dir) >+ { >+ FcConfig *config; >++ FcBool ret; >+ >+- config = FcConfigGetCurrent (); >++ config = FcConfigReference (NULL); >+ if (!config) >+ return FcFalse; >+ >+- return FcDirCacheValidConfig (dir, config); >++ ret = FcDirCacheValidConfig (dir, config); >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ >+ /* >+@@ -1410,9 +1483,13 @@ FcDirCacheClean (const FcChar8 *cache_di >+ FcCache *cache; >+ struct stat target_stat; >+ const FcChar8 *sysroot; >++ FcConfig *config; >+ >++ config = FcConfigReference (NULL); >++ if (!config) >++ return FcFalse; >+ /* FIXME: this API needs to support non-current FcConfig */ >+- sysroot = FcConfigGetSysRoot (NULL); >++ sysroot = FcConfigGetSysRoot (config); >+ if (sysroot) >+ dir = FcStrBuildFilename (sysroot, cache_dir, NULL); >+ else >+@@ -1420,7 +1497,8 @@ FcDirCacheClean (const FcChar8 *cache_di >+ if (!dir) >+ { >+ fprintf (stderr, "Fontconfig error: %s: out of memory\n", cache_dir); >+- return FcFalse; >++ ret = FcFalse; >++ goto bail; >+ } >+ if (access ((char *) dir, W_OK) != 0) >+ { >+@@ -1497,8 +1575,10 @@ FcDirCacheClean (const FcChar8 *cache_di >+ } >+ >+ closedir (d); >+- bail0: >++bail0: >+ FcStrFree (dir); >++bail: >++ FcConfigDestroy (config); >+ >+ return ret; >+ } >+@@ -1940,15 +2020,20 @@ FcDirCacheCreateTagFile (const FcChar8 * >+ } >+ >+ void >+-FcCacheCreateTagFile (const FcConfig *config) >++FcCacheCreateTagFile (FcConfig *config) >+ { >+ FcChar8 *cache_dir = NULL, *d = NULL; >+ FcStrList *list; >+- const FcChar8 *sysroot = FcConfigGetSysRoot (config); >++ const FcChar8 *sysroot; >++ >++ config = FcConfigReference (config); >++ if (!config) >++ return; >++ sysroot = FcConfigGetSysRoot (config); >+ >+ list = FcConfigGetCacheDirs (config); >+ if (!list) >+- return; >++ goto bail; >+ >+ while ((cache_dir = FcStrListNext (list))) >+ { >+@@ -1964,6 +2049,8 @@ FcCacheCreateTagFile (const FcConfig *co >+ if (d) >+ FcStrFree (d); >+ FcStrListDone (list); >++bail: >++ FcConfigDestroy (config); >+ } >+ >+ #define __fccache__ >+--- src/fccfg.c.orig 2019-05-08 08:22:25 UTC >++++ src/fccfg.c >+@@ -33,6 +33,49 @@ >+ #endif >+ >+ static FcConfig *_fcConfig; /* MT-safe */ >++static FcMutex *_lock; >++ >++static void >++lock_config (void) >++{ >++ FcMutex *lock; >++retry: >++ lock = fc_atomic_ptr_get (&_lock); >++ if (!lock) >++ { >++ lock = (FcMutex *) malloc (sizeof (FcMutex)); >++ FcMutexInit (lock); >++ if (!fc_atomic_ptr_cmpexch (&_lock, NULL, lock)) >++ { >++ FcMutexFinish (lock); >++ goto retry; >++ } >++ FcMutexLock (lock); >++ /* Initialize random state */ >++ FcRandom (); >++ return; >++ } >++ FcMutexLock (lock); >++} >++ >++static void >++unlock_config (void) >++{ >++ FcMutexUnlock (_lock); >++} >++ >++static void >++free_lock (void) >++{ >++ FcMutex *lock; >++ >++ lock = fc_atomic_ptr_get (&_lock); >++ if (lock && fc_atomic_ptr_cmpexch (&_lock, lock, NULL)) >++ { >++ FcMutexFinish (lock); >++ free (lock); >++ } >++} >+ >+ static FcConfig * >+ FcConfigEnsure (void) >+@@ -44,8 +87,9 @@ retry: >+ { >+ config = FcInitLoadConfigAndFonts (); >+ >+- if (!fc_atomic_ptr_cmpexch (&_fcConfig, NULL, config)) { >+- FcConfigDestroy (config); >++ if (!config || !fc_atomic_ptr_cmpexch (&_fcConfig, NULL, config)) { >++ if (config) >++ FcConfigDestroy (config); >+ goto retry; >+ } >+ } >+@@ -76,6 +120,7 @@ FcConfigFini (void) >+ FcConfig *cfg = fc_atomic_ptr_get (&_fcConfig); >+ if (cfg && fc_atomic_ptr_cmpexch (&_fcConfig, cfg, NULL)) >+ FcConfigDestroy (cfg); >++ free_lock (); >+ } >+ >+ static FcChar8 * >+@@ -237,12 +282,12 @@ FcConfigUptoDate (FcConfig *config) >+ { >+ FcFileTime config_time, config_dir_time, font_time; >+ time_t now = time(0); >++ FcBool ret = FcTrue; >++ >++ config = FcConfigReference (config); >+ if (!config) >+- { >+- config = FcConfigGetCurrent (); >+- if (!config) >+- return FcFalse; >+- } >++ return FcFalse; >++ >+ config_time = FcConfigNewestFile (config->configFiles); >+ config_dir_time = FcConfigNewestFile (config->configDirs); >+ font_time = FcConfigNewestFile (config->fontDirs); >+@@ -258,13 +303,19 @@ FcConfigUptoDate (FcConfig *config) >+ fprintf (stderr, >+ "Fontconfig warning: Directory/file mtime in the future. New fonts may not be detected.\n"); >+ config->rescanTime = now; >+- return FcTrue; >++ goto bail; >+ } >+ else >+- return FcFalse; >++ { >++ ret = FcFalse; >++ goto bail; >++ } >+ } >+ config->rescanTime = now; >+- return FcTrue; >++bail: >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ >+ FcExpr * >+@@ -291,12 +342,31 @@ FcConfigReference (FcConfig *config) >+ { >+ if (!config) >+ { >+- config = FcConfigGetCurrent (); >++ /* lock during obtaining the value from _fcConfig and count up refcount there, >++ * there are the race between them. >++ */ >++ lock_config (); >++ retry: >++ config = fc_atomic_ptr_get (&_fcConfig); >+ if (!config) >+- return 0; >+- } >++ { >++ unlock_config (); >+ >+- FcRefInc (&config->ref); >++ config = FcInitLoadConfigAndFonts (); >++ if (!config) >++ goto retry; >++ lock_config (); >++ if (!fc_atomic_ptr_cmpexch (&_fcConfig, NULL, config)) >++ { >++ FcConfigDestroy (config); >++ goto retry; >++ } >++ } >++ FcRefInc (&config->ref); >++ unlock_config (); >++ } >++ else >++ FcRefInc (&config->ref); >+ >+ return config; >+ } >+@@ -475,25 +545,32 @@ FcBool >+ FcConfigBuildFonts (FcConfig *config) >+ { >+ FcFontSet *fonts; >++ FcBool ret = FcTrue; >+ >++ config = FcConfigReference (config); >+ if (!config) >+- { >+- config = FcConfigGetCurrent (); >+- if (!config) >+- return FcFalse; >+- } >++ return FcFalse; >+ >+ fonts = FcFontSetCreate (); >+ if (!fonts) >+- return FcFalse; >++ { >++ ret = FcFalse; >++ goto bail; >++ } >+ >+ FcConfigSetFonts (config, fonts, FcSetSystem); >+ >+ if (!FcConfigAddDirList (config, FcSetSystem, config->fontDirs)) >+- return FcFalse; >++ { >++ ret = FcFalse; >++ goto bail; >++ } >+ if (FcDebug () & FC_DBG_FONTSET) >+ FcFontSetPrint (fonts); >+- return FcTrue; >++bail: >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ >+ FcBool >+@@ -501,20 +578,29 @@ FcConfigSetCurrent (FcConfig *config) >+ { >+ FcConfig *cfg; >+ >++ if (config) >++ { >++ if (!config->fonts[FcSetSystem]) >++ if (!FcConfigBuildFonts (config)) >++ return FcFalse; >++ FcRefInc (&config->ref); >++ } >++ >++ lock_config (); >+ retry: >+ cfg = fc_atomic_ptr_get (&_fcConfig); >+ >+ if (config == cfg) >++ { >++ unlock_config (); >++ if (config) >++ FcConfigDestroy (config); >+ return FcTrue; >+- >+- if (config && !config->fonts[FcSetSystem]) >+- if (!FcConfigBuildFonts (config)) >+- return FcFalse; >++ } >+ >+ if (!fc_atomic_ptr_cmpexch (&_fcConfig, cfg, config)) >+ goto retry; >+- >+- FcConfigReference (config); >++ unlock_config (); >+ if (cfg) >+ FcConfigDestroy (cfg); >+ >+@@ -537,13 +623,15 @@ FcConfigAddConfigDir (FcConfig *conf >+ FcStrList * >+ FcConfigGetConfigDirs (FcConfig *config) >+ { >++ FcStrList *ret; >++ >++ config = FcConfigReference (config); >+ if (!config) >+- { >+- config = FcConfigGetCurrent (); >+- if (!config) >+- return 0; >+- } >+- return FcStrListCreate (config->configDirs); >++ return NULL; >++ ret = FcStrListCreate (config->configDirs); >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ >+ FcBool >+@@ -579,13 +667,15 @@ FcConfigResetFontDirs (FcConfig *config) >+ FcStrList * >+ FcConfigGetFontDirs (FcConfig *config) >+ { >++ FcStrList *ret; >++ >++ config = FcConfigReference (config); >+ if (!config) >+- { >+- config = FcConfigGetCurrent (); >+- if (!config) >+- return 0; >+- } >+- return FcStrListCreate (config->fontDirs); >++ return NULL; >++ ret = FcStrListCreate (config->fontDirs); >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ >+ static FcBool >+@@ -670,15 +760,17 @@ FcConfigAddCacheDir (FcConfig *confi >+ } >+ >+ FcStrList * >+-FcConfigGetCacheDirs (const FcConfig *config) >++FcConfigGetCacheDirs (FcConfig *config) >+ { >++ FcStrList *ret; >++ >++ config = FcConfigReference (config); >+ if (!config) >+- { >+- config = FcConfigGetCurrent (); >+- if (!config) >+- return 0; >+- } >+- return FcStrListCreate (config->cacheDirs); >++ return NULL; >++ ret = FcStrListCreate (config->cacheDirs); >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ >+ FcBool >+@@ -686,7 +778,7 @@ FcConfigAddConfigFile (FcConfig *con >+ const FcChar8 *f) >+ { >+ FcBool ret; >+- FcChar8 *file = FcConfigFilename (f); >++ FcChar8 *file = FcConfigGetFilename (config, f); >+ >+ if (!file) >+ return FcFalse; >+@@ -699,13 +791,15 @@ FcConfigAddConfigFile (FcConfig *con >+ FcStrList * >+ FcConfigGetConfigFiles (FcConfig *config) >+ { >++ FcStrList *ret; >++ >++ config = FcConfigReference (config); >+ if (!config) >+- { >+- config = FcConfigGetCurrent (); >+- if (!config) >+- return 0; >+- } >+- return FcStrListCreate (config->configFiles); >++ return NULL; >++ ret = FcStrListCreate (config->configFiles); >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ >+ FcChar8 * >+@@ -784,25 +878,26 @@ FcConfigAddBlank (FcConfig *config FC_UN >+ int >+ FcConfigGetRescanInterval (FcConfig *config) >+ { >++ int ret; >++ >++ config = FcConfigReference (config); >+ if (!config) >+- { >+- config = FcConfigGetCurrent (); >+- if (!config) >+- return 0; >+- } >+- return config->rescanInterval; >++ return 0; >++ ret = config->rescanInterval; >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ >+ FcBool >+ FcConfigSetRescanInterval (FcConfig *config, int rescanInterval) >+ { >++ config = FcConfigReference (config); >+ if (!config) >+- { >+- config = FcConfigGetCurrent (); >+- if (!config) >+- return FcFalse; >+- } >++ return FcFalse; >+ config->rescanInterval = rescanInterval; >++ FcConfigDestroy (config); >++ >+ return FcTrue; >+ } >+ >+@@ -1670,15 +1765,13 @@ FcConfigSubstituteWithPat (FcConfig * >+ FcBool retval = FcTrue; >+ FcTest **tst = NULL; >+ >+- if (!config) >+- { >+- config = FcConfigGetCurrent (); >+- if (!config) >+- return FcFalse; >+- } >+- >+ if (kind < FcMatchKindBegin || kind >= FcMatchKindEnd) >+ return FcFalse; >++ >++ config = FcConfigReference (config); >++ if (!config) >++ return FcFalse; >++ >+ s = config->subst[kind]; >+ if (kind == FcMatchPattern) >+ { >+@@ -1973,6 +2066,7 @@ bail1: >+ free (value); >+ if (tst) >+ free (tst); >++ FcConfigDestroy (config); >+ >+ return retval; >+ } >+@@ -2284,10 +2378,16 @@ FcConfigEnableHome (FcBool enable) >+ } >+ >+ FcChar8 * >+-FcConfigFilename (const FcChar8 *url) >++FcConfigGetFilename (FcConfig *config, >++ const FcChar8 *url) >+ { >+ FcChar8 *file, *dir, **path, **p; >++ const FcChar8 *sysroot; >+ >++ config = FcConfigReference (config); >++ if (!config) >++ return NULL; >++ sysroot = FcConfigGetSysRoot (config); >+ if (!url || !*url) >+ { >+ url = (FcChar8 *) getenv ("FONTCONFIG_FILE"); >+@@ -2297,13 +2397,26 @@ FcConfigFilename (const FcChar8 *url) >+ file = 0; >+ >+ if (FcStrIsAbsoluteFilename(url)) >+- return FcConfigFileExists (0, url); >++ { >++ file = FcConfigFileExists (sysroot, url); >++ goto bail; >++ } >+ >+ if (*url == '~') >+ { >+ dir = FcConfigHome (); >+ if (dir) >+- file = FcConfigFileExists (dir, url + 1); >++ { >++ FcChar8 *s; >++ >++ if (sysroot) >++ s = FcStrBuildFilename (sysroot, dir, NULL); >++ else >++ s = dir; >++ file = FcConfigFileExists (s, url + 1); >++ if (sysroot) >++ FcStrFree (s); >++ } >+ else >+ file = 0; >+ } >+@@ -2311,45 +2424,64 @@ FcConfigFilename (const FcChar8 *url) >+ { >+ path = FcConfigGetPath (); >+ if (!path) >+- return NULL; >++ { >++ file = NULL; >++ goto bail; >++ } >+ for (p = path; *p; p++) >+ { >+- file = FcConfigFileExists (*p, url); >++ FcChar8 *s; >++ >++ if (sysroot) >++ s = FcStrBuildFilename (sysroot, *p, NULL); >++ else >++ s = *p; >++ file = FcConfigFileExists (s, url); >++ if (sysroot) >++ FcStrFree (s); >+ if (file) >+ break; >+ } >+ FcConfigFreePath (path); >+ } >++bail: >++ FcConfigDestroy (config); >++ >+ return file; >+ } >+ >+ FcChar8 * >++FcConfigFilename (const FcChar8 *url) >++{ >++ return FcConfigGetFilename (NULL, url); >++} >++ >++FcChar8 * >+ FcConfigRealFilename (FcConfig *config, >+ const FcChar8 *url) >+ { >+- const FcChar8 *sysroot = FcConfigGetSysRoot (config); >+- FcChar8 *n = FcConfigFilename (url); >+- FcChar8 *nn = NULL; >++ FcChar8 *n = FcConfigGetFilename (config, url); >+ >+ if (n) >+ { >+ FcChar8 buf[FC_PATH_MAX]; >+ ssize_t len; >++ struct stat sb; >+ >+- if (sysroot) >+- nn = FcStrBuildFilename (sysroot, n, NULL); >+- else >+- nn = FcStrdup (n); >+- FcStrFree (n); >+- >+- if ((len = FcReadLink (nn, buf, sizeof (buf) - 1)) != -1) >++ if ((len = FcReadLink (n, buf, sizeof (buf) - 1)) != -1) >+ { >+ buf[len] = 0; >+ >+- if (!FcStrIsAbsoluteFilename (buf)) >++ /* We try to pick up a config from FONTCONFIG_FILE >++ * when url is null. don't try to address the real filename >++ * if it is a named pipe. >++ */ >++ if (!url && FcStat (n, &sb) == 0 && S_ISFIFO (sb.st_mode)) >++ return n; >++ else if (!FcStrIsAbsoluteFilename (buf)) >+ { >+- FcChar8 *dirname = FcStrDirname (nn); >+- FcStrFree (nn); >++ FcChar8 *dirname = FcStrDirname (n); >++ FcStrFree (n); >+ if (!dirname) >+ return NULL; >+ >+@@ -2358,18 +2490,18 @@ FcConfigRealFilename (FcConfig *config, >+ if (!path) >+ return NULL; >+ >+- nn = FcStrCanonFilename (path); >++ n = FcStrCanonFilename (path); >+ FcStrFree (path); >+ } >+ else >+ { >+- FcStrFree (nn); >+- nn = FcStrdup (buf); >++ FcStrFree (n); >++ n = FcStrdup (buf); >+ } >+ } >+ } >+ >+- return nn; >++ return n; >+ } >+ >+ /* >+@@ -2384,17 +2516,18 @@ FcConfigAppFontAddFile (FcConfig *con >+ FcStrSet *subdirs; >+ FcStrList *sublist; >+ FcChar8 *subdir; >++ FcBool ret = FcTrue; >+ >++ config = FcConfigReference (config); >+ if (!config) >+- { >+- config = FcConfigGetCurrent (); >+- if (!config) >+- return FcFalse; >+- } >++ return FcFalse; >+ >+ subdirs = FcStrSetCreateEx (FCSS_GROW_BY_64); >+ if (!subdirs) >+- return FcFalse; >++ { >++ ret = FcFalse; >++ goto bail; >++ } >+ >+ set = FcConfigGetFonts (config, FcSetApplication); >+ if (!set) >+@@ -2403,7 +2536,8 @@ FcConfigAppFontAddFile (FcConfig *con >+ if (!set) >+ { >+ FcStrSetDestroy (subdirs); >+- return FcFalse; >++ ret = FcFalse; >++ goto bail; >+ } >+ FcConfigSetFonts (config, set, FcSetApplication); >+ } >+@@ -2411,7 +2545,8 @@ FcConfigAppFontAddFile (FcConfig *con >+ if (!FcFileScanConfig (set, subdirs, file, config)) >+ { >+ FcStrSetDestroy (subdirs); >+- return FcFalse; >++ ret = FcFalse; >++ goto bail; >+ } >+ if ((sublist = FcStrListCreate (subdirs))) >+ { >+@@ -2422,7 +2557,10 @@ FcConfigAppFontAddFile (FcConfig *con >+ FcStrListDone (sublist); >+ } >+ FcStrSetDestroy (subdirs); >+- return FcTrue; >++bail: >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ >+ FcBool >+@@ -2431,17 +2569,18 @@ FcConfigAppFontAddDir (FcConfig *con >+ { >+ FcFontSet *set; >+ FcStrSet *dirs; >++ FcBool ret = FcTrue; >+ >++ config = FcConfigReference (config); >+ if (!config) >+- { >+- config = FcConfigGetCurrent (); >+- if (!config) >+- return FcFalse; >+- } >++ return FcFalse; >+ >+ dirs = FcStrSetCreateEx (FCSS_GROW_BY_64); >+ if (!dirs) >+- return FcFalse; >++ { >++ ret = FcFalse; >++ goto bail; >++ } >+ >+ set = FcConfigGetFonts (config, FcSetApplication); >+ if (!set) >+@@ -2450,7 +2589,8 @@ FcConfigAppFontAddDir (FcConfig *con >+ if (!set) >+ { >+ FcStrSetDestroy (dirs); >+- return FcFalse; >++ ret = FcFalse; >++ goto bail; >+ } >+ FcConfigSetFonts (config, set, FcSetApplication); >+ } >+@@ -2460,23 +2600,26 @@ FcConfigAppFontAddDir (FcConfig *con >+ if (!FcConfigAddDirList (config, FcSetApplication, dirs)) >+ { >+ FcStrSetDestroy (dirs); >+- return FcFalse; >++ ret = FcFalse; >++ goto bail; >+ } >+ FcStrSetDestroy (dirs); >+- return FcTrue; >++bail: >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ >+ void >+ FcConfigAppFontClear (FcConfig *config) >+ { >++ config = FcConfigReference (config); >+ if (!config) >+- { >+- config = FcConfigGetCurrent (); >+- if (!config) >+- return; >+- } >++ return; >+ >+ FcConfigSetFonts (config, 0, FcSetApplication); >++ >++ FcConfigDestroy (config); >+ } >+ >+ /* >+@@ -2571,7 +2714,9 @@ FcConfigSetSysRoot (FcConfig *confi >+ { >+ FcChar8 *s = NULL; >+ FcBool init = FcFalse; >++ int nretry = 3; >+ >++retry: >+ if (!config) >+ { >+ /* We can't use FcConfigGetCurrent() here to ensure >+@@ -2603,6 +2748,17 @@ FcConfigSetSysRoot (FcConfig *confi >+ if (init) >+ { >+ config = FcInitLoadOwnConfigAndFonts (config); >++ if (!config) >++ { >++ /* Something failed. this is usually unlikely. so retrying */ >++ init = FcFalse; >++ if (--nretry == 0) >++ { >++ fprintf (stderr, "Fontconfig warning: Unable to initialize config and retry limit exceeded. sysroot functionality may not work as expected.\n"); >++ return; >++ } >++ goto retry; >++ } >+ FcConfigSetCurrent (config); >+ /* FcConfigSetCurrent() increases the refcount. >+ * decrease it here to avoid the memory leak. >+--- src/fcdir.c.orig 2019-05-08 08:22:25 UTC >++++ src/fcdir.c >+@@ -167,7 +167,16 @@ FcFileScan (FcFontSet *set, >+ const FcChar8 *file, >+ FcBool force FC_UNUSED) >+ { >+- return FcFileScanConfig (set, dirs, file, FcConfigGetCurrent ()); >++ FcConfig *config; >++ FcBool ret; >++ >++ config = FcConfigReference (NULL); >++ if (!config) >++ return FcFalse; >++ ret = FcFileScanConfig (set, dirs, file, config); >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ >+ /* >+@@ -271,10 +280,19 @@ FcDirScan (FcFontSet *set, >+ const FcChar8 *dir, >+ FcBool force FC_UNUSED) >+ { >++ FcConfig *config; >++ FcBool ret; >++ >+ if (cache || !force) >+ return FcFalse; >+ >+- return FcDirScanConfig (set, dirs, dir, force, FcConfigGetCurrent ()); >++ config = FcConfigReference (NULL); >++ if (!config) >++ return FcFalse; >++ ret = FcDirScanConfig (set, dirs, dir, force, config); >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ >+ /* >+@@ -353,12 +371,16 @@ FcDirCacheRescan (const FcChar8 *dir, Fc >+ FcCache *new = NULL; >+ struct stat dir_stat; >+ FcStrSet *dirs; >+- const FcChar8 *sysroot = FcConfigGetSysRoot (config); >++ const FcChar8 *sysroot; >+ FcChar8 *d = NULL; >+ #ifndef _WIN32 >+ int fd = -1; >+ #endif >+ >++ config = FcConfigReference (config); >++ if (!config) >++ return NULL; >++ sysroot = FcConfigGetSysRoot (config); >+ cache = FcDirCacheLoad (dir, config, NULL); >+ if (!cache) >+ goto bail; >+@@ -401,6 +423,7 @@ bail1: >+ bail: >+ if (d) >+ FcStrFree (d); >++ FcConfigDestroy (config); >+ >+ return new; >+ } >+@@ -413,6 +436,7 @@ FcDirCacheRead (const FcChar8 *dir, FcBo >+ { >+ FcCache *cache = NULL; >+ >++ config = FcConfigReference (config); >+ /* Try to use existing cache file */ >+ if (!force) >+ cache = FcDirCacheLoad (dir, config, NULL); >+@@ -420,6 +444,7 @@ FcDirCacheRead (const FcChar8 *dir, FcBo >+ /* Not using existing cache file, construct new cache */ >+ if (!cache) >+ cache = FcDirCacheScan (dir, config); >++ FcConfigDestroy (config); >+ >+ return cache; >+ } >+--- src/fcfreetype.c.orig 2019-08-09 10:47:03 UTC >++++ src/fcfreetype.c >+@@ -1294,7 +1294,7 @@ FcFreeTypeQueryFaceInternal (const FT_Fa >+ if (!FcPatternObjectAddBool (pat, FC_OUTLINE_OBJECT, has_outline)) >+ goto bail1; >+ >+- has_color = FT_HAS_COLOR (face); >++ has_color = !!FT_HAS_COLOR (face); >+ if (!FcPatternObjectAddBool (pat, FC_COLOR_OBJECT, has_color)) >+ goto bail1; >+ >+@@ -1495,7 +1495,8 @@ FcFreeTypeQueryFaceInternal (const FT_Fa >+ * and treat the instance's nameid as FONT_SUBFAMILY. >+ * Postscript name is automatically handled by FreeType. */ >+ if (nameid == TT_NAME_ID_WWS_SUBFAMILY || >+- nameid == TT_NAME_ID_PREFERRED_SUBFAMILY) >++ nameid == TT_NAME_ID_PREFERRED_SUBFAMILY || >++ nameid == TT_NAME_ID_FULL_NAME) >+ continue; >+ >+ if (nameid == TT_NAME_ID_FONT_SUBFAMILY) >+@@ -1528,6 +1529,8 @@ FcFreeTypeQueryFaceInternal (const FT_Fa >+ break; >+ case TT_NAME_ID_MAC_FULL_NAME: >+ case TT_NAME_ID_FULL_NAME: >++ if (variable) >++ break; >+ if (FcDebug () & FC_DBG_SCANV) >+ printf ("found full (n %2d p %d e %d l 0x%04x)", >+ sname.name_id, sname.platform_id, >+@@ -1679,6 +1682,61 @@ FcFreeTypeQueryFaceInternal (const FT_Fa >+ ++nfamily; >+ } >+ >++ /* Add the fullname into the cache */ >++ if (!variable && !nfullname) >++ { >++ FcChar8 *family, *style, *lang; >++ int n = 0; >++ size_t len, i; >++ FcStrBuf sbuf; >++ >++ while (FcPatternObjectGetString (pat, FC_FAMILYLANG_OBJECT, n, &lang) == FcResultMatch) >++ { >++ if (FcStrCmp (lang, (const FcChar8 *) "en") == 0) >++ break; >++ n++; >++ lang = NULL; >++ } >++ if (!lang) >++ n = 0; >++ if (FcPatternObjectGetString (pat, FC_FAMILY_OBJECT, n, &family) != FcResultMatch) >++ goto bail1; >++ len = strlen ((const char *) family); >++ for (i = len; i > 0; i--) >++ { >++ if (!isspace (family[i])) >++ break; >++ } >++ family[i] = 0; >++ while (FcPatternObjectGetString (pat, FC_STYLELANG_OBJECT, n, &lang) == FcResultMatch) >++ { >++ if (FcStrCmp (lang, (const FcChar8 *) "en") == 0) >++ break; >++ n++; >++ lang = NULL; >++ } >++ if (!lang) >++ n = 0; >++ if (FcPatternObjectGetString (pat, FC_STYLE_OBJECT, n, &style) != FcResultMatch) >++ goto bail1; >++ len = strlen ((const char *) style); >++ for (i = 0; style[i] != 0 && isspace (style[i]); i++) >++ break; >++ memcpy (style, &style[i], len - i); >++ FcStrBufInit (&sbuf, NULL, 0); >++ FcStrBufString (&sbuf, family); >++ FcStrBufChar (&sbuf, ' '); >++ FcStrBufString (&sbuf, style); >++ if (!FcPatternObjectAddString (pat, FC_FULLNAME_OBJECT, FcStrBufDoneStatic (&sbuf))) >++ { >++ FcStrBufDestroy (&sbuf); >++ goto bail1; >++ } >++ FcStrBufDestroy (&sbuf); >++ if (!FcPatternObjectAddString (pat, FC_FULLNAMELANG_OBJECT, (const FcChar8 *) "en")) >++ goto bail1; >++ ++nfullname; >++ } >+ /* Add the PostScript name into the cache */ >+ if (!variable) >+ { >+@@ -2142,6 +2200,17 @@ bail2: >+ FcCharSetDestroy (cs); >+ bail1: >+ FcPatternDestroy (pat); >++ if (master) >++ { >++#ifdef HAVE_FT_DONE_MM_VAR >++ if (face->glyph) >++ FT_Done_MM_Var (face->glyph->library, master); >++#else >++ free (master); >++#endif >++ } >++ if (!nm_share && name_mapping) >++ free (name_mapping); >+ if (foundry_) >+ free (foundry_); >+ bail0: >+@@ -2302,6 +2371,8 @@ bail: >+ if (face) >+ FT_Done_Face (face); >+ FT_Done_FreeType (ftLibrary); >++ if (nm) >++ free (nm); >+ >+ return ret; >+ } >+--- src/fcinit.c.orig 2018-06-05 10:36:38 UTC >++++ src/fcinit.c >+@@ -199,10 +199,10 @@ void >+ FcFini (void) >+ { >+ FcConfigFini (); >+- FcCacheFini (); >++ FcConfigPathFini (); >+ FcDefaultFini (); >+ FcObjectFini (); >+- FcConfigPathFini (); >++ FcCacheFini (); >+ } >+ >+ /* >+@@ -229,7 +229,8 @@ FcInitReinitialize (void) >+ FcBool >+ FcInitBringUptoDate (void) >+ { >+- FcConfig *config = FcConfigGetCurrent (); >++ FcConfig *config = FcConfigReference (NULL); >++ FcBool ret = FcTrue; >+ time_t now; >+ >+ if (!config) >+@@ -238,19 +239,23 @@ FcInitBringUptoDate (void) >+ * rescanInterval == 0 disables automatic up to date >+ */ >+ if (config->rescanInterval == 0) >+- return FcTrue; >++ goto bail; >+ /* >+ * Check no more often than rescanInterval seconds >+ */ >+ now = time (0); >+ if (config->rescanTime + config->rescanInterval - now > 0) >+- return FcTrue; >++ goto bail; >+ /* >+ * If up to date, don't reload configuration >+ */ >+ if (FcConfigUptoDate (0)) >+- return FcTrue; >+- return FcInitReinitialize (); >++ goto bail; >++ ret = FcInitReinitialize (); >++bail: >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ >+ #define __fcinit__ >+--- src/fclist.c.orig 2018-07-19 03:15:01 UTC >++++ src/fclist.c >+@@ -491,11 +491,10 @@ FcFontSetList (FcConfig *config, >+ { >+ if (!FcInitBringUptoDate ()) >+ goto bail0; >+- >+- config = FcConfigGetCurrent (); >+- if (!config) >+- goto bail0; >+ } >++ config = FcConfigReference (config); >++ if (!config) >++ goto bail0; >+ FcListHashTableInit (&table); >+ >+ if (!os) >+@@ -558,7 +557,7 @@ FcFontSetList (FcConfig *config, >+ */ >+ ret = FcFontSetCreate (); >+ if (!ret) >+- goto bail0; >++ goto bail1; >+ for (i = 0; i < FC_LIST_HASH_SIZE; i++) >+ while ((bucket = table.buckets[i])) >+ { >+@@ -570,6 +569,7 @@ FcFontSetList (FcConfig *config, >+ >+ if (destroy_os) >+ FcObjectSetDestroy (os); >++ FcConfigDestroy (config); >+ >+ return ret; >+ >+@@ -577,6 +577,7 @@ bail2: >+ FcFontSetDestroy (ret); >+ bail1: >+ FcListHashTableCleanup (&table); >++ FcConfigDestroy (config); >+ bail0: >+ if (destroy_os) >+ FcObjectSetDestroy (os); >+@@ -588,24 +589,26 @@ FcFontList (FcConfig *config, >+ FcPattern *p, >+ FcObjectSet *os) >+ { >+- FcFontSet *sets[2]; >++ FcFontSet *sets[2], *ret; >+ int nsets; >+ >+ if (!config) >+ { >+ if (!FcInitBringUptoDate ()) >+ return 0; >+- >+- config = FcConfigGetCurrent (); >+- if (!config) >+- return 0; >+ } >++ config = FcConfigReference (config); >++ if (!config) >++ return NULL; >+ nsets = 0; >+ if (config->fonts[FcSetSystem]) >+ sets[nsets++] = config->fonts[FcSetSystem]; >+ if (config->fonts[FcSetApplication]) >+ sets[nsets++] = config->fonts[FcSetApplication]; >+- return FcFontSetList (config, sets, nsets, p, os); >++ ret = FcFontSetList (config, sets, nsets, p, os); >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ #define __fclist__ >+ #include "fcaliastail.h" >+--- src/fcmatch.c.orig 2018-07-19 08:28:09 UTC >++++ src/fcmatch.c >+@@ -342,6 +342,7 @@ typedef enum _FcMatcherPriority { >+ PRI1(SLANT), >+ PRI1(WEIGHT), >+ PRI1(WIDTH), >++ PRI1(FONT_HAS_HINT), >+ PRI1(DECORATIVE), >+ PRI1(ANTIALIAS), >+ PRI1(RASTERIZER), >+@@ -844,7 +845,7 @@ FcFontSetMatch (FcConfig *config, >+ FcPattern *p, >+ FcResult *result) >+ { >+- FcPattern *best; >++ FcPattern *best, *ret = NULL; >+ >+ assert (sets != NULL); >+ assert (p != NULL); >+@@ -852,17 +853,16 @@ FcFontSetMatch (FcConfig *config, >+ >+ *result = FcResultNoMatch; >+ >++ config = FcConfigReference (config); >+ if (!config) >+- { >+- config = FcConfigGetCurrent (); >+- if (!config) >+- return 0; >+- } >++ return NULL; >+ best = FcFontSetMatchInternal (sets, nsets, p, result); >+ if (best) >+- return FcFontRenderPrepare (config, p, best); >+- else >+- return NULL; >++ ret = FcFontRenderPrepare (config, p, best); >++ >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ >+ FcPattern * >+@@ -872,19 +872,16 @@ FcFontMatch (FcConfig *config, >+ { >+ FcFontSet *sets[2]; >+ int nsets; >+- FcPattern *best; >++ FcPattern *best, *ret = NULL; >+ >+ assert (p != NULL); >+ assert (result != NULL); >+ >+ *result = FcResultNoMatch; >+ >++ config = FcConfigReference (config); >+ if (!config) >+- { >+- config = FcConfigGetCurrent (); >+- if (!config) >+- return 0; >+- } >++ return NULL; >+ nsets = 0; >+ if (config->fonts[FcSetSystem]) >+ sets[nsets++] = config->fonts[FcSetSystem]; >+@@ -893,9 +890,11 @@ FcFontMatch (FcConfig *config, >+ >+ best = FcFontSetMatchInternal (sets, nsets, p, result); >+ if (best) >+- return FcFontRenderPrepare (config, p, best); >+- else >+- return NULL; >++ ret = FcFontRenderPrepare (config, p, best); >++ >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ >+ typedef struct _FcSortNode { >+@@ -1182,7 +1181,7 @@ FcFontSort (FcConfig *config, >+ FcCharSet **csp, >+ FcResult *result) >+ { >+- FcFontSet *sets[2]; >++ FcFontSet *sets[2], *ret; >+ int nsets; >+ >+ assert (p != NULL); >+@@ -1190,18 +1189,18 @@ FcFontSort (FcConfig *config, >+ >+ *result = FcResultNoMatch; >+ >++ config = FcConfigReference (config); >+ if (!config) >+- { >+- config = FcConfigGetCurrent (); >+- if (!config) >+- return 0; >+- } >++ return NULL; >+ nsets = 0; >+ if (config->fonts[FcSetSystem]) >+ sets[nsets++] = config->fonts[FcSetSystem]; >+ if (config->fonts[FcSetApplication]) >+ sets[nsets++] = config->fonts[FcSetApplication]; >+- return FcFontSetSort (config, sets, nsets, p, trim, csp, result); >++ ret = FcFontSetSort (config, sets, nsets, p, trim, csp, result); >++ FcConfigDestroy (config); >++ >++ return ret; >+ } >+ #define __fcmatch__ >+ #include "fcaliastail.h" >+--- src/fcobjs.h.orig 2019-07-30 11:03:27 UTC >++++ src/fcobjs.h >+@@ -72,5 +72,5 @@ FC_OBJECT (COLOR, FcTypeBool, FcCompare >+ FC_OBJECT (SYMBOL, FcTypeBool, FcCompareBool) >+ FC_OBJECT (FONT_VARIATIONS, FcTypeString, NULL) >+ FC_OBJECT (VARIABLE, FcTypeBool, FcCompareBool) >+-FC_OBJECT (FONT_HAS_HINT, FcTypeBool, NULL) >++FC_OBJECT (FONT_HAS_HINT, FcTypeBool, FcCompareBool) >+ /* ^-------------- Add new objects here. */ >+--- src/fcxml.c.orig 2019-07-29 05:17:34 UTC >++++ src/fcxml.c >+@@ -2301,6 +2301,11 @@ FcParseCacheDir (FcConfigParse *parse) >+ data = prefix; >+ goto bail; >+ } >++ if (data[0] == 0) >++ { >++ FcConfigMessage (parse, FcSevereWarning, "empty cache directory name ignored"); >++ return; >++ } >+ if (prefix) >+ { >+ size_t plen = strlen ((const char *)prefix); >+@@ -2536,7 +2541,7 @@ FcParseInclude (FcConfigParse *parse) >+ FcChar8 *filename; >+ static FcBool warn_conf = FcFalse, warn_confd = FcFalse; >+ >+- filename = FcConfigFilename(s); >++ filename = FcConfigGetFilename(parse->config, s); >+ if (deprecated == FcTrue && >+ filename != NULL && >+ userdir != NULL && >+@@ -3526,8 +3531,10 @@ _FcConfigParse (FcConfig *config, >+ int len; >+ FcStrBuf sbuf; >+ char buf[BUFSIZ]; >+- FcBool ret = FcFalse; >++ FcBool ret = FcFalse, complain_again = complain; >++ FcStrBuf reason; >+ >++ FcStrBufInit (&reason, NULL, 0); >+ #ifdef _WIN32 >+ if (!pGetSystemWindowsDirectory) >+ { >+@@ -3544,12 +3551,20 @@ _FcConfigParse (FcConfig *config, >+ } >+ #endif >+ >+- filename = FcConfigFilename (name); >++ filename = FcConfigGetFilename (config, name); >+ if (!filename) >++ { >++ FcStrBufString (&reason, (FcChar8 *)"No such file: "); >++ FcStrBufString (&reason, name ? name : (FcChar8 *)"(null)"); >+ goto bail0; >++ } >+ realfilename = FcConfigRealFilename (config, name); >+ if (!realfilename) >++ { >++ FcStrBufString (&reason, (FcChar8 *)"No such realfile: "); >++ FcStrBufString (&reason, name ? name : (FcChar8 *)"(null)"); >+ goto bail0; >++ } >+ if (FcStrSetMember (config->availConfigFiles, realfilename)) >+ { >+ FcStrFree (filename); >+@@ -3577,7 +3592,11 @@ _FcConfigParse (FcConfig *config, >+ >+ fd = FcOpen ((char *) realfilename, O_RDONLY); >+ if (fd == -1) >++ { >++ FcStrBufString (&reason, (FcChar8 *)"Unable to open "); >++ FcStrBufString (&reason, realfilename); >+ goto bail1; >++ } >+ >+ do { >+ len = read (fd, buf, BUFSIZ); >+@@ -3605,7 +3624,7 @@ _FcConfigParse (FcConfig *config, >+ close (fd); >+ >+ ret = FcConfigParseAndLoadFromMemoryInternal (config, filename, FcStrBufDoneStatic (&sbuf), complain, load); >+- complain = FcFalse; /* no need to reclaim here */ >++ complain_again = FcFalse; /* no need to reclaim here */ >+ bail1: >+ FcStrBufDestroy (&sbuf); >+ bail0: >+@@ -3613,14 +3632,18 @@ bail0: >+ FcStrFree (filename); >+ if (realfilename) >+ FcStrFree (realfilename); >+- if (!ret && complain) >++ if (!complain) >++ return FcTrue; >++ if (!ret && complain_again) >+ { >+ if (name) >+- FcConfigMessage (0, FcSevereError, "Cannot %s config file \"%s\"", load ? "load" : "scan", name); >++ FcConfigMessage (0, FcSevereError, "Cannot %s config file \"%s\": %s", load ? "load" : "scan", name, FcStrBufDoneStatic (&reason)); >+ else >+- FcConfigMessage (0, FcSevereError, "Cannot %s default config file", load ? "load" : "scan"); >++ FcConfigMessage (0, FcSevereError, "Cannot %s default config file: %s", load ? "load" : "scan", FcStrBufDoneStatic (&reason)); >++ FcStrBufDestroy (&reason); >+ return FcFalse; >+ } >++ FcStrBufDestroy (&reason); >+ return ret; >+ } >+ >Index: x11-fonts/fontconfig/pkg-message >=================================================================== >--- x11-fonts/fontconfig/pkg-message (nonexistent) >+++ x11-fonts/fontconfig/pkg-message (working copy) >@@ -0,0 +1,15 @@ >+[ >+{ >+ type: upgrade, >+ maximum_version: "2.13.92,1", >+ message: <<EOM >+Fontconfig 2.13.1 generated .uuid files in the fonts directory >+which where not properly registered to the packages. >+To clean them up, please execute the following command: >+ >+ find %%LOCALBASE%%/share/fonts -type f -name .uuid >+ >+and delete the files at your discretion. >+EOM >+} >+] >Index: x11-fonts/fontconfig/pkg-plist >=================================================================== >--- x11-fonts/fontconfig/pkg-plist (revision 528919) >+++ x11-fonts/fontconfig/pkg-plist (working copy) >@@ -7,6 +7,8 @@ > bin/fc-query > bin/fc-scan > bin/fc-validate >+etc/fonts/conf.avail/05-reset-dirs-sample.conf >+etc/fonts/conf.avail/09-autohint-if-no-hinting.conf > etc/fonts/conf.avail/10-autohint.conf > etc/fonts/conf.avail/10-hinting-full.conf > etc/fonts/conf.avail/10-hinting-medium.conf >@@ -25,6 +27,7 @@ > etc/fonts/conf.avail/20-unhint-small-vera.conf > etc/fonts/conf.avail/25-unhint-nonlatin.conf > etc/fonts/conf.avail/30-metric-aliases.conf >+etc/fonts/conf.avail/35-lang-normalize.conf > etc/fonts/conf.avail/40-nonlatin.conf > etc/fonts/conf.avail/45-generic.conf > etc/fonts/conf.avail/45-latin.conf >Index: x11-fonts/fontconfig-reference/pkg-plist >=================================================================== >--- x11-fonts/fontconfig-reference/pkg-plist (revision 528919) >+++ x11-fonts/fontconfig-reference/pkg-plist (working copy) >@@ -179,6 +179,7 @@ > man/man3/FcRangeDestroy.3.gz > man/man3/FcRangeGetDouble.3.gz > man/man3/FcStrBasename.3.gz >+man/man3/FcStrBuildFilename.3.gz > man/man3/FcStrCmp.3.gz > man/man3/FcStrCmpIgnoreCase.3.gz > man/man3/FcStrCopy.3.gz
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
lightside
:
maintainer-approval?
(
desktop
)
Actions:
View
|
Diff
Attachments on
bug 239167
:
205723
|
205785
|
205786
|
205810
|
205827
|
205855
|
206007
|
206009
|
206030
|
206087
|
206117
|
212601
|
212602
|
212603
|
212612
|
212643
| 212645
Working