X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=src%2Ffcmatch.c;h=aa84eda834c895ec13a7a8245d62cf60ea4de3a7;hb=2e44cbe1b9bf466718167e9e05077743df36ab21;hp=b86cbbcd4058f8690e2790daa4aea4aee2e1f90f;hpb=b8860e2faffa8b3f62b3c7aafd2d3b6962566f41;p=fontconfig.git diff --git a/src/fcmatch.c b/src/fcmatch.c index b86cbbc..aa84eda 100644 --- a/src/fcmatch.c +++ b/src/fcmatch.c @@ -13,9 +13,9 @@ * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * - * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * 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 @@ -61,7 +61,7 @@ FcCompareNumber (FcValue *value1, FcValue *value2) static double FcCompareString (FcValue *v1, FcValue *v2) { - return (double) FcStrCmpIgnoreCase (fc_value_string(v1), fc_value_string(v2)) != 0; + return (double) FcStrCmpIgnoreCase (FcValueString(v1), FcValueString(v2)) != 0; } static double @@ -69,8 +69,8 @@ FcCompareFamily (FcValue *v1, FcValue *v2) { /* rely on the guarantee in FcPatternAddWithBinding that * families are always FcTypeString. */ - const FcChar8* v1_string = fc_value_string(v1); - const FcChar8* v2_string = fc_value_string(v2); + const FcChar8* v1_string = FcValueString(v1); + const FcChar8* v2_string = FcValueString(v2); if (FcToLower(*v1_string) != FcToLower(*v2_string) && *v1_string != ' ' && *v2_string != ' ') @@ -129,7 +129,7 @@ FcCompareLang (FcValue *v1, FcValue *v2) static double FcCompareBool (FcValue *v1, FcValue *v2) { - if (fc_storage_type(v2) != FcTypeBool || fc_storage_type(v1) != FcTypeBool) + if (v2->type != FcTypeBool || v1->type != FcTypeBool) return -1.0; return (double) v2->u.b != v1->u.b; } @@ -137,7 +137,7 @@ FcCompareBool (FcValue *v1, FcValue *v2) static double FcCompareCharSet (FcValue *v1, FcValue *v2) { - return (double) FcCharSetSubtractCount (fc_value_charset(v1), fc_value_charset(v2)); + return (double) FcCharSetSubtractCount (FcValueCharSet(v1), FcValueCharSet(v2)); } static double @@ -184,72 +184,43 @@ typedef struct _FcMatcher { * each value, earlier values are more significant than * later values */ -static FcMatcher _FcMatchers [] = { +static const FcMatcher _FcMatchers [] = { { FC_FOUNDRY_OBJECT, FcCompareString, 0, 0 }, #define MATCH_FOUNDRY 0 -#define MATCH_FOUNDRY_INDEX 0 - { FC_CHARSET_OBJECT, FcCompareCharSet, 1, 1 }, #define MATCH_CHARSET 1 -#define MATCH_CHARSET_INDEX 1 - { FC_FAMILY_OBJECT, FcCompareFamily, 2, 4 }, #define MATCH_FAMILY 2 -#define MATCH_FAMILY_STRONG_INDEX 2 -#define MATCH_FAMILY_WEAK_INDEX 4 - { FC_LANG_OBJECT, FcCompareLang, 3, 3 }, #define MATCH_LANG 3 #define MATCH_LANG_INDEX 3 - { FC_SPACING_OBJECT, FcCompareNumber, 5, 5 }, #define MATCH_SPACING 4 -#define MATCH_SPACING_INDEX 5 - { FC_PIXEL_SIZE_OBJECT, FcCompareSize, 6, 6 }, #define MATCH_PIXEL_SIZE 5 -#define MATCH_PIXEL_SIZE_INDEX 6 - { FC_STYLE_OBJECT, FcCompareString, 7, 7 }, #define MATCH_STYLE 6 -#define MATCH_STYLE_INDEX 7 - { FC_SLANT_OBJECT, FcCompareNumber, 8, 8 }, #define MATCH_SLANT 7 -#define MATCH_SLANT_INDEX 8 - { FC_WEIGHT_OBJECT, FcCompareNumber, 9, 9 }, #define MATCH_WEIGHT 8 -#define MATCH_WEIGHT_INDEX 9 - { FC_WIDTH_OBJECT, FcCompareNumber, 10, 10 }, #define MATCH_WIDTH 9 -#define MATCH_WIDTH_INDEX 10 - { FC_DECORATIVE_OBJECT, FcCompareBool, 11, 11 }, #define MATCH_DECORATIVE 10 -#define MATCH_DECORATIVE_INDEX 11 - { FC_ANTIALIAS_OBJECT, FcCompareBool, 12, 12 }, #define MATCH_ANTIALIAS 11 -#define MATCH_ANTIALIAS_INDEX 12 - { FC_RASTERIZER_OBJECT, FcCompareString, 13, 13 }, #define MATCH_RASTERIZER 12 -#define MATCH_RASTERIZER_INDEX 13 - { FC_OUTLINE_OBJECT, FcCompareBool, 14, 14 }, #define MATCH_OUTLINE 13 -#define MATCH_OUTLINE_INDEX 14 - { FC_FONTVERSION_OBJECT, FcCompareNumber, 15, 15 }, #define MATCH_FONTVERSION 14 -#define MATCH_FONTVERSION_INDEX 15 }; #define NUM_MATCH_VALUES 16 -static FcMatcher* +static const FcMatcher* FcObjectToMatcher (FcObject object) { int i; @@ -305,7 +276,7 @@ FcCompareValueList (FcObject object, FcValueListPtr v1, v2; double v, best, bestStrong, bestWeak; int j; - FcMatcher *match = FcObjectToMatcher(object); + const FcMatcher *match = FcObjectToMatcher(object); if (!match) { @@ -606,38 +577,45 @@ FcSortCompare (const void *aa, const void *ab) } static FcBool -FcSortWalk (FcSortNode **n, int nnode, FcFontSet *fs, FcCharSet **cs, FcBool trim, FcBool build_cs) +FcSortWalk (FcSortNode **n, int nnode, FcFontSet *fs, FcCharSet **csp, FcBool trim) { - FcCharSet *ncs; - FcSortNode *node; + FcBool ret = FcFalse; + FcCharSet *cs; + + cs = 0; + if (trim || csp) + { + cs = FcCharSetCreate (); + if (cs == NULL) + goto bail; + } while (nnode--) { - node = *n++; + FcSortNode *node = *n++; + FcBool adds_chars = FcFalse; /* * Only fetch node charset if we'd need it */ - if (trim || build_cs) + if (cs) { + FcCharSet *ncs; + if (FcPatternGetCharSet (node->pattern, FC_CHARSET, 0, &ncs) != FcResultMatch) continue; + + if (!FcCharSetMerge (cs, ncs, &adds_chars)) + goto bail; } /* * If this font isn't a subset of the previous fonts, * add it to the list */ - if (!trim || !*cs || !FcCharSetIsSubset (ncs, *cs)) + if (!trim || adds_chars) { - if (trim || build_cs) - { - *cs = FcCharSetMerge (*cs, ncs); - if (*cs == NULL) - return FcFalse; - } - FcPatternReference (node->pattern); if (FcDebug () & FC_DBG_MATCHV) { @@ -647,11 +625,23 @@ FcSortWalk (FcSortNode **n, int nnode, FcFontSet *fs, FcCharSet **cs, FcBool tri if (!FcFontSetAdd (fs, node->pattern)) { FcPatternDestroy (node->pattern); - return FcFalse; + goto bail; } } } - return FcTrue; + if (csp) + { + *csp = cs; + cs = 0; + } + + ret = FcTrue; + +bail: + if (cs) + FcCharSetDestroy (cs); + + return ret; } void @@ -675,7 +665,6 @@ FcFontSetSort (FcConfig *config, FcSortNode **nodeps, **nodep; int nnodes; FcSortNode *new; - FcCharSet *cs; int set; int f; int i; @@ -803,19 +792,9 @@ FcFontSetSort (FcConfig *config, if (!ret) goto bail1; - cs = 0; - - if (!FcSortWalk (nodeps, nnodes, ret, &cs, trim, (csp!=0))) + if (!FcSortWalk (nodeps, nnodes, ret, csp, trim)) goto bail2; - if (csp) - *csp = cs; - else - { - if (cs) - FcCharSetDestroy (cs); - } - free (nodes); if (FcDebug() & FC_DBG_MATCH) @@ -826,8 +805,6 @@ FcFontSetSort (FcConfig *config, return ret; bail2: - if (cs) - FcCharSetDestroy (cs); FcFontSetDestroy (ret); bail1: free (nodes);