From c78e7fd6deea835a522a89b3ae9ecc4fb1a2b672 Mon Sep 17 00:00:00 2001 From: Akira TAGOH Date: Fri, 3 Apr 2020 19:44:00 +0900 Subject: [PATCH] Add fullname later once FcConfigSubstitute() is done So user's changes in family and style will be reflected into fullname. --- src/Makefile.am | 1 + src/fcdir.c | 3 ++ src/fcfreetype.c | 57 ------------------------------ src/fcint.h | 4 +++ src/fcopentype.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 98 insertions(+), 57 deletions(-) create mode 100644 src/fcopentype.c 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; +}