diff options
-rw-r--r-- | main/fontconfig/APKBUILD | 29 | ||||
-rw-r--r-- | main/fontconfig/fontconfig-fix-woff.patch | 157 |
2 files changed, 179 insertions, 7 deletions
diff --git a/main/fontconfig/APKBUILD b/main/fontconfig/APKBUILD index 78c8ef631..cac6f1900 100644 --- a/main/fontconfig/APKBUILD +++ b/main/fontconfig/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: Natanael Copa <ncopa@alpinelinux.org> pkgname=fontconfig pkgver=2.10.92 -pkgrel=0 +pkgrel=1 pkgdesc="The Fontconfig package is a library for configuring and customizing font access." url="http://fontconfig.org" arch="all" @@ -12,11 +12,23 @@ makedepends="pkgconfig freetype-dev expat-dev zlib-dev" install= triggers="$pkgname.trigger=/usr/share/fonts/*" subpackages="$pkgname-doc $pkgname-dev" -source="http://fontconfig.org/release/${pkgname}-${pkgver}.tar.gz" +source="http://fontconfig.org/release/${pkgname}-${pkgver}.tar.gz + fontconfig-fix-woff.patch" depends_dev="freetype-dev expat-dev" +_builddir="$srcdir/$pkgname-$pkgver" +prepare() { + local i + cd "$_builddir" + for i in $source; do + case $i in + *.patch) msg $i; patch -p1 -i "$srcdir"/$i || return 1;; + esac + done +} + build() { - cd "$srcdir/$pkgname-$pkgver" + cd "$_builddir" ./configure --prefix=/usr \ --sysconfdir=/etc \ @@ -25,13 +37,16 @@ build() { } package() { - cd "$srcdir/$pkgname-$pkgver" + cd "$_builddir" make -j1 DESTDIR="$pkgdir" install || return 1 rm "$pkgdir"/usr/lib/*.la install -m644 -D COPYING "$pkgdir"/usr/share/licenses/"${pkgname}"/COPYING } -md5sums="5738838ef01f4c77fe33eeac2ceafe4d fontconfig-2.10.92.tar.gz" -sha256sums="d9185302a937f800483fa50d9333581f1035cf4f7339e7aab456e6cde5c50bd2 fontconfig-2.10.92.tar.gz" -sha512sums="536a82ecb39488774a2ec83615ebdce08eff2f7884749e2d2bc4dec841b8142cf874d3a77d191b8d80a479efc10a1281e47bb5d96802e55936dbefd6fab62f9d fontconfig-2.10.92.tar.gz" +md5sums="5738838ef01f4c77fe33eeac2ceafe4d fontconfig-2.10.92.tar.gz +d14a7c88fa001f1e5c2e350a2cf737cd fontconfig-fix-woff.patch" +sha256sums="d9185302a937f800483fa50d9333581f1035cf4f7339e7aab456e6cde5c50bd2 fontconfig-2.10.92.tar.gz +8ef41c69d5a87fd4d180a86fa80160277bb13fba020d547724698128590f60a1 fontconfig-fix-woff.patch" +sha512sums="536a82ecb39488774a2ec83615ebdce08eff2f7884749e2d2bc4dec841b8142cf874d3a77d191b8d80a479efc10a1281e47bb5d96802e55936dbefd6fab62f9d fontconfig-2.10.92.tar.gz +38b40fd954b3aa571661cea03e58ff2314c0fee55559db3abb6f2d705e7ea8ae9b9ad8a707791f2cd831220ae38926893ee4df3fd5c3a1beffb144e0e5e7e73d fontconfig-fix-woff.patch" diff --git a/main/fontconfig/fontconfig-fix-woff.patch b/main/fontconfig/fontconfig-fix-woff.patch new file mode 100644 index 000000000..a3600c018 --- /dev/null +++ b/main/fontconfig/fontconfig-fix-woff.patch @@ -0,0 +1,157 @@ +diff --git a/src/fcfreetype.c b/src/fcfreetype.c +index 8a037c0..5e8990d 100644 +--- a/src/fcfreetype.c ++++ b/src/fcfreetype.c +@@ -1104,7 +1104,10 @@ FcFreeTypeQueryFace (const FT_Face face, + char psname[256]; + const char *tmp; + +- FcChar8 *hashstr; ++ FcChar8 *hashstr = NULL; ++ char *fontdata = NULL; ++ FT_Error err; ++ FT_ULong len = 0, alen; + + pat = FcPatternCreate (); + if (!pat) +@@ -1662,12 +1665,34 @@ FcFreeTypeQueryFace (const FT_Face face, + if (!FcPatternAddBool (pat, FC_DECORATIVE, decorative)) + goto bail1; + +- hashstr = FcHashGetSHA256DigestFromFile (file); ++ err = FT_Load_Sfnt_Table (face, 0, 0, NULL, &len); ++ if (err == FT_Err_Ok) ++ { ++ alen = (len + 63) & ~63; ++ fontdata = malloc (alen); ++ if (!fontdata) ++ goto bail1; ++ err = FT_Load_Sfnt_Table (face, 0, 0, (FT_Byte *)fontdata, &len); ++ if (err != FT_Err_Ok) ++ goto bail1; ++ memset (&fontdata[len], 0, alen - len); ++ hashstr = FcHashGetSHA256DigestFromMemory (fontdata, len); ++ } ++ else if (err == FT_Err_Invalid_Face_Handle) ++ { ++ /* font may not support SFNT. falling back to ++ * read the font data from file directly ++ */ ++ hashstr = FcHashGetSHA256DigestFromFile (file); ++ } ++ else ++ { ++ goto bail1; ++ } + if (!hashstr) + goto bail1; + if (!FcPatternAddString (pat, FC_HASH, hashstr)) + goto bail1; +- free (hashstr); + + /* + * Compute the unicode coverage for the font +@@ -1756,6 +1781,10 @@ FcFreeTypeQueryFace (const FT_Face face, + bail2: + FcCharSetDestroy (cs); + bail1: ++ if (hashstr) ++ free (hashstr); ++ if (fontdata) ++ free (fontdata); + FcPatternDestroy (pat); + bail0: + return NULL; +diff --git a/src/fchash.c b/src/fchash.c +index 827b20f..92585a6 100644 +--- a/src/fchash.c ++++ b/src/fchash.c +@@ -220,7 +220,7 @@ FcHashGetSHA256DigestFromFile (const FcChar8 *filename) + + ret = FcHashInitSHA256Digest (); + if (!ret) +- return NULL; ++ goto bail0; + + while (!feof (fp)) + { +@@ -261,5 +261,60 @@ FcHashGetSHA256DigestFromFile (const FcChar8 *filename) + + bail0: + fclose (fp); ++ + return NULL; + } ++ ++FcChar8 * ++FcHashGetSHA256DigestFromMemory (const char *fontdata, ++ size_t length) ++{ ++ char ibuf[64]; ++ FcChar32 *ret; ++ size_t i = 0; ++ ++ ret = FcHashInitSHA256Digest (); ++ if (!ret) ++ return NULL; ++ ++ while (i <= length) ++ { ++ if ((length - i) < 64) ++ { ++ long v; ++ size_t n; ++ ++ /* add a padding */ ++ n = length - i; ++ if (n > 0) ++ memcpy (ibuf, &fontdata[i], n); ++ memset (&ibuf[n], 0, 64 - n); ++ ibuf[n] = 0x80; ++ if ((64 - n) < 9) ++ { ++ /* process a block once */ ++ FcHashComputeSHA256Digest (ret, ibuf); ++ memset (ibuf, 0, 64); ++ } ++ /* set input size at the end */ ++ v = length * 8; ++ ibuf[63 - 0] = v & 0xff; ++ ibuf[63 - 1] = (v >> 8) & 0xff; ++ ibuf[63 - 2] = (v >> 16) & 0xff; ++ ibuf[63 - 3] = (v >> 24) & 0xff; ++ ibuf[63 - 4] = (v >> 32) & 0xff; ++ ibuf[63 - 5] = (v >> 40) & 0xff; ++ ibuf[63 - 6] = (v >> 48) & 0xff; ++ ibuf[63 - 7] = (v >> 56) & 0xff; ++ FcHashComputeSHA256Digest (ret, ibuf); ++ break; ++ } ++ else ++ { ++ FcHashComputeSHA256Digest (ret, &fontdata[i]); ++ } ++ i += 64; ++ } ++ ++ return FcHashSHA256ToString (ret); ++} +diff --git a/src/fcint.h b/src/fcint.h +index c45075e..8919958 100644 +--- a/src/fcint.h ++++ b/src/fcint.h +@@ -818,9 +818,14 @@ FcFontSetSerialize (FcSerialize *serialize, const FcFontSet * s); + FcPrivate FcChar8 * + FcHashGetSHA256Digest (const FcChar8 *input_strings, + size_t len); ++ + FcPrivate FcChar8 * + FcHashGetSHA256DigestFromFile (const FcChar8 *filename); + ++FcPrivate FcChar8 * ++FcHashGetSHA256DigestFromMemory (const char *fontdata, ++ size_t length); ++ + /* fcinit.c */ + FcPrivate FcConfig * + FcInitLoadOwnConfig (FcConfig *config); |