src/Makefile.am | 1 src/fcdir.c | 3 + src/fcfreetype.c | 84 +++------------------------------------------------ src/fcint.h | 4 ++ src/fcopentype.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/meson.build | 1 6 files changed, 104 insertions(+), 79 deletions(-) New commits: commit dbd67ccc63bcf5983e47123d9ec06eb4389e2d1b Author: Akira TAGOH <akira@xxxxxxxxx> Date: Wed Sep 16 15:06:43 2020 +0900 Update meson.build diff --git a/src/meson.build b/src/meson.build index ee5b8cc..0065e8f 100644 --- a/src/meson.build +++ b/src/meson.build @@ -19,6 +19,7 @@ fc_sources = [ 'fcmatrix.c', 'fcname.c', 'fcobjs.c', + 'fcopentype.c', 'fcpat.c', 'fcrange.c', 'fcserialize.c', commit c78e7fd6deea835a522a89b3ae9ecc4fb1a2b672 Author: Akira TAGOH <akira@xxxxxxxxx> Date: Fri Apr 3 19:44:00 2020 +0900 Add fullname later once FcConfigSubstitute() is done So user's changes in family and style will be reflected into fullname. diff --git a/src/Makefile.am b/src/Makefile.am index 4ddcb1a..eddb87c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -151,6 +151,7 @@ libfontconfig_la_SOURCES = \ fcname.c \ fcobjs.c \ fcobjs.h \ + fcopentype.c \ fcpat.c \ fcrange.c \ fcserialize.c \ diff --git a/src/fcdir.c b/src/fcdir.c index e332897..06644a0 100644 --- a/src/fcdir.c +++ b/src/fcdir.c @@ -117,6 +117,9 @@ FcFileScanFontConfig (FcFontSet *set, if (config && !FcConfigSubstitute (config, font, FcMatchScan)) ret = FcFalse; + if (!FcPatternAddFullname (font)) + ret = FcFalse; + if (FcDebug() & FC_DBG_SCANV) { printf ("Final font pattern:\n"); diff --git a/src/fcfreetype.c b/src/fcfreetype.c index 672c33a..0001f38 100644 --- a/src/fcfreetype.c +++ b/src/fcfreetype.c @@ -1666,63 +1666,6 @@ FcFreeTypeQueryFaceInternal (const FT_Face face, ++nfamily; } - /* Add the fullname into the cache */ - if (!variable) - { - 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); - if (FcStrCmpIgnoreBlanksAndCase(style, (const FcChar8 *) "Regular") != 0) - { - 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; - } /* Add the PostScript name into the cache */ if (!variable) { diff --git a/src/fcint.h b/src/fcint.h index a3b192d..2d4a2c4 100644 --- a/src/fcint.h +++ b/src/fcint.h @@ -1368,6 +1368,10 @@ FcObjectLookupOtherTypeById (FcObject id); FcPrivate const FcObjectType * FcObjectLookupOtherTypeByName (const char *str); +/* fcopentype.c */ +FcPrivate FcBool +FcPatternAddFullname (FcPattern *pat); + /* fchash.c */ FcPrivate FcBool FcHashStrCopy (const void *src, diff --git a/src/fcopentype.c b/src/fcopentype.c new file mode 100644 index 0000000..9382a1b --- /dev/null +++ b/src/fcopentype.c @@ -0,0 +1,90 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of the author(s) not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. The authors make no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +#include "fcint.h" + +FcBool +FcPatternAddFullname (FcPattern *pat) +{ + FcBool b = FcFalse; + + if (FcRefIsConst (&pat->ref)) + return FcFalse; + if (FcPatternObjectGetBool (pat, FC_VARIABLE_OBJECT, 0, &b) != FcResultMatch || b == FcFalse) + { + FcChar8 *family, *style, *lang = NULL; + 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) + return FcFalse; + len = strlen ((const char *) family); + for (i = len; i > 0; i--) + { + if (!isspace (family[i])) + break; + } + family[i] = 0; + lang = NULL; + 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) + return FcFalse; + 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); + if (FcStrCmpIgnoreBlanksAndCase(style, (const FcChar8 *) "Regular") != 0) + { + FcStrBufChar (&sbuf, ' '); + FcStrBufString (&sbuf, style); + } + if (!FcPatternObjectAddString (pat, FC_FULLNAME_OBJECT, FcStrBufDoneStatic (&sbuf))) + { + FcStrBufDestroy (&sbuf); + return FcFalse; + } + FcStrBufDestroy (&sbuf); + if (!FcPatternObjectAddString (pat, FC_FULLNAMELANG_OBJECT, (const FcChar8 *) "en")) + return FcFalse; + } + + return FcTrue; +} commit 0f9040406cae2b3c574110acd925867c4a987a37 Author: Akira TAGOH <akira@xxxxxxxxx> Date: Tue Feb 4 15:34:42 2020 +0900 Construct fullname from family and style OpenType spec says that the Regular descriptor would generally be omitted from fullname. but some fonts doesn't follow on it. So decided to construct a fullname from family and style instead of relying on the meta data in a font. Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/issues/208 diff --git a/src/fcfreetype.c b/src/fcfreetype.c index 7147569..672c33a 100644 --- a/src/fcfreetype.c +++ b/src/fcfreetype.c @@ -1133,12 +1133,10 @@ static const FT_UShort platform_order[] = { static const FT_UShort nameid_order[] = { TT_NAME_ID_WWS_FAMILY, - TT_NAME_ID_PREFERRED_FAMILY, + TT_NAME_ID_TYPOGRAPHIC_FAMILY, TT_NAME_ID_FONT_FAMILY, - TT_NAME_ID_MAC_FULL_NAME, - TT_NAME_ID_FULL_NAME, TT_NAME_ID_WWS_SUBFAMILY, - TT_NAME_ID_PREFERRED_SUBFAMILY, + TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY, TT_NAME_ID_FONT_SUBFAMILY, TT_NAME_ID_TRADEMARK, TT_NAME_ID_MANUFACTURER, @@ -1272,8 +1270,6 @@ FcFreeTypeQueryFaceInternal (const FT_Face face, int nfamily_lang = 0; int nstyle = 0; int nstyle_lang = 0; - int nfullname = 0; - int nfullname_lang = 0; unsigned int p, n; FcChar8 *style = 0; @@ -1495,8 +1491,7 @@ FcFreeTypeQueryFaceInternal (const FT_Face face, * 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_FULL_NAME) + nameid == TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY) continue; if (nameid == TT_NAME_ID_FONT_SUBFAMILY) @@ -1512,7 +1507,7 @@ FcFreeTypeQueryFaceInternal (const FT_Face face, { switch (nameid) { case TT_NAME_ID_WWS_FAMILY: - case TT_NAME_ID_PREFERRED_FAMILY: + case TT_NAME_ID_TYPOGRAPHIC_FAMILY: case TT_NAME_ID_FONT_FAMILY: #if 0 case TT_NAME_ID_UNIQUE_ID: @@ -1527,22 +1522,8 @@ FcFreeTypeQueryFaceInternal (const FT_Face face, np = &nfamily; nlangp = &nfamily_lang; 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, - sname.encoding_id, sname.language_id); - - obj = FC_FULLNAME_OBJECT; - objlang = FC_FULLNAMELANG_OBJECT; - np = &nfullname; - nlangp = &nfullname_lang; - break; case TT_NAME_ID_WWS_SUBFAMILY: - case TT_NAME_ID_PREFERRED_SUBFAMILY: + case TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY: case TT_NAME_ID_FONT_SUBFAMILY: if (variable) break; @@ -1686,7 +1667,7 @@ FcFreeTypeQueryFaceInternal (const FT_Face face, } /* Add the fullname into the cache */ - if (!variable && !nfullname) + if (!variable) { FcChar8 *family, *style, *lang; int n = 0; @@ -1728,8 +1709,11 @@ FcFreeTypeQueryFaceInternal (const FT_Face face, memcpy (style, &style[i], len - i); FcStrBufInit (&sbuf, NULL, 0); FcStrBufString (&sbuf, family); - FcStrBufChar (&sbuf, ' '); - FcStrBufString (&sbuf, style); + if (FcStrCmpIgnoreBlanksAndCase(style, (const FcChar8 *) "Regular") != 0) + { + FcStrBufChar (&sbuf, ' '); + FcStrBufString (&sbuf, style); + } if (!FcPatternObjectAddString (pat, FC_FULLNAME_OBJECT, FcStrBufDoneStatic (&sbuf))) { FcStrBufDestroy (&sbuf); @@ -1738,7 +1722,6 @@ FcFreeTypeQueryFaceInternal (const FT_Face face, FcStrBufDestroy (&sbuf); if (!FcPatternObjectAddString (pat, FC_FULLNAMELANG_OBJECT, (const FcChar8 *) "en")) goto bail1; - ++nfullname; } /* Add the PostScript name into the cache */ if (!variable) _______________________________________________ Fontconfig mailing list Fontconfig@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/fontconfig